@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.
- package/dist/api-handler-graphql.cjs +11 -11
- package/dist/api-handler-graphql.js +7 -7
- package/dist/api-handler-trpc.cjs +9 -9
- package/dist/api-handler-trpc.js +7 -7
- package/dist/api-handler.cjs +10 -10
- package/dist/api-handler.js +7 -7
- package/dist/{bootstrap-4CELFLJO.cjs → bootstrap-FUAPY2OF.cjs} +9 -9
- package/dist/{bootstrap-4CELFLJO.cjs.map → bootstrap-FUAPY2OF.cjs.map} +1 -1
- package/dist/bootstrap-OXNVM7FP.js +7 -0
- package/dist/{bootstrap-3PV3GJ3S.js.map → bootstrap-OXNVM7FP.js.map} +1 -1
- package/dist/{chunk-5RFGYEQ3.js → chunk-354ISGA4.js} +5 -23
- package/dist/chunk-354ISGA4.js.map +1 -0
- package/dist/{chunk-E4JZ73FY.cjs → chunk-3P5AHK2U.cjs} +11 -24
- package/dist/chunk-3P5AHK2U.cjs.map +1 -0
- package/dist/{chunk-BVUDFKKS.js → chunk-526M5MOA.js} +6 -8
- package/dist/chunk-526M5MOA.js.map +1 -0
- package/dist/{chunk-5PMQQFRE.cjs → chunk-5GFQPHGT.cjs} +6 -9
- package/dist/chunk-5GFQPHGT.cjs.map +1 -0
- package/dist/{chunk-OYCICW4B.js → chunk-AN2L2CJZ.js} +4 -17
- package/dist/chunk-AN2L2CJZ.js.map +1 -0
- package/dist/{chunk-RFFSZSCL.cjs → chunk-GYIJ3JJM.cjs} +3 -11
- package/dist/chunk-GYIJ3JJM.cjs.map +1 -0
- package/dist/{chunk-PQ72Z6WC.js → chunk-GZS4LMR7.js} +2 -5
- package/dist/chunk-GZS4LMR7.js.map +1 -0
- package/dist/{chunk-GAAHG2Z4.js → chunk-HY6B7B5A.js} +4 -7
- package/dist/chunk-HY6B7B5A.js.map +1 -0
- package/dist/{chunk-IEIHABVR.cjs → chunk-ISKYUUP4.cjs} +15 -33
- package/dist/chunk-ISKYUUP4.cjs.map +1 -0
- package/dist/{chunk-6UNONDW7.js → chunk-N5QSHUA6.js} +2 -11
- package/dist/chunk-N5QSHUA6.js.map +1 -0
- package/dist/{chunk-OXYSOU6Z.cjs → chunk-NQJJYRLP.cjs} +11 -13
- package/dist/chunk-NQJJYRLP.cjs.map +1 -0
- package/dist/{chunk-Q23GAMLE.cjs → chunk-THBQG64D.cjs} +2 -5
- package/dist/chunk-THBQG64D.cjs.map +1 -0
- package/dist/{chunk-Y7AQK4R4.cjs → chunk-VKREAIBA.cjs} +2 -11
- package/dist/chunk-VKREAIBA.cjs.map +1 -0
- package/dist/{chunk-V7KZQIZ6.js → chunk-XHAAAEXX.js} +2 -10
- package/dist/chunk-XHAAAEXX.js.map +1 -0
- package/dist/cli/index.cjs +1 -41
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +1 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/drizzle/index.cjs +9 -9
- package/dist/drizzle/index.js +1 -1
- package/dist/index.cjs +62 -64
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -10
- package/dist/index.js.map +1 -1
- package/dist/mongodb/index.cjs +3 -3
- package/dist/mongodb/index.js +1 -1
- package/dist/rest/index.cjs +6 -6
- package/dist/rest/index.js +4 -4
- package/package.json +1 -1
- package/dist/bootstrap-3PV3GJ3S.js +0 -7
- package/dist/chunk-5PMQQFRE.cjs.map +0 -1
- package/dist/chunk-5RFGYEQ3.js.map +0 -1
- package/dist/chunk-6UNONDW7.js.map +0 -1
- package/dist/chunk-BVUDFKKS.js.map +0 -1
- package/dist/chunk-E4JZ73FY.cjs.map +0 -1
- package/dist/chunk-GAAHG2Z4.js.map +0 -1
- package/dist/chunk-IEIHABVR.cjs.map +0 -1
- package/dist/chunk-OXYSOU6Z.cjs.map +0 -1
- package/dist/chunk-OYCICW4B.js.map +0 -1
- package/dist/chunk-PQ72Z6WC.js.map +0 -1
- package/dist/chunk-Q23GAMLE.cjs.map +0 -1
- package/dist/chunk-RFFSZSCL.cjs.map +0 -1
- package/dist/chunk-V7KZQIZ6.js.map +0 -1
- package/dist/chunk-Y7AQK4R4.cjs.map +0 -1
package/dist/cli/index.cjs
CHANGED
|
@@ -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-
|
|
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) {
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -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":"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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 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-
|
|
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) {
|