@kyro-cms/core 0.9.9 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/api-handler-graphql.cjs +11 -11
  2. package/dist/api-handler-graphql.js +7 -7
  3. package/dist/api-handler-trpc.cjs +9 -9
  4. package/dist/api-handler-trpc.js +7 -7
  5. package/dist/api-handler.cjs +10 -10
  6. package/dist/api-handler.js +7 -7
  7. package/dist/{bootstrap-4CELFLJO.cjs → bootstrap-FUAPY2OF.cjs} +9 -9
  8. package/dist/{bootstrap-4CELFLJO.cjs.map → bootstrap-FUAPY2OF.cjs.map} +1 -1
  9. package/dist/bootstrap-OXNVM7FP.js +7 -0
  10. package/dist/{bootstrap-3PV3GJ3S.js.map → bootstrap-OXNVM7FP.js.map} +1 -1
  11. package/dist/{chunk-5RFGYEQ3.js → chunk-354ISGA4.js} +5 -23
  12. package/dist/chunk-354ISGA4.js.map +1 -0
  13. package/dist/{chunk-E4JZ73FY.cjs → chunk-3P5AHK2U.cjs} +11 -24
  14. package/dist/chunk-3P5AHK2U.cjs.map +1 -0
  15. package/dist/{chunk-BVUDFKKS.js → chunk-526M5MOA.js} +6 -8
  16. package/dist/chunk-526M5MOA.js.map +1 -0
  17. package/dist/{chunk-5PMQQFRE.cjs → chunk-5GFQPHGT.cjs} +6 -9
  18. package/dist/chunk-5GFQPHGT.cjs.map +1 -0
  19. package/dist/{chunk-OYCICW4B.js → chunk-AN2L2CJZ.js} +4 -17
  20. package/dist/chunk-AN2L2CJZ.js.map +1 -0
  21. package/dist/{chunk-RFFSZSCL.cjs → chunk-GYIJ3JJM.cjs} +3 -11
  22. package/dist/chunk-GYIJ3JJM.cjs.map +1 -0
  23. package/dist/{chunk-PQ72Z6WC.js → chunk-GZS4LMR7.js} +2 -5
  24. package/dist/chunk-GZS4LMR7.js.map +1 -0
  25. package/dist/{chunk-GAAHG2Z4.js → chunk-HY6B7B5A.js} +4 -7
  26. package/dist/chunk-HY6B7B5A.js.map +1 -0
  27. package/dist/{chunk-IEIHABVR.cjs → chunk-ISKYUUP4.cjs} +15 -33
  28. package/dist/chunk-ISKYUUP4.cjs.map +1 -0
  29. package/dist/{chunk-6UNONDW7.js → chunk-N5QSHUA6.js} +2 -11
  30. package/dist/chunk-N5QSHUA6.js.map +1 -0
  31. package/dist/{chunk-OXYSOU6Z.cjs → chunk-NQJJYRLP.cjs} +11 -13
  32. package/dist/chunk-NQJJYRLP.cjs.map +1 -0
  33. package/dist/{chunk-Q23GAMLE.cjs → chunk-THBQG64D.cjs} +2 -5
  34. package/dist/chunk-THBQG64D.cjs.map +1 -0
  35. package/dist/{chunk-Y7AQK4R4.cjs → chunk-VKREAIBA.cjs} +2 -11
  36. package/dist/chunk-VKREAIBA.cjs.map +1 -0
  37. package/dist/{chunk-V7KZQIZ6.js → chunk-XHAAAEXX.js} +2 -10
  38. package/dist/chunk-XHAAAEXX.js.map +1 -0
  39. package/dist/cli/index.cjs +1 -41
  40. package/dist/cli/index.cjs.map +1 -1
  41. package/dist/cli/index.js +1 -41
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/drizzle/index.cjs +9 -9
  44. package/dist/drizzle/index.js +1 -1
  45. package/dist/index.cjs +62 -64
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.js +8 -10
  48. package/dist/index.js.map +1 -1
  49. package/dist/mongodb/index.cjs +3 -3
  50. package/dist/mongodb/index.js +1 -1
  51. package/dist/rest/index.cjs +6 -6
  52. package/dist/rest/index.js +4 -4
  53. package/package.json +1 -1
  54. package/dist/bootstrap-3PV3GJ3S.js +0 -7
  55. package/dist/chunk-5PMQQFRE.cjs.map +0 -1
  56. package/dist/chunk-5RFGYEQ3.js.map +0 -1
  57. package/dist/chunk-6UNONDW7.js.map +0 -1
  58. package/dist/chunk-BVUDFKKS.js.map +0 -1
  59. package/dist/chunk-E4JZ73FY.cjs.map +0 -1
  60. package/dist/chunk-GAAHG2Z4.js.map +0 -1
  61. package/dist/chunk-IEIHABVR.cjs.map +0 -1
  62. package/dist/chunk-OXYSOU6Z.cjs.map +0 -1
  63. package/dist/chunk-OYCICW4B.js.map +0 -1
  64. package/dist/chunk-PQ72Z6WC.js.map +0 -1
  65. package/dist/chunk-Q23GAMLE.cjs.map +0 -1
  66. package/dist/chunk-RFFSZSCL.cjs.map +0 -1
  67. package/dist/chunk-V7KZQIZ6.js.map +0 -1
  68. package/dist/chunk-Y7AQK4R4.cjs.map +0 -1
@@ -1 +0,0 @@
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-V7KZQIZ6.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 console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);\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 \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 \"status\" VARCHAR(20) DEFAULT 'draft',\n \"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 \"status\" TEXT DEFAULT 'draft',\n \"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\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 defs[\"status\"] = '\"status\" VARCHAR(20) DEFAULT NULL';\n 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 defs[\"status\"] = '\"status\" TEXT DEFAULT NULL';\n 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 console.log(`[DrizzleAdapter] Fixed column type: \"${tableName}\".\"${sqlName}\" VARCHAR → TEXT`);\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 console.log(`[DrizzleAdapter] Fixed column type: \"${tableName}\".\"${sqlName}\" VARCHAR → JSONB`);\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 console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);\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 console.log(`[DrizzleAdapter.update] CALLED for ${slug}/${id}`);\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 console.log(\n `[createDatabase] runMigrations called — use drizzle-kit CLI for migrations (drizzle-kit migrate)`,\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 +0,0 @@
1
- {"version":3,"sources":["../src/config/ConfigService.ts","../src/auth/nodemailer-transport.ts","../src/auth/security/password-policy.ts"],"names":["settings"],"mappings":"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","file":"chunk-Y7AQK4R4.cjs","sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { settings as settingsSchema } from \"../database/drizzle/schema/settings.js\";\n\nlet _settingsTableEnsured = false;\n\nexport interface S3CompatibleConfig {\n bucket?: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n endpoint?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface R2Config {\n accountId?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n bucket?: string;\n cdnUrl?: string;\n prefix?: string;\n publicDevUrl?: string;\n}\n\nexport interface GCSConfig {\n bucket?: string;\n projectId?: string;\n clientEmail?: string;\n privateKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BackblazeConfig {\n bucket?: string;\n accountId?: string;\n applicationKeyId?: string;\n applicationKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BunnyConfig {\n storageZone?: string;\n apiKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface FTPConfig {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n secure?: boolean;\n baseUrl?: string;\n prefix?: string;\n}\n\nexport interface StorageConfig {\n type: string;\n s3: S3CompatibleConfig;\n r2: R2Config;\n gcs: GCSConfig;\n digitalocean: S3CompatibleConfig;\n backblaze: BackblazeConfig;\n wasabi: S3CompatibleConfig;\n bunny: BunnyConfig;\n ftp: FTPConfig;\n cloudinary: {\n cloudName?: string;\n apiKey?: string;\n apiSecret?: string;\n folder?: string;\n };\n imgix: {\n domain?: string;\n signKey?: string;\n };\n local: {\n uploadDir?: string;\n baseUrl?: string;\n };\n}\n\nexport interface EmailConfig {\n provider?: string;\n host?: string;\n port?: number;\n secure?: boolean;\n user?: string;\n pass?: string;\n from?: string;\n fromName?: string;\n replyTo?: string;\n}\n\nexport class ConfigService {\n private db: any;\n private cache: Record<string, string> = {};\n private loaded = false;\n private static readonly SENSITIVE_KEYS = [\n \"storage.s3.secret_access_key\",\n \"storage.r2.secret_access_key\",\n \"storage.gcs.private_key\",\n \"storage.backblaze.application_key\",\n \"storage.wasabi.secret_access_key\",\n \"storage.ftp.password\",\n \"storage.bunny.api_key\",\n \"storage.cloudinary.api_secret\",\n \"storage.imgix.sign_key\",\n \"email.smtp.pass\",\n \"auth.jwt_secret\",\n \"auth.github_secret\",\n \"auth.google_secret\",\n \"auth.app_secret\",\n \"database.url\",\n \"redis.url\",\n \"auth.admin_password\",\n ];\n\n constructor(db: any) {\n this.db = db;\n }\n\n /**\n * Initialize the service by loading all settings from the database\n */\n async load(): Promise<void> {\n if (this.loaded) return;\n\n await this.ensureSettingsTable();\n\n try {\n if (typeof this.db?.select === \"function\") {\n const allSettings = await this.db.select().from(settingsSchema);\n this.cache = allSettings.reduce((acc: any, row: any) => {\n acc[row.key] = row.value;\n return acc;\n }, {});\n }\n \n // Always try to load from globals to pick up CMS-configured storage settings\n await this.loadFromGlobals();\n } catch (error) {\n console.warn(\n \"ConfigService: Could not load settings from database, using environment fallbacks.\",\n );\n }\n\n this.loaded = true;\n }\n\n private async ensureSettingsTable(): Promise<void> {\n if (_settingsTableEnsured) return;\n\n try {\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"settings\" (\n \"key\" VARCHAR(255) PRIMARY KEY,\n \"value\" TEXT NOT NULL,\n \"description\" TEXT,\n \"updated_at\" TIMESTAMP DEFAULT NOW()\n )\n `);\n _settingsTableEnsured = true;\n } else if (typeof this.db?.exec === \"function\") {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n description TEXT,\n updated_at TEXT\n )\n `);\n _settingsTableEnsured = true;\n }\n } catch {\n // Table creation failed — will fall back to env vars\n }\n }\n\n /**\n * Load settings from the _globals_storage-settings table (SQLite fallback)\n * Maps nested global structure to flat key-value cache\n */\n private async loadFromGlobals(): Promise<void> {\n try {\n let row: any = null;\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n const variants = ['\"_globals_storage-settings\"', '\"_globals_storage_settings\"', '\"global_storage_settings\"'];\n for (const name of variants) {\n try {\n const result = await this.db.execute(sql`SELECT * FROM ${sql.raw(name)} LIMIT 1`);\n row = Array.isArray(result) ? result[0] : (result?.rows ? result.rows[0] : null);\n if (row) break;\n } catch {}\n }\n } else if (typeof this.db?.prepare === \"function\") {\n const variants = ['\"_globals_storage-settings\"', '\"_globals_storage_settings\"', '\"global_storage_settings\"'];\n for (const name of variants) {\n try {\n row = this.db.prepare(`SELECT * FROM ${name} LIMIT 1`).get();\n if (row) break;\n } catch {}\n }\n }\n\n if (!row) return;\n\n const parseJSON = (val: any) => {\n if (!val) return null;\n if (typeof val === \"string\") {\n try {\n return JSON.parse(val);\n } catch {\n return null;\n }\n }\n return val;\n };\n\n const provider = row.provider || \"local\";\n this.cache[\"storage.type\"] = provider === \"aws\" ? \"s3\" : provider;\n\n if (provider === \"local\") {\n const local = parseJSON(row.local);\n this.cache[\"storage.local.dir\"] =\n local?.uploadDir || \"./public/uploads\";\n this.cache[\"storage.local.url\"] = local?.baseUrl || \"/uploads\";\n }\n\n if (provider === \"aws\") {\n const aws = parseJSON(row.aws);\n this.cache[\"storage.s3.bucket\"] = aws?.bucket || \"\";\n this.cache[\"storage.s3.region\"] = aws?.region || \"us-east-1\";\n this.cache[\"storage.s3.access_key_id\"] = aws?.accessKeyId || \"\";\n this.cache[\"storage.s3.secret_access_key\"] = aws?.secretAccessKey || \"\";\n this.cache[\"storage.s3.endpoint\"] = aws?.endpoint || \"\";\n this.cache[\"storage.s3.cdn_url\"] = aws?.cdnUrl || \"\";\n this.cache[\"storage.s3.prefix\"] = aws?.prefix || \"\";\n }\n\n if (provider === \"r2\") {\n const r2 = parseJSON(row.r2);\n this.cache[\"storage.r2.account_id\"] = r2?.accountId || \"\";\n this.cache[\"storage.r2.access_key_id\"] = r2?.accessKeyId || \"\";\n this.cache[\"storage.r2.secret_access_key\"] = r2?.secretAccessKey || \"\";\n this.cache[\"storage.r2.bucket\"] = r2?.bucket || \"\";\n this.cache[\"storage.r2.cdn_url\"] = r2?.cdnUrl || \"\";\n this.cache[\"storage.r2.prefix\"] = r2?.prefix || \"\";\n }\n\n if (provider === \"cloudinary\") {\n const cloudinary = parseJSON(row.cloudinary);\n this.cache[\"storage.cloudinary.cloud_name\"] =\n cloudinary?.cloudName || \"\";\n this.cache[\"storage.cloudinary.api_key\"] = cloudinary?.apiKey || \"\";\n this.cache[\"storage.cloudinary.api_secret\"] =\n cloudinary?.apiSecret || \"\";\n this.cache[\"storage.cloudinary.folder\"] = cloudinary?.folder || \"\";\n }\n\n if (provider === \"ftp\") {\n const ftp = parseJSON(row.ftp);\n this.cache[\"storage.ftp.host\"] = ftp?.host || \"\";\n this.cache[\"storage.ftp.port\"] = String(ftp?.port || \"21\");\n this.cache[\"storage.ftp.user\"] = ftp?.user || \"\";\n this.cache[\"storage.ftp.password\"] = ftp?.password || \"\";\n this.cache[\"storage.ftp.secure\"] = ftp?.secure ? \"true\" : \"false\";\n this.cache[\"storage.ftp.base_url\"] = ftp?.baseUrl || \"\";\n this.cache[\"storage.ftp.prefix\"] = ftp?.prefix || \"\";\n }\n } catch (error) {\n console.warn(\"ConfigService: Could not load storage settings from globals table:\", error);\n }\n\n // Also load email-settings\n try {\n let row: any = null;\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n const variants = ['\"_globals_email-settings\"', '\"_globals_email_settings\"', '\"global_email_settings\"'];\n for (const name of variants) {\n try {\n const result = await this.db.execute(sql`SELECT * FROM ${sql.raw(name)} LIMIT 1`);\n row = Array.isArray(result) ? result[0] : (result?.rows ? result.rows[0] : null);\n if (row) break;\n } catch {}\n }\n } else if (typeof this.db?.prepare === \"function\") {\n const variants = ['\"_globals_email-settings\"', '\"_globals_email_settings\"', '\"global_email_settings\"'];\n for (const name of variants) {\n try {\n row = this.db.prepare(`SELECT * FROM ${name} LIMIT 1`).get();\n if (row) break;\n } catch {}\n }\n }\n\n if (row) {\n const parseJSON = (val: any) => {\n if (!val) return null;\n if (typeof val === \"string\") {\n try { return JSON.parse(val); } catch { return null; }\n }\n return val;\n };\n\n this.cache[\"email.provider\"] = row.provider || \"smtp\";\n this.cache[\"email.smtp.from\"] = row.fromEmail || \"\";\n this.cache[\"email.smtp.from_name\"] = row.fromName || \"\";\n this.cache[\"email.smtp.reply_to\"] = row.replyTo || \"\";\n\n if (row.provider === \"smtp\") {\n const smtp = parseJSON(row.smtp);\n this.cache[\"email.smtp.host\"] = smtp?.host || \"\";\n this.cache[\"email.smtp.port\"] = String(smtp?.port || \"587\");\n this.cache[\"email.smtp.user\"] = smtp?.username || \"\";\n this.cache[\"email.smtp.pass\"] = smtp?.password || \"\";\n this.cache[\"email.smtp.secure\"] = smtp?.secure ? \"true\" : \"false\";\n } else if (row.provider === \"resend\") {\n const resend = parseJSON(row.resend);\n this.cache[\"email.smtp.pass\"] = resend?.apiKey || \"\"; // We might use pass as apiKey\n } else if (row.provider === \"sendgrid\") {\n const sendgrid = parseJSON(row.sendgrid);\n this.cache[\"email.smtp.pass\"] = sendgrid?.apiKey || \"\";\n } else if (row.provider === \"mailgun\") {\n const mailgun = parseJSON(row.mailgun);\n this.cache[\"email.smtp.pass\"] = mailgun?.apiKey || \"\";\n } else if (row.provider === \"ses\") {\n const ses = parseJSON(row.ses);\n this.cache[\"email.smtp.user\"] = ses?.accessKeyId || \"\";\n this.cache[\"email.smtp.pass\"] = ses?.secretAccessKey || \"\";\n }\n }\n } catch (error) {\n console.warn(\"ConfigService: Could not load email settings from globals table:\", error);\n }\n }\n\n /**\n * Get a settings value with environment fallback\n */\n get(key: string, envKey?: string, defaultValue?: string): string | undefined {\n // 1. Check database cache\n if (this.cache[key]) return this.cache[key];\n\n // 2. Check environment variable\n if (envKey && process.env[envKey]) return process.env[envKey];\n\n // 3. Return default\n return defaultValue;\n }\n\n /**\n * Get storage configuration\n */\n getStorageConfig(): StorageConfig {\n return {\n type: this.get(\"storage.type\", \"STORAGE_TYPE\", \"local\")!,\n s3: {\n bucket: this.get(\"storage.s3.bucket\", \"STORAGE_BUCKET\"),\n region: this.get(\"storage.s3.region\", \"STORAGE_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.s3.access_key_id\",\n \"STORAGE_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.s3.secret_access_key\",\n \"STORAGE_SECRET_ACCESS_KEY\",\n ),\n endpoint: this.get(\"storage.s3.endpoint\", \"STORAGE_ENDPOINT\"),\n cdnUrl: this.get(\"storage.s3.cdn_url\", \"STORAGE_CDN_URL\"),\n prefix: this.get(\"storage.s3.prefix\", \"STORAGE_PREFIX\"),\n },\n r2: {\n accountId: this.get(\"storage.r2.account_id\", \"R2_ACCOUNT_ID\"),\n accessKeyId: this.get(\"storage.r2.access_key_id\", \"R2_ACCESS_KEY_ID\"),\n secretAccessKey: this.get(\n \"storage.r2.secret_access_key\",\n \"R2_SECRET_ACCESS_KEY\",\n ),\n bucket: this.get(\"storage.r2.bucket\", \"R2_BUCKET\"),\n cdnUrl: this.get(\"storage.r2.cdn_url\", \"R2_CDN_URL\"),\n prefix: this.get(\"storage.r2.prefix\", \"R2_PREFIX\"),\n },\n gcs: {\n bucket: this.get(\"storage.gcs.bucket\", \"GCS_BUCKET\"),\n projectId: this.get(\"storage.gcs.project_id\", \"GCS_PROJECT_ID\"),\n clientEmail: this.get(\"storage.gcs.client_email\", \"GCS_CLIENT_EMAIL\"),\n privateKey: this.get(\"storage.gcs.private_key\", \"GCS_PRIVATE_KEY\"),\n cdnUrl: this.get(\"storage.gcs.cdn_url\", \"GCS_CDN_URL\"),\n prefix: this.get(\"storage.gcs.prefix\", \"GCS_PREFIX\"),\n },\n digitalocean: {\n bucket: this.get(\"storage.digitalocean.bucket\", \"DO_BUCKET\"),\n region: this.get(\"storage.digitalocean.region\", \"DO_REGION\", \"nyc3\"),\n accessKeyId: this.get(\n \"storage.digitalocean.access_key_id\",\n \"DO_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.digitalocean.secret_access_key\",\n \"DO_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.digitalocean.cdn_url\", \"DO_CDN_URL\"),\n prefix: this.get(\"storage.digitalocean.prefix\", \"DO_PREFIX\"),\n },\n backblaze: {\n bucket: this.get(\"storage.backblaze.bucket\", \"BB_BUCKET\"),\n accountId: this.get(\"storage.backblaze.account_id\", \"BB_ACCOUNT_ID\"),\n applicationKeyId: this.get(\n \"storage.backblaze.application_key_id\",\n \"BB_APPLICATION_KEY_ID\",\n ),\n applicationKey: this.get(\n \"storage.backblaze.application_key\",\n \"BB_APPLICATION_KEY\",\n ),\n cdnUrl: this.get(\"storage.backblaze.cdn_url\", \"BB_CDN_URL\"),\n prefix: this.get(\"storage.backblaze.prefix\", \"BB_PREFIX\"),\n },\n wasabi: {\n bucket: this.get(\"storage.wasabi.bucket\", \"WASABI_BUCKET\"),\n region: this.get(\"storage.wasabi.region\", \"WASABI_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.wasabi.access_key_id\",\n \"WASABI_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.wasabi.secret_access_key\",\n \"WASABI_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.wasabi.cdn_url\", \"WASABI_CDN_URL\"),\n prefix: this.get(\"storage.wasabi.prefix\", \"WASABI_PREFIX\"),\n },\n bunny: {\n storageZone: this.get(\n \"storage.bunny.storage_zone\",\n \"BUNNY_STORAGE_ZONE\",\n ),\n apiKey: this.get(\"storage.bunny.api_key\", \"BUNNY_API_KEY\"),\n cdnUrl: this.get(\"storage.bunny.cdn_url\", \"BUNNY_CDN_URL\"),\n prefix: this.get(\"storage.bunny.prefix\", \"BUNNY_PREFIX\"),\n },\n ftp: {\n host: this.get(\"storage.ftp.host\", \"FTP_HOST\"),\n port: parseInt(this.get(\"storage.ftp.port\", \"FTP_PORT\", \"21\")!, 10),\n user: this.get(\"storage.ftp.user\", \"FTP_USER\"),\n password: this.get(\"storage.ftp.password\", \"FTP_PASSWORD\"),\n secure: this.get(\"storage.ftp.secure\", \"FTP_SECURE\") === \"true\",\n baseUrl: this.get(\"storage.ftp.base_url\", \"FTP_BASE_URL\"),\n prefix: this.get(\"storage.ftp.prefix\", \"FTP_PREFIX\"),\n },\n cloudinary: {\n cloudName: this.get(\n \"storage.cloudinary.cloud_name\",\n \"CLOUDINARY_CLOUD_NAME\",\n ),\n apiKey: this.get(\"storage.cloudinary.api_key\", \"CLOUDINARY_API_KEY\"),\n apiSecret: this.get(\n \"storage.cloudinary.api_secret\",\n \"CLOUDINARY_API_SECRET\",\n ),\n folder: this.get(\"storage.cloudinary.folder\", \"CLOUDINARY_FOLDER\"),\n },\n imgix: {\n domain: this.get(\"storage.imgix.domain\", \"IMGIX_DOMAIN\"),\n signKey: this.get(\"storage.imgix.sign_key\", \"IMGIX_SIGN_KEY\"),\n },\n local: {\n uploadDir: this.get(\"storage.local.dir\", \"STORAGE_LOCAL_DIR\", \"./public/uploads\"),\n baseUrl: this.get(\"storage.local.url\", \"STORAGE_LOCAL_URL\", \"/uploads\"),\n },\n };\n }\n\n /**\n * Get email configuration\n */\n getEmailConfig(): EmailConfig {\n return {\n provider: this.get(\"email.provider\", \"EMAIL_PROVIDER\", \"smtp\"),\n host: this.get(\"email.smtp.host\", \"SMTP_HOST\"),\n port: parseInt(this.get(\"email.smtp.port\", \"SMTP_PORT\", \"587\")!, 10),\n secure: this.get(\"email.smtp.secure\", \"SMTP_SECURE\") === \"true\",\n user: this.get(\"email.smtp.user\", \"SMTP_USER\"),\n pass: this.get(\"email.smtp.pass\", \"SMTP_PASS\"),\n from: this.get(\"email.smtp.from\", \"SMTP_FROM\", \"noreply@example.com\"),\n fromName: this.get(\"email.smtp.from_name\", \"SMTP_FROM_NAME\", \"Kyro CMS\"),\n replyTo: this.get(\"email.smtp.reply_to\", \"SMTP_REPLY_TO\"),\n };\n }\n\n /**\n * Mask sensitive values for display\n */\n maskSensitive(key: string, value: string | undefined): string | undefined {\n if (!value) return value;\n if (ConfigService.SENSITIVE_KEYS.includes(key)) {\n return \"********\";\n }\n return value;\n }\n\n /**\n * Update a setting in the database\n */\n async set(key: string, value: string, description?: string): Promise<void> {\n await this.db\n .insert(settingsSchema)\n .values({\n key,\n value,\n description,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [settingsSchema.key],\n set: { value, description, updatedAt: new Date() },\n });\n this.cache[key] = value;\n }\n}\n","import type { Transporter, SentMessageInfo } from \"nodemailer\";\n\nexport interface EmailConfig {\n provider: \"smtp\" | \"resend\" | \"sendgrid\" | \"mailgun\" | \"ses\";\n from: string;\n fromName?: string;\n replyTo?: string;\n smtp?: {\n host: string;\n port: number;\n secure: boolean;\n auth: {\n user: string;\n pass: string;\n };\n };\n resend?: {\n apiKey: string;\n };\n sendgrid?: {\n apiKey: string;\n };\n mailgun?: {\n apiKey: string;\n domain: string;\n region?: \"us\" | \"eu\";\n };\n ses?: {\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n };\n}\n\nexport interface EmailOptions {\n to: string | string[];\n subject: string;\n html: string;\n text?: string;\n replyTo?: string;\n}\n\nexport interface EmailTemplates {\n verifyEmail: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n resetPassword: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n welcome: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n accountLocked: (\n attempts: number,\n duration: number,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n passwordChanged: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n newLogin: (\n location: string,\n time: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n}\n\nconst defaultTemplates: EmailTemplates = {\n verifyEmail: (link, userName = \"User\") => ({\n subject: \"Verify your email address\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Verify Email</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome, ${userName}!</h1>\n <p>Please verify your email address by clicking the button below:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Verify Email</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <p>This link will expire in 24 hours.</p>\n <div class=\"footer\">\n <p>If you didn't create an account, you can safely ignore this email.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Welcome ${userName}!\\n\\nPlease verify your email by clicking this link: ${link}\\n\\nThis link will expire in 24 hours.\\n\\nIf you didn't create an account, you can safely ignore this email.`,\n }),\n\n resetPassword: (link, userName = \"User\") => ({\n subject: \"Reset your password\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Reset Password</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #dc2626; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .warning { background: #fef3c7; border: 1px solid #f59e0b; padding: 12px; border-radius: 6px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Reset Request</h1>\n <p>Hello ${userName},</p>\n <p>We received a request to reset your password. Click the button below to create a new password:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Reset Password</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <div class=\"warning\">\n <strong>⚠️ Important:</strong> This link will expire in 1 hour. If you didn't request a password reset, please ignore this email or contact support if you have concerns.\n </div>\n <div class=\"footer\">\n <p>For security reasons, please don't share this email with anyone.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Password Reset Request\\n\\nHello ${userName},\\n\\nWe received a request to reset your password. Click this link to create a new password: ${link}\\n\\nThis link will expire in 1 hour.\\n\\nIf you didn't request a password reset, please ignore this email.`,\n }),\n\n welcome: (userName = \"User\") => ({\n subject: \"Welcome to Kyro CMS\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Welcome</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome to Kyro CMS, ${userName}!</h1>\n <p>Your account has been created successfully.</p>\n <p>You can now:</p>\n <ul>\n <li>Manage your content collections</li>\n <li>Upload and organize media</li>\n <li>Configure settings</li>\n <li>And much more...</li>\n </ul>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"#\" class=\"button\">Get Started</a>\n </p>\n <p>If you have any questions, feel free to reach out to our support team.</p>\n </div>\n </body>\n </html>\n `,\n text: `Welcome to Kyro CMS, ${userName}!\\n\\nYour account has been created successfully.\\n\\nYou can now:\\n- Manage your content collections\\n- Upload and organize media\\n- Configure settings\\n- And much more...\\n\\nGet started by logging into your dashboard.`,\n }),\n\n accountLocked: (attempts, duration, userName = \"User\") => ({\n subject: \"Account Security Alert - Account Locked\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Account Locked</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .alert { background: #fef2f2; border: 1px solid #ef4444; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Account Security Alert</h1>\n <p>Hello ${userName},</p>\n <div class=\"alert\">\n <p><strong>⚠️ Your account has been temporarily locked due to multiple failed login attempts.</strong></p>\n <p>Failed attempts: ${attempts}</p>\n <p>Lockout duration: ${Math.round(duration / 60000)} minutes</p>\n </div>\n <p>Your account will automatically unlock after the lockout period expires.</p>\n <p>If this wasn't you, we recommend:</p>\n <ul>\n <li>Using a strong, unique password</li>\n <li>Enabling two-factor authentication (coming soon)</li>\n <li>Reviewing your recent account activity</li>\n </ul>\n <div class=\"footer\">\n <p>If you need immediate assistance, please contact support.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Account Security Alert\\n\\nHello ${userName},\\n\\nYour account has been temporarily locked due to multiple failed login attempts (${attempts}).\\n\\nLockout duration: ${Math.round(duration / 60000)} minutes\\n\\nYour account will automatically unlock after this period.\\n\\nIf this wasn't you, we recommend using a strong, unique password.`,\n }),\n\n passwordChanged: (userName = \"User\") => ({\n subject: \"Your password has been changed\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Password Changed</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info { background: #f0fdf4; border: 1px solid #22c55e; padding: 12px; border-radius: 6px; margin: 20px 0; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Changed</h1>\n <p>Hello ${userName},</p>\n <div class=\"info\">\n <p>Your password was recently changed.</p>\n </div>\n <p>If you did this, you can safely ignore this email.</p>\n <p><strong>If you didn't change your password</strong>, please contact our support team immediately as your account may have been compromised.</p>\n </div>\n </body>\n </html>\n `,\n text: `Password Changed\\n\\nHello ${userName},\\n\\nYour password was recently changed.\\n\\nIf you did this, you can safely ignore this email.\\n\\nIf you didn't change your password, please contact support immediately.`,\n }),\n\n newLogin: (location, time, userName = \"User\") => ({\n subject: \"New login to your account\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>New Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info-box { background: #f8fafc; border: 1px solid #e2e8f0; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>New Login Detected</h1>\n <p>Hello ${userName},</p>\n <p>We detected a new login to your account:</p>\n <div class=\"info-box\">\n <p><strong>Location:</strong> ${location}</p>\n <p><strong>Time:</strong> ${time}</p>\n </div>\n <p><strong>If this was you</strong>, no action is needed.</p>\n <p><strong>If this wasn't you</strong>, your account may be compromised. Please:</p>\n <ol>\n <li>Change your password immediately</li>\n <li>Review your recent account activity</li>\n <li>Contact support if needed</li>\n </ol>\n <div class=\"footer\">\n <p>This is an automated security notification.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `New Login Detected\\n\\nHello ${userName},\\n\\nWe detected a new login to your account:\\n\\nLocation: ${location}\\nTime: ${time}\\n\\nIf this wasn't you, please change your password immediately and contact support.`,\n }),\n};\n\nimport { ConfigService } from \"../config/ConfigService.js\";\n\nexport class EmailTransport {\n private transporter?: Transporter<SentMessageInfo>;\n private config: EmailConfig;\n private templates: EmailTemplates;\n private transporterInitialized: boolean = false;\n\n constructor(config: EmailConfig, templates?: Partial<EmailTemplates>) {\n this.config = config;\n this.templates = { ...defaultTemplates, ...templates };\n }\n\n private async ensureTransporter(): Promise<Transporter<SentMessageInfo>> {\n if (this.transporterInitialized) {\n return this.transporter!;\n }\n\n const { default: nodemailer } = await import(\"nodemailer\");\n\n if (this.config.provider === \"smtp\" && this.config.smtp) {\n this.transporter = nodemailer.createTransport({\n host: this.config.smtp.host,\n port: this.config.smtp.port,\n secure: this.config.smtp.secure,\n auth: this.config.smtp.auth,\n });\n } else if (this.config.provider === \"ses\" && this.config.ses) {\n this.transporter = nodemailer.createTransport({\n host: `email-smtp.${this.config.ses.region}.amazonaws.com`,\n port: 587,\n secure: false,\n auth: {\n user: this.config.ses.accessKeyId,\n pass: this.config.ses.secretAccessKey,\n },\n });\n }\n\n this.transporterInitialized = true;\n return this.transporter!;\n }\n\n async send(options: EmailOptions): Promise<any> {\n const { provider, from, fromName, replyTo: configReplyTo } = this.config;\n const fromFull = `\"${fromName || \"Kyro CMS\"}\" <${from}>`;\n const replyTo = options.replyTo || configReplyTo;\n\n console.log(`[EmailTransport] Sending email via ${provider}...`);\n console.log(\n `[EmailTransport] To: ${Array.isArray(options.to) ? options.to.join(\", \") : options.to}`,\n );\n console.log(`[EmailTransport] Subject: ${options.subject}`);\n\n try {\n let result;\n switch (provider) {\n case \"smtp\":\n case \"ses\":\n {\n const transporter = await this.ensureTransporter();\n if (!transporter)\n throw new Error(`${provider} transporter not initialized`);\n result = await transporter.sendMail({\n from: fromFull,\n to: Array.isArray(options.to)\n ? options.to.join(\", \")\n : options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n replyTo,\n });\n }\n break;\n\n case \"resend\":\n result = await this.sendViaResend(fromFull, options, replyTo);\n break;\n\n case \"sendgrid\":\n result = await this.sendViaSendGrid(fromFull, options, replyTo);\n break;\n\n case \"mailgun\":\n result = await this.sendViaMailgun(fromFull, options, replyTo);\n break;\n\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n console.log(`[EmailTransport] Success! Provider response received.`);\n return result;\n } catch (error: any) {\n console.error(`[EmailTransport] FAILED to send email:`, error.message);\n if (error.response) {\n console.error(\n `[EmailTransport] Provider Error Detail:`,\n JSON.stringify(error.response, null, 2),\n );\n }\n throw error;\n }\n }\n\n private async sendViaResend(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.resend?.apiKey;\n if (!apiKey) throw new Error(\"Resend API Key missing\");\n\n const body = {\n from,\n to: options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: replyTo,\n };\n\n console.log(`[EmailTransport] Calling Resend API...`);\n const resp = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Resend Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n private async sendViaSendGrid(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.sendgrid?.apiKey;\n if (!apiKey) throw new Error(\"SendGrid API Key missing\");\n\n const body = {\n personalizations: [\n {\n to: Array.isArray(options.to)\n ? options.to.map((email) => ({ email }))\n : [{ email: options.to }],\n },\n ],\n from: {\n email: from.match(/<(.+)>/)?.[1] || from,\n name: from.match(/\"(.+)\"/)?.[1],\n },\n subject: options.subject,\n content: [\n { type: \"text/plain\", value: options.text || \"\" },\n { type: \"text/html\", value: options.html },\n ],\n reply_to: replyTo ? { email: replyTo } : undefined,\n };\n\n console.log(`[EmailTransport] Calling SendGrid API...`);\n const resp = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`SendGrid Error: ${JSON.stringify(error)}`);\n }\n return { success: true };\n }\n\n private async sendViaMailgun(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const { apiKey, domain, region } = this.config.mailgun || {};\n if (!apiKey || !domain) throw new Error(\"Mailgun config missing\");\n\n const base = region === \"eu\" ? \"api.eu.mailgun.net\" : \"api.mailgun.net\";\n const auth = btoa(`api:${apiKey}`);\n\n const formData = new URLSearchParams();\n formData.append(\"from\", from);\n const to = Array.isArray(options.to) ? options.to.join(\", \") : options.to;\n formData.append(\"to\", to);\n formData.append(\"subject\", options.subject);\n formData.append(\"html\", options.html);\n if (options.text) formData.append(\"text\", options.text);\n if (replyTo) formData.append(\"h:Reply-To\", replyTo);\n\n console.log(`[EmailTransport] Calling Mailgun API (${region || \"us\"})...`);\n const resp = await fetch(`https://${base}/v3/${domain}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${auth}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Mailgun Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n getTemplates(): EmailTemplates {\n return this.templates;\n }\n\n async verifyConnection(): Promise<boolean> {\n if (this.config.provider === \"smtp\" || this.config.provider === \"ses\") {\n try {\n const transporter = await this.ensureTransporter();\n if (transporter) {\n await transporter.verify();\n return true;\n }\n } catch {\n return false;\n }\n }\n return !!(\n this.config.resend?.apiKey ||\n this.config.sendgrid?.apiKey ||\n this.config.mailgun?.apiKey\n );\n }\n\n static async fromConfig(db: any): Promise<EmailTransport | null> {\n const configService = new ConfigService(db);\n await configService.load();\n const config = configService.getEmailConfig();\n\n if (!config.provider) {\n return this.fromEnv();\n }\n\n const transformed: EmailConfig = {\n provider: (config.provider as any) || \"smtp\",\n from: config.from || \"noreply@example.com\",\n fromName: config.fromName,\n replyTo: config.replyTo,\n smtp:\n config.provider === \"smtp\"\n ? {\n host: config.host || \"\",\n port: config.port || 587,\n secure: config.secure || false,\n auth: { user: config.user || \"\", pass: config.pass || \"\" },\n }\n : undefined,\n resend:\n config.provider === \"resend\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n sendgrid:\n config.provider === \"sendgrid\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n mailgun:\n config.provider === \"mailgun\"\n ? {\n apiKey: config.pass || \"\",\n domain: config.host || \"\",\n region: (config.secure ? \"eu\" : \"us\") as any,\n }\n : undefined,\n ses:\n config.provider === \"ses\"\n ? {\n accessKeyId: config.user || \"\",\n secretAccessKey: config.pass || \"\",\n region: config.host || \"us-east-1\",\n }\n : undefined,\n };\n\n return new EmailTransport(transformed);\n }\n\n static fromEnv(): EmailTransport | null {\n const provider = (process.env.EMAIL_PROVIDER as any) || \"smtp\";\n const from =\n process.env.SMTP_FROM ||\n process.env.DEFAULT_FROM ||\n \"noreply@example.com\";\n const fromName = process.env.SMTP_FROM_NAME || \"Kyro CMS\";\n const replyTo = process.env.SMTP_REPLY_TO;\n\n if (provider === \"smtp\") {\n const host = process.env.SMTP_HOST;\n const user = process.env.SMTP_USER;\n const pass = process.env.SMTP_PASS;\n if (!host || !user || !pass) return null;\n\n return new EmailTransport({\n provider: \"smtp\",\n from,\n fromName,\n replyTo,\n smtp: {\n host,\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n secure: process.env.SMTP_SECURE === \"true\",\n auth: { user, pass },\n },\n });\n }\n\n if (provider === \"resend\") {\n const apiKey = process.env.RESEND_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"resend\",\n from,\n fromName,\n replyTo,\n resend: { apiKey },\n });\n }\n\n if (provider === \"sendgrid\") {\n const apiKey = process.env.SENDGRID_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"sendgrid\",\n from,\n fromName,\n replyTo,\n sendgrid: { apiKey },\n });\n }\n\n if (provider === \"mailgun\") {\n const apiKey = process.env.MAILGUN_API_KEY || process.env.SMTP_PASS;\n const domain = process.env.MAILGUN_DOMAIN || process.env.SMTP_HOST;\n if (!apiKey || !domain) return null;\n return new EmailTransport({\n provider: \"mailgun\",\n from,\n fromName,\n replyTo,\n mailgun: {\n apiKey,\n domain,\n region: (process.env.MAILGUN_REGION ||\n (process.env.SMTP_SECURE === \"true\" ? \"eu\" : \"us\")) as any,\n },\n });\n }\n\n if (provider === \"ses\") {\n const accessKeyId =\n process.env.AWS_ACCESS_KEY_ID || process.env.SMTP_USER;\n const secretAccessKey =\n process.env.AWS_SECRET_ACCESS_KEY || process.env.SMTP_PASS;\n const region =\n process.env.AWS_REGION || process.env.SMTP_HOST || \"us-east-1\";\n if (!accessKeyId || !secretAccessKey) return null;\n return new EmailTransport({\n provider: \"ses\",\n from,\n fromName,\n replyTo,\n ses: { accessKeyId, secretAccessKey, region },\n });\n }\n\n return null;\n }\n}\n","export interface PasswordPolicyConfig {\n minLength: number;\n requireUppercase: boolean;\n requireLowercase: boolean;\n requireNumbers: boolean;\n requireSpecialChars: boolean;\n preventReuse: number;\n maxLength?: number;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport const DEFAULT_PASSWORD_POLICY: PasswordPolicyConfig = {\n minLength: 12,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true,\n preventReuse: 5,\n maxLength: 128,\n};\n\nexport class PasswordPolicy {\n private config: PasswordPolicyConfig;\n\n constructor(config: Partial<PasswordPolicyConfig> = {}) {\n this.config = { ...DEFAULT_PASSWORD_POLICY, ...config };\n }\n\n validate(password: string): ValidationResult {\n const errors: string[] = [];\n\n if (this.config.maxLength && password.length > this.config.maxLength) {\n errors.push(\n `Password must not exceed ${this.config.maxLength} characters`,\n );\n }\n\n if (password.length < this.config.minLength) {\n errors.push(\n `Password must be at least ${this.config.minLength} characters`,\n );\n }\n\n if (this.config.requireUppercase && !/[A-Z]/.test(password)) {\n errors.push(\"Password must contain at least one uppercase letter\");\n }\n\n if (this.config.requireLowercase && !/[a-z]/.test(password)) {\n errors.push(\"Password must contain at least one lowercase letter\");\n }\n\n if (this.config.requireNumbers && !/[0-9]/.test(password)) {\n errors.push(\"Password must contain at least one number\");\n }\n\n if (\n this.config.requireSpecialChars &&\n !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)\n ) {\n errors.push(\"Password must contain at least one special character\");\n }\n\n const commonPasswords = [\n \"password\",\n \"123456\",\n \"12345678\",\n \"qwerty\",\n \"abc123\",\n \"monkey\",\n \"1234567\",\n \"letmein\",\n \"trustno1\",\n \"dragon\",\n \"baseball\",\n \"iloveyou\",\n \"master\",\n \"sunshine\",\n \"ashley\",\n \"football\",\n \"password1\",\n \"shadow\",\n \"123123\",\n \"654321\",\n ];\n\n if (commonPasswords.includes(password.toLowerCase())) {\n errors.push(\n \"This password is too common. Please choose a more secure password\",\n );\n }\n\n if (/^[a-zA-Z]+$/.test(password) || /^[0-9]+$/.test(password)) {\n errors.push(\n \"Password must contain a mix of letters, numbers, and/or special characters\",\n );\n }\n\n if (/(.)\\1{2,}/.test(password)) {\n errors.push(\n \"Password must not contain more than 2 consecutive identical characters\",\n );\n }\n\n if (\n /^(012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210)+$/i.test(\n password,\n )\n ) {\n errors.push(\"Password must not contain sequential numbers or letters\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n async checkReuse(\n passwordHash: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<ValidationResult> {\n return {\n valid: true,\n errors: [],\n };\n }\n\n async isInHistory(\n password: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<boolean> {\n for (const hash of history) {\n if (await verifyFn(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n generatePassword(length: number = 16): string {\n const uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const lowercase = \"abcdefghijklmnopqrstuvwxyz\";\n const numbers = \"0123456789\";\n const special = \"!@#$%^&*()_+-=[]{}|;:,.<>?\";\n\n let password = \"\";\n\n password += uppercase[Math.floor(Math.random() * uppercase.length)];\n password += lowercase[Math.floor(Math.random() * lowercase.length)];\n password += numbers[Math.floor(Math.random() * numbers.length)];\n password += special[Math.floor(Math.random() * special.length)];\n\n const allChars = uppercase + lowercase + numbers + special;\n for (let i = password.length; i < length; i++) {\n password += allChars[Math.floor(Math.random() * allChars.length)];\n }\n\n return password\n .split(\"\")\n .sort(() => Math.random() - 0.5)\n .join(\"\");\n }\n\n getStrength(password: string): {\n score: number;\n label: string;\n feedback: string[];\n } {\n let score = 0;\n const feedback: string[] = [];\n\n if (password.length >= 8) score += 1;\n if (password.length >= 12) score += 1;\n if (password.length >= 16) score += 1;\n\n if (/[a-z]/.test(password)) score += 1;\n if (/[A-Z]/.test(password)) score += 1;\n if (/[0-9]/.test(password)) score += 1;\n if (/[!@#$%^&*()_+\\-=\\[\\]{}|;:,.<>?]/.test(password)) score += 1;\n\n if (password.length > 8) score += 1;\n if (password.length > 12) score += 1;\n\n const uniqueChars = new Set(password).size;\n if (uniqueChars > 6) score += 1;\n if (uniqueChars > 10) score += 1;\n\n let label: string;\n if (score <= 3) {\n label = \"Weak\";\n feedback.push(\"Add more characters\");\n feedback.push(\"Include uppercase and lowercase letters\");\n } else if (score <= 5) {\n label = \"Fair\";\n feedback.push(\"Add special characters\");\n feedback.push(\"Consider making it longer\");\n } else if (score <= 7) {\n label = \"Good\";\n feedback.push(\"Consider making it longer for extra security\");\n } else {\n label = \"Strong\";\n }\n\n return { score, label, feedback };\n }\n\n setConfig(config: Partial<PasswordPolicyConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): PasswordPolicyConfig {\n return { ...this.config };\n }\n}\n"]}