create-hsi-app 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -0
- package/bin/create-hsi-app.mjs +160 -10
- package/package.json +3 -2
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# create-hsi-app
|
|
2
|
+
|
|
3
|
+
Scaffold a new Vite + React + TypeScript app from the frontend template.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
### npm
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm create hsi-app@latest
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### yarn
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
yarn create hsi-app
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### pnpm
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm create hsi-app@latest
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### bun
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
bun create hsi-app@latest
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Pass the package manager flag after the initializer:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm create hsi-app@latest -- --pnpm
|
|
35
|
+
```
|
package/bin/create-hsi-app.mjs
CHANGED
|
@@ -10,9 +10,12 @@ import {
|
|
|
10
10
|
import { basename, join, resolve } from 'node:path';
|
|
11
11
|
|
|
12
12
|
const templateRepo = 'https://github.com/Hsiii/frontend-template.git';
|
|
13
|
-
const templateTag = 'v0.
|
|
13
|
+
const templateTag = 'v0.2.0';
|
|
14
14
|
const defaultAppName = 'my-app';
|
|
15
|
-
const
|
|
15
|
+
const packageManagers = ['bun', 'npm', 'pnpm', 'yarn'];
|
|
16
|
+
const rawArgs = process.argv.slice(2);
|
|
17
|
+
const selectedPackageManager = parsePackageManagerFlag(rawArgs);
|
|
18
|
+
const targetArg = rawArgs.find((arg) => !arg.startsWith('--')) ?? '.';
|
|
16
19
|
const targetPath = resolve(targetArg);
|
|
17
20
|
const appName = toPackageName(basename(targetPath));
|
|
18
21
|
|
|
@@ -34,18 +37,23 @@ run('git', [
|
|
|
34
37
|
|
|
35
38
|
rmSync(join(targetPath, '.git'), { force: true, recursive: true });
|
|
36
39
|
rmSync(join(targetPath, '.github'), { force: true, recursive: true });
|
|
40
|
+
rmSync(join(targetPath, 'docs'), { force: true, recursive: true });
|
|
37
41
|
rmSync(join(targetPath, 'packages'), { force: true, recursive: true });
|
|
42
|
+
rmSync(join(targetPath, 'scripts'), { force: true, recursive: true });
|
|
38
43
|
|
|
39
44
|
updatePackageJson();
|
|
40
45
|
updateBunLock();
|
|
41
46
|
updateAppText();
|
|
47
|
+
updatePackageManagerFiles();
|
|
42
48
|
writeAppReadme();
|
|
43
49
|
|
|
44
50
|
console.log(`\nCreated ${appName} in ${targetPath}\n`);
|
|
45
51
|
console.log('Next steps:');
|
|
46
|
-
|
|
47
|
-
console.log(
|
|
48
|
-
|
|
52
|
+
if (targetArg !== '.') {
|
|
53
|
+
console.log(` cd ${targetArg}`);
|
|
54
|
+
}
|
|
55
|
+
console.log(` ${installCommand()}`);
|
|
56
|
+
console.log(` ${devCommand()}`);
|
|
49
57
|
|
|
50
58
|
function run(command, args) {
|
|
51
59
|
try {
|
|
@@ -63,9 +71,12 @@ function updatePackageJson() {
|
|
|
63
71
|
packageJson.version = '0.1.0';
|
|
64
72
|
delete packageJson.repository;
|
|
65
73
|
delete packageJson.publishConfig;
|
|
66
|
-
delete packageJson.
|
|
74
|
+
delete packageJson.packageManager;
|
|
75
|
+
delete packageJson.engines;
|
|
76
|
+
delete packageJson.scripts.release;
|
|
67
77
|
packageJson.scripts.check =
|
|
68
|
-
'
|
|
78
|
+
'tsc -p tsconfig.json --noEmit && eslint . && prettier . --check && vite build';
|
|
79
|
+
packageJson.packageManager = packageManagerDeclaration();
|
|
69
80
|
|
|
70
81
|
writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 4)}\n`);
|
|
71
82
|
}
|
|
@@ -77,6 +88,11 @@ function updateBunLock() {
|
|
|
77
88
|
return;
|
|
78
89
|
}
|
|
79
90
|
|
|
91
|
+
if (selectedPackageManager !== 'bun') {
|
|
92
|
+
rmSync(lockPath, { force: true });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
80
96
|
const lock = readFileSync(lockPath, 'utf8').replace(
|
|
81
97
|
'"name": "frontend-template"',
|
|
82
98
|
`"name": "${appName}"`
|
|
@@ -102,7 +118,44 @@ function updateAppText() {
|
|
|
102
118
|
);
|
|
103
119
|
}
|
|
104
120
|
|
|
121
|
+
function updatePackageManagerFiles() {
|
|
122
|
+
rmSync(join(targetPath, 'bunfig.toml'), { force: true });
|
|
123
|
+
rmSync(join(targetPath, '.npmrc'), { force: true });
|
|
124
|
+
rmSync(join(targetPath, 'pnpm-workspace.yaml'), { force: true });
|
|
125
|
+
rmSync(join(targetPath, '.yarnrc.yml'), { force: true });
|
|
126
|
+
|
|
127
|
+
switch (selectedPackageManager) {
|
|
128
|
+
case 'bun':
|
|
129
|
+
writeFileSync(
|
|
130
|
+
join(targetPath, 'bunfig.toml'),
|
|
131
|
+
'[install]\nminimumReleaseAge = 604800\n'
|
|
132
|
+
);
|
|
133
|
+
return;
|
|
134
|
+
case 'npm':
|
|
135
|
+
writeFileSync(join(targetPath, '.npmrc'), 'min-release-age=7\n');
|
|
136
|
+
return;
|
|
137
|
+
case 'pnpm':
|
|
138
|
+
writeFileSync(
|
|
139
|
+
join(targetPath, 'pnpm-workspace.yaml'),
|
|
140
|
+
'minimumReleaseAge: 10080\n'
|
|
141
|
+
);
|
|
142
|
+
return;
|
|
143
|
+
case 'yarn':
|
|
144
|
+
writeFileSync(
|
|
145
|
+
join(targetPath, '.yarnrc.yml'),
|
|
146
|
+
'npmMinimalAgeGate: 7d\n'
|
|
147
|
+
);
|
|
148
|
+
return;
|
|
149
|
+
default:
|
|
150
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
105
154
|
function writeAppReadme() {
|
|
155
|
+
const installLine = installCommand();
|
|
156
|
+
const devLine = devCommand();
|
|
157
|
+
const checkLine = checkCommand();
|
|
158
|
+
const securityNote = securityNoteForPackageManager();
|
|
106
159
|
const readme = `# ${appName}
|
|
107
160
|
|
|
108
161
|
Created from the frontend template.
|
|
@@ -110,20 +163,22 @@ Created from the frontend template.
|
|
|
110
163
|
## Install
|
|
111
164
|
|
|
112
165
|
\`\`\`bash
|
|
113
|
-
|
|
166
|
+
${installLine}
|
|
114
167
|
\`\`\`
|
|
115
168
|
|
|
116
169
|
## Develop
|
|
117
170
|
|
|
118
171
|
\`\`\`bash
|
|
119
|
-
|
|
172
|
+
${devLine}
|
|
120
173
|
\`\`\`
|
|
121
174
|
|
|
122
175
|
## Check
|
|
123
176
|
|
|
124
177
|
\`\`\`bash
|
|
125
|
-
|
|
178
|
+
${checkLine}
|
|
126
179
|
\`\`\`
|
|
180
|
+
|
|
181
|
+
${securityNote}
|
|
127
182
|
`;
|
|
128
183
|
|
|
129
184
|
writeFileSync(join(targetPath, 'README.md'), readme);
|
|
@@ -146,6 +201,101 @@ function toPackageName(value) {
|
|
|
146
201
|
return name || defaultAppName;
|
|
147
202
|
}
|
|
148
203
|
|
|
204
|
+
function parsePackageManagerFlag(args) {
|
|
205
|
+
const selectedFlags = args.filter((arg) =>
|
|
206
|
+
['--bun', '--npm', '--pnpm', '--yarn'].includes(arg)
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
if (selectedFlags.length > 1) {
|
|
210
|
+
fail('Pass only one of --bun, --npm, --pnpm, or --yarn.');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
switch (selectedFlags[0]) {
|
|
214
|
+
case '--npm':
|
|
215
|
+
return 'npm';
|
|
216
|
+
case '--pnpm':
|
|
217
|
+
return 'pnpm';
|
|
218
|
+
case '--yarn':
|
|
219
|
+
return 'yarn';
|
|
220
|
+
case '--bun':
|
|
221
|
+
case undefined:
|
|
222
|
+
return 'bun';
|
|
223
|
+
default:
|
|
224
|
+
fail(`Unsupported package manager flag: ${selectedFlags[0]}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function packageManagerDeclaration() {
|
|
229
|
+
switch (selectedPackageManager) {
|
|
230
|
+
case 'bun':
|
|
231
|
+
return 'bun@1.3.9';
|
|
232
|
+
case 'npm':
|
|
233
|
+
return 'npm@11';
|
|
234
|
+
case 'pnpm':
|
|
235
|
+
return 'pnpm@10';
|
|
236
|
+
case 'yarn':
|
|
237
|
+
return 'yarn@4';
|
|
238
|
+
default:
|
|
239
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function installCommand() {
|
|
244
|
+
switch (selectedPackageManager) {
|
|
245
|
+
case 'bun':
|
|
246
|
+
return 'bun install';
|
|
247
|
+
case 'npm':
|
|
248
|
+
return 'npm install';
|
|
249
|
+
case 'pnpm':
|
|
250
|
+
return 'pnpm install';
|
|
251
|
+
case 'yarn':
|
|
252
|
+
return 'yarn install';
|
|
253
|
+
default:
|
|
254
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function devCommand() {
|
|
259
|
+
switch (selectedPackageManager) {
|
|
260
|
+
case 'yarn':
|
|
261
|
+
return 'yarn dev';
|
|
262
|
+
case 'bun':
|
|
263
|
+
case 'npm':
|
|
264
|
+
case 'pnpm':
|
|
265
|
+
return `${selectedPackageManager} run dev`;
|
|
266
|
+
default:
|
|
267
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function checkCommand() {
|
|
272
|
+
switch (selectedPackageManager) {
|
|
273
|
+
case 'yarn':
|
|
274
|
+
return 'yarn check';
|
|
275
|
+
case 'bun':
|
|
276
|
+
case 'npm':
|
|
277
|
+
case 'pnpm':
|
|
278
|
+
return `${selectedPackageManager} run check`;
|
|
279
|
+
default:
|
|
280
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function securityNoteForPackageManager() {
|
|
285
|
+
switch (selectedPackageManager) {
|
|
286
|
+
case 'bun':
|
|
287
|
+
return 'This project includes `bunfig.toml` with `minimumReleaseAge = 604800`.';
|
|
288
|
+
case 'npm':
|
|
289
|
+
return 'This project includes `.npmrc` with `min-release-age=7`.';
|
|
290
|
+
case 'pnpm':
|
|
291
|
+
return 'This project includes `pnpm-workspace.yaml` with `minimumReleaseAge: 10080`.';
|
|
292
|
+
case 'yarn':
|
|
293
|
+
return 'This project includes `.yarnrc.yml` with `npmMinimalAgeGate: 7d`.';
|
|
294
|
+
default:
|
|
295
|
+
fail(`Unsupported package manager: ${selectedPackageManager}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
149
299
|
function fail(message) {
|
|
150
300
|
console.error(`create-hsi-app: ${message}`);
|
|
151
301
|
process.exit(1);
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-hsi-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Create a new app from the frontend template.",
|
|
6
6
|
"bin": {
|
|
7
7
|
"create-hsi-app": "bin/create-hsi-app.mjs"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
|
-
"bin"
|
|
10
|
+
"bin",
|
|
11
|
+
"README.md"
|
|
11
12
|
],
|
|
12
13
|
"engines": {
|
|
13
14
|
"node": ">=18"
|