@kyro-cms/core 0.9.9 → 0.10.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.
Files changed (68) hide show
  1. package/dist/api-handler-graphql.cjs +11 -11
  2. package/dist/api-handler-graphql.js +7 -7
  3. package/dist/api-handler-trpc.cjs +9 -9
  4. package/dist/api-handler-trpc.js +7 -7
  5. package/dist/api-handler.cjs +10 -10
  6. package/dist/api-handler.js +7 -7
  7. package/dist/{bootstrap-4CELFLJO.cjs → bootstrap-FUAPY2OF.cjs} +9 -9
  8. package/dist/{bootstrap-4CELFLJO.cjs.map → bootstrap-FUAPY2OF.cjs.map} +1 -1
  9. package/dist/bootstrap-OXNVM7FP.js +7 -0
  10. package/dist/{bootstrap-3PV3GJ3S.js.map → bootstrap-OXNVM7FP.js.map} +1 -1
  11. package/dist/{chunk-5RFGYEQ3.js → chunk-354ISGA4.js} +5 -23
  12. package/dist/chunk-354ISGA4.js.map +1 -0
  13. package/dist/{chunk-E4JZ73FY.cjs → chunk-3P5AHK2U.cjs} +11 -24
  14. package/dist/chunk-3P5AHK2U.cjs.map +1 -0
  15. package/dist/{chunk-BVUDFKKS.js → chunk-526M5MOA.js} +6 -8
  16. package/dist/chunk-526M5MOA.js.map +1 -0
  17. package/dist/{chunk-5PMQQFRE.cjs → chunk-5GFQPHGT.cjs} +6 -9
  18. package/dist/chunk-5GFQPHGT.cjs.map +1 -0
  19. package/dist/{chunk-OYCICW4B.js → chunk-AN2L2CJZ.js} +4 -17
  20. package/dist/chunk-AN2L2CJZ.js.map +1 -0
  21. package/dist/{chunk-RFFSZSCL.cjs → chunk-GYIJ3JJM.cjs} +3 -11
  22. package/dist/chunk-GYIJ3JJM.cjs.map +1 -0
  23. package/dist/{chunk-PQ72Z6WC.js → chunk-GZS4LMR7.js} +2 -5
  24. package/dist/chunk-GZS4LMR7.js.map +1 -0
  25. package/dist/{chunk-GAAHG2Z4.js → chunk-HY6B7B5A.js} +4 -7
  26. package/dist/chunk-HY6B7B5A.js.map +1 -0
  27. package/dist/{chunk-IEIHABVR.cjs → chunk-ISKYUUP4.cjs} +15 -33
  28. package/dist/chunk-ISKYUUP4.cjs.map +1 -0
  29. package/dist/{chunk-6UNONDW7.js → chunk-N5QSHUA6.js} +2 -11
  30. package/dist/chunk-N5QSHUA6.js.map +1 -0
  31. package/dist/{chunk-OXYSOU6Z.cjs → chunk-NQJJYRLP.cjs} +11 -13
  32. package/dist/chunk-NQJJYRLP.cjs.map +1 -0
  33. package/dist/{chunk-Q23GAMLE.cjs → chunk-THBQG64D.cjs} +2 -5
  34. package/dist/chunk-THBQG64D.cjs.map +1 -0
  35. package/dist/{chunk-Y7AQK4R4.cjs → chunk-VKREAIBA.cjs} +2 -11
  36. package/dist/chunk-VKREAIBA.cjs.map +1 -0
  37. package/dist/{chunk-V7KZQIZ6.js → chunk-XHAAAEXX.js} +2 -10
  38. package/dist/chunk-XHAAAEXX.js.map +1 -0
  39. package/dist/cli/index.cjs +1 -41
  40. package/dist/cli/index.cjs.map +1 -1
  41. package/dist/cli/index.js +1 -41
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/drizzle/index.cjs +9 -9
  44. package/dist/drizzle/index.js +1 -1
  45. package/dist/index.cjs +62 -64
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.js +8 -10
  48. package/dist/index.js.map +1 -1
  49. package/dist/mongodb/index.cjs +3 -3
  50. package/dist/mongodb/index.js +1 -1
  51. package/dist/rest/index.cjs +6 -6
  52. package/dist/rest/index.js +4 -4
  53. package/package.json +1 -1
  54. package/dist/bootstrap-3PV3GJ3S.js +0 -7
  55. package/dist/chunk-5PMQQFRE.cjs.map +0 -1
  56. package/dist/chunk-5RFGYEQ3.js.map +0 -1
  57. package/dist/chunk-6UNONDW7.js.map +0 -1
  58. package/dist/chunk-BVUDFKKS.js.map +0 -1
  59. package/dist/chunk-E4JZ73FY.cjs.map +0 -1
  60. package/dist/chunk-GAAHG2Z4.js.map +0 -1
  61. package/dist/chunk-IEIHABVR.cjs.map +0 -1
  62. package/dist/chunk-OXYSOU6Z.cjs.map +0 -1
  63. package/dist/chunk-OYCICW4B.js.map +0 -1
  64. package/dist/chunk-PQ72Z6WC.js.map +0 -1
  65. package/dist/chunk-Q23GAMLE.cjs.map +0 -1
  66. package/dist/chunk-RFFSZSCL.cjs.map +0 -1
  67. package/dist/chunk-V7KZQIZ6.js.map +0 -1
  68. package/dist/chunk-Y7AQK4R4.cjs.map +0 -1
@@ -332,18 +332,14 @@ function createGenerateCommand() {
332
332
  process.exit(1);
333
333
  }
334
334
  const outputPath2 = path.resolve(options.output);
335
- console.log("\u{1F527} Generating types from:", options.url);
336
335
  try {
337
336
  const collections = await fetchRemoteSchema(options.url, options.apiKey);
338
- console.log(`\u{1F4E6} Found ${collections.length} collection(s):`);
339
- collections.forEach((c) => console.log(` - ${c.slug}`));
340
337
  const types = generateRemoteTypes(collections);
341
338
  const outputDir = path.join(outputPath2, "..");
342
339
  if (!fs.existsSync(outputDir)) {
343
340
  fs.mkdirSync(outputDir, { recursive: true });
344
341
  }
345
342
  fs.writeFileSync(outputPath2, types);
346
- console.log(`\u2705 Types generated at: ${outputPath2}`);
347
343
  } catch (error) {
348
344
  console.error("\u274C Error:", error.message);
349
345
  process.exit(1);
@@ -352,7 +348,6 @@ function createGenerateCommand() {
352
348
  }
353
349
  const configPath = path.resolve(options.config);
354
350
  const outputPath = path.resolve(options.output);
355
- console.log("\u{1F527} Generating types from:", configPath);
356
351
  try {
357
352
  const configFiles = await glob.glob(`${configPath}/**/*.{ts,js}`);
358
353
  if (configFiles.length === 0) {
@@ -373,21 +368,15 @@ function createGenerateCommand() {
373
368
  console.error("\u274C No valid collection configs found");
374
369
  process.exit(1);
375
370
  }
376
- console.log(`\u{1F4E6} Found ${collections.length} collection(s):`);
377
- collections.forEach((c) => console.log(` - ${c.slug}`));
378
371
  const types = generateTypes(collections);
379
372
  const outputDir = path.join(outputPath, "..");
380
373
  if (!fs.existsSync(outputDir)) {
381
374
  fs.mkdirSync(outputDir, { recursive: true });
382
375
  }
383
376
  fs.writeFileSync(outputPath, types);
384
- console.log(`\u2705 Types generated at: ${outputPath}`);
385
377
  if (options.watch) {
386
- console.log("\n\u{1F441}\uFE0F Watching for changes...");
387
378
  const { watch } = await import('fs');
388
379
  watch(configPath, { recursive: true }, async (eventType, filename) => {
389
- console.log(`
390
- \u{1F504} File changed: ${filename}`);
391
380
  const newCollections = [];
392
381
  for (const file of configFiles) {
393
382
  try {
@@ -399,7 +388,6 @@ function createGenerateCommand() {
399
388
  }
400
389
  const newTypes = generateTypes(newCollections);
401
390
  fs.writeFileSync(outputPath, newTypes);
402
- console.log("\u2705 Types regenerated");
403
391
  });
404
392
  }
405
393
  } catch (error) {
@@ -424,9 +412,6 @@ try {
424
412
  var program = new commander.Command();
425
413
  program.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(version);
426
414
  program.command("dev").description("Start Kyro CMS development server").option("-p, --port <port>", "Port to run on", "4321").option("-h, --host <host>", "Host to bind to", "localhost").action(async (options) => {
427
- console.log("\u{1F680} Starting Kyro CMS development server...");
428
- console.log(` Port: ${options.port}`);
429
- console.log(` Host: ${options.host}`);
430
415
  const { exec } = await import('child_process');
431
416
  const child = exec(`astro dev --port ${options.port} --host ${options.host}`, {
432
417
  env: { ...process.env, NODE_NO_WARNINGS: "1" }
@@ -445,51 +430,42 @@ program.command("dev").description("Start Kyro CMS development server").option("
445
430
  program.addCommand(createGenerateCommand());
446
431
  var dbCommand = program.command("db").description("Database management commands");
447
432
  dbCommand.command("generate").description("Generate migrations from schema").action(async () => {
448
- console.log("\u{1F4DD} Generating migrations...");
449
433
  const { exec } = await import('child_process');
450
434
  exec("npx drizzle-kit generate", (error, stdout, stderr) => {
451
435
  if (error) {
452
436
  console.error("\u274C Generation failed:", error.message);
453
437
  process.exit(1);
454
438
  }
455
- console.log(stdout);
456
439
  });
457
440
  });
458
441
  dbCommand.command("migrate").description("Run database migrations").action(async () => {
459
- console.log("\u{1F504} Running migrations...");
460
442
  const { exec } = await import('child_process');
461
443
  exec("npx drizzle-kit migrate", (error, stdout, stderr) => {
462
444
  if (error) {
463
445
  console.error("\u274C Migration failed:", error.message);
464
446
  process.exit(1);
465
447
  }
466
- console.log(stdout);
467
448
  });
468
449
  });
469
450
  dbCommand.command("push").description("Push schema to database (development)").action(async () => {
470
- console.log("\u{1F504} Pushing schema...");
471
451
  const { exec } = await import('child_process');
472
452
  exec("npx drizzle-kit push", (error, stdout, stderr) => {
473
453
  if (error) {
474
454
  console.error("\u274C Push failed:", error.message);
475
455
  process.exit(1);
476
456
  }
477
- console.log(stdout);
478
457
  });
479
458
  });
480
459
  dbCommand.command("seed").description("Seed database with initial data").action(async () => {
481
- console.log("\u{1F331} Seeding database...");
482
460
  const { exec } = await import('child_process');
483
461
  exec("npx tsx src/database/drizzle/seed.ts", (error, stdout, stderr) => {
484
462
  if (error) {
485
463
  console.error("\u274C Seeding failed:", error.message);
486
464
  process.exit(1);
487
465
  }
488
- console.log(stdout);
489
466
  });
490
467
  });
491
468
  dbCommand.command("studio").description("Open Drizzle Studio").action(async () => {
492
- console.log("\u{1F513} Opening Drizzle Studio...");
493
469
  const { exec } = await import('child_process');
494
470
  exec("npx drizzle-kit studio", (error, stdout, stderr) => {
495
471
  if (error) {
@@ -514,11 +490,8 @@ authCommand.command("bootstrap").description("Create initial admin user").option
514
490
  );
515
491
  process.exit(1);
516
492
  }
517
- console.log("\u{1F464} Creating admin user...");
518
- console.log(` Email: ${options.email}`);
519
- console.log(` Role: ${options.role}`);
520
493
  try {
521
- const { bootstrapAdmin } = await import('../bootstrap-4CELFLJO.cjs');
494
+ const { bootstrapAdmin } = await import('../bootstrap-FUAPY2OF.cjs');
522
495
  const databaseUrl = process.env.DATABASE_URL || "";
523
496
  const isPostgres = databaseUrl.toLowerCase().startsWith("postgres://") || databaseUrl.toLowerCase().startsWith("postgresql://");
524
497
  const isMongo = databaseUrl.toLowerCase().startsWith("mongodb://") || databaseUrl.toLowerCase().startsWith("mongodb+srv://");
@@ -532,7 +505,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
532
505
  } });
533
506
  const db = drizzle(client);
534
507
  adapter = new PostgresAuthAdapter({ db });
535
- console.log(" Database: PostgreSQL");
536
508
  } else if (isMongo) {
537
509
  const { MongoDBAuthAdapter } = await import('../mongo-auth-adapter-GT4S7SCU.cjs');
538
510
  const { MongoClient } = await import('mongodb');
@@ -540,12 +512,10 @@ authCommand.command("bootstrap").description("Create initial admin user").option
540
512
  await client.connect();
541
513
  const db = client.db();
542
514
  adapter = new MongoDBAuthAdapter({ db });
543
- console.log(" Database: MongoDB");
544
515
  } else {
545
516
  const { SQLiteAuthAdapter } = await import('../sqlite-adapter-AQB5TCGV.cjs');
546
517
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
547
518
  adapter = new SQLiteAuthAdapter({ path: authDbPath });
548
- console.log(" Database: SQLite");
549
519
  }
550
520
  if (adapter.connect) {
551
521
  await adapter.connect();
@@ -560,7 +530,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
560
530
  await adapter.disconnect();
561
531
  }
562
532
  if (result.success) {
563
- console.log("\u2705 Admin user created successfully!");
564
533
  } else {
565
534
  console.error("\u274C Failed to create admin:", result.error);
566
535
  process.exit(1);
@@ -571,7 +540,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
571
540
  }
572
541
  });
573
542
  program.command("health").description("Check system health").action(async () => {
574
- console.log("\u{1F3E5} System Health Check");
575
543
  const databaseUrl = process.env.DATABASE_URL || "";
576
544
  const isPostgres = databaseUrl.toLowerCase().startsWith("postgres://") || databaseUrl.toLowerCase().startsWith("postgresql://");
577
545
  const isMongo = databaseUrl.toLowerCase().startsWith("mongodb://") || databaseUrl.toLowerCase().startsWith("mongodb+srv://");
@@ -582,10 +550,8 @@ program.command("health").description("Check system health").action(async () =>
582
550
  const client = postgres(databaseUrl, { max: 1, onnotice: () => {
583
551
  } });
584
552
  await client.unsafe("SELECT 1");
585
- console.log(" \u2705 Database (PostgreSQL): Connected");
586
553
  await client.end();
587
554
  } catch {
588
- console.log(" \u274C Database (PostgreSQL): Not connected");
589
555
  }
590
556
  } else if (isMongo) {
591
557
  try {
@@ -593,25 +559,19 @@ program.command("health").description("Check system health").action(async () =>
593
559
  const client = new MongoClient(databaseUrl);
594
560
  await client.connect();
595
561
  await client.db().admin().ping();
596
- console.log(" \u2705 Database (MongoDB): Connected");
597
562
  await client.close();
598
563
  } catch {
599
- console.log(" \u274C Database (MongoDB): Not connected");
600
564
  }
601
565
  } else if (isSQLite) {
602
566
  try {
603
567
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
604
568
  const { existsSync: existsSync2 } = await import('fs');
605
569
  if (existsSync2(authDbPath)) {
606
- console.log(` \u2705 Database (SQLite): File exists at ${authDbPath}`);
607
570
  } else {
608
- console.log(` \u26A0\uFE0F Database (SQLite): No file yet at ${authDbPath} (will be created on first run)`);
609
571
  }
610
572
  } catch {
611
- console.log(" \u274C Database (SQLite): Error checking file");
612
573
  }
613
574
  }
614
- console.log(" \u2705 API: Running");
615
575
  });
616
576
  program.parse();
617
577
  if (!process.argv.slice(2).length) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["Command","outputPath","resolve","join","existsSync","mkdirSync","writeFileSync","glob","__filename","fileURLToPath","__dirname","dirname","readFileSync"],"mappings":";;;;;;;;;;;AAyBA,SAAS,YAAY,KAAA,EAA4B;AAC/C,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,KAAA,CAAM,UAAU,UAAA,GAAa,QAAA;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,OAAO,KAAA,CAAM,UAAU,UAAA,GAAa,QAAA;AAAA,IACtC,KAAK,UAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAChE,QAAA,OAAO,KAAA,CAAM,OAAA,GAAU,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,CAAA,GAAQ,MAAA;AAAA,MAC3C;AACA,MAAA,OAAO,KAAA,CAAM,UAAU,UAAA,GAAa,QAAA;AAAA,IACtC,KAAK,cAAA;AACH,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,EAAG;AACnC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC/E,QAAA,OAAO,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,CAAA,GAAQ,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACnD;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,IAAc,SAAA;AAClC,MAAA,OAAO,KAAA,CAAM,OAAA,GAAU,CAAA,CAAA,EAAI,UAAA,CAAW,KAAK,CAAC,CAAA,YAAA,CAAA,GAAiB,CAAA,EAAG,UAAA,CAAW,KAAK,CAAC,CAAA,SAAA,CAAA;AAAA,IACnF,KAAK,QAAA;AACH,MAAA,OAAO,KAAA,CAAM,UAAU,oBAAA,GAAuB,gBAAA;AAAA,IAChD,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3D,UAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,UAAA,OAAO,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,EAAG,EAAE,QAAA,GAAW,EAAA,GAAK,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAAA,QACvD,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACZ,QAAA,OAAO,CAAA;AAAA,EAAY,UAAU;AAAA,IAAA,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,uBAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK;AAC3D,UAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,UAAA,OAAO,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,EAAG,EAAE,QAAA,GAAW,EAAA,GAAK,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAAA,QACrD,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACZ,QAAA,OAAO,CAAA;AAAA,EAAM,UAAU;AAAA,CAAA,CAAA;AAAA,MACzB;AACA,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AAC5G;AAEA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AACrE;AAEA,SAAS,sBAAsB,UAAA,EAAsC;AACnE,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK;AAC5D,IAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,IAAA,OAAO,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,EAAG,EAAE,QAAA,GAAW,EAAA,GAAK,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAAA,EACrD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AAC9B,EAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,EAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAElC,EAAA,OAAO,oBAAoB,IAAI,CAAA;AAAA,EAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CAAA;AACzD;AAEA,SAAS,cAAc,WAAA,EAAyC;AAC9D,EAAA,MAAM,aAAa,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,qBAAA,CAAsB,CAAC,CAAC,CAAA;AAEhE,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AAyBf,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,EA+Df,YAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,EAAE,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,EAAE,IAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAAA,EAiB7E,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,mBAAA,EAAsB,EAAE,IAAI,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASxF,EAAA,OAAO,SAAS,IAAA,GAAO,MAAA;AACzB;AAMA,eAAe,iBAAA,CAAkB,KAAa,MAAA,EAAgC;AAC5E,EAAA,MAAM,YAAY,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,aAAA,CAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA,EAAW;AAAA,IACjC,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,GAC9C,CAAA;AACD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AAEA,SAAS,oBAAoB,WAAA,EAA4B;AACvD,EAAA,IAAI,MAAA,GAAS,CAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AAyBb,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,CAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAW;AACnE,MAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,OAAO,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,EAAG,EAAE,QAAA,GAAW,EAAA,GAAK,GAAG,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IACrD,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AAC9B,IAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,IAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,IAAA,MAAA,IAAU,oBAAoB,IAAI,CAAA;AAAA,EAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAA,IAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAuCV,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAa;AAC9B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,OAAO,CAAA,IAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA;AAAA,wBAAA,EAEP,IAAI,CAAA,0GAAA,EAA6G,GAAA,CAAI,IAAI,CAAA;AAAA;AAAA,gBAAA,EAEjI,IAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,CAAA;AAAA;AAAA,wBAAA,EAEZ,IAAI,CAAA,SAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,6BAAA,EACnB,IAAI,CAAA;AAAA,uBAAA,EACV,IAAI,CAAA,yBAAA,EAA4B,GAAA,CAAI,IAAI,CAAA;AAAA,yCAAA,EACtB,IAAI,CAAA;AAAA,uBAAA,EACtB,IAAI,CAAA,yBAAA,EAA4B,GAAA,CAAI,IAAI,CAAA;AAAA;AAAA,uBAAA,EAExC,IAAI,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA;AAAA;AAAA,0CAAA,EAEpB,IAAI,IAAI,CAAA;AAAA,MAAA,CAAA;AAAA,EAEpD,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA,CAAA;AAKX,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,qBAAA,GAAiC;AAC/C,EAAA,MAAM,QAAA,GAAW,IAAIA,iBAAA,CAAQ,UAAU,EACpC,WAAA,CAAY,mDAAmD,CAAA,CAC/D,MAAA,CAAO,qBAAA,EAAuB,kCAAA,EAAoC,YAAY,CAAA,CAC9E,OAAO,qBAAA,EAAuB,kBAAA,EAAoB,uBAAuB,CAAA,CACzE,MAAA,CAAO,aAAA,EAAe,kCAAkC,CAAA,CACxD,OAAO,aAAA,EAAe,0DAA0D,CAAA,CAChF,MAAA,CAAO,iBAAA,EAAmB,kDAAkD,CAAA,CAC5E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,QAAA,OAAA,CAAQ,MAAM,2CAAsC,CAAA;AACpD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,OAAA,CAAQ,MAAM,+CAA0C,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,MAAMC,WAAAA,GAAaC,YAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,kCAAA,EAA6B,OAAA,CAAQ,GAAG,CAAA;AAEpD,MAAA,IAAI;AACF,QAAA,MAAM,cAAc,MAAM,iBAAA,CAAkB,OAAA,CAAQ,GAAA,EAAK,QAAQ,MAAM,CAAA;AACvE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAY,WAAA,CAAY,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC3D,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAW,OAAA,CAAQ,IAAI,CAAA,KAAA,EAAQ,CAAA,CAAE,IAAI,CAAA,CAAE,CAAC,CAAA;AAE7D,QAAA,MAAM,KAAA,GAAQ,oBAAoB,WAAW,CAAA;AAE7C,QAAA,MAAM,SAAA,GAAYC,SAAA,CAAKF,WAAAA,EAAY,IAAI,CAAA;AACvC,QAAA,IAAI,CAACG,aAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,UAAAC,YAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,QAC1C;AACA,QAAAC,gBAAA,CAAcL,aAAY,KAAK,CAAA;AAC/B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyBA,WAAU,CAAA,CAAE,CAAA;AAAA,MACnD,SAAS,KAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACvC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAaC,YAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAaA,YAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAEzC,IAAA,OAAA,CAAQ,GAAA,CAAI,oCAA6B,UAAU,CAAA;AAEnD,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAMK,SAAA,CAAK,CAAA,EAAG,UAAU,CAAA,aAAA,CAAe,CAAA;AAE3D,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAA+B,UAAU,CAAA;AACvD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAGA,MAAA,MAAM,cAAkC,EAAC;AAEzC,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,IAAI;AAEF,UAAA,MAAM,GAAA,GAAM,MAAM,OAAO,IAAA,CAAA;AACzB,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,MAAM,CAAA;AAC7E,UAAA,WAAA,CAAY,IAAA,CAAK,GAAI,OAA8B,CAAA;AAAA,QACrD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,MAAM,0CAAqC,CAAA;AACnD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAY,WAAA,CAAY,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC3D,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AAGtD,MAAA,MAAM,KAAA,GAAQ,cAAc,WAAW,CAAA;AAGvC,MAAA,MAAM,SAAA,GAAYJ,SAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AACvC,MAAA,IAAI,CAACC,aAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,QAAAC,YAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,MAC1C;AAEA,MAAAC,gBAAA,CAAc,YAAY,KAAK,CAAA;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyB,UAAU,CAAA,CAAE,CAAA;AAGjD,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,OAAA,CAAQ,IAAI,4CAAgC,CAAA;AAC5C,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,IAAI,CAAA;AACnC,QAAA,KAAA,CAAM,YAAY,EAAE,SAAA,EAAW,MAAK,EAAG,OAAO,WAAW,QAAA,KAAa;AACpE,UAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,wBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAE5C,UAAA,MAAM,iBAAqC,EAAC;AAC5C,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,IAAI;AACF,cAAA,MAAM,MAAM,MAAM,OAAO,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA;AAChD,cAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAW,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,MAAM,CAAA;AAC7E,cAAA,cAAA,CAAe,IAAA,CAAK,GAAI,OAA8B,CAAA;AAAA,YACxD,CAAA,CAAA,MAAQ;AAAA,YAAC;AAAA,UACX;AACA,UAAA,MAAM,QAAA,GAAW,cAAc,cAAc,CAAA;AAC7C,UAAAA,gBAAA,CAAc,YAAY,QAAQ,CAAA;AAClC,UAAA,OAAA,CAAQ,IAAI,0BAAqB,CAAA;AAAA,QACnC,CAAC,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAY,KAAA,CAAM,OAAO,CAAA;AACvC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,QAAA;AACT;;;ACzcA,IAAME,YAAA,GAAaC,iBAAA,CAAc,2PAAe,CAAA;AAChD,IAAMC,WAAA,GAAYC,aAAQH,YAAU,CAAA;AAGpC,IAAI,OAAA,GAAU,OAAA;AACd,IAAI;AACF,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA;AAAA,IACfI,eAAAA,CAAaT,SAAAA,CAAKO,WAAA,EAAW,oBAAoB,GAAG,OAAO;AAAA,GAC7D;AACA,EAAA,OAAA,GAAU,GAAA,CAAI,OAAA;AAChB,CAAA,CAAA,MAAQ;AAAC;AAET,IAAM,OAAA,GAAU,IAAIV,iBAAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,MAAM,CAAA,CACX,YAAY,sCAAsC,CAAA,CAClD,QAAQ,OAAO,CAAA;AAGlB,OAAA,CACG,QAAQ,KAAK,CAAA,CACb,YAAY,mCAAmC,CAAA,CAC/C,OAAO,mBAAA,EAAqB,gBAAA,EAAkB,MAAM,CAAA,CACpD,OAAO,mBAAA,EAAqB,iBAAA,EAAmB,WAAW,CAAA,CAC1D,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,OAAA,CAAQ,IAAI,mDAA4C,CAAA;AACxD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACtC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAEtC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,IAC5E,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,kBAAkB,GAAA;AAAI,GAC9C,CAAA;AAED,EAAA,KAAA,CAAM,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAC,SAAS,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAC7D,EAAA,KAAA,CAAM,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAC,SAAS,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAE7D,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AACzB,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,MAAM;AAC1B,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,OAAA,CAAQ,UAAA,CAAW,uBAAuB,CAAA;AAG1C,IAAM,YAAY,OAAA,CACf,OAAA,CAAQ,IAAI,CAAA,CACZ,YAAY,8BAA8B,CAAA;AAG7C,SAAA,CACG,QAAQ,UAAU,CAAA,CAClB,YAAY,iCAAiC,CAAA,CAC7C,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,oCAA6B,CAAA;AACzC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,IAAA,CAAK,0BAAA,EAA4B,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW;AAC1D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAAA,EAAwB,KAAA,CAAM,OAAO,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,SAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,yBAAyB,CAAA,CACrC,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,iCAA0B,CAAA;AACtC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,IAAA,CAAK,yBAAA,EAA2B,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW;AACzD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAAA,EAAuB,KAAA,CAAM,OAAO,CAAA;AAClD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,uCAAuC,CAAA,CACnD,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,6BAAsB,CAAA;AAClC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,IAAA,CAAK,sBAAA,EAAwB,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW;AACtD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAA,EAAkB,KAAA,CAAM,OAAO,CAAA;AAC7C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,iCAAiC,CAAA,CAC7C,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,+BAAwB,CAAA;AACpC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,IAAA,CAAK,sCAAA,EAAwC,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW;AACtE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAA,EAAqB,KAAA,CAAM,OAAO,CAAA;AAChD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EACpB,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,SAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,qBAAqB,CAAA,CACjC,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,qCAA8B,CAAA;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,eAAe,CAAA;AAC7C,EAAA,IAAA,CAAK,wBAAA,EAA0B,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW;AACxD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAA,EAAoB,KAAA,CAAM,OAAO,CAAA;AAC/C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACH,CAAC,CAAA;AAGH,IAAM,cAAc,OAAA,CACjB,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,oCAAoC,CAAA;AAGnD,WAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,qBAAA,EAAuB,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA,CACzE,MAAA;AAAA,EACC,2BAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAQ,GAAA,CAAI;AACd,CAAA,CACC,MAAA;AAAA,EACC,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA,CAAQ,IAAI,eAAA,IAAmB;AACjC,CAAA,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,QAAA,EAAU;AACvC,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,IAAI,kCAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAEtC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,2BAAsB,CAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,EAAA;AAChD,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,aAAa,CAAA,IAAK,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,eAAe,CAAA;AAC9H,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,YAAY,CAAA,IAAK,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,gBAAgB,CAAA;AAC3H,IAAA,MAAM,QAAA,GAAW,CAAC,WAAA,IAAe,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAA,CAAY,SAAS,OAAO,CAAA;AAE9H,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,MAAM,OAAO,uCAA8C,CAAA;AAC3F,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,yBAAyB,CAAA;AAC1D,MAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,MAAA,MAAM,SAAS,QAAA,CAAS,WAAA,EAAa,EAAE,GAAA,EAAK,CAAA,EAAG,UAAU,MAAM;AAAA,MAAC,GAAG,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,QAAQ,MAAM,CAAA;AACzB,MAAA,OAAA,GAAU,IAAI,mBAAA,CAAoB,EAAE,EAAA,EAAI,CAAA;AACxC,MAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AAAA,IACvC,WAAW,OAAA,EAAS;AAClB,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,MAAM,OAAO,oCAA2C,CAAA;AACvF,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,SAAS,CAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,WAAW,CAAA;AAC1C,MAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,MAAA,MAAM,EAAA,GAAK,OAAO,EAAA,EAAG;AACrB,MAAA,OAAA,GAAU,IAAI,kBAAA,CAAmB,EAAE,EAAA,EAAI,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,sBAAsB,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,gCAA2B,CAAA;AACtE,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,gBAAA;AACpD,MAAA,OAAA,GAAU,IAAI,iBAAA,CAAkB,EAAE,IAAA,EAAM,YAAY,CAAA;AACpD,MAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAAA,IACxB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,MAClC,WAAA,EAAa,OAAA;AAAA,MACb,YAAY,OAAA,CAAQ,KAAA;AAAA,MACpB,eAAe,OAAA,CAAQ,QAAA;AAAA,MACvB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAM,QAAQ,UAAA,EAAW;AAAA,IAC3B;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,IAAI,yCAAoC,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAA,EAA6B,MAAA,CAAO,KAAK,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAAuB,KAAK,CAAA;AAC1C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,qBAAqB,CAAA,CACjC,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,IAAI,+BAAwB,CAAA;AAEpC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,EAAA;AAChD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,aAAa,CAAA,IAAK,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,eAAe,CAAA;AAC9H,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,YAAY,CAAA,IAAK,WAAA,CAAY,WAAA,EAAY,CAAE,UAAA,CAAW,gBAAgB,CAAA;AAC3H,EAAA,MAAM,QAAA,GAAW,CAAC,WAAA,IAAe,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAA,CAAY,SAAS,OAAO,CAAA;AAE9H,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,MAAM,OAAO,UAAU,CAAA;AACrD,MAAA,MAAM,SAAS,QAAA,CAAS,WAAA,EAAa,EAAE,GAAA,EAAK,CAAA,EAAG,UAAU,MAAM;AAAA,MAAC,GAAG,CAAA;AACnE,MAAA,MAAM,MAAA,CAAO,OAAO,UAAU,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAI,4CAAuC,CAAA;AACnD,MAAA,MAAM,OAAO,GAAA,EAAI;AAAA,IACnB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,IAAI,gDAA2C,CAAA;AAAA,IACzD;AAAA,EACF,WAAW,OAAA,EAAS;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,SAAS,CAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,WAAW,CAAA;AAC1C,MAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,MAAA,MAAM,MAAA,CAAO,EAAA,EAAG,CAAE,KAAA,GAAQ,IAAA,EAAK;AAC/B,MAAA,OAAA,CAAQ,IAAI,yCAAoC,CAAA;AAChD,MAAA,MAAM,OAAO,KAAA,EAAM;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,IAAI,6CAAwC,CAAA;AAAA,IACtD;AAAA,EACF,WAAW,QAAA,EAAU;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,gBAAA;AACpD,MAAA,MAAM,EAAE,UAAA,EAAAI,WAAAA,EAAW,GAAI,MAAM,OAAO,IAAI,CAAA;AACxC,MAAA,IAAIA,WAAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAA0C,UAAU,CAAA,CAAE,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mDAAA,EAA4C,UAAU,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACrG;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,IAAI,kDAA6C,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,wBAAmB,CAAA;AACjC,CAAC,CAAA;AAGH,OAAA,CAAQ,KAAA,EAAM;AAGd,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,MAAA,EAAQ;AACjC,EAAA,OAAA,CAAQ,UAAA,EAAW;AACrB","file":"index.cjs","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction toCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${toCamel(c.slug)}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n ${collections.map(c => ` ${toCamel(c.slug)}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nasync function fetchRemoteSchema(url: string, apiKey: string): Promise<any[]> {\n const schemaUrl = `${url.replace(/\\/+$/, \"\")}/api/__schema`;\n const res = await fetch(schemaUrl, {\n headers: { Authorization: `ApiKey ${apiKey}` },\n });\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Schema fetch failed (${res.status}): ${body}`);\n }\n return res.json();\n}\n\nfunction generateRemoteTypes(collections: any[]): string {\n let output = `// ============================================================================\n// Auto-generated by kyro generate --api\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n for (const col of collections) {\n const name = capitalize(col.slug);\n const fields = col.fields.filter((f: any) => f.name).map((f: any) => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n output += `export interface ${name} {\\n${fields.join('\\n')}\\n}\\n\\n`;\n }\n\n // Typed REST Client\n output += `// ============================================================================\n// Typed REST Client\n// ============================================================================\n\nexport interface KyroClientOptions {\n url: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport function createKyroClient(opts: KyroClientOptions) {\n const base = opts.url.replace(/\\\\/+$/, \"\");\n const http = opts.fetch || globalThis.fetch;\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const res = await http(\\`\\${base}/api\\${path}\\`, {\n headers: {\n \"Authorization\": \\`ApiKey \\${opts.apiKey}\\`,\n \"Content-Type\": \"application/json\",\n ...init?.headers,\n },\n ...init,\n });\n if (!res.ok) {\n const body = await res.text();\n throw new Error(\\`Kyro API error \\${res.status}: \\${body}\\`);\n }\n return res.json();\n }\n\n function qs(params: Record<string, any>): string {\n const s = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null) s.set(k, typeof v === \"object\" ? JSON.stringify(v) : String(v));\n }\n return s.toString();\n }\n\n return {\n${collections.map((col: any) => {\n const name = capitalize(col.slug);\n return ` ${toCamel(col.slug)}: {\n find: (args?: { where?: Record<string, any>; sort?: string; limit?: number; page?: number; draft?: boolean }) =>\n request<{ docs: ${name}[]; totalDocs: number; page: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean }>(\\`/${col.slug}\\${args ? \"?\" + qs(args) : \"\"}\\`),\n findByID: (id: string, args?: { draft?: boolean }) =>\n request<${name}>(\\`/${col.slug}/\\${id}\\${args ? \"?\" + qs(args) : \"\"}\\`),\n findBySlug: (slug: string, args?: { draft?: boolean }) =>\n request<{ docs: ${name}[] }>(\\`/${col.slug}?where=\\${encodeURIComponent(JSON.stringify({ slug: { equals: slug } }))}\\`),\n create: (data: Partial<${name}>) =>\n request<{ doc: ${name}; message?: string }>(\\`/${col.slug}\\`, { method: \"POST\", body: JSON.stringify(data) }),\n update: (id: string, data: Partial<${name}>, args?: { baseUpdatedAt?: string }) =>\n request<{ doc: ${name}; message?: string }>(\\`/${col.slug}/\\${id}\\`, { method: \"PATCH\", body: JSON.stringify({ ...data, ...args }) }),\n delete: (id: string) =>\n request<{ doc: ${name}; message: string }>(\\`/${col.slug}/\\${id}\\`, { method: \"DELETE\" }),\n count: (args?: { where?: Record<string, any> }) =>\n request<{ totalDocs: number }>(\\`/${col.slug}/count\\${args ? \"?\" + qs(args) : \"\"}\\`),\n },`;\n}).join('\\n')}\n };\n}\n`;\n\n return output;\n}\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .option('--url <url>', 'URL of a running Kyro CMS instance (enables remote mode)')\n .option('--api-key <key>', 'API key for authentication (required with --url)')\n .action(async (options) => {\n if (options.url) {\n if (!options.url) {\n console.error('❌ --url is required when using --api');\n process.exit(1);\n }\n if (!options.apiKey) {\n console.error('❌ --api-key is required when using --api');\n process.exit(1);\n }\n\n const outputPath = resolve(options.output);\n console.log('🔧 Generating types from:', options.url);\n\n try {\n const collections = await fetchRemoteSchema(options.url, options.apiKey);\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach((c: any) => console.log(` - ${c.slug}`));\n\n const types = generateRemoteTypes(collections);\n\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n return;\n }\n\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n console.log('🔧 Generating types from:', configPath);\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach(c => console.log(` - ${c.slug}`));\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n\n // Watch mode\n if (options.watch) {\n console.log('\\n👁️ Watching for changes...');\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n console.log(`\\n🔄 File changed: ${filename}`);\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n console.log('✅ Types regenerated');\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Dev command\nprogram\n .command(\"dev\")\n .description(\"Start Kyro CMS development server\")\n .option(\"-p, --port <port>\", \"Port to run on\", \"4321\")\n .option(\"-h, --host <host>\", \"Host to bind to\", \"localhost\")\n .action(async (options) => {\n console.log(\"🚀 Starting Kyro CMS development server...\");\n console.log(` Port: ${options.port}`);\n console.log(` Host: ${options.host}`);\n \n const { exec } = await import(\"child_process\");\n const child = exec(`astro dev --port ${options.port} --host ${options.host}`, {\n env: { ...process.env, NODE_NO_WARNINGS: \"1\" },\n });\n \n child.stdout?.on(\"data\", (data) => process.stdout.write(data));\n child.stderr?.on(\"data\", (data) => process.stderr.write(data));\n \n process.on(\"SIGINT\", () => {\n child.kill(\"SIGINT\");\n process.exit(0);\n });\n \n process.on(\"SIGTERM\", () => {\n child.kill(\"SIGTERM\");\n process.exit(0);\n });\n });\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n console.log(\"📝 Generating migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n console.log(\"🔄 Running migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n console.log(\"🔄 Pushing schema...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n console.log(\"🌱 Seeding database...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n console.log(\"🔓 Opening Drizzle Studio...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n console.log(\"👤 Creating admin user...\");\n console.log(` Email: ${options.email}`);\n console.log(` Role: ${options.role}`);\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const databaseUrl = process.env.DATABASE_URL || \"\";\n const isPostgres = databaseUrl.toLowerCase().startsWith(\"postgres://\") || databaseUrl.toLowerCase().startsWith(\"postgresql://\");\n const isMongo = databaseUrl.toLowerCase().startsWith(\"mongodb://\") || databaseUrl.toLowerCase().startsWith(\"mongodb+srv://\");\n const isSQLite = !databaseUrl || databaseUrl.includes(\".db\") || databaseUrl.includes(\"sqlite\") || databaseUrl.includes(\"file:\");\n\n let adapter: any;\n\n if (isPostgres) {\n const { PostgresAuthAdapter } = await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { default: postgres } = await import(\"postgres\");\n const client = postgres(databaseUrl, { max: 1, onnotice: () => {} });\n const db = drizzle(client);\n adapter = new PostgresAuthAdapter({ db });\n console.log(\" Database: PostgreSQL\");\n } else if (isMongo) {\n const { MongoDBAuthAdapter } = await import(\"../database/mongodb/mongo-auth-adapter.js\");\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(databaseUrl);\n await client.connect();\n const db = client.db();\n adapter = new MongoDBAuthAdapter({ db });\n console.log(\" Database: MongoDB\");\n } else {\n const { SQLiteAuthAdapter } = await import(\"../auth/sqlite-adapter.js\");\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n adapter = new SQLiteAuthAdapter({ path: authDbPath });\n console.log(\" Database: SQLite\");\n }\n\n if (adapter.connect) {\n await adapter.connect();\n }\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n if (adapter.disconnect) {\n await adapter.disconnect();\n }\n\n if (result.success) {\n console.log(\"✅ Admin user created successfully!\");\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n console.log(\"🏥 System Health Check\");\n\n const databaseUrl = process.env.DATABASE_URL || \"\";\n const isPostgres = databaseUrl.toLowerCase().startsWith(\"postgres://\") || databaseUrl.toLowerCase().startsWith(\"postgresql://\");\n const isMongo = databaseUrl.toLowerCase().startsWith(\"mongodb://\") || databaseUrl.toLowerCase().startsWith(\"mongodb+srv://\");\n const isSQLite = !databaseUrl || databaseUrl.includes(\".db\") || databaseUrl.includes(\"sqlite\") || databaseUrl.includes(\"file:\");\n\n if (isPostgres) {\n try {\n const { default: postgres } = await import(\"postgres\");\n const client = postgres(databaseUrl, { max: 1, onnotice: () => {} });\n await client.unsafe(\"SELECT 1\");\n console.log(\" ✅ Database (PostgreSQL): Connected\");\n await client.end();\n } catch {\n console.log(\" ❌ Database (PostgreSQL): Not connected\");\n }\n } else if (isMongo) {\n try {\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(databaseUrl);\n await client.connect();\n await client.db().admin().ping();\n console.log(\" ✅ Database (MongoDB): Connected\");\n await client.close();\n } catch {\n console.log(\" ❌ Database (MongoDB): Not connected\");\n }\n } else if (isSQLite) {\n try {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n const { existsSync } = await import(\"fs\");\n if (existsSync(authDbPath)) {\n console.log(` ✅ Database (SQLite): File exists at ${authDbPath}`);\n } else {\n console.log(` ⚠️ Database (SQLite): No file yet at ${authDbPath} (will be created on first run)`);\n }\n } catch {\n console.log(\" ❌ Database (SQLite): Error checking file\");\n }\n }\n\n console.log(\" ✅ API: Running\");\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
1
+ {"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["Command","outputPath","resolve","join","existsSync","mkdirSync","writeFileSync","glob","__filename","fileURLToPath","__dirname","dirname","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction toCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${toCamel(c.slug)}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n ${collections.map(c => ` ${toCamel(c.slug)}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nasync function fetchRemoteSchema(url: string, apiKey: string): Promise<any[]> {\n const schemaUrl = `${url.replace(/\\/+$/, \"\")}/api/__schema`;\n const res = await fetch(schemaUrl, {\n headers: { Authorization: `ApiKey ${apiKey}` },\n });\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Schema fetch failed (${res.status}): ${body}`);\n }\n return res.json();\n}\n\nfunction generateRemoteTypes(collections: any[]): string {\n let output = `// ============================================================================\n// Auto-generated by kyro generate --api\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n for (const col of collections) {\n const name = capitalize(col.slug);\n const fields = col.fields.filter((f: any) => f.name).map((f: any) => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n output += `export interface ${name} {\\n${fields.join('\\n')}\\n}\\n\\n`;\n }\n\n // Typed REST Client\n output += `// ============================================================================\n// Typed REST Client\n// ============================================================================\n\nexport interface KyroClientOptions {\n url: string;\n apiKey: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport function createKyroClient(opts: KyroClientOptions) {\n const base = opts.url.replace(/\\\\/+$/, \"\");\n const http = opts.fetch || globalThis.fetch;\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const res = await http(\\`\\${base}/api\\${path}\\`, {\n headers: {\n \"Authorization\": \\`ApiKey \\${opts.apiKey}\\`,\n \"Content-Type\": \"application/json\",\n ...init?.headers,\n },\n ...init,\n });\n if (!res.ok) {\n const body = await res.text();\n throw new Error(\\`Kyro API error \\${res.status}: \\${body}\\`);\n }\n return res.json();\n }\n\n function qs(params: Record<string, any>): string {\n const s = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== null) s.set(k, typeof v === \"object\" ? JSON.stringify(v) : String(v));\n }\n return s.toString();\n }\n\n return {\n${collections.map((col: any) => {\n const name = capitalize(col.slug);\n return ` ${toCamel(col.slug)}: {\n find: (args?: { where?: Record<string, any>; sort?: string; limit?: number; page?: number; draft?: boolean }) =>\n request<{ docs: ${name}[]; totalDocs: number; page: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean }>(\\`/${col.slug}\\${args ? \"?\" + qs(args) : \"\"}\\`),\n findByID: (id: string, args?: { draft?: boolean }) =>\n request<${name}>(\\`/${col.slug}/\\${id}\\${args ? \"?\" + qs(args) : \"\"}\\`),\n findBySlug: (slug: string, args?: { draft?: boolean }) =>\n request<{ docs: ${name}[] }>(\\`/${col.slug}?where=\\${encodeURIComponent(JSON.stringify({ slug: { equals: slug } }))}\\`),\n create: (data: Partial<${name}>) =>\n request<{ doc: ${name}; message?: string }>(\\`/${col.slug}\\`, { method: \"POST\", body: JSON.stringify(data) }),\n update: (id: string, data: Partial<${name}>, args?: { baseUpdatedAt?: string }) =>\n request<{ doc: ${name}; message?: string }>(\\`/${col.slug}/\\${id}\\`, { method: \"PATCH\", body: JSON.stringify({ ...data, ...args }) }),\n delete: (id: string) =>\n request<{ doc: ${name}; message: string }>(\\`/${col.slug}/\\${id}\\`, { method: \"DELETE\" }),\n count: (args?: { where?: Record<string, any> }) =>\n request<{ totalDocs: number }>(\\`/${col.slug}/count\\${args ? \"?\" + qs(args) : \"\"}\\`),\n },`;\n}).join('\\n')}\n };\n}\n`;\n\n return output;\n}\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .option('--url <url>', 'URL of a running Kyro CMS instance (enables remote mode)')\n .option('--api-key <key>', 'API key for authentication (required with --url)')\n .action(async (options) => {\n if (options.url) {\n if (!options.url) {\n console.error('❌ --url is required when using --api');\n process.exit(1);\n }\n if (!options.apiKey) {\n console.error('❌ --api-key is required when using --api');\n process.exit(1);\n }\n\n const outputPath = resolve(options.output);\n\n\n try {\n const collections = await fetchRemoteSchema(options.url, options.apiKey);\n\n\n const types = generateRemoteTypes(collections);\n\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(outputPath, types);\n\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n return;\n }\n\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n\n\n // Watch mode\n if (options.watch) {\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Dev command\nprogram\n .command(\"dev\")\n .description(\"Start Kyro CMS development server\")\n .option(\"-p, --port <port>\", \"Port to run on\", \"4321\")\n .option(\"-h, --host <host>\", \"Host to bind to\", \"localhost\")\n .action(async (options) => {\n\n \n const { exec } = await import(\"child_process\");\n const child = exec(`astro dev --port ${options.port} --host ${options.host}`, {\n env: { ...process.env, NODE_NO_WARNINGS: \"1\" },\n });\n \n child.stdout?.on(\"data\", (data) => process.stdout.write(data));\n child.stderr?.on(\"data\", (data) => process.stderr.write(data));\n \n process.on(\"SIGINT\", () => {\n child.kill(\"SIGINT\");\n process.exit(0);\n });\n \n process.on(\"SIGTERM\", () => {\n child.kill(\"SIGTERM\");\n process.exit(0);\n });\n });\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const databaseUrl = process.env.DATABASE_URL || \"\";\n const isPostgres = databaseUrl.toLowerCase().startsWith(\"postgres://\") || databaseUrl.toLowerCase().startsWith(\"postgresql://\");\n const isMongo = databaseUrl.toLowerCase().startsWith(\"mongodb://\") || databaseUrl.toLowerCase().startsWith(\"mongodb+srv://\");\n const isSQLite = !databaseUrl || databaseUrl.includes(\".db\") || databaseUrl.includes(\"sqlite\") || databaseUrl.includes(\"file:\");\n\n let adapter: any;\n\n if (isPostgres) {\n const { PostgresAuthAdapter } = await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { default: postgres } = await import(\"postgres\");\n const client = postgres(databaseUrl, { max: 1, onnotice: () => {} });\n const db = drizzle(client);\n adapter = new PostgresAuthAdapter({ db });\n\n } else if (isMongo) {\n const { MongoDBAuthAdapter } = await import(\"../database/mongodb/mongo-auth-adapter.js\");\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(databaseUrl);\n await client.connect();\n const db = client.db();\n adapter = new MongoDBAuthAdapter({ db });\n\n } else {\n const { SQLiteAuthAdapter } = await import(\"../auth/sqlite-adapter.js\");\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n adapter = new SQLiteAuthAdapter({ path: authDbPath });\n\n }\n\n if (adapter.connect) {\n await adapter.connect();\n }\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n if (adapter.disconnect) {\n await adapter.disconnect();\n }\n\n if (result.success) {\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n\n\n const databaseUrl = process.env.DATABASE_URL || \"\";\n const isPostgres = databaseUrl.toLowerCase().startsWith(\"postgres://\") || databaseUrl.toLowerCase().startsWith(\"postgresql://\");\n const isMongo = databaseUrl.toLowerCase().startsWith(\"mongodb://\") || databaseUrl.toLowerCase().startsWith(\"mongodb+srv://\");\n const isSQLite = !databaseUrl || databaseUrl.includes(\".db\") || databaseUrl.includes(\"sqlite\") || databaseUrl.includes(\"file:\");\n\n if (isPostgres) {\n try {\n const { default: postgres } = await import(\"postgres\");\n const client = postgres(databaseUrl, { max: 1, onnotice: () => {} });\n await client.unsafe(\"SELECT 1\");\n\n await client.end();\n } catch {\n\n }\n } else if (isMongo) {\n try {\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(databaseUrl);\n await client.connect();\n await client.db().admin().ping();\n\n await client.close();\n } catch {\n\n }\n } else if (isSQLite) {\n try {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n const { existsSync } = await import(\"fs\");\n if (existsSync(authDbPath)) {\n\n } else {\n\n }\n } catch {\n\n }\n }\n\n\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
package/dist/cli/index.js CHANGED
@@ -329,18 +329,14 @@ function createGenerateCommand() {
329
329
  process.exit(1);
330
330
  }
331
331
  const outputPath2 = resolve(options.output);
332
- console.log("\u{1F527} Generating types from:", options.url);
333
332
  try {
334
333
  const collections = await fetchRemoteSchema(options.url, options.apiKey);
335
- console.log(`\u{1F4E6} Found ${collections.length} collection(s):`);
336
- collections.forEach((c) => console.log(` - ${c.slug}`));
337
334
  const types = generateRemoteTypes(collections);
338
335
  const outputDir = join(outputPath2, "..");
339
336
  if (!existsSync(outputDir)) {
340
337
  mkdirSync(outputDir, { recursive: true });
341
338
  }
342
339
  writeFileSync(outputPath2, types);
343
- console.log(`\u2705 Types generated at: ${outputPath2}`);
344
340
  } catch (error) {
345
341
  console.error("\u274C Error:", error.message);
346
342
  process.exit(1);
@@ -349,7 +345,6 @@ function createGenerateCommand() {
349
345
  }
350
346
  const configPath = resolve(options.config);
351
347
  const outputPath = resolve(options.output);
352
- console.log("\u{1F527} Generating types from:", configPath);
353
348
  try {
354
349
  const configFiles = await glob(`${configPath}/**/*.{ts,js}`);
355
350
  if (configFiles.length === 0) {
@@ -370,21 +365,15 @@ function createGenerateCommand() {
370
365
  console.error("\u274C No valid collection configs found");
371
366
  process.exit(1);
372
367
  }
373
- console.log(`\u{1F4E6} Found ${collections.length} collection(s):`);
374
- collections.forEach((c) => console.log(` - ${c.slug}`));
375
368
  const types = generateTypes(collections);
376
369
  const outputDir = join(outputPath, "..");
377
370
  if (!existsSync(outputDir)) {
378
371
  mkdirSync(outputDir, { recursive: true });
379
372
  }
380
373
  writeFileSync(outputPath, types);
381
- console.log(`\u2705 Types generated at: ${outputPath}`);
382
374
  if (options.watch) {
383
- console.log("\n\u{1F441}\uFE0F Watching for changes...");
384
375
  const { watch } = await import('fs');
385
376
  watch(configPath, { recursive: true }, async (eventType, filename) => {
386
- console.log(`
387
- \u{1F504} File changed: ${filename}`);
388
377
  const newCollections = [];
389
378
  for (const file of configFiles) {
390
379
  try {
@@ -396,7 +385,6 @@ function createGenerateCommand() {
396
385
  }
397
386
  const newTypes = generateTypes(newCollections);
398
387
  writeFileSync(outputPath, newTypes);
399
- console.log("\u2705 Types regenerated");
400
388
  });
401
389
  }
402
390
  } catch (error) {
@@ -421,9 +409,6 @@ try {
421
409
  var program = new Command();
422
410
  program.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(version);
423
411
  program.command("dev").description("Start Kyro CMS development server").option("-p, --port <port>", "Port to run on", "4321").option("-h, --host <host>", "Host to bind to", "localhost").action(async (options) => {
424
- console.log("\u{1F680} Starting Kyro CMS development server...");
425
- console.log(` Port: ${options.port}`);
426
- console.log(` Host: ${options.host}`);
427
412
  const { exec } = await import('child_process');
428
413
  const child = exec(`astro dev --port ${options.port} --host ${options.host}`, {
429
414
  env: { ...process.env, NODE_NO_WARNINGS: "1" }
@@ -442,51 +427,42 @@ program.command("dev").description("Start Kyro CMS development server").option("
442
427
  program.addCommand(createGenerateCommand());
443
428
  var dbCommand = program.command("db").description("Database management commands");
444
429
  dbCommand.command("generate").description("Generate migrations from schema").action(async () => {
445
- console.log("\u{1F4DD} Generating migrations...");
446
430
  const { exec } = await import('child_process');
447
431
  exec("npx drizzle-kit generate", (error, stdout, stderr) => {
448
432
  if (error) {
449
433
  console.error("\u274C Generation failed:", error.message);
450
434
  process.exit(1);
451
435
  }
452
- console.log(stdout);
453
436
  });
454
437
  });
455
438
  dbCommand.command("migrate").description("Run database migrations").action(async () => {
456
- console.log("\u{1F504} Running migrations...");
457
439
  const { exec } = await import('child_process');
458
440
  exec("npx drizzle-kit migrate", (error, stdout, stderr) => {
459
441
  if (error) {
460
442
  console.error("\u274C Migration failed:", error.message);
461
443
  process.exit(1);
462
444
  }
463
- console.log(stdout);
464
445
  });
465
446
  });
466
447
  dbCommand.command("push").description("Push schema to database (development)").action(async () => {
467
- console.log("\u{1F504} Pushing schema...");
468
448
  const { exec } = await import('child_process');
469
449
  exec("npx drizzle-kit push", (error, stdout, stderr) => {
470
450
  if (error) {
471
451
  console.error("\u274C Push failed:", error.message);
472
452
  process.exit(1);
473
453
  }
474
- console.log(stdout);
475
454
  });
476
455
  });
477
456
  dbCommand.command("seed").description("Seed database with initial data").action(async () => {
478
- console.log("\u{1F331} Seeding database...");
479
457
  const { exec } = await import('child_process');
480
458
  exec("npx tsx src/database/drizzle/seed.ts", (error, stdout, stderr) => {
481
459
  if (error) {
482
460
  console.error("\u274C Seeding failed:", error.message);
483
461
  process.exit(1);
484
462
  }
485
- console.log(stdout);
486
463
  });
487
464
  });
488
465
  dbCommand.command("studio").description("Open Drizzle Studio").action(async () => {
489
- console.log("\u{1F513} Opening Drizzle Studio...");
490
466
  const { exec } = await import('child_process');
491
467
  exec("npx drizzle-kit studio", (error, stdout, stderr) => {
492
468
  if (error) {
@@ -511,11 +487,8 @@ authCommand.command("bootstrap").description("Create initial admin user").option
511
487
  );
512
488
  process.exit(1);
513
489
  }
514
- console.log("\u{1F464} Creating admin user...");
515
- console.log(` Email: ${options.email}`);
516
- console.log(` Role: ${options.role}`);
517
490
  try {
518
- const { bootstrapAdmin } = await import('../bootstrap-3PV3GJ3S.js');
491
+ const { bootstrapAdmin } = await import('../bootstrap-OXNVM7FP.js');
519
492
  const databaseUrl = process.env.DATABASE_URL || "";
520
493
  const isPostgres = databaseUrl.toLowerCase().startsWith("postgres://") || databaseUrl.toLowerCase().startsWith("postgresql://");
521
494
  const isMongo = databaseUrl.toLowerCase().startsWith("mongodb://") || databaseUrl.toLowerCase().startsWith("mongodb+srv://");
@@ -529,7 +502,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
529
502
  } });
530
503
  const db = drizzle(client);
531
504
  adapter = new PostgresAuthAdapter({ db });
532
- console.log(" Database: PostgreSQL");
533
505
  } else if (isMongo) {
534
506
  const { MongoDBAuthAdapter } = await import('../mongo-auth-adapter-M7VV4LNB.js');
535
507
  const { MongoClient } = await import('mongodb');
@@ -537,12 +509,10 @@ authCommand.command("bootstrap").description("Create initial admin user").option
537
509
  await client.connect();
538
510
  const db = client.db();
539
511
  adapter = new MongoDBAuthAdapter({ db });
540
- console.log(" Database: MongoDB");
541
512
  } else {
542
513
  const { SQLiteAuthAdapter } = await import('../sqlite-adapter-N5H6IM2X.js');
543
514
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
544
515
  adapter = new SQLiteAuthAdapter({ path: authDbPath });
545
- console.log(" Database: SQLite");
546
516
  }
547
517
  if (adapter.connect) {
548
518
  await adapter.connect();
@@ -557,7 +527,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
557
527
  await adapter.disconnect();
558
528
  }
559
529
  if (result.success) {
560
- console.log("\u2705 Admin user created successfully!");
561
530
  } else {
562
531
  console.error("\u274C Failed to create admin:", result.error);
563
532
  process.exit(1);
@@ -568,7 +537,6 @@ authCommand.command("bootstrap").description("Create initial admin user").option
568
537
  }
569
538
  });
570
539
  program.command("health").description("Check system health").action(async () => {
571
- console.log("\u{1F3E5} System Health Check");
572
540
  const databaseUrl = process.env.DATABASE_URL || "";
573
541
  const isPostgres = databaseUrl.toLowerCase().startsWith("postgres://") || databaseUrl.toLowerCase().startsWith("postgresql://");
574
542
  const isMongo = databaseUrl.toLowerCase().startsWith("mongodb://") || databaseUrl.toLowerCase().startsWith("mongodb+srv://");
@@ -579,10 +547,8 @@ program.command("health").description("Check system health").action(async () =>
579
547
  const client = postgres(databaseUrl, { max: 1, onnotice: () => {
580
548
  } });
581
549
  await client.unsafe("SELECT 1");
582
- console.log(" \u2705 Database (PostgreSQL): Connected");
583
550
  await client.end();
584
551
  } catch {
585
- console.log(" \u274C Database (PostgreSQL): Not connected");
586
552
  }
587
553
  } else if (isMongo) {
588
554
  try {
@@ -590,25 +556,19 @@ program.command("health").description("Check system health").action(async () =>
590
556
  const client = new MongoClient(databaseUrl);
591
557
  await client.connect();
592
558
  await client.db().admin().ping();
593
- console.log(" \u2705 Database (MongoDB): Connected");
594
559
  await client.close();
595
560
  } catch {
596
- console.log(" \u274C Database (MongoDB): Not connected");
597
561
  }
598
562
  } else if (isSQLite) {
599
563
  try {
600
564
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
601
565
  const { existsSync: existsSync2 } = await import('fs');
602
566
  if (existsSync2(authDbPath)) {
603
- console.log(` \u2705 Database (SQLite): File exists at ${authDbPath}`);
604
567
  } else {
605
- console.log(` \u26A0\uFE0F Database (SQLite): No file yet at ${authDbPath} (will be created on first run)`);
606
568
  }
607
569
  } catch {
608
- console.log(" \u274C Database (SQLite): Error checking file");
609
570
  }
610
571
  }
611
- console.log(" \u2705 API: Running");
612
572
  });
613
573
  program.parse();
614
574
  if (!process.argv.slice(2).length) {