-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.js
84 lines (68 loc) · 2.46 KB
/
cli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer');
const copyRecursiveSync = (src, dest) => {
const exists = fs.existsSync(src);
const stats = exists && fs.statSync(src);
const isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest, { recursive: true });
fs.readdirSync(src).forEach((childItemName) => {
copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
});
} else {
fs.copyFileSync(src, dest);
}
};
const questions = [
{
type: 'input',
name: 'folder',
message: 'Enter the folder name for your project (leave blank for current folder):',
default: '.'
},
{
type: 'list',
name: 'language',
message: 'Which language would you like to use?',
choices: ['JavaScript', 'TypeScript']
},
{
"type": "list",
"name": "pattern",
"message": "Which architectural pattern would you like to use?",
"choices": [
"Model-View-Controller (MVC) Pattern",
"Layered Architecture Pattern (Modular)"
]
},
];
inquirer.prompt(questions).then(answers => {
const { language, pattern, folder } = answers;
console.log(`Setting up Express boilerplate (${language}, ${pattern}) in ${folder}`);
const patternName = (pattern === 'Model-View-Controller (MVC) Pattern') ? 'mvc' : 'ma';
const targetPath = folder != '.' ? path.join(process.cwd(), folder) : process.cwd();
const templatePath = path.join(__dirname, 'template', language.toLowerCase(), patternName.toLowerCase());
if (folder != '.') {
try {
fs.mkdirSync(targetPath);
} catch (err) {
if (err.code === 'EEXIST') {
console.error(`The folder "${folder}" already exists. Please choose a different name.`);
process.exit(1);
} else {
console.error(err);
process.exit(1);
}
}
}
copyRecursiveSync(templatePath, targetPath);
console.log(`Express boilerplate (${language}, ${patternName}) has been set up in ${targetPath}!`);
try {
process.chdir(targetPath);
console.log(`To get started:\n\n cd ${folder}\n npm install\n npm run dev\n\nEnjoy!`);
} catch (error) {
console.error('Error occurred setting up the project:', error);
}
});