-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate-module.mjs
75 lines (65 loc) · 2.83 KB
/
generate-module.mjs
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
// Consola
import { consola } from 'consola';
// File System
import fs from 'fs';
// Path
import path from 'path';
const args = process.argv.slice(2);
if (args.length === 0) {
consola.error('Please provide a module name.');
} else {
consola.start('Creating module directory structure...');
const moduleName = args[0];
let capitalizeModuleName;
// ? We need still to check if the module name is contained more than one word or module name is camel case. Then, we need to convert it to kebab case.
const kebabCaseModuleName = moduleName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
const modulePath = path.join('app', 'src', 'modules', kebabCaseModuleName);
if (kebabCaseModuleName) {
// ? We need to change kebab-case into capital case
capitalizeModuleName = kebabCaseModuleName
.split('-')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join('');
}
try {
fs.mkdirSync(modulePath, { recursive: true });
const listFolderNames = ['components', 'constants', 'interfaces', 'routes', 'services', 'stores', 'views'];
// Create seperates folders and files
listFolderNames.forEach(folderName => {
fs.mkdirSync(path.join(modulePath, folderName));
switch (folderName) {
case 'components':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, '.gitkeep'), 'w'));
break;
case 'constants':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `index.ts`), 'w'));
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.constant.ts`), 'w'));
fs.closeSync(
fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.api.constant.ts`), 'w'),
);
break;
case 'interfaces':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.interface.ts`), 'w'));
break;
case 'routes':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.route.ts`), 'w'));
break;
case 'services':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.service.ts`), 'w'));
break;
case 'stores':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${kebabCaseModuleName}.store.ts`), 'w'));
break;
case 'views':
fs.closeSync(fs.openSync(path.join(modulePath, folderName, `${capitalizeModuleName}UI.vue`), 'w'));
break;
default:
fs.closeSync(fs.openSync(path.join(modulePath, folderName, 'index.ts'), 'w'));
break;
}
});
consola.success(`Module "${moduleName}" directory structure created successfully. Let's check it out!`);
} catch (err) {
consola.error(`Error creating module "${moduleName}": ${err}`);
}
}