@kyro-cms/core 0.10.2 → 0.10.4

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 (31) hide show
  1. package/dist/api-handler-graphql.cjs +8 -8
  2. package/dist/api-handler-graphql.js +4 -4
  3. package/dist/api-handler-trpc.cjs +6 -6
  4. package/dist/api-handler-trpc.js +4 -4
  5. package/dist/api-handler.cjs +7 -7
  6. package/dist/api-handler.js +4 -4
  7. package/dist/{chunk-3P5AHK2U.cjs → chunk-74YSDAWE.cjs} +11 -11
  8. package/dist/{chunk-3P5AHK2U.cjs.map → chunk-74YSDAWE.cjs.map} +1 -1
  9. package/dist/{chunk-ISKYUUP4.cjs → chunk-B6X3LN25.cjs} +7 -7
  10. package/dist/{chunk-ISKYUUP4.cjs.map → chunk-B6X3LN25.cjs.map} +1 -1
  11. package/dist/{chunk-AN2L2CJZ.js → chunk-HZOMOK5Y.js} +4 -4
  12. package/dist/{chunk-AN2L2CJZ.js.map → chunk-HZOMOK5Y.js.map} +1 -1
  13. package/dist/{chunk-GYIJ3JJM.cjs → chunk-OIRG6ZRV.cjs} +15 -11
  14. package/dist/chunk-OIRG6ZRV.cjs.map +1 -0
  15. package/dist/{chunk-354ISGA4.js → chunk-OLV7K22H.js} +3 -3
  16. package/dist/{chunk-354ISGA4.js.map → chunk-OLV7K22H.js.map} +1 -1
  17. package/dist/{chunk-526M5MOA.js → chunk-SX76DNOO.js} +4 -4
  18. package/dist/{chunk-526M5MOA.js.map → chunk-SX76DNOO.js.map} +1 -1
  19. package/dist/{chunk-XHAAAEXX.js → chunk-V5AWATUP.js} +14 -10
  20. package/dist/chunk-V5AWATUP.js.map +1 -0
  21. package/dist/{chunk-NQJJYRLP.cjs → chunk-VAXLFZCV.cjs} +7 -7
  22. package/dist/{chunk-NQJJYRLP.cjs.map → chunk-VAXLFZCV.cjs.map} +1 -1
  23. package/dist/drizzle/index.cjs +9 -9
  24. package/dist/drizzle/index.js +1 -1
  25. package/dist/index.cjs +48 -48
  26. package/dist/index.js +4 -4
  27. package/dist/rest/index.cjs +4 -4
  28. package/dist/rest/index.js +2 -2
  29. package/package.json +1 -1
  30. package/dist/chunk-GYIJ3JJM.cjs.map +0 -1
  31. package/dist/chunk-XHAAAEXX.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import { createKyro, LocalAdapter } from './chunk-AN2L2CJZ.js';
1
+ import { createKyro, LocalAdapter } from './chunk-HZOMOK5Y.js';
2
2
  import { autoBootstrap } from './chunk-HY6B7B5A.js';
3
3
  import { SQLiteAuthAdapter } from './chunk-Q72BOAPK.js';
4
- import { DrizzleAdapter } from './chunk-XHAAAEXX.js';
4
+ import { DrizzleAdapter } from './chunk-V5AWATUP.js';
5
5
  import { PostgresAuthAdapter } from './chunk-CJX74IYK.js';
6
6
  import { MongoDBAdapter } from './chunk-GZS4LMR7.js';
7
7
  import { MongoDBAuthAdapter } from './chunk-7OGPN7MP.js';
@@ -99,5 +99,5 @@ var ALL = async (context) => {
99
99
  };
100
100
 
101
101
  export { ALL, kyroInstance, warmKyroInstance };
102
- //# sourceMappingURL=chunk-526M5MOA.js.map
103
- //# sourceMappingURL=chunk-526M5MOA.js.map
102
+ //# sourceMappingURL=chunk-SX76DNOO.js.map
103
+ //# sourceMappingURL=chunk-SX76DNOO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler.ts"],"names":[],"mappings":"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","file":"chunk-526M5MOA.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\ndeclare var __KYRO_API_PATH__: string;\n\nexport let kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n try {\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n }\n\n // Auto-start WebSocket (checks settings.access.apiAccess.wsEnabled internally)\n if (typeof kyroInstance.startWebSocket === \"function\") {\n kyroInstance.startWebSocket().catch((err: any) => {\n console.error(\"[Kyro] WebSocket auto-start failed:\", err);\n });\n }\n\n // Expose instance globally so admin SSR can read DB directly\n (globalThis as any).__KYRO_INSTANCE__ = kyroInstance;\n\n } catch (err) {\n kyroInstance = null;\n initPromise = null;\n console.error(\"[Kyro API] Init failed, will retry:\", err);\n throw err;\n }\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000)\n ),\n ]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const url = new URL(context.request.url);\n const path = url.pathname;\n const p = __KYRO_API_PATH__;\n\n if (path === `${p}/graphql` && typeof kyroInstance.getGraphQL === \"function\") {\n const yoga = kyroInstance.getGraphQL();\n const res = await yoga.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n if (path.startsWith(`${p}/trpc/`) && typeof kyroInstance.getTRPC === \"function\") {\n const trpc = kyroInstance.getTRPC();\n const res = await trpc.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler.ts"],"names":[],"mappings":"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","file":"chunk-SX76DNOO.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\ndeclare var __KYRO_API_PATH__: string;\n\nexport let kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n try {\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n }\n\n // Auto-start WebSocket (checks settings.access.apiAccess.wsEnabled internally)\n if (typeof kyroInstance.startWebSocket === \"function\") {\n kyroInstance.startWebSocket().catch((err: any) => {\n console.error(\"[Kyro] WebSocket auto-start failed:\", err);\n });\n }\n\n // Expose instance globally so admin SSR can read DB directly\n (globalThis as any).__KYRO_INSTANCE__ = kyroInstance;\n\n } catch (err) {\n kyroInstance = null;\n initPromise = null;\n console.error(\"[Kyro API] Init failed, will retry:\", err);\n throw err;\n }\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000)\n ),\n ]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const url = new URL(context.request.url);\n const path = url.pathname;\n const p = __KYRO_API_PATH__;\n\n if (path === `${p}/graphql` && typeof kyroInstance.getGraphQL === \"function\") {\n const yoga = kyroInstance.getGraphQL();\n const res = await yoga.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n if (path.startsWith(`${p}/trpc/`) && typeof kyroInstance.getTRPC === \"function\") {\n const trpc = kyroInstance.getTRPC();\n const res = await trpc.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
@@ -284,6 +284,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
284
284
  const colDefs = this.generateCreateColumns(config);
285
285
  const hasCreated = config.fields.some((f) => f.name === "createdAt");
286
286
  const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
287
+ const hasStatus = config.fields.some((f) => f.name === "status");
288
+ const hasDraftField = config.fields.some((f) => f.name === "hasDraft");
287
289
  if (this.dialect === "postgres") {
288
290
  const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
289
291
  statements.push(`
@@ -292,8 +294,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
292
294
  ${colDefs}
293
295
  ${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
294
296
  ${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
295
- "status" VARCHAR(20) DEFAULT 'draft',
296
- "hasDraft" BOOLEAN DEFAULT false
297
+ ${hasStatus ? "" : `"status" VARCHAR(20) DEFAULT 'draft',`}
298
+ ${hasDraftField ? "" : '"hasDraft" BOOLEAN DEFAULT false'}
297
299
  )
298
300
  `);
299
301
  } else {
@@ -304,8 +306,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
304
306
  ${colDefs}
305
307
  ${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
306
308
  ${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
307
- "status" TEXT DEFAULT 'draft',
308
- "hasDraft" INTEGER DEFAULT 0
309
+ ${hasStatus ? "" : `"status" TEXT DEFAULT 'draft',`}
310
+ ${hasDraftField ? "" : '"hasDraft" INTEGER DEFAULT 0'}
309
311
  )
310
312
  `);
311
313
  }
@@ -378,18 +380,20 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
378
380
  const isGlobal = config.slug.startsWith("_globals_");
379
381
  const hasCreated = config.fields.some((f) => f.name === "createdAt");
380
382
  const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
383
+ const hasStatus = config.fields.some((f) => f.name === "status");
384
+ const hasDraftField = config.fields.some((f) => f.name === "hasDraft");
381
385
  if (this.dialect === "postgres") {
382
386
  defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
383
387
  if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
384
388
  if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
385
- defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
386
- defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
389
+ if (!hasStatus) defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
390
+ if (!hasDraftField) defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
387
391
  } else {
388
392
  defs["id"] = '"id" TEXT PRIMARY KEY';
389
393
  if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
390
394
  if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
391
- defs["status"] = '"status" TEXT DEFAULT NULL';
392
- defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
395
+ if (!hasStatus) defs["status"] = '"status" TEXT DEFAULT NULL';
396
+ if (!hasDraftField) defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
393
397
  }
394
398
  for (const field of config.fields) {
395
399
  if (!field.name || field.name === "id") continue;
@@ -1051,5 +1055,5 @@ async function seedDefaultRoles(db) {
1051
1055
  }
1052
1056
 
1053
1057
  export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles };
1054
- //# sourceMappingURL=chunk-XHAAAEXX.js.map
1055
- //# sourceMappingURL=chunk-XHAAAEXX.js.map
1058
+ //# sourceMappingURL=chunk-V5AWATUP.js.map
1059
+ //# sourceMappingURL=chunk-V5AWATUP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/database/drizzle/adapter.ts","../src/database/drizzle/database.ts"],"names":["postgres","drizzle","sql","sqliteText","sqliteInteger","sqliteNumeric","integer","db"],"mappings":"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","file":"chunk-V5AWATUP.js","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport { sql, eq, and, or, desc, ne, inArray, like, gt, gte, lt, lte } from 'drizzle-orm';\nimport {\n pgTable,\n uuid,\n varchar,\n boolean,\n timestamp,\n integer,\n text,\n jsonb,\n decimal,\n} from 'drizzle-orm/pg-core';\nimport {\n sqliteTable,\n integer as sqliteInteger,\n text as sqliteText,\n numeric as sqliteNumeric,\n} from 'drizzle-orm/sqlite-core';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n VersionRecord,\n CreateVersionArgs,\n} from '../../registry/types.js';\nimport type { Field, RelationshipField } from '../../fields/types.js';\nimport type { TenantContext } from '../../auth/rls/tenant.js';\nimport { applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from '../../auth/rls/tenant.js';\n\nlet _schemaEnsured = false;\n\n// ============================================================================\n// Drizzle Schema Generator\n// ============================================================================\n\nexport function fieldToDrizzleType(field: Field, dialect: 'postgres' | 'sqlite' = 'postgres'): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'color':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'textarea':\n case 'code':\n case 'markdown':\n case 'secret':\n return 'text';\n case 'number':\n return field.integer ? 'integer' : 'decimal';\n case 'checkbox':\n return 'boolean';\n case 'date':\n return 'timestamp';\n case 'select':\n case 'radio':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'richtext':\n case 'json':\n case 'array':\n case 'group':\n case 'blocks':\n case 'row':\n case 'collapsible':\n case 'tabs':\n return 'jsonb';\n case 'relationship':\n return dialect === 'sqlite' ? 'text' : 'varchar';\n case 'upload':\n return 'jsonb';\n default:\n return 'jsonb';\n }\n}\n\nexport function collectionToDrizzleSchema(\n collection: CollectionConfig,\n dialect: 'postgres' | 'sqlite' = 'postgres'\n): string {\n const tableName = collection.slug.replace(/-/g, '_');\n const lines: string[] = [];\n \n lines.push(`export const ${tableName} = pgTable('${tableName}', {`);\n \n // Add id field\n lines.push(` id: uuid('id').primaryKey().defaultRandom(),`);\n \n // Process fields\n for (const field of collection.fields) {\n if (field.name === 'id') continue;\n \n const dbType = fieldToDrizzleType(field, dialect);\n const isRequired = field.required;\n \n let fieldDef = ` ${field.name}: pg.${dbType}('${field.name}')`;\n \n // Add constraints\n if (field.unique) fieldDef += '.unique()';\n if (!isRequired) fieldDef += '.nullable()';\n \n // Add default value\n if (field.defaultValue !== undefined) {\n if (typeof field.defaultValue === 'string') {\n fieldDef += `.default('${field.defaultValue}')`;\n } else if (typeof field.defaultValue === 'boolean') {\n fieldDef += `.default(${field.defaultValue})`;\n } else {\n fieldDef += `.default(sql\\`${JSON.stringify(field.defaultValue)}\\`)`;\n }\n }\n \n fieldDef += ',';\n lines.push(fieldDef);\n }\n \n // Add timestamps\n if (collection.timestamps) {\n lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);\n lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);\n }\n \n // Add status field\n lines.push(` status: ${dialect === 'sqlite' ? 'sqlite' : 'pg'}.varchar('status').default('draft'),`);\n lines.push(` hasDraft: ${dialect === 'sqlite' ? 'sqlite' : 'pg'}.boolean('hasDraft').default(false),`);\n \n lines.push('});');\n \n return lines.join('\\n');\n}\n\n// ============================================================================\n// Drizzle Adapter\n// ============================================================================\n\nexport class DrizzleAdapter extends AbstractBaseAdapter {\n public client: any;\n private schema: any;\n public dialect: 'postgres' | 'sqlite';\n private connectionString?: string;\n private versionsTableReady = false;\n \n constructor(options: {\n type?: 'postgres' | 'sqlite';\n client?: any;\n schema?: any;\n connectionString?: string;\n }) {\n super();\n this.schema = options.schema || {};\n \n if (options.connectionString) {\n this.connectionString = options.connectionString;\n const connStr = options.connectionString.toLowerCase();\n if (connStr.startsWith('postgres://') || connStr.startsWith('postgresql://')) {\n this.dialect = 'postgres';\n } else if (connStr.includes('.db') || connStr.includes('sqlite') || connStr.includes('file:')) {\n this.dialect = 'sqlite';\n } else {\n this.dialect = options.type || 'postgres';\n }\n } else {\n this.client = options.client;\n this.dialect = options.type || 'sqlite';\n }\n }\n\n protected prepareData(data: Record<string, any>, config: CollectionConfig): Record<string, any> {\n const result = super.prepareData(data, config);\n\n // Convert ISO date strings to Date objects for Drizzle timestamp columns\n if (result.createdAt && typeof result.createdAt === \"string\") {\n result.createdAt = new Date(result.createdAt);\n }\n if (result.updatedAt && typeof result.updatedAt === \"string\") {\n result.updatedAt = new Date(result.updatedAt);\n }\n\n // Convert date-type field values to Date objects for Drizzle timestamp columns\n for (const field of config.fields) {\n if (field.type === 'date' && field.name) {\n const value = result[field.name];\n if (value && typeof value === \"string\") {\n result[field.name] = new Date(value);\n }\n }\n }\n\n // Process complex fields — Drizzle ORM handles JSONB serialization natively,\n // so we only stringify for non-jsonb types and keep objects for jsonb columns.\n for (const field of config.fields) {\n const dbType = fieldToDrizzleType(field, this.dialect);\n const isJsonb = dbType === \"jsonb\";\n\n if (field.type === 'tabs' && 'tabs' in field && field.name) {\n const tabData = data[field.name];\n if (tabData && typeof tabData === 'object') {\n const processedTabData: any = {};\n for (const [key, value] of Object.entries(tabData)) {\n const tabField = field.tabs.flatMap((t: any) => t.fields).find((f: any) => f.name === key);\n const needsStringify = (tabField?.type === 'upload' || tabField?.type === 'image' || tabField?.type === 'list' || tabField?.type === 'relationship-block') && value;\n if (needsStringify) {\n processedTabData[key] = Array.isArray(value) ? JSON.stringify(value) : typeof value === 'object' ? JSON.stringify(value) : value;\n } else {\n processedTabData[key] = value;\n }\n }\n result[field.name] = isJsonb ? processedTabData : JSON.stringify(processedTabData);\n }\n }\n\n if ((field as any).type === 'upload' || (field as any).type === 'image' || (field as any).type === 'list' || (field as any).type === 'relationship-block') {\n if (field.name) {\n const value = data[field.name];\n if (value) {\n result[field.name] = isJsonb ? value : (Array.isArray(value) ? JSON.stringify(value) : typeof value === 'object' ? JSON.stringify(value) : value);\n }\n }\n }\n }\n\n // Convert empty strings to null for field types that reject them in PostgreSQL\n for (const field of config.fields) {\n if (field.name && result[field.name] === \"\") {\n const dbType = fieldToDrizzleType(field, this.dialect);\n if (dbType === \"timestamp\" || dbType === \"jsonb\" || dbType === \"decimal\" || dbType === \"integer\" || dbType === \"numeric\" || dbType === \"boolean\") {\n result[field.name] = null;\n }\n }\n }\n \n return result;\n }\n\n async connect(): Promise<void> {\n if (this.connectionString && !this.client) {\n if (this.dialect === 'postgres') {\n const { default: postgres } = await import('postgres');\n const { drizzle } = await import('drizzle-orm/postgres-js');\n const sql = postgres(this.connectionString, { onnotice: () => {} });\n this.client = drizzle(sql, { schema: this.schema });\n } else if (this.dialect === 'sqlite') {\n const { default: betterSqlite3 } = await import('better-sqlite3');\n const { drizzle } = await import('drizzle-orm/better-sqlite3');\n const db = new betterSqlite3(this.connectionString.replace('file:', ''));\n this.client = drizzle(db, { schema: this.schema });\n }\n }\n this.connected = true;\n\n }\n\n async init(collections: CollectionConfig[], globals: GlobalConfig[] = []): Promise<void> {\n await super.init(collections, globals);\n\n if (this.connectionString && !this.client) {\n await this.connect();\n }\n\n if (this.client && !_schemaEnsured) {\n for (const config of collections) {\n const tableName = this.getTableName(config.slug);\n if (!this.schema[tableName]) {\n this.schema[tableName] = this.createTableFromConfig(config);\n }\n }\n await this.ensureCollectionTables(collections);\n\n // Create tables for globals (stored as _globals_{slug})\n const globalCollections: CollectionConfig[] = globals.map((g) => ({\n slug: `_globals_${g.slug}`,\n fields: g.fields,\n label: g.label,\n }));\n for (const gc of globalCollections) {\n const tableName = this.getTableName(gc.slug);\n if (!this.schema[tableName]) {\n this.schema[tableName] = this.createTableFromConfig(gc, true);\n }\n // Register in collections so CRUD methods can find them\n if (!this.collections.has(gc.slug)) {\n this.collections.set(gc.slug, gc as CollectionConfig);\n }\n }\n await this.ensureCollectionTables(globalCollections);\n _schemaEnsured = true;\n }\n }\n\n private createTableFromConfig(config: CollectionConfig, useTextId = false): any {\n const tableName = this.getTableName(config.slug);\n const columns: Record<string, any> = {\n id: useTextId ? text(\"id\").primaryKey() : uuid(\"id\").primaryKey().defaultRandom(),\n };\n\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const dbType = fieldToDrizzleType(field, this.dialect);\n const propName = field.name.replace(/-/g, \"_\");\n const sqlName = propName.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n\n let col: any;\n if (this.dialect === 'sqlite') {\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n col = sqliteText(sqlName);\n break;\n case \"integer\":\n col = sqliteInteger(sqlName);\n break;\n case \"decimal\":\n case \"numeric\":\n col = sqliteNumeric(sqlName);\n break;\n case \"boolean\":\n col = sqliteInteger(sqlName, { mode: 'boolean' });\n break;\n case \"timestamp\":\n col = sqliteText(sqlName);\n break;\n case \"jsonb\":\n col = sqliteText(sqlName);\n break;\n default:\n col = sqliteText(sqlName);\n }\n } else {\n switch (dbType) {\n case \"varchar\":\n col = varchar(sqlName, { length: 255 });\n break;\n case \"integer\":\n col = integer(sqlName);\n break;\n case \"decimal\":\n col = decimal(sqlName);\n break;\n case \"boolean\":\n col = boolean(sqlName);\n break;\n case \"timestamp\":\n col = timestamp(sqlName);\n break;\n case \"jsonb\":\n col = jsonb(sqlName);\n break;\n default:\n col = text(sqlName);\n }\n }\n if (!field.required) col = col.default(null);\n columns[propName] = col;\n }\n\n if (!columns.createdAt) columns.createdAt = this.dialect === 'sqlite' ? sqliteText(\"created_at\").default(new Date().toISOString()) : timestamp(\"created_at\").defaultNow();\n if (!columns.updatedAt) columns.updatedAt = this.dialect === 'sqlite' ? sqliteText(\"updated_at\").default(new Date().toISOString()) : timestamp(\"updated_at\").defaultNow();\n columns.status = this.dialect === 'sqlite' ? sqliteText(\"status\").default(\"draft\") : varchar(\"status\", { length: 20 }).default(\"draft\");\n columns.hasDraft = this.dialect === 'sqlite' ? sqliteInteger(\"hasDraft\", { mode: 'boolean' }).default(false) : boolean(\"hasDraft\").default(false);\n\n return this.dialect === 'sqlite'\n ? sqliteTable(tableName, columns)\n : pgTable(tableName, columns);\n }\n\n private async ensureCollectionTables(collections: CollectionConfig[]): Promise<void> {\n const statements: string[] = [];\n for (const config of collections) {\n const isGlobal = config.slug.startsWith(\"_globals_\");\n const tableName = this.getTableName(config.slug);\n const colDefs = this.generateCreateColumns(config);\n const hasCreated = config.fields.some((f) => f.name === \"createdAt\");\n const hasUpdated = config.fields.some((f) => f.name === \"updatedAt\");\n const hasStatus = config.fields.some((f) => f.name === \"status\");\n const hasDraftField = config.fields.some((f) => f.name === \"hasDraft\");\n \n if (this.dialect === 'postgres') {\n const idCol = isGlobal ? '\"id\" TEXT PRIMARY KEY' : '\"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid()';\n statements.push(`\n CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n ${idCol},\n ${colDefs}\n ${hasCreated ? \"\" : '\"created_at\" TIMESTAMP NOT NULL DEFAULT NOW(),'}\n ${hasUpdated ? \"\" : '\"updated_at\" TIMESTAMP NOT NULL DEFAULT NOW(),'}\n ${hasStatus ? \"\" : '\"status\" VARCHAR(20) DEFAULT \\'draft\\','}\n ${hasDraftField ? \"\" : '\"hasDraft\" BOOLEAN DEFAULT false'}\n )\n `);\n } else {\n const idCol = isGlobal ? '\"id\" TEXT PRIMARY KEY' : '\"id\" TEXT PRIMARY KEY';\n statements.push(`\n CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n ${idCol},\n ${colDefs}\n ${hasCreated ? \"\" : '\"created_at\" TEXT NOT NULL DEFAULT (datetime(\\'now\\')),'}\n ${hasUpdated ? \"\" : '\"updated_at\" TEXT NOT NULL DEFAULT (datetime(\\'now\\')),'}\n ${hasStatus ? \"\" : '\"status\" TEXT DEFAULT \\'draft\\','}\n ${hasDraftField ? \"\" : '\"hasDraft\" INTEGER DEFAULT 0'}\n )\n `);\n }\n }\n if (statements.length > 0) {\n if (this.dialect === 'postgres') {\n await this.client.execute(sql.raw(statements.join(\";\\n\")));\n } else {\n for (const stmt of statements) {\n await this.client.execute(sql.raw(stmt));\n }\n }\n }\n // Sync missing columns for each table (handles schema drift from config changes)\n for (const config of collections) {\n const tableName = this.getTableName(config.slug);\n // Skip auth-managed tables — their schema is managed by the auth adapter,\n // and altering columns (e.g. users.avatar VARCHAR→jsonb) breaks auth queries.\n if (tableName === \"users\" || tableName === \"audit_logs\") continue;\n await this.syncTableColumns(config, tableName);\n }\n }\n\n private getColumnSqlDefinition(field: Field, dialect: \"postgres\" | \"sqlite\"): string {\n const dbType = fieldToDrizzleType(field, dialect);\n const sqlName = field.name!\n .replace(/-/g, \"_\")\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n const sqlType = this.columnSqlType(dbType, dialect);\n return `\"${sqlName}\" ${sqlType} DEFAULT NULL`;\n }\n\n private columnSqlType(dbType: string, dialect: string): string {\n if (dialect === 'sqlite') {\n switch (dbType) {\n case \"varchar\": return \"TEXT\";\n case \"text\": return \"TEXT\";\n case \"integer\": return \"INTEGER\";\n case \"decimal\": case \"numeric\": return \"NUMERIC\";\n case \"boolean\": return \"INTEGER\";\n case \"timestamp\": return \"TEXT\";\n case \"jsonb\": return \"TEXT\";\n default: return \"TEXT\";\n }\n }\n switch (dbType) {\n case \"varchar\": return \"VARCHAR(255)\";\n case \"text\": return \"TEXT\";\n case \"integer\": return \"INTEGER\";\n case \"decimal\": case \"numeric\": return \"DECIMAL\";\n case \"boolean\": return \"BOOLEAN\";\n case \"timestamp\": return \"TIMESTAMP\";\n case \"jsonb\": return \"JSONB\";\n default: return \"TEXT\";\n }\n }\n\n private getExpectedColumnDefs(config: CollectionConfig, tableName: string): Record<string, string> {\n const defs: Record<string, string> = {};\n const isGlobal = config.slug.startsWith(\"_globals_\");\n const hasCreated = config.fields.some((f) => f.name === \"createdAt\");\n const hasUpdated = config.fields.some((f) => f.name === \"updatedAt\");\n const hasStatus = config.fields.some((f) => f.name === \"status\");\n const hasDraftField = config.fields.some((f) => f.name === \"hasDraft\");\n\n if (this.dialect === 'postgres') {\n defs[\"id\"] = isGlobal ? '\"id\" TEXT PRIMARY KEY' : '\"id\" UUID PRIMARY KEY DEFAULT gen_random_uuid()';\n if (!hasCreated) defs[\"created_at\"] = '\"created_at\" TIMESTAMP DEFAULT NULL';\n if (!hasUpdated) defs[\"updated_at\"] = '\"updated_at\" TIMESTAMP DEFAULT NULL';\n if (!hasStatus) defs[\"status\"] = '\"status\" VARCHAR(20) DEFAULT NULL';\n if (!hasDraftField) defs[\"hasDraft\"] = '\"hasDraft\" BOOLEAN DEFAULT NULL';\n } else {\n defs[\"id\"] = '\"id\" TEXT PRIMARY KEY';\n if (!hasCreated) defs[\"created_at\"] = '\"created_at\" TEXT DEFAULT NULL';\n if (!hasUpdated) defs[\"updated_at\"] = '\"updated_at\" TEXT DEFAULT NULL';\n if (!hasStatus) defs[\"status\"] = '\"status\" TEXT DEFAULT NULL';\n if (!hasDraftField) defs[\"hasDraft\"] = '\"hasDraft\" INTEGER DEFAULT NULL';\n }\n\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const def = this.getColumnSqlDefinition(field, this.dialect);\n const sqlName = field.name\n .replace(/-/g, \"_\")\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n defs[sqlName] = def;\n }\n return defs;\n }\n\n private async syncTableColumns(config: CollectionConfig, tableName: string): Promise<void> {\n let existingCols: Map<string, { type: string; maxLen: number | null }>;\n try {\n if (this.dialect === 'postgres') {\n const result = await this.client.execute(\n sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`\n );\n existingCols = new Map(result.map((r: any) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));\n } else {\n const result = await this.client.execute(\n sql`PRAGMA table_info(\"${sql.raw(tableName)}\")`\n );\n existingCols = new Map(result.map((r: any) => [r.name, { type: r.type, maxLen: null }]));\n }\n } catch {\n return;\n }\n\n const expected = this.getExpectedColumnDefs(config, tableName);\n\n // Add missing columns\n const missing = Object.keys(expected).filter(k => !existingCols.has(k));\n if (missing.length > 0) {\n const alterStmts = missing.map(k => `ALTER TABLE \"${tableName}\" ADD COLUMN ${expected[k]}`);\n await this.executeRaw(sql.raw(alterStmts.join(\";\\n\")));\n }\n\n // Fix column type mismatches: VARCHAR → correct type where field config changed\n if (this.dialect === 'postgres') {\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const expectedDbType = fieldToDrizzleType(field, this.dialect);\n const sqlName = field.name\n .replace(/-/g, \"_\")\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n\n const info = existingCols.get(sqlName);\n if (!info || info.type !== 'character varying') continue;\n\n if (expectedDbType === 'text') {\n await this.executeRaw(sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"${sqlName}\" TYPE TEXT`));\n\n } else if (expectedDbType === 'jsonb') {\n await this.executeRaw(sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"${sqlName}\" DROP DEFAULT`));\n await this.executeRaw(sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"${sqlName}\" TYPE JSONB USING (CASE WHEN \"${sqlName}\" IS NULL THEN NULL WHEN \"${sqlName}\"::text ~ '^\\\\s*\\\\{' THEN \"${sqlName}\"::jsonb ELSE jsonb_build_object('id', \"${sqlName}\"::text) END)`));\n\n }\n }\n }\n }\n\n private generateCreateColumns(config: CollectionConfig): string {\n const cols: string[] = [];\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\") continue;\n const dbType = fieldToDrizzleType(field, this.dialect);\n const sqlName = field.name\n .replace(/-/g, \"_\")\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase();\n const nullable = field.required ? \"NOT NULL\" : \"DEFAULT NULL\";\n\n let sqlType: string;\n if (this.dialect === 'sqlite') {\n switch (dbType) {\n case \"varchar\":\n case \"text\":\n sqlType = `TEXT ${nullable}`;\n break;\n case \"integer\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"decimal\":\n case \"numeric\":\n sqlType = `NUMERIC ${nullable}`;\n break;\n case \"boolean\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"timestamp\":\n sqlType = `TEXT ${nullable}`;\n break;\n case \"jsonb\":\n sqlType = `TEXT ${nullable}`;\n break;\n default:\n sqlType = `TEXT ${nullable}`;\n }\n } else {\n switch (dbType) {\n case \"varchar\":\n sqlType = `VARCHAR(255) ${nullable}`;\n break;\n case \"integer\":\n sqlType = `INTEGER ${nullable}`;\n break;\n case \"decimal\":\n sqlType = `DECIMAL ${nullable}`;\n break;\n case \"boolean\":\n sqlType = `BOOLEAN ${nullable}`;\n break;\n case \"timestamp\":\n sqlType = `TIMESTAMP ${nullable}`;\n break;\n case \"jsonb\":\n sqlType = `JSONB ${nullable}`;\n break;\n default:\n sqlType = `TEXT ${nullable}`;\n }\n }\n cols.push(`\"${sqlName}\" ${sqlType}`);\n }\n return cols.join(\",\\n \") + (cols.length > 0 ? \",\" : \"\");\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n let effectiveWhere = { ...where };\n if (this.tenantContext && config.tenantScoped) {\n const rlsQuery = applyRLS({ where: effectiveWhere }, slug, this.tenantContext, DEFAULT_RLS_CONFIG);\n effectiveWhere = rlsQuery.where || {};\n }\n\n // Build query\n const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);\n \n // Default filter for non-draft requests: only show published\n if (!draft && table.status) {\n filters.push(eq(table.status, 'published'));\n }\n\n const sortOption = this.parseSort(sort);\n\n // Get total count (include status filter for non-draft requests)\n const countWhere = !draft && table.status ? { ...effectiveWhere, status: 'published' } : effectiveWhere;\n const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });\n\n // Execute query\n const offset = (page - 1) * limit;\n \n let results = [];\n try {\n const sortCol = table[sortOption.field] || table.createdAt || table.id;\n const sorted = sortOption.direction === 'asc' ? sortCol : desc(sortCol);\n let query = this.client.select().from(table);\n \n if (filters.length > 0) {\n query = query.where(and(...filters));\n }\n \n results = await query.orderBy(sorted).limit(limit).offset(offset);\n } catch (error) {\n console.error(`[DrizzleAdapter] Query error:`, error);\n }\n\n let docs: T[] = results.map((doc: any) => this.processResult(doc, config));\n\n if (this.tenantContext && !this.tenantContext.isSuperAdmin) {\n docs = docs.filter((doc: any) => canAccessDocument(doc, slug, this.tenantContext!, DEFAULT_RLS_CONFIG)) as T[];\n }\n\n // If draft: true, merge the latest version (autosave or manual) into the response\n if (draft) {\n docs = await Promise.all(docs.map(async (doc: any) => {\n const versions = await this.executeRaw<any>(sql`\n SELECT * FROM kyro_versions\n WHERE collection_slug = ${slug}\n AND document_id = ${doc.id}\n ORDER BY created_at DESC\n LIMIT 1\n `);\n if (versions.length > 0) {\n const ver = versions[0];\n const versionData = typeof ver.data === 'string' ? JSON.parse(ver.data) : ver.data;\n return { ...doc, ...versionData, status: doc.status };\n }\n return doc;\n }));\n }\n\n return {\n docs,\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID, draft } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n if (this.tenantContext && config.tenantScoped) {\n const tempDoc = { id, tenantId: this.tenantContext.tenantId };\n if (!canAccessDocument(tempDoc, slug, this.tenantContext, DEFAULT_RLS_CONFIG)) {\n return null;\n }\n }\n\n const conditions = [eq(table.id, id)];\n if (tenantID && table.tenantId) conditions.push(eq(table.tenantId, tenantID));\n if (!draft && table.status) conditions.push(eq(table.status, \"published\"));\n const whereClause = conditions.length > 1 ? and(...conditions) : conditions[0];\n let allRows = await this.client.select().from(table).where(whereClause);\n if (allRows.length === 0) return null;\n let doc = this.processResult(allRows[0], config) as T;\n\n // If draft: true, merge the latest version (autosave or manual) into the response\n if (draft) {\n const versions = await this.executeRaw<any>(sql`\n SELECT * FROM kyro_versions\n WHERE collection_slug = ${slug}\n AND document_id = ${(doc as any).id}\n ORDER BY created_at DESC\n LIMIT 1\n `);\n if (versions.length > 0) {\n const ver = versions[0];\n const versionData = typeof ver.data === 'string' ? JSON.parse(ver.data) : ver.data;\n doc = { ...doc, ...versionData, status: (doc as any).status };\n }\n }\n\n return doc;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const insertData = this.prepareData(data, config);\n if (tenantID) {\n insertData.tenantId = tenantID;\n }\n\n const result = await this.client\n .insert(table)\n .values(insertData)\n .returning();\n\n return this.processResult(result[0], config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const updateData = this.prepareData(data, config);\n\n // Never include id in the SET clause\n delete updateData.id;\n\n\n\n const conditions: any[] = [eq(table.id, id)];\n if (tenantID && table.tenantId) {\n conditions.push(eq(table.tenantId, tenantID));\n }\n\n const result = await this.client\n .update(table)\n .set(updateData)\n .where(and(...conditions))\n .returning();\n\n if (result.length === 0) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result[0], config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const conditions: any[] = [eq(table.id, id)];\n if (tenantID && table.tenantId) {\n conditions.push(eq(table.tenantId, tenantID));\n }\n\n const result = await this.client\n .delete(table)\n .where(and(...conditions))\n .returning();\n\n if (result.length === 0) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result[0], config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollection(slug);\n const table = this.getTable(slug);\n\n const filters = this.buildWhereClause(where, config, table, tenantID);\n\n try {\n let query = this.client.select({ count: sql<number>`count(*)` }).from(table);\n \n if (filters.length > 0) {\n query = query.where(and(...filters));\n }\n\n const result = await query;\n return Number(result[0]?.count || 0);\n } catch {\n return 0;\n }\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any> {\n const { collection: slug, where = {}, tenantID, draft } = args;\n \n // Check if it's a Global\n if (slug.startsWith('_globals_')) {\n const globalSlug = slug.replace('_globals_', '');\n const globalConfig = this.globals.get(globalSlug);\n if (!globalConfig) throw new Error(`Global \"${globalSlug}\" not found`);\n \n const table = this.getTable(slug);\n let query = this.client.select().from(table);\n \n if (!draft && table.status) {\n query = query.where(eq(table.status, 'published'));\n }\n\n const results = await query.limit(1);\n if (results.length === 0) return null;\n\n let doc = this.processResult(results[0], globalConfig as any);\n\n // If draft: true, merge the latest version (autosave or manual) into the response\n if (draft) {\n const versions = await this.executeRaw<any>(sql`\n SELECT * FROM kyro_versions\n WHERE collection_slug = ${slug}\n AND document_id = ${globalSlug}\n ORDER BY created_at DESC\n LIMIT 1\n `);\n if (versions.length > 0) {\n const ver = versions[0];\n const versionData = typeof ver.data === 'string' ? JSON.parse(ver.data) : ver.data;\n doc = { ...doc, ...versionData, status: (doc as any).status };\n }\n }\n return doc;\n }\n\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n async findVersions(args: any): Promise<FindResult<any>> {\n await this.ensureVersionsTable();\n const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;\n\n const offset = (page - 1) * limit;\n \n const countResult = await this.executeRaw(sql`\n SELECT count(*) as count \n FROM kyro_versions \n WHERE collection_slug = ${slug} \n AND document_id = ${documentId}\n AND autosave = 0\n ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}\n `);\n const totalDocs = parseInt(countResult[0]?.count || '0');\n\n const results = await this.executeRaw(sql`\n SELECT * \n FROM kyro_versions \n WHERE collection_slug = ${slug} \n AND document_id = ${documentId}\n AND autosave = 0\n ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}\n ORDER BY created_at DESC\n LIMIT ${limit}\n OFFSET ${offset}\n `);\n\n return {\n docs: results.map(row => ({\n ...row,\n data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data,\n })),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<any> {\n await this.ensureVersionsTable();\n const results = await this.executeRaw(sql`\n SELECT * FROM kyro_versions \n WHERE id = ${args.versionId} \n AND collection_slug = ${args.collection}\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n LIMIT 1\n `);\n \n if (results.length === 0) return null;\n const row = results[0];\n return {\n ...row,\n data: typeof row.data === 'string' ? JSON.parse(row.data) : row.data,\n };\n }\n\n async createVersion(args: any): Promise<any> {\n await this.ensureVersionsTable();\n const now = new Date().toISOString();\n\n // Autosave: reuse existing autosave slot instead of creating a new row\n if (args.autosave) {\n const existing = await this.executeRaw(sql`\n SELECT * FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n AND autosave = 1\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n LIMIT 1\n `);\n if (existing.length > 0) {\n await this.executeRaw(sql`\n UPDATE kyro_versions\n SET data = ${JSON.stringify(args.data)},\n status = ${args.status},\n updated_at = ${now}\n WHERE id = ${existing[0].id}\n `);\n return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });\n }\n }\n\n const id = Math.random().toString(36).substring(2, 15);\n \n await this.executeRaw(sql`\n INSERT INTO kyro_versions (\n id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at\n ) VALUES (\n ${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null}, \n ${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null}, \n ${args.changeDescription || null}, ${now}, ${now}\n )\n `);\n\n // Pruning logic — skip for autosave versions (only one per doc, not counted toward limit)\n if (!args.autosave) {\n const config = this.getCollection(args.collection);\n if (config.versions?.maxPerDoc) {\n await this.deleteVersions({\n collection: args.collection,\n documentId: args.documentId,\n keepLatest: config.versions.maxPerDoc,\n tenantID: args.tenantID,\n });\n }\n }\n\n return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });\n }\n\n async updateLatestVersion(args: any): Promise<any> {\n return this.createVersion({ ...args, autosave: true });\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n await this.ensureVersionsTable();\n \n if (args.keepLatest) {\n // Exclude autosave versions from pruning\n const toKeep = await this.executeRaw(sql`\n SELECT id FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n AND autosave = 0\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n ORDER BY created_at DESC\n LIMIT ${args.keepLatest}\n `);\n \n const keepIds = toKeep.map(r => r.id);\n if (keepIds.length > 0) {\n await this.executeRaw(sql`\n DELETE FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n AND autosave = 0\n AND id NOT IN (${sql.join(keepIds.map(id => sql`${id}`), sql`, `)})\n `);\n }\n } else {\n await this.executeRaw(sql`\n DELETE FROM kyro_versions\n WHERE collection_slug = ${args.collection}\n AND document_id = ${args.documentId}\n ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}\n `);\n }\n }\n\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getTable(slug: string): any {\n const tableName = this.getTableName(slug);\n const table = this.schema[tableName];\n if (!table) {\n throw new Error(`Table \"${tableName}\" not found in schema`);\n }\n return table;\n }\n\n private buildWhereClause(\n where: Record<string, any>,\n config: CollectionConfig,\n table: any,\n tenantID?: string\n ): any[] {\n const conditions: any[] = [];\n\n if (tenantID && config.tenantScoped && table.tenantId) {\n conditions.push(eq(table.tenantId, tenantID));\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n const andConditions = value\n .map((sub: any) => this.buildWhereClause(sub, config, table))\n .flat()\n .filter(Boolean);\n if (andConditions.length > 0) {\n conditions.push(and(...andConditions));\n }\n } else if (key === 'OR' && Array.isArray(value)) {\n const orConditions = value\n .map((sub: any) => this.buildWhereClause(sub, config, table))\n .flat()\n .filter(Boolean);\n if (orConditions.length > 0) {\n conditions.push(or(...orConditions));\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const col = table[key];\n if (!col) continue;\n\n if (value.equals !== undefined) conditions.push(eq(col, value.equals));\n if (value.not_equals !== undefined) conditions.push(ne(col, value.not_equals));\n if (value.in && Array.isArray(value.in)) conditions.push(inArray(col, value.in));\n if (value.like !== undefined) conditions.push(like(col, value.like));\n if (value.contains !== undefined) conditions.push(like(col, `%${value.contains}%`));\n if (value.greater_than !== undefined) conditions.push(gt(col, value.greater_than));\n if (value.greater_than_equal !== undefined) conditions.push(gte(col, value.greater_than_equal));\n if (value.less_than !== undefined) conditions.push(lt(col, value.less_than));\n if (value.less_than_equal !== undefined) conditions.push(lte(col, value.less_than_equal));\n } else {\n const col = table[key];\n if (col) conditions.push(eq(col, value));\n }\n }\n\n return conditions;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert id field\n if (data.id) {\n result.id = String(data.id);\n }\n\n // Map snake_case SQL column names to camelCase field names\n // (createTableFromConfig converts field names like featuredImage → featured_image in SQL)\n for (const field of config.fields) {\n if (!field.name) continue;\n const sqlKey = field.name.replace(/-/g, \"_\").replace(/([A-Z])/g, \"_$1\").toLowerCase();\n if (sqlKey !== field.name && result[sqlKey] !== undefined && result[field.name] === undefined) {\n result[field.name] = result[sqlKey];\n delete result[sqlKey];\n }\n }\n\n // Parse JSON fields and upload/image fields\n for (const field of config.fields) {\n if (['json', 'richtext', 'array', 'group', 'blocks', 'upload', 'image', 'list', 'relationship-block'].includes((field as any).type)) {\n const f = field as any;\n if (result[f.name] && typeof result[f.name] === 'string') {\n try {\n const parsed = JSON.parse(result[f.name]);\n result[f.name] = parsed;\n } catch {\n // Keep original value\n }\n }\n }\n \n // Handle nested tab fields - build nested structure\n if (field.type === 'tabs' && 'tabs' in field && field.name) {\n // If the tabs column already has an object (from JSONB or parsed above), parse nested upload/image fields\n if (typeof result[field.name] === 'object' && result[field.name] !== null && !Array.isArray(result[field.name])) {\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if ((tabField.type === 'upload' || tabField.type === 'image') && tabField.name) {\n const val = result[field.name][tabField.name];\n if (typeof val === 'string') {\n try { \n const parsed = JSON.parse(val);\n result[field.name][tabField.name] = Array.isArray(parsed)\n ? parsed.map((item: any) => item && typeof item === 'object' && typeof item.id === 'string' ? item.id : String(item || ''))\n : typeof parsed.id === 'string' ? parsed.id : String(parsed.id || '');\n } catch {}\n } else if (val && typeof val === 'object') {\n result[field.name][tabField.name] = Array.isArray(val)\n ? val.map((item: any) => item && typeof item === 'object' && typeof item.id === 'string' ? item.id : String(item || ''))\n : typeof val.id === 'string' ? val.id : String(val.id || '');\n }\n }\n }\n }\n continue;\n }\n // If the tabs column is a JSON string, parse it\n if (typeof result[field.name] === 'string') {\n try {\n const parsed = JSON.parse(result[field.name]);\n if (typeof parsed === 'object' && parsed !== null) {\n result[field.name] = parsed;\n continue;\n }\n } catch { /* fall through to flat rebuild */ }\n }\n const tabData: any = {};\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && result[tabField.name] !== undefined) {\n let value = result[tabField.name];\n if (['json', 'richtext', 'array', 'group', 'blocks', 'upload', 'image', 'list', 'relationship-block'].includes((tabField as any).type)) {\n if (value && typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n // Keep original value\n }\n }\n // Normalize upload/image to ID string\n if ((tabField.type === 'upload' || tabField.type === 'image') && value && typeof value === 'object') {\n value = Array.isArray(value)\n ? (value as any[]).map((item: any) => item && typeof item === 'object' && typeof item.id === 'string' ? item.id : String(item || ''))\n : typeof value.id === 'string' ? value.id : String(value.id || '');\n }\n }\n tabData[tabField.name] = value;\n delete result[tabField.name];\n }\n }\n }\n result[field.name] = tabData;\n }\n }\n\n // Convert timestamps to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n\n private async ensureVersionsTable(): Promise<void> {\n if (this.versionsTableReady) return;\n\n let createTableSQL: string;\n if (this.dialect === 'sqlite') {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_versions (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n status text NOT NULL DEFAULT 'draft',\n autosave integer NOT NULL DEFAULT 0,\n created_by text,\n change_description text,\n created_at text DEFAULT (datetime('now')),\n updated_at text DEFAULT (datetime('now'))\n )\n `;\n } else {\n createTableSQL = `\n CREATE TABLE IF NOT EXISTS kyro_versions (\n id text PRIMARY KEY,\n collection_slug text NOT NULL,\n document_id text NOT NULL,\n tenant_id text,\n data text NOT NULL,\n status text NOT NULL,\n autosave integer NOT NULL DEFAULT 0,\n created_by text,\n change_description text,\n created_at text NOT NULL,\n updated_at text NOT NULL\n )\n `;\n }\n\n await this.executeRaw(sql.raw(createTableSQL));\n\n // Migration: add autosave column to existing tables\n try {\n if (this.dialect === 'postgres') {\n await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));\n } else {\n // SQLite does not support IF NOT EXISTS for ALTER TABLE\n await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));\n }\n } catch {\n // Column already exists — safe to ignore\n }\n\n this.versionsTableReady = true;\n }\n\n private async executeRaw<T = any>(query: any): Promise<T[]> {\n const result = await this.client.execute(query);\n if (Array.isArray(result)) {\n return result as T[];\n }\n if (Array.isArray(result?.rows)) {\n return result.rows as T[];\n }\n if (Array.isArray(result?.[0])) {\n return result[0] as T[];\n }\n return [];\n }\n\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDrizzleAdapter(options: {\n type?: 'postgres' | 'sqlite';\n client?: any;\n schema?: any;\n connectionString?: string;\n}): DrizzleAdapter {\n return new DrizzleAdapter(options);\n}\n","import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { randomBytes } from \"crypto\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { createRequire } from \"module\";\nconst _require = createRequire(import.meta.url);\nconst modPath = \"node:\" + \"sqlite\";\nconst { DatabaseSync } = _require(modPath) as typeof import(\"node:sqlite\");\n\nexport type Dialect = \"sqlite\" | \"postgres\";\n\nfunction getDialect(): Dialect {\n const val = process.env.DB_TYPE as Dialect | undefined;\n if (val === \"postgres\") return \"postgres\";\n return \"sqlite\";\n}\n\nexport function genId(): string {\n return randomBytes(16).toString(\"hex\");\n}\n\nexport interface DatabaseResult {\n db: any;\n dialect: Dialect;\n genId: () => string;\n}\n\nexport async function createDatabase(): Promise<DatabaseResult> {\n const dialect = getDialect();\n\n if (dialect === \"sqlite\") {\n const dbPath = resolve(process.cwd(), \"data\", \"kyro.db\");\n await mkdir(dirname(dbPath), { recursive: true });\n const db = new DatabaseSync(dbPath);\n db.exec(\"PRAGMA journal_mode = WAL\");\n return { db, dialect, genId };\n }\n\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const maxConnections = parseInt(process.env.DB_POOL_MAX || \"10\", 10);\n const ssl = process.env.DB_SSL === \"true\";\n const client = postgres(databaseUrl, {\n max: maxConnections,\n ssl: ssl ? \"require\" : false,\n onnotice: () => {},\n });\n const db = drizzle(client);\n return { db, dialect, genId };\n}\n\nexport async function runMigrations(\n _db: any,\n _dialect?: Dialect,\n): Promise<void> {\n\n}\n\nexport async function seedDefaultRoles(db: any): Promise<void> {\n const { roles } = await import(\"./schema/index.js\");\n await db\n .insert(roles)\n .values({\n name: \"super_admin\",\n level: 100,\n inherits: [],\n description: \"Full system access across all tenants\",\n isSystem: true,\n })\n .onConflictDoNothing();\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunk3P5AHK2U_cjs = require('./chunk-3P5AHK2U.cjs');
3
+ var chunk74YSDAWE_cjs = require('./chunk-74YSDAWE.cjs');
4
4
  var chunk5GFQPHGT_cjs = require('./chunk-5GFQPHGT.cjs');
5
5
  var chunkIDVRRRAK_cjs = require('./chunk-IDVRRRAK.cjs');
6
- var chunkGYIJ3JJM_cjs = require('./chunk-GYIJ3JJM.cjs');
6
+ var chunkOIRG6ZRV_cjs = require('./chunk-OIRG6ZRV.cjs');
7
7
  var chunk7OS7TX2Q_cjs = require('./chunk-7OS7TX2Q.cjs');
8
8
  var chunkTHBQG64D_cjs = require('./chunk-THBQG64D.cjs');
9
9
  var chunkGXFOGU7N_cjs = require('./chunk-GXFOGU7N.cjs');
@@ -19,19 +19,19 @@ async function doInit() {
19
19
  if (exports.kyroInstance) return;
20
20
  try {
21
21
  const config = projectConfig__default.default.default || projectConfig__default.default;
22
- exports.kyroInstance = chunk3P5AHK2U_cjs.createKyro(config);
22
+ exports.kyroInstance = chunk74YSDAWE_cjs.createKyro(config);
23
23
  await exports.kyroInstance.init();
24
24
  await exports.kyroInstance.loadSettings();
25
25
  const db = exports.kyroInstance.db;
26
26
  let bootstrapAuthAdapter = void 0;
27
- if (db instanceof chunkGYIJ3JJM_cjs.DrizzleAdapter) {
27
+ if (db instanceof chunkOIRG6ZRV_cjs.DrizzleAdapter) {
28
28
  if (db.dialect === "postgres") {
29
29
  bootstrapAuthAdapter = new chunk7OS7TX2Q_cjs.PostgresAuthAdapter({ db: db.client });
30
30
  } else if (db.dialect === "sqlite") {
31
31
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
32
32
  bootstrapAuthAdapter = new chunkIDVRRRAK_cjs.SQLiteAuthAdapter({ path: authDbPath });
33
33
  }
34
- } else if (db instanceof chunk3P5AHK2U_cjs.LocalAdapter) {
34
+ } else if (db instanceof chunk74YSDAWE_cjs.LocalAdapter) {
35
35
  const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
36
36
  bootstrapAuthAdapter = new chunkIDVRRRAK_cjs.SQLiteAuthAdapter({ path: authDbPath });
37
37
  } else if (db instanceof chunkTHBQG64D_cjs.MongoDBAdapter) {
@@ -106,5 +106,5 @@ var ALL = async (context) => {
106
106
 
107
107
  exports.ALL = ALL;
108
108
  exports.warmKyroInstance = warmKyroInstance;
109
- //# sourceMappingURL=chunk-NQJJYRLP.cjs.map
110
- //# sourceMappingURL=chunk-NQJJYRLP.cjs.map
109
+ //# sourceMappingURL=chunk-VAXLFZCV.cjs.map
110
+ //# sourceMappingURL=chunk-VAXLFZCV.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler.ts"],"names":["kyroInstance","projectConfig","createKyro","DrizzleAdapter","PostgresAuthAdapter","SQLiteAuthAdapter","LocalAdapter","MongoDBAdapter","MongoDBAuthAdapter","autoBootstrap"],"mappings":"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","file":"chunk-NQJJYRLP.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\ndeclare var __KYRO_API_PATH__: string;\n\nexport let kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n try {\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n }\n\n // Auto-start WebSocket (checks settings.access.apiAccess.wsEnabled internally)\n if (typeof kyroInstance.startWebSocket === \"function\") {\n kyroInstance.startWebSocket().catch((err: any) => {\n console.error(\"[Kyro] WebSocket auto-start failed:\", err);\n });\n }\n\n // Expose instance globally so admin SSR can read DB directly\n (globalThis as any).__KYRO_INSTANCE__ = kyroInstance;\n\n } catch (err) {\n kyroInstance = null;\n initPromise = null;\n console.error(\"[Kyro API] Init failed, will retry:\", err);\n throw err;\n }\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000)\n ),\n ]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const url = new URL(context.request.url);\n const path = url.pathname;\n const p = __KYRO_API_PATH__;\n\n if (path === `${p}/graphql` && typeof kyroInstance.getGraphQL === \"function\") {\n const yoga = kyroInstance.getGraphQL();\n const res = await yoga.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n if (path.startsWith(`${p}/trpc/`) && typeof kyroInstance.getTRPC === \"function\") {\n const trpc = kyroInstance.getTRPC();\n const res = await trpc.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler.ts"],"names":["kyroInstance","projectConfig","createKyro","DrizzleAdapter","PostgresAuthAdapter","SQLiteAuthAdapter","LocalAdapter","MongoDBAdapter","MongoDBAuthAdapter","autoBootstrap"],"mappings":"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","file":"chunk-VAXLFZCV.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\ndeclare var __KYRO_API_PATH__: string;\n\nexport let kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n try {\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n }\n\n // Auto-start WebSocket (checks settings.access.apiAccess.wsEnabled internally)\n if (typeof kyroInstance.startWebSocket === \"function\") {\n kyroInstance.startWebSocket().catch((err: any) => {\n console.error(\"[Kyro] WebSocket auto-start failed:\", err);\n });\n }\n\n // Expose instance globally so admin SSR can read DB directly\n (globalThis as any).__KYRO_INSTANCE__ = kyroInstance;\n\n } catch (err) {\n kyroInstance = null;\n initPromise = null;\n console.error(\"[Kyro API] Init failed, will retry:\", err);\n throw err;\n }\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000)\n ),\n ]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const url = new URL(context.request.url);\n const path = url.pathname;\n const p = __KYRO_API_PATH__;\n\n if (path === `${p}/graphql` && typeof kyroInstance.getGraphQL === \"function\") {\n const yoga = kyroInstance.getGraphQL();\n const res = await yoga.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n if (path.startsWith(`${p}/trpc/`) && typeof kyroInstance.getTRPC === \"function\") {\n const trpc = kyroInstance.getTRPC();\n const res = await trpc.fetch(context.request, context.locals);\n return new Response(res.body, res);\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-3YELQL7Z.cjs');
4
- var chunkGYIJ3JJM_cjs = require('../chunk-GYIJ3JJM.cjs');
4
+ var chunkOIRG6ZRV_cjs = require('../chunk-OIRG6ZRV.cjs');
5
5
  var chunk7OS7TX2Q_cjs = require('../chunk-7OS7TX2Q.cjs');
6
6
  require('../chunk-DPA3KWPY.cjs');
7
7
  require('../chunk-GUUB5EAG.cjs');
@@ -12,35 +12,35 @@ require('../chunk-CZLDE2OZ.cjs');
12
12
 
13
13
  Object.defineProperty(exports, "DrizzleAdapter", {
14
14
  enumerable: true,
15
- get: function () { return chunkGYIJ3JJM_cjs.DrizzleAdapter; }
15
+ get: function () { return chunkOIRG6ZRV_cjs.DrizzleAdapter; }
16
16
  });
17
17
  Object.defineProperty(exports, "collectionToDrizzleSchema", {
18
18
  enumerable: true,
19
- get: function () { return chunkGYIJ3JJM_cjs.collectionToDrizzleSchema; }
19
+ get: function () { return chunkOIRG6ZRV_cjs.collectionToDrizzleSchema; }
20
20
  });
21
21
  Object.defineProperty(exports, "createDatabase", {
22
22
  enumerable: true,
23
- get: function () { return chunkGYIJ3JJM_cjs.createDatabase; }
23
+ get: function () { return chunkOIRG6ZRV_cjs.createDatabase; }
24
24
  });
25
25
  Object.defineProperty(exports, "createDrizzleAdapter", {
26
26
  enumerable: true,
27
- get: function () { return chunkGYIJ3JJM_cjs.createDrizzleAdapter; }
27
+ get: function () { return chunkOIRG6ZRV_cjs.createDrizzleAdapter; }
28
28
  });
29
29
  Object.defineProperty(exports, "fieldToDrizzleType", {
30
30
  enumerable: true,
31
- get: function () { return chunkGYIJ3JJM_cjs.fieldToDrizzleType; }
31
+ get: function () { return chunkOIRG6ZRV_cjs.fieldToDrizzleType; }
32
32
  });
33
33
  Object.defineProperty(exports, "genId", {
34
34
  enumerable: true,
35
- get: function () { return chunkGYIJ3JJM_cjs.genId; }
35
+ get: function () { return chunkOIRG6ZRV_cjs.genId; }
36
36
  });
37
37
  Object.defineProperty(exports, "runMigrations", {
38
38
  enumerable: true,
39
- get: function () { return chunkGYIJ3JJM_cjs.runMigrations; }
39
+ get: function () { return chunkOIRG6ZRV_cjs.runMigrations; }
40
40
  });
41
41
  Object.defineProperty(exports, "seedDefaultRoles", {
42
42
  enumerable: true,
43
- get: function () { return chunkGYIJ3JJM_cjs.seedDefaultRoles; }
43
+ get: function () { return chunkOIRG6ZRV_cjs.seedDefaultRoles; }
44
44
  });
45
45
  Object.defineProperty(exports, "PostgresAuthAdapter", {
46
46
  enumerable: true,
@@ -1,5 +1,5 @@
1
1
  import '../chunk-QU2RFFH4.js';
2
- export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles } from '../chunk-XHAAAEXX.js';
2
+ export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles } from '../chunk-V5AWATUP.js';
3
3
  export { PostgresAuthAdapter } from '../chunk-CJX74IYK.js';
4
4
  import '../chunk-UUDTPZX6.js';
5
5
  import '../chunk-WXVB364T.js';