@kyro-cms/core 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler.cjs +5 -5
- package/dist/api-handler.js +4 -4
- package/dist/bootstrap-PBMMLBQC.js +6 -0
- package/dist/{bootstrap-LI3Q7ROO.js.map → bootstrap-PBMMLBQC.js.map} +1 -1
- package/dist/bootstrap-QN77EVI3.cjs +31 -0
- package/dist/{bootstrap-GPXZWJXU.cjs.map → bootstrap-QN77EVI3.cjs.map} +1 -1
- package/dist/{chunk-JINGZG7I.cjs → chunk-7SXPHG3M.cjs} +8 -5
- package/dist/chunk-7SXPHG3M.cjs.map +1 -0
- package/dist/{chunk-FG4PAYML.cjs → chunk-AGAIUDAV.cjs} +4 -4
- package/dist/{chunk-FG4PAYML.cjs.map → chunk-AGAIUDAV.cjs.map} +1 -1
- package/dist/{chunk-XKVPPGLX.cjs → chunk-EVEJC22G.cjs} +8 -5
- package/dist/chunk-EVEJC22G.cjs.map +1 -0
- package/dist/{chunk-7DSDEVBA.js → chunk-L4E76X2K.js} +7 -4
- package/dist/chunk-L4E76X2K.js.map +1 -0
- package/dist/{chunk-QSVSNOKK.js → chunk-Q4DNT7FO.js} +3 -3
- package/dist/{chunk-QSVSNOKK.js.map → chunk-Q4DNT7FO.js.map} +1 -1
- package/dist/{chunk-RCRCW2TQ.js → chunk-SO25EHOE.js} +4 -4
- package/dist/{chunk-RCRCW2TQ.js.map → chunk-SO25EHOE.js.map} +1 -1
- package/dist/{chunk-V3423DUL.cjs → chunk-SYRDCLH7.cjs} +9 -9
- package/dist/{chunk-V3423DUL.cjs.map → chunk-SYRDCLH7.cjs.map} +1 -1
- package/dist/{chunk-SCRAGYNM.js → chunk-WH4Y5MT6.js} +7 -4
- package/dist/chunk-WH4Y5MT6.js.map +1 -0
- package/dist/{chunk-ALAAPA3U.cjs → chunk-XJ2VYR47.cjs} +6 -6
- package/dist/{chunk-ALAAPA3U.cjs.map → chunk-XJ2VYR47.cjs.map} +1 -1
- package/dist/{chunk-6R37DO2Z.js → chunk-XR5EJS3C.js} +3 -3
- package/dist/{chunk-6R37DO2Z.js.map → chunk-XR5EJS3C.js.map} +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/drizzle/index.cjs +5 -5
- package/dist/drizzle/index.js +1 -1
- package/dist/index.cjs +62 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -9
- package/dist/index.js.map +1 -1
- package/dist/rest/index.cjs +5 -5
- package/dist/rest/index.js +3 -3
- package/package.json +2 -2
- package/dist/bootstrap-GPXZWJXU.cjs +0 -31
- package/dist/bootstrap-LI3Q7ROO.js +0 -6
- package/dist/chunk-7DSDEVBA.js.map +0 -1
- package/dist/chunk-JINGZG7I.cjs.map +0 -1
- package/dist/chunk-SCRAGYNM.js.map +0 -1
- package/dist/chunk-XKVPPGLX.cjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts","../src/lib/seo.ts","../src/lib/storage/browser.ts","../src/lib/storage/encryption.ts","../src/lib/storage/node.ts","../src/lib/storage/factory.ts","../src/index.ts"],"names":["result","resolve","randomBytes","RedisAuthAdapter","getEncryptionKey","crypto","createStorage"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import Database from \"better-sqlite3\";\nimport { randomBytes } from 'crypto';\nimport { AbstractBaseAdapter } from \"../base.js\";\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n DocumentStatus,\n} from \"../../registry/types.js\";\nimport type { Field } from \"../../fields/types.js\";\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nfunction flattenFields(fields: Field[]): Field[] {\n const result: Field[] = [];\n for (const field of fields) {\n if (field.type === \"tabs\" && \"tabs\" in field) {\n for (const tab of field.tabs) {\n result.push(...flattenFields(tab.fields));\n }\n } else if (field.type === \"row\" && \"fields\" in field) {\n result.push(...flattenFields(field.fields));\n } else if (field.type === \"collapsible\" && \"fields\" in field) {\n result.push(...flattenFields(field.fields));\n } else {\n result.push(field);\n }\n }\n return result;\n}\n\nfunction processFieldValue(row: any, field: Field): any {\n const f = field as any;\n let value = row[f.name];\n \n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (f.type === \"checkbox\") {\n value = Boolean(value);\n }\n\n if (f.type === \"date\" && value) {\n try {\n const d = new Date(value);\n if (isNaN(d.getTime())) {\n value = null;\n } else {\n value = d.toISOString();\n }\n } catch {\n value = null;\n }\n }\n\n if ((f.type === \"upload\" || f.type === \"image\") && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed.map((item: any) => {\n if (typeof item === \"object\" && item !== null) {\n return item;\n }\n return { id: item };\n });\n } else {\n value = typeof parsed === \"object\" ? parsed : { id: parsed };\n }\n } catch {\n value = { id: value };\n }\n }\n\n if (f.type === \"relationship\" && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed;\n } else {\n value = parsed;\n }\n } catch {\n value = { relationTo: Array.isArray(f.relationTo) ? f.relationTo[0] : f.relationTo, value };\n }\n }\n\n if (f.type === \"list\" && value) {\n try {\n const parsed = JSON.parse(value);\n value = Array.isArray(parsed) ? parsed : [];\n } catch {\n value = [];\n }\n }\n\n if (f.type === \"relationship-block\" && value) {\n try {\n const parsed = JSON.parse(value);\n value = Array.isArray(parsed) ? parsed : [];\n } catch {\n value = [];\n }\n }\n\n return value;\n}\n\nfunction buildNestedDoc(row: any, fields: Field[]): any {\n const doc: any = {};\n \n for (const field of fields) {\n if (!field.name || field.name === \"id\") continue;\n \n if (field.type === \"tabs\" && \"tabs\" in field) {\n const tabData: any = {};\n for (const tab of field.tabs) {\n Object.assign(tabData, buildNestedDoc(row, tab.fields));\n }\n doc[field.name] = tabData;\n } else if (field.type === \"row\" && \"fields\" in field) {\n const rowData = buildNestedDoc(row, field.fields);\n Object.assign(doc, rowData);\n } else if (field.type === \"collapsible\" && \"fields\" in field) {\n doc[field.name] = buildNestedDoc(row, field.fields);\n } else {\n doc[field.name] = processFieldValue(row, field);\n }\n }\n \n return doc;\n}\n\nfunction getTableColumns(db: any, tableName: string): string[] {\n try {\n const rows = db.prepare(`PRAGMA table_info(${tableName})`).all() as any[];\n return rows.map((r: any) => r.name);\n } catch {\n return [];\n }\n}\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n private readonly draftsTableName = \"kyro_drafts\";\n private readonly versionsTableName = \"kyro_versions\";\n\n constructor(options: { db?: any; path?: string }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n this.db = new Database(this.path || \":memory:\");\n }\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n this.db.exec(\"PRAGMA foreign_keys = ON\");\n this.connected = true;\n console.log(\n `[LocalAdapter] Connected to SQLite (${this.path || \"memory\"})`,\n );\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log(\"[LocalAdapter] Disconnected\");\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(\n config: CollectionConfig | GlobalConfig,\n tableName?: string,\n ): void {\n const name = tableName || this.getTableNameFor(config.slug);\n\n const columns: string[] = [`id TEXT PRIMARY KEY`];\n\n for (const field of flattenFields(config.fields)) {\n if (!field.name || field.name === \"id\") continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n // Always add timestamps for all tables\n columns.push(`${this.col(\"createdAt\")} TEXT DEFAULT (datetime('now'))`);\n columns.push(`${this.col(\"updatedAt\")} TEXT DEFAULT (datetime('now'))`);\n // _status: defaults to 'published' so existing data stays live after migration\n columns.push(`_status TEXT DEFAULT 'published'`);\n columns.push(`_has_draft INTEGER DEFAULT 0`);\n\n if ((config as CollectionConfig).tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const existingColumns = getTableColumns(this.db, name);\n\n if (existingColumns.length === 0) {\n const createSQL = `CREATE TABLE IF NOT EXISTS ${name} (${columns.join(\", \")})`;\n this.db.exec(createSQL);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${name}__status ON ${name}(_status)`);\n\n for (const field of flattenFields(config.fields)) {\n if (field.name && field.indexed) {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${name}_${field.name} ON ${name}(${this.col(field.name)})`,\n );\n }\n if (field.name && field.unique) {\n this.db.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${name}_${field.name}_unique ON ${name}(${this.col(field.name)})`,\n );\n }\n }\n } else {\n const existingSet = new Set(existingColumns);\n for (const colDef of columns) {\n const colName = colDef.split(\" \")[0].replace(/^\"/, \"\").replace(/\"$/, \"\");\n if (!existingSet.has(colName) && colName !== \"id\") {\n try {\n if (colName === \"_status\") {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} TEXT DEFAULT 'published'`);\n } else if (colName === \"_has_draft\") {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} INTEGER DEFAULT 0`);\n } else {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} TEXT`);\n }\n } catch {\n // Column may already exist via concurrent migration\n }\n }\n }\n }\n\n this.migrations.set(name, true);\n }\n\n private ensureVersionsTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.versionsTableName} (\n id TEXT PRIMARY KEY,\n collection_slug TEXT NOT NULL,\n document_id TEXT NOT NULL,\n tenant_id TEXT,\n version INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'draft',\n data TEXT NOT NULL,\n created_by TEXT,\n change_description TEXT,\n published_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_doc ON ${this.versionsTableName}(collection_slug, document_id)`,\n );\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_status ON ${this.versionsTableName}(status)`,\n );\n }\n\n private ensureDraftsTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.draftsTableName} (\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 base_updated_at TEXT,\n draft_updated_at TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n this.db.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${this.draftsTableName}_document ON ${this.draftsTableName}(collection_slug, document_id, tenant_id)`,\n );\n }\n\n // ========================================================================\n // SQL Quoting\n // ========================================================================\n\n private col(name: string): string {\n return `\"${name}\"`;\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"textarea\":\n case \"color\":\n case \"code\":\n case \"markdown\":\n case \"url\":\n return this.col(field.name) + \" TEXT\";\n case \"number\":\n return this.col(field.name) + \" REAL\";\n case \"checkbox\":\n return this.col(field.name) + \" INTEGER DEFAULT 0\";\n case \"date\":\n return this.col(field.name) + \" TEXT\";\n case \"select\":\n case \"radio\":\n return this.col(field.name) + \" TEXT\";\n case \"relationship\":\n case \"upload\":\n return this.col(field.name) + \" TEXT\";\n case \"json\":\n case \"richtext\":\n case \"array\":\n case \"group\":\n case \"blocks\":\n return this.col(field.name) + \" TEXT\";\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n private parseGlobalsSlug(slug: string): {\n isGlobal: boolean;\n globalSlug: string;\n tableName: string;\n } {\n if (slug.startsWith(\"_globals_\")) {\n const globalSlug = slug.replace(\"_globals_\", \"\");\n return {\n isGlobal: true,\n globalSlug,\n tableName: `global_${globalSlug.replace(/-/g, \"_\")}`,\n };\n }\n return {\n isGlobal: false,\n globalSlug: \"\",\n tableName: this.getTableNameFor(slug),\n };\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const {\n collection: slug,\n where = {},\n sort,\n limit = 10,\n page = 1,\n tenantID,\n draft = false,\n } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n // Public API: only show published. Admin (draft=true): show all.\n if (!draft && (config as CollectionConfig).versions?.drafts) {\n conditions.push(`_status = ?`);\n params.push('published');\n }\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\") continue;\n\n if (typeof value === \"object\" && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${this.col(key)} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${this.col(key)} IN (${value.in.map(() => \"?\").join(\", \")})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${this.col(key)} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${this.col(key)} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n\n const sortField = this.col(sort?.replace(\"-\", \"\") || \"createdAt\");\n const sortDir = sort?.startsWith(\"-\") ? \"DESC\" : \"ASC\";\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace(\"SELECT *\", \"SELECT COUNT(*) as count\");\n const countResult = this.db.prepare(countSql).get(...params) as {\n count: number;\n };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n let docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n docs = await Promise.all(docs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\n }\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID, draft = false } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n // Public API: only show published docs. Admin (draft=true): skip status filter.\n if (!draft && (config as CollectionConfig).versions?.drafts) {\n sql += ` AND _status = ?`;\n params.push('published');\n }\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n let doc = this.rowToDoc(row as any, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n\n return doc as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n const id = parsed.isGlobal ? parsed.globalSlug : (data.id || this.generateId());\n\n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n\n // Filter data to only include valid columns\n const validColumns = getTableColumns(this.db, tableName);\n const filteredData: Record<string, any> = {};\n for (const key of columns) {\n if (validColumns.includes(key)) {\n filteredData[key] = insertData[key];\n }\n }\n\n const filteredColumns = Object.keys(filteredData);\n const quotedColumns = filteredColumns.map(c => this.col(c));\n const placeholders = filteredColumns.map(() => \"?\").join(\", \");\n const values = Object.values(filteredData).map((v: any) =>\n typeof v === \"object\" ? JSON.stringify(v) : v,\n );\n\n this.db\n .prepare(\n `INSERT OR REPLACE INTO ${tableName} (${quotedColumns.join(\", \")}) VALUES (${placeholders})`,\n )\n .run(...values);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n // Filter data to only include valid columns\n const validColumns = getTableColumns(this.db, tableName);\n const filteredData: Record<string, any> = {};\n for (const key of Object.keys(updateData)) {\n if (validColumns.includes(key)) {\n filteredData[key] = updateData[key];\n }\n }\n\n const columns = Object.keys(filteredData);\n const setClause = columns.map((c) => `${this.col(c)} = ?`).join(\", \");\n const values = Object.values(filteredData).map((v: any) =>\n v !== null && typeof v === \"object\" ? JSON.stringify(v) : v,\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n console.log(`[LocalAdapter] update sql=\"${sql}\", params=${JSON.stringify(params)}`);\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID, draft: true }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = parsed.tableName;\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: {\n collection: string;\n where?: Record<string, any>;\n tenantID?: string;\n }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: {\n collection: string;\n where: Record<string, any>;\n tenantID?: string;\n draft?: boolean;\n }): Promise<any> {\n const parsed = this.parseGlobalsSlug(args.collection);\n if (parsed.isGlobal) {\n const globalConfig = this.globals.get(parsed.globalSlug);\n if (!globalConfig) {\n throw new Error(`Global \"${parsed.globalSlug}\" not found in adapter`);\n }\n this.ensureTable(globalConfig, parsed.tableName);\n\n let sql = `SELECT * FROM ${parsed.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (!args.draft && globalConfig.versions) {\n conditions.push(\"_status = 'published'\");\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n\n sql += \" LIMIT 1\";\n\n const result = this.db.prepare(sql).get(...params) as any;\n if (result) {\n let doc = this.rowToDoc(result, globalConfig);\n\n // If draft: true and doc has a separate draft, merge it\n if (args.draft && doc._has_draft) {\n const versions = await this.findVersions({\n collection: args.collection,\n documentId: parsed.globalSlug,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }\n return null;\n }\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version History\n // ========================================================================\n\n async findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>> {\n this.ensureVersionsTable();\n const { collection, documentId, tenantID, limit = 20, page = 1 } = args;\n const conditions = [`collection_slug = ?`, `document_id = ?`];\n const params: any[] = [collection, documentId];\n\n if (tenantID) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n } else {\n conditions.push(`tenant_id IS NULL`);\n }\n\n const where = `WHERE ${conditions.join(' AND ')}`;\n const countResult = this.db\n .prepare(`SELECT COUNT(*) as count FROM ${this.versionsTableName} ${where}`)\n .get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n const offset = (page - 1) * limit;\n const rows = this.db\n .prepare(`SELECT * FROM ${this.versionsTableName} ${where} ORDER BY version DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as any[];\n\n const docs = rows.map((r) => this.rowToVersion(r));\n return {\n docs,\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null> {\n this.ensureVersionsTable();\n const row = this.db\n .prepare(`SELECT * FROM ${this.versionsTableName} WHERE id = ? AND collection_slug = ? LIMIT 1`)\n .get(args.versionId, args.collection) as any;\n return row ? this.rowToVersion(row) : null;\n }\n\n async createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>> {\n this.ensureVersionsTable();\n const now = new Date().toISOString();\n const id = this.generateId();\n\n // Get next version number\n const latestRow = this.db\n .prepare(`SELECT version FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC LIMIT 1`)\n .get(args.collection, args.documentId) as any;\n const nextVersion = (latestRow?.version ?? 0) + 1;\n\n this.db\n .prepare(\n `INSERT INTO ${this.versionsTableName} (\n id, collection_slug, document_id, tenant_id, version, status, data, created_by, change_description, published_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n args.collection,\n args.documentId,\n args.tenantID ?? null,\n nextVersion,\n args.status,\n JSON.stringify(args.data),\n args.createdBy ?? null,\n args.changeDescription ?? null,\n args.status === 'published' ? now : null,\n now,\n now,\n );\n\n // Prune old versions if collection has maxPerDoc configured\n const collectionConfig = this.collections.get(args.collection);\n const maxPerDoc = (collectionConfig as CollectionConfig)?.versions?.maxPerDoc;\n if (maxPerDoc && maxPerDoc > 0) {\n await this.deleteVersions({ collection: args.collection, documentId: args.documentId, keepLatest: maxPerDoc, tenantID: args.tenantID });\n }\n\n const saved = await this.findVersionByID({ collection: args.collection, versionId: id });\n return saved as VersionRecord<T>;\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n this.ensureVersionsTable();\n const { collection, documentId, keepLatest, tenantID } = args;\n\n if (keepLatest && keepLatest > 0) {\n // Delete all non-published versions beyond the keepLatest limit\n const rows = this.db\n .prepare(`SELECT id, status FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC`)\n .all(collection, documentId) as any[];\n\n // Always keep published versions; prune non-published beyond the limit\n let draftCount = 0;\n const toDelete: string[] = [];\n for (const row of rows) {\n if (row.status === 'published') continue;\n draftCount++;\n if (draftCount > keepLatest) toDelete.push(row.id);\n }\n\n for (const vid of toDelete) {\n this.db.prepare(`DELETE FROM ${this.versionsTableName} WHERE id = ?`).run(vid);\n }\n } else {\n // Delete all versions for this document\n let sql = `DELETE FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [collection, documentId];\n if (tenantID) { sql += ` AND tenant_id = ?`; params.push(tenantID); }\n this.db.prepare(sql).run(...params);\n }\n }\n\n private rowToVersion<T = Record<string, any>>(row: any): VersionRecord<T> {\n return {\n id: String(row.id),\n collection: row.collection_slug,\n documentId: row.document_id,\n version: row.version,\n status: row.status as DocumentStatus,\n data: row.data ? JSON.parse(row.data) : {},\n createdBy: row.created_by ?? undefined,\n changeDescription: row.change_description ?? undefined,\n publishedAt: row.published_at ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n this.ensureDraftsTable();\n\n let sql = `SELECT * FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [args.collection, args.documentId];\n\n if (args.tenantID) {\n sql += ` AND tenant_id = ?`;\n params.push(args.tenantID);\n } else {\n sql += ` AND tenant_id IS NULL`;\n }\n\n sql += ` LIMIT 1`;\n const row = this.db.prepare(sql).get(...params) as any;\n if (!row) return null;\n\n return this.rowToDraft<T>(row);\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n this.ensureDraftsTable();\n\n const existing = await this.findDraft<T>(args);\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const id = existing?.id || this.generateId();\n\n this.db\n .prepare(\n `INSERT OR REPLACE INTO ${this.draftsTableName} (\n id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n args.collection,\n args.documentId,\n args.tenantID ?? null,\n JSON.stringify(args.data),\n args.baseUpdatedAt ?? null,\n draftUpdatedAt,\n existing?.createdAt || now,\n now,\n );\n\n const saved = await this.findDraft<T>(args);\n if (!saved) {\n throw new Error(\"Failed to persist draft snapshot\");\n }\n return saved;\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n this.ensureDraftsTable();\n\n let sql = `DELETE FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [args.collection, args.documentId];\n\n if (args.tenantID) {\n sql += ` AND tenant_id = ?`;\n params.push(args.tenantID);\n } else {\n sql += ` AND tenant_id IS NULL`;\n }\n\n this.db.prepare(sql).run(...params);\n }\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n protected prepareData(\n data: Record<string, any>,\n config: CollectionConfig | GlobalConfig,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const fields = flattenFields(config.fields);\n\n // Helper to process a field value\n const processValue = (field: Field, value: any): any => {\n const f = field as any;\n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n if (f.name === \"content\" && Array.isArray(value)) {\n console.log(\"[processValue] content blocks before stringify - first block id:\", value[0]?.id, \"first block:\", JSON.stringify(value[0]));\n }\n return value !== null && value !== undefined ? JSON.stringify(value) : null;\n } else if (f.type === \"checkbox\") {\n return value ? 1 : 0;\n } else if (f.type === \"number\") {\n return value !== null && value !== \"\" ? Number(value) : null;\n } else if (f.type === \"upload\" || f.type === \"image\") {\n if (value === null || value === undefined) return null;\n if (Array.isArray(value)) {\n const items = value.map((v: any) => {\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return v.id || v._id || v;\n return String(v);\n });\n return JSON.stringify(items);\n }\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } else if (field.type === \"relationship\") {\n if (value === null || value === undefined) return null;\n if (Array.isArray(value)) {\n const rels = value.map((v: any) => {\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return JSON.stringify({ relationTo: field.relationTo, value: v.id || v });\n return String(v);\n });\n return JSON.stringify(rels);\n }\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\") return JSON.stringify({ relationTo: field.relationTo, value: value.id || value });\n return String(value);\n }\n return value;\n };\n\n // First pass: process top-level fields\n for (const field of fields) {\n if (!field.name || field.name === \"id\") continue;\n \n // Skip fields that are inside tabs (they'll be handled separately)\n const isInTab = config.fields.some(f => \n f.type === \"tabs\" && \"tabs\" in f && \n f.tabs.some(t => t.fields.some(tf => tf.name === field.name))\n );\n if (isInTab) continue;\n \n const value = data[field.name];\n if (value !== undefined) {\n result[field.name] = processValue(field, value);\n }\n }\n\n // Second pass: process nested tab fields\n for (const field of config.fields) {\n if (field.type === \"tabs\" && \"tabs\" in field && field.name) {\n const tabData = data[field.name];\n if (tabData && typeof tabData === \"object\") {\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && tabField.name !== \"id\") {\n const value = tabData[tabField.name];\n if (value !== undefined) {\n result[tabField.name] = processValue(tabField, value);\n }\n }\n }\n }\n }\n }\n }\n\n return result;\n }\n\n private rowToDoc(row: any, config: CollectionConfig | GlobalConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of flattenFields(config.fields)) {\n if (!field.name || field.name === \"id\") continue;\n\n const f = field as any;\n let value = row[f.name];\n\n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n if (f.name === \"content\" && value) {\n console.log(\"[rowToDoc] RAW content from DB (first 300 chars):\", JSON.stringify(value).slice(0, 300));\n }\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === \"checkbox\") {\n value = Boolean(value);\n }\n\n if (field.type === \"date\" && value) {\n try {\n const d = new Date(value);\n if (isNaN(d.getTime())) {\n console.warn(`[LocalAdapter] Invalid date value for field \"${field.name}\":`, value);\n value = null;\n } else {\n value = d.toISOString();\n }\n } catch {\n value = null;\n }\n }\n\n if ((field.type === \"upload\" || field.type === \"image\") && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed.map((item: any) => {\n if (typeof item === \"object\" && item !== null) {\n return item; // Keep full object with id, url, etc.\n }\n return { id: item };\n });\n } else {\n // If it's an object, keep it; otherwise assume it's just an ID\n value = typeof parsed === \"object\" ? parsed : { id: parsed };\n }\n } catch {\n value = { id: value };\n }\n }\n\n if (field.type === \"relationship\" && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed;\n } else {\n value = parsed;\n }\n } catch {\n value = { relationTo: Array.isArray(field.relationTo) ? field.relationTo[0] : field.relationTo, value };\n }\n }\n\n doc[field.name] = value;\n }\n\n // Build nested structure for tab/row/collapsible fields\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\" || field.name === \"row\" || field.name === \"collapsible\") continue;\n \n if (field.type === \"tabs\" && \"tabs\" in field) {\n const tabData: any = {};\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && tabField.name !== \"id\") {\n // Get the processed value for this tab field\n tabData[tabField.name] = processFieldValue(row, tabField);\n }\n }\n }\n doc[field.name] = tabData;\n }\n }\n\n if ((config as CollectionConfig).timestamps) {\n const cAt = row.createdAt || row.created_at;\n const uAt = row.updatedAt || row.updated_at;\n \n if (cAt) {\n try {\n const d = new Date(cAt);\n if (!isNaN(d.getTime())) doc.createdAt = d.toISOString();\n } catch {}\n }\n \n if (uAt) {\n try {\n const d = new Date(uAt);\n if (!isNaN(d.getTime())) doc.updatedAt = d.toISOString();\n } catch {}\n }\n }\n\n if ((config as CollectionConfig).tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n const timestamp = Date.now().toString(16).padStart(12, '0');\n const random = randomBytes(6).toString('hex');\n return timestamp + random;\n }\n\n private getMediaById(mediaId: string): { id: string; url: string; thumbnailUrl?: string } | null {\n try {\n const tableName = this.getTableNameFor(\"media\");\n const row = this.db.prepare(`SELECT id, url, thumbnail_url FROM ${tableName} WHERE id = ?`).get(mediaId) as any;\n if (row) {\n return {\n id: row.id,\n url: row.url,\n thumbnailUrl: row.thumbnail_url || row.url,\n };\n }\n } catch (err) {\n // Media table might not exist or query failed\n }\n return null;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, \"_\");\n }\n\n private rowToDraft<T>(row: any): DraftSnapshot<T> {\n return {\n id: row.id,\n collection: row.collection_slug,\n documentId: row.document_id,\n tenantID: row.tenant_id ?? undefined,\n data: row.data ? JSON.parse(row.data) : {},\n baseUpdatedAt: row.base_updated_at ?? null,\n draftUpdatedAt: row.draft_updated_at,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n this.ensureDraftsTable();\n console.log(\"[LocalAdapter] Migrations complete\");\n }\n\n async rollback(): Promise<void> {\n console.log(\"[LocalAdapter] Rollback not supported for schema changes\");\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from \"../registry/types.js\";\nimport type { Field } from \"../fields/types.js\";\nimport type { Hook } from \"../hooks/types.js\";\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (\n slug: string,\n extension: Partial<CollectionConfig>,\n ) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super(\"seo\");\n this.description =\n \"Advanced SEO features including sitemaps, robots.txt, and structured data\";\n\n this.collections.push({\n slug: \"seo-settings\",\n label: \"SEO Settings\",\n fields: [\n {\n name: \"sitemap\",\n type: \"checkbox\",\n label: \"Enable Sitemap\",\n defaultValue: true,\n },\n { name: \"robotsTxt\", type: \"richtext\", label: \"robots.txt Content\" },\n {\n name: \"canonicalUrl\",\n type: \"text\",\n variant: \"url\" as any,\n label: \"Canonical URL\",\n },\n { name: \"ogImage\", type: \"text\", label: \"Default OG Image URL\" },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super(\"analytics\");\n this.description =\n \"Analytics integration for tracking page views and events\";\n\n this.collections.push({\n slug: \"analytics-events\",\n label: \"Analytics Events\",\n fields: [\n { name: \"name\", type: \"text\", required: true },\n { name: \"properties\", type: \"json\", label: \"Event Properties\" },\n { name: \"timestamp\", type: \"date\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"sessionId\", type: \"text\", label: \"Session ID\" },\n ],\n });\n\n this.adminComponents[\"AnalyticsDashboard\"] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super(\"comments\");\n this.description = \"Commenting system for products and posts\";\n\n this.collections.push({\n slug: \"comments\",\n label: \"Comments\",\n fields: [\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"text\", required: true },\n { name: \"email\", type: \"email\" },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"parent\", type: \"text\", label: \"Parent Comment ID\" },\n { name: \"resourceType\", type: \"text\", required: true },\n { name: \"resourceId\", type: \"text\", required: true },\n ],\n });\n\n this.adminComponents[\"CommentModeration\"] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super(\"reviews\");\n this.description = \"Product reviews and ratings\";\n\n this.collections.push({\n slug: \"reviews\",\n label: \"Reviews\",\n fields: [\n { name: \"rating\", type: \"number\", required: true, min: 1, max: 5 },\n { name: \"title\", type: \"text\" },\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"relationship\", relationTo: \"customers\" },\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n required: true,\n },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"verified\", type: \"checkbox\", label: \"Verified Purchase\" },\n {\n name: \"helpful\",\n type: \"number\",\n label: \"Helpful Count\",\n defaultValue: 0,\n },\n ],\n });\n\n this.adminComponents[\"ReviewModeration\"] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super(\"wishlist\");\n this.description = \"Customer wishlists\";\n\n this.collections.push({\n slug: \"wishlists\",\n label: \"Wishlists\",\n fields: [\n {\n name: \"customer\",\n type: \"relationship\",\n relationTo: \"customers\",\n required: true,\n },\n {\n name: \"name\",\n type: \"text\",\n label: \"Wishlist Name\",\n defaultValue: \"My Wishlist\",\n },\n {\n name: \"items\",\n type: \"blocks\",\n label: \"Items\",\n blocks: [\n {\n slug: \"wishlist-item\",\n label: \"Item\",\n fields: [\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n },\n { name: \"quantity\", type: \"number\", defaultValue: 1 },\n { name: \"addedAt\", type: \"date\" },\n {\n name: \"priority\",\n type: \"select\",\n options: [\n { label: \"Low\", value: \"low\" },\n { label: \"Medium\", value: \"medium\" },\n { label: \"High\", value: \"high\" },\n ],\n },\n ],\n },\n ],\n },\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","import type { Redis } from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import type { Redis } from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map();\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map();\n private auditLogs: Array<Record<string, unknown>> = [];\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user || !user.passwordHash) return null;\n const bcrypt = (await import(\"bcryptjs\")).default;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n const sessionId = this.refreshTokens.get(refreshToken);\n if (!sessionId) return null;\n const session = this.sessions.get(sessionId);\n return session || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n let logs = this.auditLogs.slice().reverse();\n if (filter.userId) logs = logs.filter((l) => l.userId === filter.userId);\n if (filter.action) {\n if (Array.isArray(filter.action)) {\n logs = logs.filter((l) => filter.action!.includes(String(l.action)));\n } else {\n logs = logs.filter((l) => l.action === filter.action);\n }\n }\n if (filter.resource)\n logs = logs.filter((l) => l.resource === filter.resource);\n if (filter.success !== undefined)\n logs = logs.filter((l) => l.success === filter.success);\n return { logs: logs.slice(offset, offset + limit), total: logs.length };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n this.auditLogs.push(log);\n return log;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\nimport { readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? join(cwd, \"..\") : cwd;\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"auth.db\");\n\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"postgres\": {\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"mongodb\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const email = EmailTransport.fromEnv() || undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\nimport type * as jwt from \"jsonwebtoken\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const user = await this.adapter.createUser({\n email: data.email,\n password: data.password,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.verifyPassword(\n credentials.email,\n credentials.password,\n );\n if (!user) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const decoded = jwtModule.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n user.email,\n currentPassword,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n await this.adapter.updateUser(userId, { password: newPassword });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.updateUser(user.id, { password: newPassword });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = await this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private async generateToken(user: AuthUser): Promise<string> {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwtModule.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n const { default: bcrypt } = await import(\"bcryptjs\");\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n","export interface SeoTagsOptions {\n siteSettings: any;\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n}\n\n/**\n * Generates standard SEO meta tags based on global site settings and page overrides.\n */\nexport function generateSeoTags(options: SeoTagsOptions): string {\n const { siteSettings, title, description, image, url } = options;\n \n if (!siteSettings) return '';\n\n const siteName = siteSettings.siteName || '';\n const finalTitle = title ? `${title} | ${siteName}` : siteName;\n const finalDesc = description || siteSettings.siteDescription || '';\n const finalImage = image || (siteSettings.siteOgImage?.url) || '';\n const finalUrl = url || siteSettings.siteUrl || '';\n \n let tags = `\n <title>${finalTitle}</title>\n <meta name=\"description\" content=\"${finalDesc}\">\n `;\n\n if (siteSettings.siteFavicon?.url) {\n tags += `\\n <link rel=\"icon\" type=\"${siteSettings.siteFavicon.mimeType || 'image/x-icon'}\" href=\"${siteSettings.siteFavicon.url}\">`;\n }\n\n // Open Graph\n tags += `\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"${finalTitle}\">\n <meta property=\"og:description\" content=\"${finalDesc}\">\n <meta property=\"og:site_name\" content=\"${siteName}\">\n `;\n\n if (finalUrl) tags += `\\n <meta property=\"og:url\" content=\"${finalUrl}\">`;\n if (finalImage) tags += `\\n <meta property=\"og:image\" content=\"${finalImage}\">`;\n\n // Twitter\n tags += `\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"${finalTitle}\">\n <meta name=\"twitter:description\" content=\"${finalDesc}\">\n `;\n\n if (finalImage) tags += `\\n <meta name=\"twitter:image\" content=\"${finalImage}\">`;\n\n // I18n\n if (siteSettings.enableI18n && siteSettings.i18n?.language) {\n tags += `\\n <meta http-equiv=\"content-language\" content=\"${siteSettings.i18n.language}\">`;\n }\n\n return tags;\n}\n\n/**\n * Generates analytics script tags based on global site settings.\n */\nexport function generateAnalyticsTags(siteSettings: any): string {\n if (!siteSettings || !siteSettings.analyticsEnabled || !siteSettings.analytics) {\n return '';\n }\n\n const { googleAnalyticsId, googleTagManagerId, plausibleDomain } = siteSettings.analytics;\n let scripts = '';\n\n if (googleAnalyticsId) {\n scripts += `\n <!-- Google Analytics -->\n <script async src=\"https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsId}\"></script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${googleAnalyticsId}');\n </script>\n `;\n }\n\n if (googleTagManagerId) {\n scripts += `\n <!-- Google Tag Manager -->\n <script>\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','${googleTagManagerId}');\n </script>\n `;\n }\n\n if (plausibleDomain) {\n scripts += `\n <!-- Plausible Analytics -->\n <script defer data-domain=\"${plausibleDomain}\" src=\"https://plausible.io/js/script.js\"></script>\n `;\n }\n\n return scripts;\n}\n","import { createStorage } from \"unstorage\";\nimport indexedbDriver from \"unstorage/drivers/indexedb\";\n\nexport interface BrowserStorageOptions {\n namespace?: string;\n ttl?: number;\n}\n\nexport async function createBrowserStorage(\n options: BrowserStorageOptions = {},\n): Promise<{\n storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> };\n cleanup?: () => Promise<void>;\n}> {\n const { namespace = \"kyro\", ttl } = options;\n\n const store = createStorage({\n driver: indexedbDriver({\n dbName: \"kyro-cms\",\n storeName: namespace,\n }),\n });\n\n const prefix = namespace ? `${namespace}:` : \"\";\n\n const storage = {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n };\n\n return {\n storage,\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import crypto from 'crypto';\n\nconst DEFAULT_ALGORITHM = 'AES-256-GCM';\n\nexport function getEncryptionOptions(secret?: string, algorithm?: string) {\n return {\n key: getEncryptionKey(secret),\n algorithm: algorithm || DEFAULT_ALGORITHM,\n };\n}\n\nexport function getEncryptionKey(secret?: string): string {\n const appSecret = secret || process.env.APP_SECRET || process.env.AUTH_SECRET || 'development-secret-key';\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}\n\nexport function hashData(data: string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function generateSessionId(): string {\n return crypto.randomUUID();\n}","import path from \"path\";\nimport { getEncryptionKey } from \"./encryption.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\nimport crypto from \"crypto\";\n\nexport interface NodeStorageOptions {\n adapter?: \"fs\";\n connectionString?: string;\n namespace?: string;\n ttl?: number;\n encryption?: boolean;\n secret?: string;\n basePath?: string;\n}\n\nfunction encrypt(text: string, key: string): string {\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n let encrypted = cipher.update(text, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const authTag = cipher.getAuthTag().toString(\"hex\");\n return `${iv.toString(\"hex\")}:${authTag}:${encrypted}`;\n}\n\nfunction decrypt(encryptedText: string, key: string): string {\n const [ivHex, authTagHex, encrypted] = encryptedText.split(\":\");\n const iv = Buffer.from(ivHex, \"hex\");\n const authTag = Buffer.from(authTagHex, \"hex\");\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n decipher.setAuthTag(authTag);\n let decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n}\n\nexport async function createNodeStorage(\n options: NodeStorageOptions = {}\n): Promise<{ storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> }; cleanup?: () => Promise<void> }> {\n const {\n namespace = \"kyro\",\n ttl,\n encryption = true,\n secret,\n basePath,\n } = options;\n\n const defaultPath = basePath\n ? path.join(basePath, \".astro\", \"kyro.json\")\n : path.join(process.cwd(), \".astro\", \"kyro.json\");\n\n const store = createStorage({\n driver: fsDriver({ base: defaultPath }),\n });\n\n const encKey = encryption ? getEncryptionKey(secret) : null;\n const prefix = namespace ? `${namespace}:` : \"\";\n\n return {\n storage: {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const data = encKey ? decrypt(raw, encKey) : raw;\n const parsed = JSON.parse(data);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, encKey ? encrypt(data, encKey) : data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n },\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import type { StorageConfig, StorageAdapter, CreateStorageResult } from './types.js';\nimport { createBrowserStorage } from './browser.js';\nimport { createNodeStorage } from './node.js';\nimport { getEncryptionKey } from './encryption.js';\n\nexport type { StorageConfig, StorageAdapter, Environment, EncryptionConfig } from './types.js';\nexport { getEncryptionKey } from './encryption.js';\n\nexport async function createStorage(config: StorageConfig): Promise<CreateStorageResult & { storage: _StateStorage }> {\n const { environment, adapter, connectionString, encryption } = config;\n\n const secret = process.env.APP_SECRET || process.env.AUTH_SECRET;\n\n const encryptionOptions = {\n enabled: encryption?.enabled ?? true,\n algorithm: encryption?.algorithm,\n };\n\n if (environment === 'browser') {\n return createBrowserStorage({\n namespace: 'kyro',\n });\n }\n\n return createNodeStorage({\n adapter: (adapter || 'fs') as \"fs\",\n connectionString,\n namespace: 'kyro',\n encryption: encryptionOptions.enabled,\n secret,\n });\n}\n\ntype _StateStorage = {\n getItem: (name: string) => string | null | Promise<string | null>;\n setItem: (name: string, value: string) => void | Promise<void>;\n removeItem: (name: string) => void | Promise<void>;\n};\n\nexport function createSyncStorage(config: StorageConfig): _StateStorage {\n const { environment } = config;\n\n if (typeof globalThis !== 'undefined' && (globalThis as any).window || environment === 'browser') {\n return {\n getItem: (name: string): string | null => {\n try {\n return localStorage.getItem(name);\n } catch {\n return null;\n }\n },\n setItem: (name: string, value: string): void => {\n try {\n localStorage.setItem(name, value);\n } catch (e) {\n console.error('Failed to save to localStorage:', e);\n }\n },\n removeItem: (name: string): void => {\n try {\n localStorage.removeItem(name);\n } catch (e) {\n console.error('Failed to remove from localStorage:', e);\n }\n },\n };\n }\n\n return {\n getItem: async (): Promise<string | null> => null,\n setItem: async (): Promise<void> => {},\n removeItem: async (): Promise<void> => {},\n };\n}\n\nexport async function createAuthStorage(config: StorageConfig): Promise<CreateStorageResult> {\n const storageConfig: StorageConfig = {\n ...config,\n encryption: {\n enabled: true,\n algorithm: config.encryption?.algorithm,\n },\n };\n\n return createStorage(storageConfig);\n}\n\nexport { createBrowserStorage } from './browser.js';\nexport { createNodeStorage } from './node.js';\n","// ============================================================================\n// @kyro-cms/core\n// Astro-native headless CMS with multi-database, multi-protocol, multi-vendor\n// ============================================================================\n\n// Main Factory\nexport { Kyro, createKyro } from \"./createKyro.js\";\n\n// Registry\nexport {\n Registry,\n getRegistry,\n resetRegistry,\n createRegistry,\n} from \"./registry/index.js\";\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n AdminConfig,\n UploadConfig,\n ImageSize,\n VersionConfig,\n AuthConfig,\n BaseAdapter,\n AdapterConfig,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from \"./registry/types.js\";\nexport {\n validateConfig,\n validateCollection,\n validateGlobal,\n validateFields,\n ConfigValidationError,\n} from \"./registry/validator.js\";\nexport {\n collectionToZod,\n collectionToCreateZod,\n collectionToUpdateZod,\n collectionToWhereZod,\n globalToZod,\n fieldToZod,\n} from \"./registry/zod-builder.js\";\n\n// Fields\nexport type {\n Field,\n FieldType,\n BaseField,\n FieldAdmin,\n ValidateOptions,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n ImageField,\n RichTextField,\n RichTextBlock,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n Block,\n RowField,\n CollapsibleField,\n TabsField,\n} from \"./fields/index.js\";\nexport {\n normalizeRichTextDocument,\n normalizeRichTextValue,\n renderRichText,\n richTextStyles,\n createColumnsNode,\n isTextField,\n isNumberField,\n isRelationshipField,\n isArrayField,\n isGroupField,\n isBlocksField,\n isUploadField,\n isImageField,\n isRichTextField,\n isSelectField,\n isLayoutField,\n PRIMITIVE_FIELD_TYPES,\n COMPLEX_FIELD_TYPES,\n RELATIONAL_FIELD_TYPES,\n LAYOUT_FIELD_TYPES,\n ALL_FIELD_TYPES,\n} from \"./fields/index.js\";\n\n// Access Control\nexport type {\n AccessControl,\n AccessArgs,\n WhereClause,\n CollectionAccess,\n GlobalAccess,\n FieldAccess,\n} from \"./access/index.js\";\nexport {\n evaluateAccess,\n mergeWhereClauses,\n getWhereClause,\n} from \"./access/index.js\";\n\n// Hooks\nexport type {\n Hook,\n HookArgs,\n CollectionHooks,\n FieldHooks,\n GlobalHooks,\n Request,\n User,\n} from \"./hooks/index.js\";\nexport { runHooks, runFieldHooks } from \"./hooks/index.js\";\n\n// Database Adapters\nexport { AbstractBaseAdapter } from \"./database/index.js\";\nexport type {\n DatabaseType as DbAdapterType,\n DatabaseConnectionOptions,\n DrizzleAdapterOptions,\n MongoDBAdapterOptions,\n AdapterOptions,\n} from \"./database/index.js\";\nexport {\n DrizzleAdapter,\n createDrizzleAdapter,\n fieldToDrizzleType,\n collectionToDrizzleSchema,\n} from \"./database/index.js\";\nexport { MongoDBAdapter, createMongoDBAdapter } from \"./database/index.js\";\nexport { LocalAdapter, createLocalAdapter } from \"./database/index.js\";\n\n// API Gateways\nexport {\n createContext,\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n createDynamicRouter,\n createKyroServer,\n} from \"./api/index.js\";\nexport { buildGraphQLSchema, createGraphQLSchema } from \"./api/index.js\";\nexport { createHonoApp, createRESTAPI } from \"./api/index.js\";\nexport {\n PubSub,\n KyroPubSub,\n KyroWSServer,\n createWSServer,\n} from \"./api/index.js\";\n\n// Plugin System\nexport {\n KyroPlugin,\n PluginManager,\n type PluginHooks,\n type PluginAPI,\n SEOPLugin,\n AnalyticsPlugin,\n CommentsPlugin,\n ReviewsPlugin,\n WishlistPlugin,\n presetPlugins,\n} from \"./plugins/index.js\";\n\n// Styling System\nexport {\n type StylingMode,\n type StylingConfig,\n type ThemeConfig,\n type ThemeColors,\n type ThemeFonts,\n type ThemeSpacing,\n type ThemeBorderRadius,\n type ThemeShadows,\n type FieldStyling,\n type AdminStylingConfig,\n CSSGenerator,\n generateTailwindConfig,\n generateCSSVariables,\n defaultLightTheme,\n defaultDarkTheme,\n ecommerce2026Theme,\n createAdminStyling,\n defaultFieldStyling,\n} from \"./styling/index.js\";\n\n// Authentication\nexport {\n Auth,\n createAuth,\n RedisAuthAdapter,\n InMemoryAuthAdapter,\n EmailTransport,\n AuditLogger,\n InMemoryAuditLogger,\n createAuditContext,\n PasswordPolicy,\n AccountLockout,\n InMemoryAccountLockout,\n RateLimiter,\n InMemoryRateLimiter,\n createAuthConfig,\n authConfig,\n} from \"./auth/index.js\";\nexport type {\n KyroAuthConfig,\n DatabaseType,\n AuthUser,\n UserRole,\n Session as AuthSession,\n Session,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n AuthAdapter,\n AuthTokenConfig,\n AuditLog,\n AuditAction,\n AuditLogFilter,\n} from \"./auth/index.js\";\n\nexport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\n\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./auth/bootstrap.js\";\n\n// Version History & Draft/Publish\nexport {\n VersionManager,\n createVersionManager,\n isPublished,\n isDraft,\n isArchived,\n type Version,\n type VersionStatus,\n type VersionDiff,\n type VersionAdapter,\n type CreateVersionOptions,\n type PublishVersionOptions,\n type CompareVersionsOptions,\n type VersionHistoryOptions,\n type DraftPublishConfig,\n type VersionPublishSchedule,\n getDefaultDraftPublishConfig,\n} from \"./versions/index.js\";\n\n// Zod re-export\nexport { z } from \"zod\";\n\n// Database - Drizzle (auth extensions)\nexport { PostgresAuthAdapter } from \"./database/drizzle/index.js\";\nexport {\n createDatabase,\n runMigrations,\n seedDefaultRoles,\n type Dialect,\n} from \"./database/drizzle/index.js\";\n\n// Media Service\nexport { MediaService } from \"./storage/MediaService.js\";\nexport { resolveProvider, createLocalStorage } from \"./storage/index.js\";\n\n// Webhooks\nexport {\n WebhookService,\n createWebhookService,\n deliverWebhook,\n deliverWithRetry,\n signPayload,\n generateWebhookSecret,\n buildDeliveryRecord,\n createTestPayload,\n WEBHOOK_EVENTS,\n ALL_WEBHOOK_EVENTS,\n type WebhookEvent,\n type WebhookConfig,\n type CreateWebhookData,\n type UpdateWebhookData,\n type WebhookPayload,\n type WebhookDelivery,\n type WebhookTriggerResult,\n WEBHOOK_COLLECTION,\n WEBHOOK_DELIVERY_COLLECTION,\n type DeliveryResult,\n type DeliveryOptions,\n} from \"./webhooks/index.js\";\n\n// Templates\nexport {\n ecommerceCollections,\n ecommerceGlobals,\n blogCollections,\n blogGlobals,\n minimalCollections,\n kitchenSinkCollections,\n mediaCollections,\n allSettingsGlobals,\n coreSettingsGlobals,\n ecommerceSettingsGlobals,\n createTemplateConfig,\n} from \"./templates/index\";\nexport type { TemplateConfig } from \"./templates/index\";\n\n// Configuration Service\nexport {\n ConfigService,\n type StorageConfig,\n type EmailConfig,\n} from \"./config/ConfigService.js\";\n\n// Configuration Helper\nexport { defineConfig } from \"./registry/config.js\";\n\n// SEO & Analytics Helpers\nexport { generateSeoTags, generateAnalyticsTags, type SeoTagsOptions } from \"./lib/seo.js\";\n\n// Storage\nexport {\n createStorage,\n createAuthStorage,\n} from \"./lib/storage/index.js\";\nexport type {\n StorageAdapter,\n Environment,\n EncryptionConfig,\n StorageOptions,\n CreateStorageResult,\n} from \"./lib/storage/index.js\";\n\n// Secret Management\nexport {\n setDbAdapter,\n loadSecrets,\n getAppSecret,\n getEncryptionKey,\n getSessionConfig,\n} from \"./lib/secret.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts","../src/lib/seo.ts","../src/lib/storage/browser.ts","../src/lib/storage/encryption.ts","../src/lib/storage/node.ts","../src/lib/storage/factory.ts","../src/index.ts"],"names":["result","resolve","randomBytes","RedisAuthAdapter","getEncryptionKey","crypto","createStorage"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import { createRequire } from \"module\";\nconst _require = createRequire(import.meta.url);\nconst modPath = \"node:\" + \"sqlite\";\nconst { DatabaseSync } = _require(modPath) as typeof import(\"node:sqlite\");\nimport { randomBytes } from 'crypto';\nimport { AbstractBaseAdapter } from \"../base.js\";\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n DocumentStatus,\n} from \"../../registry/types.js\";\nimport type { Field } from \"../../fields/types.js\";\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nfunction flattenFields(fields: Field[]): Field[] {\n const result: Field[] = [];\n for (const field of fields) {\n if (field.type === \"tabs\" && \"tabs\" in field) {\n for (const tab of field.tabs) {\n result.push(...flattenFields(tab.fields));\n }\n } else if (field.type === \"row\" && \"fields\" in field) {\n result.push(...flattenFields(field.fields));\n } else if (field.type === \"collapsible\" && \"fields\" in field) {\n result.push(...flattenFields(field.fields));\n } else {\n result.push(field);\n }\n }\n return result;\n}\n\nfunction processFieldValue(row: any, field: Field): any {\n const f = field as any;\n let value = row[f.name];\n \n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (f.type === \"checkbox\") {\n value = Boolean(value);\n }\n\n if (f.type === \"date\" && value) {\n try {\n const d = new Date(value);\n if (isNaN(d.getTime())) {\n value = null;\n } else {\n value = d.toISOString();\n }\n } catch {\n value = null;\n }\n }\n\n if ((f.type === \"upload\" || f.type === \"image\") && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed.map((item: any) => {\n if (typeof item === \"object\" && item !== null) {\n return item;\n }\n return { id: item };\n });\n } else {\n value = typeof parsed === \"object\" ? parsed : { id: parsed };\n }\n } catch {\n value = { id: value };\n }\n }\n\n if (f.type === \"relationship\" && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed;\n } else {\n value = parsed;\n }\n } catch {\n value = { relationTo: Array.isArray(f.relationTo) ? f.relationTo[0] : f.relationTo, value };\n }\n }\n\n if (f.type === \"list\" && value) {\n try {\n const parsed = JSON.parse(value);\n value = Array.isArray(parsed) ? parsed : [];\n } catch {\n value = [];\n }\n }\n\n if (f.type === \"relationship-block\" && value) {\n try {\n const parsed = JSON.parse(value);\n value = Array.isArray(parsed) ? parsed : [];\n } catch {\n value = [];\n }\n }\n\n return value;\n}\n\nfunction buildNestedDoc(row: any, fields: Field[]): any {\n const doc: any = {};\n \n for (const field of fields) {\n if (!field.name || field.name === \"id\") continue;\n \n if (field.type === \"tabs\" && \"tabs\" in field) {\n const tabData: any = {};\n for (const tab of field.tabs) {\n Object.assign(tabData, buildNestedDoc(row, tab.fields));\n }\n doc[field.name] = tabData;\n } else if (field.type === \"row\" && \"fields\" in field) {\n const rowData = buildNestedDoc(row, field.fields);\n Object.assign(doc, rowData);\n } else if (field.type === \"collapsible\" && \"fields\" in field) {\n doc[field.name] = buildNestedDoc(row, field.fields);\n } else {\n doc[field.name] = processFieldValue(row, field);\n }\n }\n \n return doc;\n}\n\nfunction getTableColumns(db: any, tableName: string): string[] {\n try {\n const rows = db.prepare(`PRAGMA table_info(${tableName})`).all() as any[];\n return rows.map((r: any) => r.name);\n } catch {\n return [];\n }\n}\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n private readonly draftsTableName = \"kyro_drafts\";\n private readonly versionsTableName = \"kyro_versions\";\n\n constructor(options: { db?: any; path?: string }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n this.db = new DatabaseSync(this.path || \":memory:\");\n }\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n this.db.exec(\"PRAGMA foreign_keys = ON\");\n this.connected = true;\n console.log(\n `[LocalAdapter] Connected to SQLite (${this.path || \"memory\"})`,\n );\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log(\"[LocalAdapter] Disconnected\");\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(\n config: CollectionConfig | GlobalConfig,\n tableName?: string,\n ): void {\n const name = tableName || this.getTableNameFor(config.slug);\n\n const columns: string[] = [`id TEXT PRIMARY KEY`];\n\n for (const field of flattenFields(config.fields)) {\n if (!field.name || field.name === \"id\") continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n // Always add timestamps for all tables\n columns.push(`${this.col(\"createdAt\")} TEXT DEFAULT (datetime('now'))`);\n columns.push(`${this.col(\"updatedAt\")} TEXT DEFAULT (datetime('now'))`);\n // _status: defaults to 'published' so existing data stays live after migration\n columns.push(`_status TEXT DEFAULT 'published'`);\n columns.push(`_has_draft INTEGER DEFAULT 0`);\n\n if ((config as CollectionConfig).tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const existingColumns = getTableColumns(this.db, name);\n\n if (existingColumns.length === 0) {\n const createSQL = `CREATE TABLE IF NOT EXISTS ${name} (${columns.join(\", \")})`;\n this.db.exec(createSQL);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${name}__status ON ${name}(_status)`);\n\n for (const field of flattenFields(config.fields)) {\n if (field.name && field.indexed) {\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${name}_${field.name} ON ${name}(${this.col(field.name)})`,\n );\n }\n if (field.name && field.unique) {\n this.db.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${name}_${field.name}_unique ON ${name}(${this.col(field.name)})`,\n );\n }\n }\n } else {\n const existingSet = new Set(existingColumns);\n for (const colDef of columns) {\n const colName = colDef.split(\" \")[0].replace(/^\"/, \"\").replace(/\"$/, \"\");\n if (!existingSet.has(colName) && colName !== \"id\") {\n try {\n if (colName === \"_status\") {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} TEXT DEFAULT 'published'`);\n } else if (colName === \"_has_draft\") {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} INTEGER DEFAULT 0`);\n } else {\n this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} TEXT`);\n }\n } catch {\n // Column may already exist via concurrent migration\n }\n }\n }\n }\n\n this.migrations.set(name, true);\n }\n\n private ensureVersionsTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.versionsTableName} (\n id TEXT PRIMARY KEY,\n collection_slug TEXT NOT NULL,\n document_id TEXT NOT NULL,\n tenant_id TEXT,\n version INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'draft',\n data TEXT NOT NULL,\n created_by TEXT,\n change_description TEXT,\n published_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_doc ON ${this.versionsTableName}(collection_slug, document_id)`,\n );\n this.db.exec(\n `CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_status ON ${this.versionsTableName}(status)`,\n );\n }\n\n private ensureDraftsTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.draftsTableName} (\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 base_updated_at TEXT,\n draft_updated_at TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n )\n `);\n this.db.exec(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${this.draftsTableName}_document ON ${this.draftsTableName}(collection_slug, document_id, tenant_id)`,\n );\n }\n\n // ========================================================================\n // SQL Quoting\n // ========================================================================\n\n private col(name: string): string {\n return `\"${name}\"`;\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"textarea\":\n case \"color\":\n case \"code\":\n case \"markdown\":\n case \"url\":\n return this.col(field.name) + \" TEXT\";\n case \"number\":\n return this.col(field.name) + \" REAL\";\n case \"checkbox\":\n return this.col(field.name) + \" INTEGER DEFAULT 0\";\n case \"date\":\n return this.col(field.name) + \" TEXT\";\n case \"select\":\n case \"radio\":\n return this.col(field.name) + \" TEXT\";\n case \"relationship\":\n case \"upload\":\n return this.col(field.name) + \" TEXT\";\n case \"json\":\n case \"richtext\":\n case \"array\":\n case \"group\":\n case \"blocks\":\n return this.col(field.name) + \" TEXT\";\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n private parseGlobalsSlug(slug: string): {\n isGlobal: boolean;\n globalSlug: string;\n tableName: string;\n } {\n if (slug.startsWith(\"_globals_\")) {\n const globalSlug = slug.replace(\"_globals_\", \"\");\n return {\n isGlobal: true,\n globalSlug,\n tableName: `global_${globalSlug.replace(/-/g, \"_\")}`,\n };\n }\n return {\n isGlobal: false,\n globalSlug: \"\",\n tableName: this.getTableNameFor(slug),\n };\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const {\n collection: slug,\n where = {},\n sort,\n limit = 10,\n page = 1,\n tenantID,\n draft = false,\n } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n // Public API: only show published. Admin (draft=true): show all.\n if (!draft && (config as CollectionConfig).versions?.drafts) {\n conditions.push(`_status = ?`);\n params.push('published');\n }\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\") continue;\n\n if (typeof value === \"object\" && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${this.col(key)} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${this.col(key)} IN (${value.in.map(() => \"?\").join(\", \")})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${this.col(key)} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${this.col(key)} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n\n const sortField = this.col(sort?.replace(\"-\", \"\") || \"createdAt\");\n const sortDir = sort?.startsWith(\"-\") ? \"DESC\" : \"ASC\";\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace(\"SELECT *\", \"SELECT COUNT(*) as count\");\n const countResult = this.db.prepare(countSql).get(...params) as {\n count: number;\n };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n let docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n docs = await Promise.all(docs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\n }\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID, draft = false } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n // Public API: only show published docs. Admin (draft=true): skip status filter.\n if (!draft && (config as CollectionConfig).versions?.drafts) {\n sql += ` AND _status = ?`;\n params.push('published');\n }\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n let doc = this.rowToDoc(row as any, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n\n return doc as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n const id = parsed.isGlobal ? parsed.globalSlug : (data.id || this.generateId());\n\n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n\n // Filter data to only include valid columns\n const validColumns = getTableColumns(this.db, tableName);\n const filteredData: Record<string, any> = {};\n for (const key of columns) {\n if (validColumns.includes(key)) {\n filteredData[key] = insertData[key];\n }\n }\n\n const filteredColumns = Object.keys(filteredData);\n const quotedColumns = filteredColumns.map(c => this.col(c));\n const placeholders = filteredColumns.map(() => \"?\").join(\", \");\n const values = Object.values(filteredData).map((v: any) =>\n typeof v === \"object\" ? JSON.stringify(v) : v,\n );\n\n this.db\n .prepare(\n `INSERT OR REPLACE INTO ${tableName} (${quotedColumns.join(\", \")}) VALUES (${placeholders})`,\n )\n .run(...values);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n // Filter data to only include valid columns\n const validColumns = getTableColumns(this.db, tableName);\n const filteredData: Record<string, any> = {};\n for (const key of Object.keys(updateData)) {\n if (validColumns.includes(key)) {\n filteredData[key] = updateData[key];\n }\n }\n\n const columns = Object.keys(filteredData);\n const setClause = columns.map((c) => `${this.col(c)} = ?`).join(\", \");\n const values = Object.values(filteredData).map((v: any) =>\n v !== null && typeof v === \"object\" ? JSON.stringify(v) : v,\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n console.log(`[LocalAdapter] update sql=\"${sql}\", params=${JSON.stringify(params)}`);\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID, draft: true }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = parsed.tableName;\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: {\n collection: string;\n where?: Record<string, any>;\n tenantID?: string;\n }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const parsed = this.parseGlobalsSlug(slug);\n const config = parsed.isGlobal \n ? this.globals.get(parsed.globalSlug)! \n : this.getCollection(slug);\n \n this.ensureTable(config, parsed.tableName);\n\n const tableName = parsed.tableName;\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && (config as CollectionConfig).tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: {\n collection: string;\n where: Record<string, any>;\n tenantID?: string;\n draft?: boolean;\n }): Promise<any> {\n const parsed = this.parseGlobalsSlug(args.collection);\n if (parsed.isGlobal) {\n const globalConfig = this.globals.get(parsed.globalSlug);\n if (!globalConfig) {\n throw new Error(`Global \"${parsed.globalSlug}\" not found in adapter`);\n }\n this.ensureTable(globalConfig, parsed.tableName);\n\n let sql = `SELECT * FROM ${parsed.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (!args.draft && globalConfig.versions) {\n conditions.push(\"_status = 'published'\");\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n\n sql += \" LIMIT 1\";\n\n const result = this.db.prepare(sql).get(...params) as any;\n if (result) {\n let doc = this.rowToDoc(result, globalConfig);\n\n // If draft: true and doc has a separate draft, merge it\n if (args.draft && doc._has_draft) {\n const versions = await this.findVersions({\n collection: args.collection,\n documentId: parsed.globalSlug,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }\n return null;\n }\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version History\n // ========================================================================\n\n async findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>> {\n this.ensureVersionsTable();\n const { collection, documentId, tenantID, limit = 20, page = 1 } = args;\n const conditions = [`collection_slug = ?`, `document_id = ?`];\n const params: any[] = [collection, documentId];\n\n if (tenantID) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n } else {\n conditions.push(`tenant_id IS NULL`);\n }\n\n const where = `WHERE ${conditions.join(' AND ')}`;\n const countResult = this.db\n .prepare(`SELECT COUNT(*) as count FROM ${this.versionsTableName} ${where}`)\n .get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n const offset = (page - 1) * limit;\n const rows = this.db\n .prepare(`SELECT * FROM ${this.versionsTableName} ${where} ORDER BY version DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as any[];\n\n const docs = rows.map((r) => this.rowToVersion(r));\n return {\n docs,\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null> {\n this.ensureVersionsTable();\n const row = this.db\n .prepare(`SELECT * FROM ${this.versionsTableName} WHERE id = ? AND collection_slug = ? LIMIT 1`)\n .get(args.versionId, args.collection) as any;\n return row ? this.rowToVersion(row) : null;\n }\n\n async createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>> {\n this.ensureVersionsTable();\n const now = new Date().toISOString();\n const id = this.generateId();\n\n // Get next version number\n const latestRow = this.db\n .prepare(`SELECT version FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC LIMIT 1`)\n .get(args.collection, args.documentId) as any;\n const nextVersion = (latestRow?.version ?? 0) + 1;\n\n this.db\n .prepare(\n `INSERT INTO ${this.versionsTableName} (\n id, collection_slug, document_id, tenant_id, version, status, data, created_by, change_description, published_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n args.collection,\n args.documentId,\n args.tenantID ?? null,\n nextVersion,\n args.status,\n JSON.stringify(args.data),\n args.createdBy ?? null,\n args.changeDescription ?? null,\n args.status === 'published' ? now : null,\n now,\n now,\n );\n\n // Prune old versions if collection has maxPerDoc configured\n const collectionConfig = this.collections.get(args.collection);\n const maxPerDoc = (collectionConfig as CollectionConfig)?.versions?.maxPerDoc;\n if (maxPerDoc && maxPerDoc > 0) {\n await this.deleteVersions({ collection: args.collection, documentId: args.documentId, keepLatest: maxPerDoc, tenantID: args.tenantID });\n }\n\n const saved = await this.findVersionByID({ collection: args.collection, versionId: id });\n return saved as VersionRecord<T>;\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n this.ensureVersionsTable();\n const { collection, documentId, keepLatest, tenantID } = args;\n\n if (keepLatest && keepLatest > 0) {\n // Delete all non-published versions beyond the keepLatest limit\n const rows = this.db\n .prepare(`SELECT id, status FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC`)\n .all(collection, documentId) as any[];\n\n // Always keep published versions; prune non-published beyond the limit\n let draftCount = 0;\n const toDelete: string[] = [];\n for (const row of rows) {\n if (row.status === 'published') continue;\n draftCount++;\n if (draftCount > keepLatest) toDelete.push(row.id);\n }\n\n for (const vid of toDelete) {\n this.db.prepare(`DELETE FROM ${this.versionsTableName} WHERE id = ?`).run(vid);\n }\n } else {\n // Delete all versions for this document\n let sql = `DELETE FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [collection, documentId];\n if (tenantID) { sql += ` AND tenant_id = ?`; params.push(tenantID); }\n this.db.prepare(sql).run(...params);\n }\n }\n\n private rowToVersion<T = Record<string, any>>(row: any): VersionRecord<T> {\n return {\n id: String(row.id),\n collection: row.collection_slug,\n documentId: row.document_id,\n version: row.version,\n status: row.status as DocumentStatus,\n data: row.data ? JSON.parse(row.data) : {},\n createdBy: row.created_by ?? undefined,\n changeDescription: row.change_description ?? undefined,\n publishedAt: row.published_at ?? null,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n this.ensureDraftsTable();\n\n let sql = `SELECT * FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [args.collection, args.documentId];\n\n if (args.tenantID) {\n sql += ` AND tenant_id = ?`;\n params.push(args.tenantID);\n } else {\n sql += ` AND tenant_id IS NULL`;\n }\n\n sql += ` LIMIT 1`;\n const row = this.db.prepare(sql).get(...params) as any;\n if (!row) return null;\n\n return this.rowToDraft<T>(row);\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n this.ensureDraftsTable();\n\n const existing = await this.findDraft<T>(args);\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const id = existing?.id || this.generateId();\n\n this.db\n .prepare(\n `INSERT OR REPLACE INTO ${this.draftsTableName} (\n id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n args.collection,\n args.documentId,\n args.tenantID ?? null,\n JSON.stringify(args.data),\n args.baseUpdatedAt ?? null,\n draftUpdatedAt,\n existing?.createdAt || now,\n now,\n );\n\n const saved = await this.findDraft<T>(args);\n if (!saved) {\n throw new Error(\"Failed to persist draft snapshot\");\n }\n return saved;\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n this.ensureDraftsTable();\n\n let sql = `DELETE FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;\n const params: any[] = [args.collection, args.documentId];\n\n if (args.tenantID) {\n sql += ` AND tenant_id = ?`;\n params.push(args.tenantID);\n } else {\n sql += ` AND tenant_id IS NULL`;\n }\n\n this.db.prepare(sql).run(...params);\n }\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n protected prepareData(\n data: Record<string, any>,\n config: CollectionConfig | GlobalConfig,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const fields = flattenFields(config.fields);\n\n // Helper to process a field value\n const processValue = (field: Field, value: any): any => {\n const f = field as any;\n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n if (f.name === \"content\" && Array.isArray(value)) {\n console.log(\"[processValue] content blocks before stringify - first block id:\", value[0]?.id, \"first block:\", JSON.stringify(value[0]));\n }\n return value !== null && value !== undefined ? JSON.stringify(value) : null;\n } else if (f.type === \"checkbox\") {\n return value ? 1 : 0;\n } else if (f.type === \"number\") {\n return value !== null && value !== \"\" ? Number(value) : null;\n } else if (f.type === \"upload\" || f.type === \"image\") {\n if (value === null || value === undefined) return null;\n if (Array.isArray(value)) {\n const items = value.map((v: any) => {\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return v.id || v._id || v;\n return String(v);\n });\n return JSON.stringify(items);\n }\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } else if (field.type === \"relationship\") {\n if (value === null || value === undefined) return null;\n if (Array.isArray(value)) {\n const rels = value.map((v: any) => {\n if (typeof v === \"string\") return v;\n if (typeof v === \"object\") return JSON.stringify({ relationTo: field.relationTo, value: v.id || v });\n return String(v);\n });\n return JSON.stringify(rels);\n }\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\") return JSON.stringify({ relationTo: field.relationTo, value: value.id || value });\n return String(value);\n }\n return value;\n };\n\n // First pass: process top-level fields\n for (const field of fields) {\n if (!field.name || field.name === \"id\") continue;\n \n // Skip fields that are inside tabs (they'll be handled separately)\n const isInTab = config.fields.some(f => \n f.type === \"tabs\" && \"tabs\" in f && \n f.tabs.some(t => t.fields.some(tf => tf.name === field.name))\n );\n if (isInTab) continue;\n \n const value = data[field.name];\n if (value !== undefined) {\n result[field.name] = processValue(field, value);\n }\n }\n\n // Second pass: process nested tab fields\n for (const field of config.fields) {\n if (field.type === \"tabs\" && \"tabs\" in field && field.name) {\n const tabData = data[field.name];\n if (tabData && typeof tabData === \"object\") {\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && tabField.name !== \"id\") {\n const value = tabData[tabField.name];\n if (value !== undefined) {\n result[tabField.name] = processValue(tabField, value);\n }\n }\n }\n }\n }\n }\n }\n\n return result;\n }\n\n private rowToDoc(row: any, config: CollectionConfig | GlobalConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of flattenFields(config.fields)) {\n if (!field.name || field.name === \"id\") continue;\n\n const f = field as any;\n let value = row[f.name];\n\n if (\n f.type === \"json\" ||\n f.type === \"richtext\" ||\n f.type === \"array\" ||\n f.type === \"group\" ||\n f.type === \"blocks\" ||\n f.type === \"list\" ||\n f.type === \"relationship-block\"\n ) {\n if (f.name === \"content\" && value) {\n console.log(\"[rowToDoc] RAW content from DB (first 300 chars):\", JSON.stringify(value).slice(0, 300));\n }\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === \"checkbox\") {\n value = Boolean(value);\n }\n\n if (field.type === \"date\" && value) {\n try {\n const d = new Date(value);\n if (isNaN(d.getTime())) {\n console.warn(`[LocalAdapter] Invalid date value for field \"${field.name}\":`, value);\n value = null;\n } else {\n value = d.toISOString();\n }\n } catch {\n value = null;\n }\n }\n\n if ((field.type === \"upload\" || field.type === \"image\") && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed.map((item: any) => {\n if (typeof item === \"object\" && item !== null) {\n return item; // Keep full object with id, url, etc.\n }\n return { id: item };\n });\n } else {\n // If it's an object, keep it; otherwise assume it's just an ID\n value = typeof parsed === \"object\" ? parsed : { id: parsed };\n }\n } catch {\n value = { id: value };\n }\n }\n\n if (field.type === \"relationship\" && value) {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n value = parsed;\n } else {\n value = parsed;\n }\n } catch {\n value = { relationTo: Array.isArray(field.relationTo) ? field.relationTo[0] : field.relationTo, value };\n }\n }\n\n doc[field.name] = value;\n }\n\n // Build nested structure for tab/row/collapsible fields\n for (const field of config.fields) {\n if (!field.name || field.name === \"id\" || field.name === \"row\" || field.name === \"collapsible\") continue;\n \n if (field.type === \"tabs\" && \"tabs\" in field) {\n const tabData: any = {};\n for (const tab of field.tabs) {\n for (const tabField of tab.fields) {\n if (tabField.name && tabField.name !== \"id\") {\n // Get the processed value for this tab field\n tabData[tabField.name] = processFieldValue(row, tabField);\n }\n }\n }\n doc[field.name] = tabData;\n }\n }\n\n if ((config as CollectionConfig).timestamps) {\n const cAt = row.createdAt || row.created_at;\n const uAt = row.updatedAt || row.updated_at;\n \n if (cAt) {\n try {\n const d = new Date(cAt);\n if (!isNaN(d.getTime())) doc.createdAt = d.toISOString();\n } catch {}\n }\n \n if (uAt) {\n try {\n const d = new Date(uAt);\n if (!isNaN(d.getTime())) doc.updatedAt = d.toISOString();\n } catch {}\n }\n }\n\n if ((config as CollectionConfig).tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n const timestamp = Date.now().toString(16).padStart(12, '0');\n const random = randomBytes(6).toString('hex');\n return timestamp + random;\n }\n\n private getMediaById(mediaId: string): { id: string; url: string; thumbnailUrl?: string } | null {\n try {\n const tableName = this.getTableNameFor(\"media\");\n const row = this.db.prepare(`SELECT id, url, thumbnail_url FROM ${tableName} WHERE id = ?`).get(mediaId) as any;\n if (row) {\n return {\n id: row.id,\n url: row.url,\n thumbnailUrl: row.thumbnail_url || row.url,\n };\n }\n } catch (err) {\n // Media table might not exist or query failed\n }\n return null;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, \"_\");\n }\n\n private rowToDraft<T>(row: any): DraftSnapshot<T> {\n return {\n id: row.id,\n collection: row.collection_slug,\n documentId: row.document_id,\n tenantID: row.tenant_id ?? undefined,\n data: row.data ? JSON.parse(row.data) : {},\n baseUpdatedAt: row.base_updated_at ?? null,\n draftUpdatedAt: row.draft_updated_at,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n this.ensureDraftsTable();\n console.log(\"[LocalAdapter] Migrations complete\");\n }\n\n async rollback(): Promise<void> {\n console.log(\"[LocalAdapter] Rollback not supported for schema changes\");\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from \"../registry/types.js\";\nimport type { Field } from \"../fields/types.js\";\nimport type { Hook } from \"../hooks/types.js\";\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (\n slug: string,\n extension: Partial<CollectionConfig>,\n ) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super(\"seo\");\n this.description =\n \"Advanced SEO features including sitemaps, robots.txt, and structured data\";\n\n this.collections.push({\n slug: \"seo-settings\",\n label: \"SEO Settings\",\n fields: [\n {\n name: \"sitemap\",\n type: \"checkbox\",\n label: \"Enable Sitemap\",\n defaultValue: true,\n },\n { name: \"robotsTxt\", type: \"richtext\", label: \"robots.txt Content\" },\n {\n name: \"canonicalUrl\",\n type: \"text\",\n variant: \"url\" as any,\n label: \"Canonical URL\",\n },\n { name: \"ogImage\", type: \"text\", label: \"Default OG Image URL\" },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super(\"analytics\");\n this.description =\n \"Analytics integration for tracking page views and events\";\n\n this.collections.push({\n slug: \"analytics-events\",\n label: \"Analytics Events\",\n fields: [\n { name: \"name\", type: \"text\", required: true },\n { name: \"properties\", type: \"json\", label: \"Event Properties\" },\n { name: \"timestamp\", type: \"date\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"sessionId\", type: \"text\", label: \"Session ID\" },\n ],\n });\n\n this.adminComponents[\"AnalyticsDashboard\"] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super(\"comments\");\n this.description = \"Commenting system for products and posts\";\n\n this.collections.push({\n slug: \"comments\",\n label: \"Comments\",\n fields: [\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"text\", required: true },\n { name: \"email\", type: \"email\" },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"parent\", type: \"text\", label: \"Parent Comment ID\" },\n { name: \"resourceType\", type: \"text\", required: true },\n { name: \"resourceId\", type: \"text\", required: true },\n ],\n });\n\n this.adminComponents[\"CommentModeration\"] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super(\"reviews\");\n this.description = \"Product reviews and ratings\";\n\n this.collections.push({\n slug: \"reviews\",\n label: \"Reviews\",\n fields: [\n { name: \"rating\", type: \"number\", required: true, min: 1, max: 5 },\n { name: \"title\", type: \"text\" },\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"relationship\", relationTo: \"customers\" },\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n required: true,\n },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"verified\", type: \"checkbox\", label: \"Verified Purchase\" },\n {\n name: \"helpful\",\n type: \"number\",\n label: \"Helpful Count\",\n defaultValue: 0,\n },\n ],\n });\n\n this.adminComponents[\"ReviewModeration\"] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super(\"wishlist\");\n this.description = \"Customer wishlists\";\n\n this.collections.push({\n slug: \"wishlists\",\n label: \"Wishlists\",\n fields: [\n {\n name: \"customer\",\n type: \"relationship\",\n relationTo: \"customers\",\n required: true,\n },\n {\n name: \"name\",\n type: \"text\",\n label: \"Wishlist Name\",\n defaultValue: \"My Wishlist\",\n },\n {\n name: \"items\",\n type: \"blocks\",\n label: \"Items\",\n blocks: [\n {\n slug: \"wishlist-item\",\n label: \"Item\",\n fields: [\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n },\n { name: \"quantity\", type: \"number\", defaultValue: 1 },\n { name: \"addedAt\", type: \"date\" },\n {\n name: \"priority\",\n type: \"select\",\n options: [\n { label: \"Low\", value: \"low\" },\n { label: \"Medium\", value: \"medium\" },\n { label: \"High\", value: \"high\" },\n ],\n },\n ],\n },\n ],\n },\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","import type { Redis } from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import type { Redis } from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map();\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map();\n private auditLogs: Array<Record<string, unknown>> = [];\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user || !user.passwordHash) return null;\n const bcrypt = (await import(\"bcryptjs\")).default;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n const sessionId = this.refreshTokens.get(refreshToken);\n if (!sessionId) return null;\n const session = this.sessions.get(sessionId);\n return session || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n let logs = this.auditLogs.slice().reverse();\n if (filter.userId) logs = logs.filter((l) => l.userId === filter.userId);\n if (filter.action) {\n if (Array.isArray(filter.action)) {\n logs = logs.filter((l) => filter.action!.includes(String(l.action)));\n } else {\n logs = logs.filter((l) => l.action === filter.action);\n }\n }\n if (filter.resource)\n logs = logs.filter((l) => l.resource === filter.resource);\n if (filter.success !== undefined)\n logs = logs.filter((l) => l.success === filter.success);\n return { logs: logs.slice(offset, offset + limit), total: logs.length };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n this.auditLogs.push(log);\n return log;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\nimport { readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? join(cwd, \"..\") : cwd;\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"auth.db\");\n\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"postgres\": {\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"mongodb\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const email = EmailTransport.fromEnv() || undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\nimport type * as jwt from \"jsonwebtoken\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const user = await this.adapter.createUser({\n email: data.email,\n password: data.password,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.verifyPassword(\n credentials.email,\n credentials.password,\n );\n if (!user) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const decoded = jwtModule.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n user.email,\n currentPassword,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n await this.adapter.updateUser(userId, { password: newPassword });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.updateUser(user.id, { password: newPassword });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = await this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private async generateToken(user: AuthUser): Promise<string> {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwtModule.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n const { default: bcrypt } = await import(\"bcryptjs\");\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n","export interface SeoTagsOptions {\n siteSettings: any;\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n}\n\n/**\n * Generates standard SEO meta tags based on global site settings and page overrides.\n */\nexport function generateSeoTags(options: SeoTagsOptions): string {\n const { siteSettings, title, description, image, url } = options;\n \n if (!siteSettings) return '';\n\n const siteName = siteSettings.siteName || '';\n const finalTitle = title ? `${title} | ${siteName}` : siteName;\n const finalDesc = description || siteSettings.siteDescription || '';\n const finalImage = image || (siteSettings.siteOgImage?.url) || '';\n const finalUrl = url || siteSettings.siteUrl || '';\n \n let tags = `\n <title>${finalTitle}</title>\n <meta name=\"description\" content=\"${finalDesc}\">\n `;\n\n if (siteSettings.siteFavicon?.url) {\n tags += `\\n <link rel=\"icon\" type=\"${siteSettings.siteFavicon.mimeType || 'image/x-icon'}\" href=\"${siteSettings.siteFavicon.url}\">`;\n }\n\n // Open Graph\n tags += `\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"${finalTitle}\">\n <meta property=\"og:description\" content=\"${finalDesc}\">\n <meta property=\"og:site_name\" content=\"${siteName}\">\n `;\n\n if (finalUrl) tags += `\\n <meta property=\"og:url\" content=\"${finalUrl}\">`;\n if (finalImage) tags += `\\n <meta property=\"og:image\" content=\"${finalImage}\">`;\n\n // Twitter\n tags += `\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"${finalTitle}\">\n <meta name=\"twitter:description\" content=\"${finalDesc}\">\n `;\n\n if (finalImage) tags += `\\n <meta name=\"twitter:image\" content=\"${finalImage}\">`;\n\n // I18n\n if (siteSettings.enableI18n && siteSettings.i18n?.language) {\n tags += `\\n <meta http-equiv=\"content-language\" content=\"${siteSettings.i18n.language}\">`;\n }\n\n return tags;\n}\n\n/**\n * Generates analytics script tags based on global site settings.\n */\nexport function generateAnalyticsTags(siteSettings: any): string {\n if (!siteSettings || !siteSettings.analyticsEnabled || !siteSettings.analytics) {\n return '';\n }\n\n const { googleAnalyticsId, googleTagManagerId, plausibleDomain } = siteSettings.analytics;\n let scripts = '';\n\n if (googleAnalyticsId) {\n scripts += `\n <!-- Google Analytics -->\n <script async src=\"https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsId}\"></script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${googleAnalyticsId}');\n </script>\n `;\n }\n\n if (googleTagManagerId) {\n scripts += `\n <!-- Google Tag Manager -->\n <script>\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','${googleTagManagerId}');\n </script>\n `;\n }\n\n if (plausibleDomain) {\n scripts += `\n <!-- Plausible Analytics -->\n <script defer data-domain=\"${plausibleDomain}\" src=\"https://plausible.io/js/script.js\"></script>\n `;\n }\n\n return scripts;\n}\n","import { createStorage } from \"unstorage\";\nimport indexedbDriver from \"unstorage/drivers/indexedb\";\n\nexport interface BrowserStorageOptions {\n namespace?: string;\n ttl?: number;\n}\n\nexport async function createBrowserStorage(\n options: BrowserStorageOptions = {},\n): Promise<{\n storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> };\n cleanup?: () => Promise<void>;\n}> {\n const { namespace = \"kyro\", ttl } = options;\n\n const store = createStorage({\n driver: indexedbDriver({\n dbName: \"kyro-cms\",\n storeName: namespace,\n }),\n });\n\n const prefix = namespace ? `${namespace}:` : \"\";\n\n const storage = {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n };\n\n return {\n storage,\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import crypto from 'crypto';\n\nconst DEFAULT_ALGORITHM = 'AES-256-GCM';\n\nexport function getEncryptionOptions(secret?: string, algorithm?: string) {\n return {\n key: getEncryptionKey(secret),\n algorithm: algorithm || DEFAULT_ALGORITHM,\n };\n}\n\nexport function getEncryptionKey(secret?: string): string {\n const appSecret = secret || process.env.APP_SECRET || process.env.AUTH_SECRET || 'development-secret-key';\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}\n\nexport function hashData(data: string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function generateSessionId(): string {\n return crypto.randomUUID();\n}","import path from \"path\";\nimport { getEncryptionKey } from \"./encryption.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\nimport crypto from \"crypto\";\n\nexport interface NodeStorageOptions {\n adapter?: \"fs\";\n connectionString?: string;\n namespace?: string;\n ttl?: number;\n encryption?: boolean;\n secret?: string;\n basePath?: string;\n}\n\nfunction encrypt(text: string, key: string): string {\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n let encrypted = cipher.update(text, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const authTag = cipher.getAuthTag().toString(\"hex\");\n return `${iv.toString(\"hex\")}:${authTag}:${encrypted}`;\n}\n\nfunction decrypt(encryptedText: string, key: string): string {\n const [ivHex, authTagHex, encrypted] = encryptedText.split(\":\");\n const iv = Buffer.from(ivHex, \"hex\");\n const authTag = Buffer.from(authTagHex, \"hex\");\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n decipher.setAuthTag(authTag);\n let decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n}\n\nexport async function createNodeStorage(\n options: NodeStorageOptions = {}\n): Promise<{ storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> }; cleanup?: () => Promise<void> }> {\n const {\n namespace = \"kyro\",\n ttl,\n encryption = true,\n secret,\n basePath,\n } = options;\n\n const defaultPath = basePath\n ? path.join(basePath, \".astro\", \"kyro.json\")\n : path.join(process.cwd(), \".astro\", \"kyro.json\");\n\n const store = createStorage({\n driver: fsDriver({ base: defaultPath }),\n });\n\n const encKey = encryption ? getEncryptionKey(secret) : null;\n const prefix = namespace ? `${namespace}:` : \"\";\n\n return {\n storage: {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const data = encKey ? decrypt(raw, encKey) : raw;\n const parsed = JSON.parse(data);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, encKey ? encrypt(data, encKey) : data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n },\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import type { StorageConfig, StorageAdapter, CreateStorageResult } from './types.js';\nimport { createBrowserStorage } from './browser.js';\nimport { createNodeStorage } from './node.js';\nimport { getEncryptionKey } from './encryption.js';\n\nexport type { StorageConfig, StorageAdapter, Environment, EncryptionConfig } from './types.js';\nexport { getEncryptionKey } from './encryption.js';\n\nexport async function createStorage(config: StorageConfig): Promise<CreateStorageResult & { storage: _StateStorage }> {\n const { environment, adapter, connectionString, encryption } = config;\n\n const secret = process.env.APP_SECRET || process.env.AUTH_SECRET;\n\n const encryptionOptions = {\n enabled: encryption?.enabled ?? true,\n algorithm: encryption?.algorithm,\n };\n\n if (environment === 'browser') {\n return createBrowserStorage({\n namespace: 'kyro',\n });\n }\n\n return createNodeStorage({\n adapter: (adapter || 'fs') as \"fs\",\n connectionString,\n namespace: 'kyro',\n encryption: encryptionOptions.enabled,\n secret,\n });\n}\n\ntype _StateStorage = {\n getItem: (name: string) => string | null | Promise<string | null>;\n setItem: (name: string, value: string) => void | Promise<void>;\n removeItem: (name: string) => void | Promise<void>;\n};\n\nexport function createSyncStorage(config: StorageConfig): _StateStorage {\n const { environment } = config;\n\n if (typeof globalThis !== 'undefined' && (globalThis as any).window || environment === 'browser') {\n return {\n getItem: (name: string): string | null => {\n try {\n return localStorage.getItem(name);\n } catch {\n return null;\n }\n },\n setItem: (name: string, value: string): void => {\n try {\n localStorage.setItem(name, value);\n } catch (e) {\n console.error('Failed to save to localStorage:', e);\n }\n },\n removeItem: (name: string): void => {\n try {\n localStorage.removeItem(name);\n } catch (e) {\n console.error('Failed to remove from localStorage:', e);\n }\n },\n };\n }\n\n return {\n getItem: async (): Promise<string | null> => null,\n setItem: async (): Promise<void> => {},\n removeItem: async (): Promise<void> => {},\n };\n}\n\nexport async function createAuthStorage(config: StorageConfig): Promise<CreateStorageResult> {\n const storageConfig: StorageConfig = {\n ...config,\n encryption: {\n enabled: true,\n algorithm: config.encryption?.algorithm,\n },\n };\n\n return createStorage(storageConfig);\n}\n\nexport { createBrowserStorage } from './browser.js';\nexport { createNodeStorage } from './node.js';\n","// ============================================================================\n// @kyro-cms/core\n// Astro-native headless CMS with multi-database, multi-protocol, multi-vendor\n// ============================================================================\n\n// Main Factory\nexport { Kyro, createKyro } from \"./createKyro.js\";\n\n// Registry\nexport {\n Registry,\n getRegistry,\n resetRegistry,\n createRegistry,\n} from \"./registry/index.js\";\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n AdminConfig,\n UploadConfig,\n ImageSize,\n VersionConfig,\n AuthConfig,\n BaseAdapter,\n AdapterConfig,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from \"./registry/types.js\";\nexport {\n validateConfig,\n validateCollection,\n validateGlobal,\n validateFields,\n ConfigValidationError,\n} from \"./registry/validator.js\";\nexport {\n collectionToZod,\n collectionToCreateZod,\n collectionToUpdateZod,\n collectionToWhereZod,\n globalToZod,\n fieldToZod,\n} from \"./registry/zod-builder.js\";\n\n// Fields\nexport type {\n Field,\n FieldType,\n BaseField,\n FieldAdmin,\n ValidateOptions,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n ImageField,\n RichTextField,\n RichTextBlock,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n Block,\n RowField,\n CollapsibleField,\n TabsField,\n} from \"./fields/index.js\";\nexport {\n normalizeRichTextDocument,\n normalizeRichTextValue,\n renderRichText,\n richTextStyles,\n createColumnsNode,\n isTextField,\n isNumberField,\n isRelationshipField,\n isArrayField,\n isGroupField,\n isBlocksField,\n isUploadField,\n isImageField,\n isRichTextField,\n isSelectField,\n isLayoutField,\n PRIMITIVE_FIELD_TYPES,\n COMPLEX_FIELD_TYPES,\n RELATIONAL_FIELD_TYPES,\n LAYOUT_FIELD_TYPES,\n ALL_FIELD_TYPES,\n} from \"./fields/index.js\";\n\n// Access Control\nexport type {\n AccessControl,\n AccessArgs,\n WhereClause,\n CollectionAccess,\n GlobalAccess,\n FieldAccess,\n} from \"./access/index.js\";\nexport {\n evaluateAccess,\n mergeWhereClauses,\n getWhereClause,\n} from \"./access/index.js\";\n\n// Hooks\nexport type {\n Hook,\n HookArgs,\n CollectionHooks,\n FieldHooks,\n GlobalHooks,\n Request,\n User,\n} from \"./hooks/index.js\";\nexport { runHooks, runFieldHooks } from \"./hooks/index.js\";\n\n// Database Adapters\nexport { AbstractBaseAdapter } from \"./database/index.js\";\nexport type {\n DatabaseType as DbAdapterType,\n DatabaseConnectionOptions,\n DrizzleAdapterOptions,\n MongoDBAdapterOptions,\n AdapterOptions,\n} from \"./database/index.js\";\nexport {\n DrizzleAdapter,\n createDrizzleAdapter,\n fieldToDrizzleType,\n collectionToDrizzleSchema,\n} from \"./database/index.js\";\nexport { MongoDBAdapter, createMongoDBAdapter } from \"./database/index.js\";\nexport { LocalAdapter, createLocalAdapter } from \"./database/index.js\";\n\n// API Gateways\nexport {\n createContext,\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n createDynamicRouter,\n createKyroServer,\n} from \"./api/index.js\";\nexport { buildGraphQLSchema, createGraphQLSchema } from \"./api/index.js\";\nexport { createHonoApp, createRESTAPI } from \"./api/index.js\";\nexport {\n PubSub,\n KyroPubSub,\n KyroWSServer,\n createWSServer,\n} from \"./api/index.js\";\n\n// Plugin System\nexport {\n KyroPlugin,\n PluginManager,\n type PluginHooks,\n type PluginAPI,\n SEOPLugin,\n AnalyticsPlugin,\n CommentsPlugin,\n ReviewsPlugin,\n WishlistPlugin,\n presetPlugins,\n} from \"./plugins/index.js\";\n\n// Styling System\nexport {\n type StylingMode,\n type StylingConfig,\n type ThemeConfig,\n type ThemeColors,\n type ThemeFonts,\n type ThemeSpacing,\n type ThemeBorderRadius,\n type ThemeShadows,\n type FieldStyling,\n type AdminStylingConfig,\n CSSGenerator,\n generateTailwindConfig,\n generateCSSVariables,\n defaultLightTheme,\n defaultDarkTheme,\n ecommerce2026Theme,\n createAdminStyling,\n defaultFieldStyling,\n} from \"./styling/index.js\";\n\n// Authentication\nexport {\n Auth,\n createAuth,\n RedisAuthAdapter,\n InMemoryAuthAdapter,\n EmailTransport,\n AuditLogger,\n InMemoryAuditLogger,\n createAuditContext,\n PasswordPolicy,\n AccountLockout,\n InMemoryAccountLockout,\n RateLimiter,\n InMemoryRateLimiter,\n createAuthConfig,\n authConfig,\n} from \"./auth/index.js\";\nexport type {\n KyroAuthConfig,\n DatabaseType,\n AuthUser,\n UserRole,\n Session as AuthSession,\n Session,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n AuthAdapter,\n AuthTokenConfig,\n AuditLog,\n AuditAction,\n AuditLogFilter,\n} from \"./auth/index.js\";\n\nexport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\n\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./auth/bootstrap.js\";\n\n// Version History & Draft/Publish\nexport {\n VersionManager,\n createVersionManager,\n isPublished,\n isDraft,\n isArchived,\n type Version,\n type VersionStatus,\n type VersionDiff,\n type VersionAdapter,\n type CreateVersionOptions,\n type PublishVersionOptions,\n type CompareVersionsOptions,\n type VersionHistoryOptions,\n type DraftPublishConfig,\n type VersionPublishSchedule,\n getDefaultDraftPublishConfig,\n} from \"./versions/index.js\";\n\n// Zod re-export\nexport { z } from \"zod\";\n\n// Database - Drizzle (auth extensions)\nexport { PostgresAuthAdapter } from \"./database/drizzle/index.js\";\nexport {\n createDatabase,\n runMigrations,\n seedDefaultRoles,\n type Dialect,\n} from \"./database/drizzle/index.js\";\n\n// Media Service\nexport { MediaService } from \"./storage/MediaService.js\";\nexport { resolveProvider, createLocalStorage } from \"./storage/index.js\";\n\n// Webhooks\nexport {\n WebhookService,\n createWebhookService,\n deliverWebhook,\n deliverWithRetry,\n signPayload,\n generateWebhookSecret,\n buildDeliveryRecord,\n createTestPayload,\n WEBHOOK_EVENTS,\n ALL_WEBHOOK_EVENTS,\n type WebhookEvent,\n type WebhookConfig,\n type CreateWebhookData,\n type UpdateWebhookData,\n type WebhookPayload,\n type WebhookDelivery,\n type WebhookTriggerResult,\n WEBHOOK_COLLECTION,\n WEBHOOK_DELIVERY_COLLECTION,\n type DeliveryResult,\n type DeliveryOptions,\n} from \"./webhooks/index.js\";\n\n// Templates\nexport {\n ecommerceCollections,\n ecommerceGlobals,\n blogCollections,\n blogGlobals,\n minimalCollections,\n kitchenSinkCollections,\n mediaCollections,\n allSettingsGlobals,\n coreSettingsGlobals,\n ecommerceSettingsGlobals,\n createTemplateConfig,\n} from \"./templates/index\";\nexport type { TemplateConfig } from \"./templates/index\";\n\n// Configuration Service\nexport {\n ConfigService,\n type StorageConfig,\n type EmailConfig,\n} from \"./config/ConfigService.js\";\n\n// Configuration Helper\nexport { defineConfig } from \"./registry/config.js\";\n\n// SEO & Analytics Helpers\nexport { generateSeoTags, generateAnalyticsTags, type SeoTagsOptions } from \"./lib/seo.js\";\n\n// Storage\nexport {\n createStorage,\n createAuthStorage,\n} from \"./lib/storage/index.js\";\nexport type {\n StorageAdapter,\n Environment,\n EncryptionConfig,\n StorageOptions,\n CreateStorageResult,\n} from \"./lib/storage/index.js\";\n\n// Secret Management\nexport {\n setDbAdapter,\n loadSecrets,\n getAppSecret,\n getEncryptionKey,\n getSessionConfig,\n} from \"./lib/secret.js\";\n"]}
|