@ysk-kit/create-app 1.0.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.
@@ -0,0 +1,630 @@
1
+ import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { dirname, join, relative, resolve, sep } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { applyThinPreset } from './thin';
5
+ export const DBS = ['mysql', 'postgresql', 'sqlite'];
6
+ export const FLAVORS = [
7
+ 'saas',
8
+ 'desktop',
9
+ 'gateway',
10
+ 'php-bridge',
11
+ 'trading',
12
+ 'static-web3',
13
+ ];
14
+ export const PRESETS = ['thin', 'full'];
15
+ const SKIP = new Set([
16
+ 'node_modules',
17
+ 'dist',
18
+ '.git',
19
+ '.turbo',
20
+ 'coverage',
21
+ '.expo',
22
+ '.DS_Store',
23
+ 'generated',
24
+ '.runs',
25
+ '.env',
26
+ '.env.local',
27
+ '.cursor',
28
+ '.grok',
29
+ '.idea',
30
+ '.vscode',
31
+ '.claude',
32
+ '.codex',
33
+ ]);
34
+ export const shouldSkipCopyEntry = (entry) => SKIP.has(entry) || (entry.startsWith('.env') && entry !== '.env.example');
35
+ export const pruneLockfileImporters = (dest) => {
36
+ const lockPath = join(dest, 'pnpm-lock.yaml');
37
+ if (!existsSync(lockPath))
38
+ return;
39
+ const lines = readFileSync(lockPath, 'utf8').split('\n');
40
+ const out = [];
41
+ let inImporters = false;
42
+ let skipBlock = false;
43
+ for (const line of lines) {
44
+ if (line === 'importers:') {
45
+ inImporters = true;
46
+ skipBlock = false;
47
+ out.push(line);
48
+ continue;
49
+ }
50
+ if (inImporters && /^[A-Za-z]/.test(line)) {
51
+ inImporters = false;
52
+ skipBlock = false;
53
+ }
54
+ if (inImporters && /^ {2}[^ \n].*:$/.test(line)) {
55
+ const key = line.slice(2, -1);
56
+ const pkgJson = key === '.' ? join(dest, 'package.json') : join(dest, key, 'package.json');
57
+ skipBlock = !existsSync(pkgJson);
58
+ }
59
+ if (!skipBlock)
60
+ out.push(line);
61
+ }
62
+ writeFileSync(lockPath, out.join('\n'));
63
+ };
64
+ const isToolingTestFile = (from, entry, kitRoot) => {
65
+ if (!entry.endsWith('.test.ts') && !entry.endsWith('.test.tsx'))
66
+ return false;
67
+ const rel = relative(kitRoot, from);
68
+ return rel === 'tooling' || rel.startsWith(`tooling${sep}`);
69
+ };
70
+ const copyTree = (from, to, kitRoot, skipApps) => {
71
+ mkdirSync(to, { recursive: true });
72
+ for (const entry of readdirSync(from)) {
73
+ if (shouldSkipCopyEntry(entry))
74
+ continue;
75
+ if (from === kitRoot && entry === 'examples')
76
+ continue;
77
+ if (isToolingTestFile(from, entry, kitRoot))
78
+ continue;
79
+ const source = join(from, entry);
80
+ const dest = join(to, entry);
81
+ const stat = statSync(source);
82
+ if (stat.isDirectory()) {
83
+ if (from === join(kitRoot, 'apps') && skipApps.has(entry))
84
+ continue;
85
+ copyTree(source, dest, kitRoot, skipApps);
86
+ }
87
+ else {
88
+ cpSync(source, dest);
89
+ }
90
+ }
91
+ };
92
+ const writeAgentStubs = (dest, kitRoot) => {
93
+ const templates = join(kitRoot, 'tooling/ysk-cli/templates/agent');
94
+ const rule = join(templates, 'ysk-kit.mdc');
95
+ const skillsDir = join(templates, 'skills');
96
+ if (!existsSync(rule) || !existsSync(skillsDir)) {
97
+ throw new Error('agent templates missing');
98
+ }
99
+ mkdirSync(join(dest, '.cursor/rules'), { recursive: true });
100
+ cpSync(rule, join(dest, '.cursor/rules/ysk-kit.mdc'));
101
+ for (const name of readdirSync(skillsDir)) {
102
+ const skillDir = join(skillsDir, name);
103
+ const src = join(skillDir, 'SKILL.md');
104
+ if (!statSync(skillDir).isDirectory() || !existsSync(src))
105
+ continue;
106
+ for (const tree of ['.grok/skills', '.cursor/skills']) {
107
+ const dir = join(dest, tree, name);
108
+ mkdirSync(dir, { recursive: true });
109
+ cpSync(src, join(dir, 'SKILL.md'));
110
+ }
111
+ }
112
+ };
113
+ const hasOpt = (argv, name) => argv.includes(`--${name}`) || argv.some((arg) => arg.startsWith(`--${name}=`));
114
+ export const parseArgs = (argv) => {
115
+ const flavorFlag = argv.find((arg) => arg.startsWith('--flavor='))?.slice('--flavor='.length);
116
+ const flavorIdx = argv.indexOf('--flavor');
117
+ const flavor = flavorFlag ?? (flavorIdx >= 0 ? argv[flavorIdx + 1] : 'saas') ?? 'saas';
118
+ const dbFlag = argv.find((arg) => arg.startsWith('--db='))?.slice('--db='.length);
119
+ const dbIdx = argv.indexOf('--db');
120
+ const db = (dbFlag ?? (dbIdx >= 0 ? argv[dbIdx + 1] : 'mysql'));
121
+ const presetFlag = argv.find((arg) => arg.startsWith('--preset='))?.slice('--preset='.length);
122
+ const presetIdx = argv.indexOf('--preset');
123
+ const preset = (presetFlag ??
124
+ (presetIdx >= 0 ? argv[presetIdx + 1] : 'thin') ??
125
+ 'thin');
126
+ const flags = new Set([
127
+ 'saas',
128
+ 'desktop',
129
+ 'gateway',
130
+ 'php-bridge',
131
+ 'trading',
132
+ 'static-web3',
133
+ 'mysql',
134
+ 'postgresql',
135
+ 'sqlite',
136
+ 'thin',
137
+ 'full',
138
+ flavor,
139
+ db,
140
+ preset,
141
+ ]);
142
+ const positional = argv.filter((arg) => arg !== '-y' && !arg.startsWith('--') && !flags.has(arg));
143
+ return {
144
+ name: positional[0],
145
+ flavor,
146
+ db,
147
+ preset,
148
+ admin: !argv.includes('--no-admin'),
149
+ mobile: !argv.includes('--no-mobile'),
150
+ yes: argv.includes('--yes') || argv.includes('-y'),
151
+ explicit: {
152
+ flavor: hasOpt(argv, 'flavor'),
153
+ db: hasOpt(argv, 'db'),
154
+ preset: hasOpt(argv, 'preset'),
155
+ noAdmin: argv.includes('--no-admin'),
156
+ noMobile: argv.includes('--no-mobile'),
157
+ },
158
+ };
159
+ };
160
+ const jaegerService = ` jaeger:
161
+ image: jaegertracing/jaeger:2.21.0
162
+ restart: unless-stopped
163
+ ports:
164
+ - "16686:16686"
165
+ - "4318:4318"
166
+ prometheus:
167
+ image: prom/prometheus:v3.15.0
168
+ restart: unless-stopped
169
+ extra_hosts:
170
+ - "host.docker.internal:host-gateway"
171
+ ports:
172
+ - "9090:9090"
173
+ volumes:
174
+ - ./deploy/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
175
+ grafana:
176
+ image: grafana/grafana:13.2.3
177
+ restart: unless-stopped
178
+ ports:
179
+ - "3000:3000"
180
+ environment:
181
+ GF_SECURITY_ADMIN_USER: admin
182
+ GF_SECURITY_ADMIN_PASSWORD: admin
183
+ GF_USERS_ALLOW_SIGN_UP: "false"
184
+ volumes:
185
+ - ./deploy/grafana/provisioning:/etc/grafana/provisioning:ro
186
+ - ./deploy/grafana/dashboards:/var/lib/grafana/dashboards:ro
187
+ `;
188
+ const mysqlCompose = `services:
189
+ mysql:
190
+ image: mysql:8.4
191
+ restart: unless-stopped
192
+ environment:
193
+ MYSQL_ROOT_PASSWORD: root
194
+ MYSQL_DATABASE: ysk_kit
195
+ MYSQL_USER: ysk
196
+ MYSQL_PASSWORD: ysk
197
+ ports:
198
+ - "3306:3306"
199
+ volumes:
200
+ - ysk_kit_mysql:/var/lib/mysql
201
+ command: ["--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
202
+ redis:
203
+ image: redis:8.10-alpine
204
+ restart: unless-stopped
205
+ ports:
206
+ - "6379:6379"
207
+ ${jaegerService}
208
+ volumes:
209
+ ysk_kit_mysql:
210
+ `;
211
+ const pgCompose = `services:
212
+ postgres:
213
+ image: postgres:18-alpine
214
+ restart: unless-stopped
215
+ environment:
216
+ POSTGRES_DB: ysk_kit
217
+ POSTGRES_USER: ysk
218
+ POSTGRES_PASSWORD: ysk
219
+ ports:
220
+ - "5432:5432"
221
+ volumes:
222
+ - ysk_kit_pg:/var/lib/postgresql/data
223
+ redis:
224
+ image: redis:8.10-alpine
225
+ restart: unless-stopped
226
+ ports:
227
+ - "6379:6379"
228
+ ${jaegerService}
229
+ volumes:
230
+ ysk_kit_pg:
231
+ `;
232
+ const sqliteCompose = `services:
233
+ redis:
234
+ image: redis:8.10-alpine
235
+ restart: unless-stopped
236
+ ports:
237
+ - "6379:6379"
238
+ ${jaegerService}`;
239
+ const pgCreatePrisma = `import { PrismaPg } from '@prisma/adapter-pg';
240
+ import { PrismaClient } from '../generated/prisma/client';
241
+
242
+ export type { PrismaClient };
243
+
244
+ export const createPrisma = (databaseUrl: string): PrismaClient => {
245
+ const adapter = new PrismaPg({ connectionString: databaseUrl });
246
+ return new PrismaClient({ adapter });
247
+ };
248
+ `;
249
+ const sqliteCreatePrisma = `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
250
+ import { PrismaClient } from '../generated/prisma/client';
251
+
252
+ export type { PrismaClient };
253
+
254
+ export const createPrisma = (databaseUrl: string): PrismaClient => {
255
+ const adapter = new PrismaBetterSqlite3({ url: databaseUrl });
256
+ return new PrismaClient({ adapter });
257
+ };
258
+ `;
259
+ const rewritePrismaAdapter = (dest, db) => {
260
+ const createPath = join(dest, 'apps/api/src/infra/create-prisma.ts');
261
+ if (!existsSync(createPath))
262
+ return;
263
+ if (db === 'postgresql') {
264
+ writeFileSync(createPath, pgCreatePrisma);
265
+ return;
266
+ }
267
+ if (db === 'sqlite') {
268
+ writeFileSync(createPath, sqliteCreatePrisma);
269
+ }
270
+ };
271
+ export const createYskApp = (opts) => {
272
+ if (!FLAVORS.includes(opts.flavor)) {
273
+ throw new Error(`flavor '${opts.flavor}' is not in this phase. Use --flavor saas, desktop, gateway, php-bridge, trading, or static-web3.`);
274
+ }
275
+ if (!PRESETS.includes(opts.preset)) {
276
+ throw new Error('--preset must be thin or full');
277
+ }
278
+ if (!['mysql', 'postgresql', 'sqlite'].includes(opts.db)) {
279
+ throw new Error('--db must be mysql, postgresql, or sqlite');
280
+ }
281
+ const dest = resolve(opts.dest);
282
+ if (existsSync(dest) && readdirSync(dest).length > 0) {
283
+ throw new Error(`${dest} is not empty`);
284
+ }
285
+ if (opts.flavor === 'php-bridge') {
286
+ return scaffoldPhpBridge(opts, dest);
287
+ }
288
+ const skipApps = new Set();
289
+ const includeAdmin = opts.flavor === 'gateway' || (opts.flavor === 'saas' && opts.admin);
290
+ if (opts.flavor === 'desktop') {
291
+ skipApps.add('web');
292
+ skipApps.add('admin');
293
+ skipApps.add('mobile');
294
+ }
295
+ else if (opts.flavor === 'gateway') {
296
+ skipApps.add('web');
297
+ skipApps.add('mobile');
298
+ skipApps.add('desktop');
299
+ }
300
+ else if (opts.flavor === 'trading') {
301
+ skipApps.add('admin');
302
+ skipApps.add('mobile');
303
+ skipApps.add('desktop');
304
+ }
305
+ else if (opts.flavor === 'static-web3') {
306
+ skipApps.add('api');
307
+ skipApps.add('admin');
308
+ skipApps.add('mobile');
309
+ skipApps.add('desktop');
310
+ }
311
+ else {
312
+ if (!opts.admin)
313
+ skipApps.add('admin');
314
+ if (!opts.mobile)
315
+ skipApps.add('mobile');
316
+ }
317
+ copyTree(opts.kitRoot, dest, opts.kitRoot, skipApps);
318
+ writeAgentStubs(dest, opts.kitRoot);
319
+ const pkgPath = join(dest, 'package.json');
320
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
321
+ pkg.name = opts.name;
322
+ pkg.description = `${opts.name} — generated from YSK Kit ${opts.flavor} flavor`;
323
+ writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
324
+ const envLines = opts.flavor === 'static-web3'
325
+ ? [
326
+ 'NODE_ENV=development',
327
+ 'API_PUBLIC_URL=http://localhost:3001',
328
+ 'WEB_PUBLIC_URL=http://localhost:5173',
329
+ 'ADMIN_PUBLIC_URL=http://localhost:5174',
330
+ ]
331
+ : [
332
+ 'NODE_ENV=development',
333
+ 'API_PORT=3001',
334
+ 'API_PUBLIC_URL=http://localhost:3001',
335
+ 'WEB_PUBLIC_URL=http://localhost:5173',
336
+ includeAdmin ? 'ADMIN_PUBLIC_URL=http://localhost:5174' : '',
337
+ 'REDIS_URL=',
338
+ 'CRYPTO_MASTER_KEY=',
339
+ opts.db === 'mysql'
340
+ ? 'DATABASE_URL=mysql://ysk:ysk@localhost:3306/ysk_kit'
341
+ : opts.db === 'postgresql'
342
+ ? 'DATABASE_URL=postgresql://ysk:ysk@localhost:5432/ysk_kit'
343
+ : 'DATABASE_URL=file:./dev.db',
344
+ 'JWT_SECRET=change-me-in-dev-only',
345
+ 'RATE_LIMIT_MAX=300',
346
+ 'RATE_LIMIT_WINDOW_MS=60000',
347
+ ];
348
+ writeFileSync(join(dest, '.env.example'), `${envLines.filter(Boolean).join('\n')}\n`);
349
+ if (opts.flavor === 'static-web3') {
350
+ writeFileSync(join(dest, 'docker-compose.yml'), '# static-web3: no local database\n');
351
+ }
352
+ else {
353
+ writeFileSync(join(dest, 'docker-compose.yml'), opts.db === 'mysql' ? mysqlCompose : opts.db === 'postgresql' ? pgCompose : sqliteCompose);
354
+ }
355
+ const schemaPath = join(dest, 'apps/api/prisma/schema.prisma');
356
+ if (existsSync(schemaPath)) {
357
+ let schema = readFileSync(schemaPath, 'utf8');
358
+ const provider = opts.db === 'postgresql' ? 'postgresql' : opts.db === 'sqlite' ? 'sqlite' : 'mysql';
359
+ schema = schema.replace(/provider\s*=\s*"mysql"/, `provider = "${provider}"`);
360
+ if (opts.db === 'sqlite') {
361
+ schema = schema.replace(/\s+@db\.[A-Za-z0-9(),]+/g, '');
362
+ }
363
+ writeFileSync(schemaPath, schema);
364
+ rewritePrismaAdapter(dest, opts.db);
365
+ }
366
+ const usesCopyTree = opts.flavor !== 'php-bridge';
367
+ if (opts.preset === 'thin' && usesCopyTree && opts.flavor !== 'static-web3') {
368
+ applyThinPreset(dest);
369
+ }
370
+ writeProductReadme(dest, opts, includeAdmin);
371
+ writeKitMarker(dest, opts);
372
+ if (opts.flavor === 'static-web3') {
373
+ writeFileSync(join(dest, 'WEB3.md'), `# static-web3
374
+
375
+ Language: [中文](WEB3.zh.md) · English
376
+
377
+ Vite web plus \`@ysk-kit/config\` / \`@ysk-kit/sdk\`. This product has no API.
378
+
379
+ - Point \`API_PUBLIC_URL\` at a remote Kit API if the UI needs one.
380
+ - Add wallet connect (viem, wagmi, or similar) in this product.
381
+ `);
382
+ writeFileSync(join(dest, 'WEB3.zh.md'), `# static-web3
383
+
384
+ Language: [English](WEB3.md) · 中文
385
+
386
+ Vite 前端,連同 \`@ysk-kit/config\` / \`@ysk-kit/sdk\`。此產品沒有 API。
387
+
388
+ - 若介面需要後端,將 \`API_PUBLIC_URL\` 指向一套遠端 Kit API。
389
+ - 錢包連線(viem、wagmi 等)寫在此產品內。
390
+ `);
391
+ }
392
+ if (opts.flavor === 'trading') {
393
+ writeFileSync(join(dest, 'TRADING.md'), `# Trading
394
+
395
+ Language: [中文](TRADING.zh.md) · English
396
+
397
+ API + web + worker skeleton. Market data, orders, and exchange connectors stay in this product.
398
+
399
+ - Run \`pnpm worker\` or PM2 \`ysk-worker\` (set \`REDIS_URL\` in production).
400
+ - Enqueue work with \`@ysk-kit/jobs\`.
401
+ `);
402
+ writeFileSync(join(dest, 'TRADING.zh.md'), `# Trading
403
+
404
+ Language: [English](TRADING.md) · 中文
405
+
406
+ API、Web 與 worker 骨架。行情、下單與交易所連接器寫在此產品內。
407
+
408
+ - 執行 \`pnpm worker\` 或 PM2 \`ysk-worker\`(生產環境設定 \`REDIS_URL\`)。
409
+ - 用 \`@ysk-kit/jobs\` 入列工作。
410
+ `);
411
+ }
412
+ if (opts.flavor === 'gateway') {
413
+ writeFileSync(join(dest, 'GATEWAY.md'), `# Gateway
414
+
415
+ Language: [中文](GATEWAY.zh.md) · English
416
+
417
+ This product has API + Admin (no public web, mobile, or desktop).
418
+
419
+ 1. Create a user in Admin or \`POST /v1/auth/register\`.
420
+ 2. Mint a machine token: \`POST /v1/me/api-keys\` with a JWT, then call the API with \`Authorization: Bearer ysk_live_…\`.
421
+ 3. Run \`pnpm worker\` or PM2 \`ysk-worker\` (set \`REDIS_URL\` in production).
422
+ 4. Optional: \`CRYPTO_MASTER_KEY\` (64 hex chars) for \`@ysk-kit/crypto\`.
423
+ `);
424
+ writeFileSync(join(dest, 'GATEWAY.zh.md'), `# Gateway
425
+
426
+ Language: [English](GATEWAY.md) · 中文
427
+
428
+ 此產品包含 API 與 Admin(沒有公開 Web、流動應用或桌面應用)。
429
+
430
+ 1. 在 Admin 建立帳戶,或呼叫 \`POST /v1/auth/register\`。
431
+ 2. 以 JWT 呼叫 \`POST /v1/me/api-keys\` 產生機器權杖,其後以 \`Authorization: Bearer ysk_live_…\` 呼叫 API。
432
+ 3. 執行 \`pnpm worker\` 或 PM2 \`ysk-worker\`(生產環境設定 \`REDIS_URL\`)。
433
+ 4. 可選:為 \`@ysk-kit/crypto\` 設定 \`CRYPTO_MASTER_KEY\`(64 個十六進位字元)。
434
+ `);
435
+ }
436
+ pruneLockfileImporters(dest);
437
+ return dest;
438
+ };
439
+ const kitVersionOf = (kitRoot) => {
440
+ const pkg = JSON.parse(readFileSync(join(kitRoot, 'package.json'), 'utf8'));
441
+ return pkg.version;
442
+ };
443
+ const writeKitMarker = (dest, opts) => {
444
+ const marker = {
445
+ kit: 'ysk-kit',
446
+ version: kitVersionOf(opts.kitRoot),
447
+ flavor: opts.flavor,
448
+ preset: opts.preset,
449
+ db: opts.db,
450
+ };
451
+ writeFileSync(join(dest, '.ysk-kit.json'), `${JSON.stringify(marker, null, 2)}\n`);
452
+ };
453
+ const generatedFromEn = (opts) => {
454
+ const version = kitVersionOf(opts.kitRoot);
455
+ return `Generated from YSK Kit ${version} (\`${opts.flavor}\`, preset \`${opts.preset}\`).
456
+ Refresh guardrails: \`pnpm ysk upgrade\``;
457
+ };
458
+ const generatedFromZh = (opts) => {
459
+ const version = kitVersionOf(opts.kitRoot);
460
+ return `由 YSK Kit ${version} 產生(\`${opts.flavor}\`,preset \`${opts.preset}\`)。
461
+ 更新護欄:\`pnpm ysk upgrade\``;
462
+ };
463
+ const writeProductReadme = (dest, opts, includeAdmin) => {
464
+ const webLine = opts.flavor === 'saas' || opts.flavor === 'trading' || opts.flavor === 'static-web3'
465
+ ? '- Web http://localhost:5173\n'
466
+ : '';
467
+ const adminLine = includeAdmin ? '- Admin http://localhost:5174\n' : '';
468
+ const desktopLine = opts.flavor === 'desktop' ? '- Desktop: pnpm --filter @ysk-kit/desktop start\n' : '';
469
+ const webLineZh = opts.flavor === 'saas' || opts.flavor === 'trading' || opts.flavor === 'static-web3'
470
+ ? '- Web http://localhost:5173\n'
471
+ : '';
472
+ const adminLineZh = includeAdmin ? '- Admin http://localhost:5174\n' : '';
473
+ const desktopLineZh = opts.flavor === 'desktop' ? '- 桌面應用:pnpm --filter @ysk-kit/desktop start\n' : '';
474
+ const compose = opts.db === 'sqlite'
475
+ ? ''
476
+ : `docker compose up -d ${opts.db === 'postgresql' ? 'postgres' : 'mysql'}\n`;
477
+ if (opts.flavor === 'static-web3') {
478
+ writeFileSync(join(dest, 'README.md'), `# ${opts.name}
479
+
480
+ Language: [中文](README.zh.md) · English
481
+
482
+ ${generatedFromEn(opts)}
483
+
484
+ \`\`\`bash
485
+ # Node 24 + pnpm 12
486
+ pnpm install
487
+ cp .env.example .env
488
+ pnpm --filter @ysk-kit/web dev
489
+ \`\`\`
490
+
491
+ ${webLine}
492
+ Documentation: [docs/README.md](docs/README.md).
493
+ `);
494
+ writeFileSync(join(dest, 'README.zh.md'), `# ${opts.name}
495
+
496
+ Language: [English](README.md) · 中文
497
+
498
+ ${generatedFromZh(opts)}
499
+
500
+ \`\`\`bash
501
+ # Node 24 + pnpm 12
502
+ pnpm install
503
+ cp .env.example .env
504
+ pnpm --filter @ysk-kit/web dev
505
+ \`\`\`
506
+
507
+ ${webLineZh}
508
+ 文件:[docs/README.zh.md](docs/README.zh.md)。
509
+ `);
510
+ return;
511
+ }
512
+ writeFileSync(join(dest, 'README.md'), `# ${opts.name}
513
+
514
+ Language: [中文](README.zh.md) · English
515
+
516
+ ${generatedFromEn(opts)}
517
+
518
+ \`\`\`bash
519
+ # Node 24 + pnpm 12
520
+ pnpm install
521
+ cp .env.example .env
522
+ ${compose}pnpm db:generate
523
+ pnpm db:migrate
524
+ pnpm db:seed
525
+ pnpm dev
526
+ \`\`\`
527
+
528
+ - API http://localhost:3001
529
+ ${webLine}${adminLine}${desktopLine}
530
+ After seed, sign in as \`admin@ysk.hk\` / \`ysk-admin-dev\` (see \`.env.example\`).
531
+
532
+ Documentation: [docs/README.md](docs/README.md).
533
+ `);
534
+ writeFileSync(join(dest, 'README.zh.md'), `# ${opts.name}
535
+
536
+ Language: [English](README.md) · 中文
537
+
538
+ ${generatedFromZh(opts)}
539
+
540
+ \`\`\`bash
541
+ # Node 24 + pnpm 12
542
+ pnpm install
543
+ cp .env.example .env
544
+ ${compose}pnpm db:generate
545
+ pnpm db:migrate
546
+ pnpm db:seed
547
+ pnpm dev
548
+ \`\`\`
549
+
550
+ - API http://localhost:3001
551
+ ${webLineZh}${adminLineZh}${desktopLineZh}
552
+ 種子帳戶:\`admin@ysk.hk\` / \`ysk-admin-dev\`(見 \`.env.example\`)。
553
+
554
+ 文件:[docs/README.zh.md](docs/README.zh.md)。
555
+ `);
556
+ };
557
+ const copyDirReplace = (from, to, name) => {
558
+ mkdirSync(to, { recursive: true });
559
+ for (const entry of readdirSync(from)) {
560
+ const source = join(from, entry);
561
+ const dest = join(to, entry);
562
+ if (statSync(source).isDirectory()) {
563
+ copyDirReplace(source, dest, name);
564
+ continue;
565
+ }
566
+ const raw = readFileSync(source, 'utf8');
567
+ writeFileSync(dest, raw.replaceAll('__NAME__', name));
568
+ }
569
+ };
570
+ const scaffoldPhpBridge = (opts, dest) => {
571
+ const here = dirname(fileURLToPath(import.meta.url));
572
+ const fromKit = join(opts.kitRoot, 'tooling/create-ysk-app/templates/php-bridge');
573
+ const fromPkg = join(here, '../templates/php-bridge');
574
+ const templates = existsSync(fromKit) ? fromKit : fromPkg;
575
+ if (!existsSync(templates)) {
576
+ throw new Error('php-bridge templates missing');
577
+ }
578
+ const slug = opts.name
579
+ .toLowerCase()
580
+ .replace(/[^a-z0-9]+/g, '-')
581
+ .replace(/^-|-$/g, '') || 'app';
582
+ copyDirReplace(templates, dest, slug);
583
+ mkdirSync(join(dest, 'docs'), { recursive: true });
584
+ const openapi = join(opts.kitRoot, 'docs/openapi.yaml');
585
+ if (!existsSync(openapi)) {
586
+ throw new Error('docs/openapi.yaml missing; run pnpm gen:openapi in the kit');
587
+ }
588
+ writeFileSync(join(dest, 'docs/openapi.yaml'), readFileSync(openapi));
589
+ writeFileSync(join(dest, 'README.md'), `# ${opts.name}
590
+
591
+ Language: [中文](README.zh.md) · English
592
+
593
+ ${generatedFromEn(opts)}
594
+
595
+ PHP and TypeScript clients generated from YSK Kit. Point them at an existing Kit API.
596
+
597
+ \`\`\`bash
598
+ # TypeScript
599
+ cd ts && node --experimental-strip-types
600
+ # PHP
601
+ cd php && composer dump-autoload
602
+ \`\`\`
603
+
604
+ \`YskClient\` / \`createClient\` unwrap \`{ ok, data }\` / \`{ ok, error }\`. Use \`request(method, path, body?)\` for any OpenAPI path. Set \`API_PUBLIC_URL\` (default http://localhost:3001).
605
+
606
+ See \`docs/openapi.yaml\`.
607
+ `);
608
+ writeFileSync(join(dest, 'README.zh.md'), `# ${opts.name}
609
+
610
+ Language: [English](README.md) · 中文
611
+
612
+ ${generatedFromZh(opts)}
613
+
614
+ 由 YSK Kit 產生的 PHP 與 TypeScript 客戶端。請指向一套現有的 Kit API。
615
+
616
+ \`\`\`bash
617
+ # TypeScript
618
+ cd ts && node --experimental-strip-types
619
+ # PHP
620
+ cd php && composer dump-autoload
621
+ \`\`\`
622
+
623
+ \`YskClient\` / \`createClient\` 會解開 \`{ ok, data }\` / \`{ ok, error }\`。其餘 OpenAPI 路徑用 \`request(method, path, body?)\`。設定 \`API_PUBLIC_URL\`(預設 http://localhost:3001)。
624
+
625
+ 見 \`docs/openapi.yaml\`。
626
+ `);
627
+ writeKitMarker(dest, opts);
628
+ return dest;
629
+ };
630
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/dist/thin.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const applyThinPreset: (dest: string) => void;
2
+ //# sourceMappingURL=thin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thin.d.ts","sourceRoot":"","sources":["../src/thin.ts"],"names":[],"mappings":"AAoOA,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,IAoO9C,CAAC"}