-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathresource-generator.js
87 lines (69 loc) · 2.72 KB
/
resource-generator.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
85
86
87
const readline = require('readline');
const fs = require('fs');
const fse = require('fs-extra');
const chalk = require('chalk');
const glob = require('glob');
const { paramCase, pascalCase } = require('change-case');
const resourcePaths = glob.sync('resources/**/fxmanifest.lua', { ignore: 'resources/**/node_modules/**' });
const currentResources = resourcePaths.map((p) => p.split('/').at(-2));
const Delay = (ms) => new Promise((res) => setTimeout(res, Math.max(1, ms)));
const replaceText = (path, find, replace) => {
const data = fs.readFileSync(path, 'utf8');
const newData = data.replace(new RegExp(find, 'gm'), replace);
fs.writeFileSync(path, newData, 'utf8');
};
const createResource = async (path) => {
const dir = path.split('/');
const name = paramCase(dir.pop());
const namePascal = pascalCase(name);
if (currentResources.includes(name)) {
console.log(`Resource ${chalk.red(name)} already exists!`);
return;
}
path = [...dir, name].join('/');
const exists = fs.existsSync(path);
if (exists) {
console.error(`Path ${chalk.red(path)} already exists`);
return;
}
fse.mkdirp(dir.join('/'));
fse.copySync('_boilerplate', path, {});
await Delay(500);
replaceText(`${path}/package.json`, '_boilerplate', name);
replaceText(`${path}/src/types.d.ts`, '_Boilerplate', namePascal);
replaceText(`${path}/src/client/types.d.ts`, '_Boilerplate', namePascal);
replaceText(`${path}/src/server/types.d.ts`, '_Boilerplate', namePascal);
if (name.includes('-')) {
replaceText(`${path}/src/client/types.d.ts`, '_boilerplate', `['${name}']`);
replaceText(`${path}/src/server/types.d.ts`, '_boilerplate', `['${name}']`);
} else {
replaceText(`${path}/src/client/types.d.ts`, '_boilerplate', name);
replaceText(`${path}/src/server/types.d.ts`, '_boilerplate', name);
}
if (dir.length > 1) {
replaceText(`${path}/webpack.config.js`, "'../", `'${'../'.repeat(dir.length)}`);
replaceText(`${path}/src/client/tsconfig.json`, '"../', `"${'../'.repeat(dir.length)}`);
replaceText(`${path}/src/server/tsconfig.json`, '"../', `"${'../'.repeat(dir.length)}`);
}
console.log(`Resource ${chalk.green(name)} created!`);
};
const input = process.argv.slice(2).join(' ');
if (input) {
createResource(`resources/${input}`);
} else {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false,
});
console.log(chalk.underline('Enter the path to the resource you want to create'));
console.log(chalk.blue('ex. game or [core]/camera'));
rl.question(chalk.gray('resources/'), (path) => {
if (path) {
createResource(`resources/${path}`);
} else {
console.log(chalk.red('No path specified'));
}
rl.close();
});
}