· 6 years ago · Apr 19, 2019, 02:26 AM
1'use strict';
2
3const fs = require('fs');
4const chalk = require('chalk');
5const shell = require('shelljs');
6const inquirer = require('inquirer');
7const elegantSpinner = require('elegant-spinner');
8const logUpdate = require('log-update');
9const Table = require('cli-table3');
10const validate = require('validate-npm-package-name');
11const { showBanner } = require('../../external/banner');
12const boilerplate = require('../../../config.json');
13
14let availableCommands = new Table();
15let frame = elegantSpinner();
16
17let projectName;
18let projectConfig;
19
20let showTables = () => {
21 console.log(chalk.yellow('\n Available commands:-'));
22
23 availableCommands.push({
24 'mevn version': 'Current CLI version'
25 }, {
26 'mevn serve': 'To launch client/server'
27 }, {
28 'mevn add:package': 'Add additional packages'
29 },{
30 'mevn generate': 'To generate config files'
31 }, {
32 'mevn create:component <name>': 'Create new components'
33 }, {
34 'mevn codesplit <name>': 'Lazy load components'
35 }, {
36 'mevn create:git-repo': 'Create a GitHub Repo'
37 }, {
38 'mevn dockerize': 'Launch within docker containers'
39 }, {
40 'mevn deploy': 'Deploy the app to Heroku'
41 });
42 console.log(availableCommands.toString());
43
44 console.log(chalk.cyanBright(`\n\n Make sure that you've done ${chalk.greenBright(`cd ${projectName}`)}`));
45 console.log(chalk.redBright('\n warning:'));
46 console.log(' Do not delete mevn.json file');
47};
48
49let fetchTemplate = (template) => {
50 let templateDir = 'mevn-boilerplate';
51 if (template !== 'basic') {
52 templateDir = `mevn-${template}-boilerplate`;
53 }
54 shell.exec(`${boilerplate[template]} ${projectName}`, {silent: true});
55
56 let fetchSpinner = setInterval(() => {
57 logUpdate('Fetching the boilerplate ' + chalk.cyan.bold.dim(frame()));
58 }, 50);
59
60 setTimeout(() =>{
61 console.log('\n');
62 clearInterval(fetchSpinner);
63 logUpdate.clear();
64 showTables();
65
66 }, 5000);
67
68 fs.writeFileSync(`./${projectName}/mevn.json`, projectConfig.join('\n').toString());
69
70 if (template === 'nuxt') {
71 setTimeout(() =>{
72
73 console.log('\n');
74
75 inquirer.prompt([{
76 name: 'mode',
77 type: 'list',
78 message: 'Choose your preferred mode',
79 choices: ['Universal', 'SPA']
80 }])
81 .then((choice) => {
82 if (choice.mode === 'Universal') {
83 let configFile = fs.readFileSync(`./${projectName}/nuxt.config.js`, 'utf8').toString().split('\n');
84 let index = configFile.indexOf(configFile.find(line => line.includes('mode')));
85 configFile[index] = ` mode: 'universal',`;
86
87 fs.writeFileSync(`./${projectName}/nuxt.config.js`, configFile.join('\n'));
88 }
89 showTables();
90 });
91 }, 5000);
92 }
93};
94
95exports.initializeProject = (appName) => {
96 showBanner();
97 console.log('\n');
98
99 let initialSpinner = setInterval(() => {
100 logUpdate('Initializing ' + chalk.cyan.bold.dim(frame()));
101 }, 50);
102
103 setTimeout(() => {
104 const hasMultipleProjectNameArgs = process.argv[4] && !process.argv[4].startsWith('-');
105 // Validation for multiple directory names
106 if (hasMultipleProjectNameArgs){
107 console.log(chalk.red.bold('\n Kindly provide only one argument as the directory name!!'));
108 process.exit(1);
109 }
110
111 const validationResult = validate(appName);
112 if (!validationResult.validForNewPackages) {
113 console.error(
114 `Could not create a project called ${chalk.red(
115 `"${appName}"`
116 )} because of npm naming restrictions:`
117 );
118 process.exit(1);
119 }
120
121 if (fs.existsSync(appName)) {
122 console.error(chalk.red.bold(`\n Directory ${appName} already exists in path!`));
123 process.exit(1);
124 }
125
126 clearInterval(initialSpinner);
127 logUpdate.clear();
128 projectName = appName;
129
130 inquirer.prompt([{
131 name: 'template',
132 type: 'list',
133 message: 'Please select one',
134 choices: ['basic', 'pwa', 'graphql', 'Nuxt-js']
135
136 }])
137 .then((choice) => {
138
139 projectConfig = [
140 '{',
141 `"name": "${appName}",`,
142 `"template": "${choice.template}"`,
143 '}'
144 ];
145
146 inquirer.prompt([{
147 name : 'wantfeature',
148 type : 'confirm',
149 message : 'Do you want additional features?'
150 }])
151 .then((wantfeature) => {
152 if(wantfeature){
153 inquirer.prompt([{
154 name : 'feature',
155 type: 'list',
156 message: 'Please select additional feature',
157 choices : ['Linter','Prettier']
158 }])
159 .then((answer) => {
160 if(answer.feature == 'Linter'){
161 shell.exec('npm install eslint')
162 }
163 if(answer.feature == 'Prettier'){
164 shell.cd(`${projectName}`);
165 shell.exec('npm install --global prettier')
166 }
167 })
168 .then(() => {
169 if (choice.template === 'Nuxt-js') {
170 choice.template = 'nuxt';
171 }
172 fetchTemplate(choice.template);
173 });
174 }
175 });
176 });
177 }, 1000);
178
179};