create-hsi-app 0.1.4 → 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 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
+ ```
@@ -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.1.4';
13
+ const templateTag = 'v0.2.0';
14
14
  const defaultAppName = 'my-app';
15
- const targetArg = process.argv[2] ?? defaultAppName;
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
- console.log(` cd ${targetArg}`);
47
- console.log(' bun i');
48
- console.log(' bun run dev');
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.scripts['check:create'];
74
+ delete packageJson.packageManager;
75
+ delete packageJson.engines;
76
+ delete packageJson.scripts.release;
67
77
  packageJson.scripts.check =
68
- 'bun run typecheck && bun run lint && bun run format:check && bun run build';
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
- bun i
166
+ ${installLine}
114
167
  \`\`\`
115
168
 
116
169
  ## Develop
117
170
 
118
171
  \`\`\`bash
119
- bun run dev
172
+ ${devLine}
120
173
  \`\`\`
121
174
 
122
175
  ## Check
123
176
 
124
177
  \`\`\`bash
125
- bun run check
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.1.4",
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"