@kyro-cms/core 0.1.1 → 0.1.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/README.md +196 -109
- package/dist/bootstrap-2WJK6PG7.cjs +29 -0
- package/dist/bootstrap-2WJK6PG7.cjs.map +1 -0
- package/dist/bootstrap-Q2TWUQF3.js +4 -0
- package/dist/bootstrap-Q2TWUQF3.js.map +1 -0
- package/dist/chunk-3QX6KG2S.js +2125 -0
- package/dist/chunk-3QX6KG2S.js.map +1 -0
- package/dist/chunk-5AOILNGY.cjs +212 -0
- package/dist/chunk-5AOILNGY.cjs.map +1 -0
- package/dist/{chunk-DKSMFC3L.js → chunk-EINVJPFM.js} +2 -2
- package/dist/{chunk-DKSMFC3L.js.map → chunk-EINVJPFM.js.map} +1 -1
- package/dist/chunk-F5B64H5S.cjs +2149 -0
- package/dist/chunk-F5B64H5S.cjs.map +1 -0
- package/dist/chunk-I4BORBXT.cjs +914 -0
- package/dist/chunk-I4BORBXT.cjs.map +1 -0
- package/dist/chunk-KA3UOIFC.js +206 -0
- package/dist/chunk-KA3UOIFC.js.map +1 -0
- package/dist/chunk-KWTKEBHM.cjs +176 -0
- package/dist/chunk-KWTKEBHM.cjs.map +1 -0
- package/dist/chunk-M4JFHQ5J.js +170 -0
- package/dist/chunk-M4JFHQ5J.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +9 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-Q7SFCCGT.cjs +11 -0
- package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
- package/dist/chunk-U4CHJTWX.cjs +94 -0
- package/dist/chunk-U4CHJTWX.cjs.map +1 -0
- package/dist/{chunk-3Q3FS5J4.cjs → chunk-V3B25QOK.cjs} +2 -2
- package/dist/{chunk-3Q3FS5J4.cjs.map → chunk-V3B25QOK.cjs.map} +1 -1
- package/dist/chunk-V67YXRBT.js +899 -0
- package/dist/chunk-V67YXRBT.js.map +1 -0
- package/dist/chunk-XLMVCGXA.js +86 -0
- package/dist/chunk-XLMVCGXA.js.map +1 -0
- package/dist/cli/index.cjs +106 -14
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +106 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/database-37KXWUER.js +5 -0
- package/dist/database-37KXWUER.js.map +1 -0
- package/dist/database-LJKD3HE4.cjs +22 -0
- package/dist/database-LJKD3HE4.cjs.map +1 -0
- package/dist/drizzle/index.cjs +25 -5
- package/dist/drizzle/index.d.cts +5 -49
- package/dist/drizzle/index.d.ts +5 -49
- package/dist/drizzle/index.js +5 -1
- package/dist/graphql/index.cjs +1 -0
- package/dist/graphql/index.js +1 -0
- package/dist/index-BVFlb7uU.d.ts +192 -0
- package/dist/index-CzkEHKqu.d.cts +192 -0
- package/dist/index.cjs +1203 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +382 -68
- package/dist/index.d.ts +382 -68
- package/dist/index.js +1110 -20
- package/dist/index.js.map +1 -1
- package/dist/mongodb/index.cjs +1 -0
- package/dist/mongodb/index.js +1 -0
- package/dist/postgres-auth-adapter-CYZAVPPP.cjs +14 -0
- package/dist/postgres-auth-adapter-CYZAVPPP.cjs.map +1 -0
- package/dist/postgres-auth-adapter-LTDUGBMB.js +5 -0
- package/dist/postgres-auth-adapter-LTDUGBMB.js.map +1 -0
- package/dist/rest/index.cjs +1 -0
- package/dist/rest/index.js +1 -0
- package/dist/templates/index.cjs +94 -536
- package/dist/templates/index.cjs.map +1 -1
- package/dist/templates/index.d.cts +45 -1
- package/dist/templates/index.d.ts +45 -1
- package/dist/templates/index.js +2 -535
- package/dist/templates/index.js.map +1 -1
- package/dist/trpc/index.cjs +1 -0
- package/dist/trpc/index.js +1 -0
- package/dist/ws/index.cjs +1 -0
- package/dist/ws/index.js +1 -0
- package/package.json +23 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts"],"names":["z","fields","KyroPubSub","createHonoApp","buildGraphQLSchema","createKyroServer","createWSServer","AbstractBaseAdapter","jwt","randomUUID","bcrypt"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from 'zod';\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from '../fields/types.js';\nimport type { CollectionConfig, GlobalConfig } from './types.js';\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case 'text':\n return textToZod(field);\n case 'number':\n return numberToZod(field);\n case 'checkbox':\n return checkboxToZod(field);\n case 'date':\n return dateToZod(field);\n case 'email':\n return emailToZod(field);\n case 'password':\n return passwordToZod(field);\n case 'textarea':\n return textareaToZod(field);\n case 'select':\n return selectToZod(field);\n case 'radio':\n return radioToZod(field);\n case 'color':\n return colorToZod(field);\n case 'richtext':\n return richTextToZod(field);\n case 'json':\n return jsonToZod(field);\n case 'code':\n return codeToZod(field);\n case 'upload':\n return uploadToZod(field);\n case 'markdown':\n return markdownToZod(field);\n case 'relationship':\n return relationshipToZod(field);\n case 'array':\n return arrayToZod(field);\n case 'group':\n return groupToZod(field);\n case 'blocks':\n return blocksToZod(field);\n case 'row':\n return rowToZod(field);\n case 'collapsible':\n return collapsibleToZod(field);\n case 'tabs':\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === 'email') schema = (schema as any).email();\n if (field.variant === 'url') schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().refine(\n (val) => !isNaN(Date.parse(val)),\n 'Invalid date format'\n );\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email('Invalid email');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().min(6, 'Password must be at least 6 characters');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === 'hex') schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === 'rgb') schema = (schema as any).regex(/^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/);\n if (field.format === 'hsl') schema = (schema as any).regex(/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }));\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blockSchemas = field.blocks.map(block => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n ),\n });\n });\n let schema: ZodTypeAny = z.array(z.discriminatedUnion('blockType', blockSchemas as any));\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(schema: ZodTypeAny, validate: (value: any, options: ValidateOptions) => string | true | Promise<string | true>): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: 'Custom validation failed',\n }\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n if (collection.timestamps) {\n shape['createdAt'] = z.string().optional();\n shape['updatedAt'] = z.string().optional();\n }\n \n if (collection.tenantScoped) {\n shape['tenantID'] = z.string().optional();\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n\nexport function collectionToCreateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z.object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n }).optional();\n }\n }\n \n shape['AND'] = z.array(z.lazy(() => z.object(shape))).optional();\n shape['OR'] = z.array(z.lazy(() => z.object(shape))).optional();\n \n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n const errors = validateCollection(config);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from './registry/index.js';\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from './registry/types.js';\nimport { KyroPubSub, createWSServer, type KyroWSServer } from './api/ws/index.js';\nimport { createHonoApp } from './api/rest/index.js';\nimport { buildGraphQLSchema } from './api/graphql/index.js';\nimport { createKyroServer } from './api/trpc/index.js';\nimport type { User, Request } from './hooks/types.js';\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(this.registry.getCollections(), this.registry.getGlobals());\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log('✅ Kyro CMS initialized');\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n });\n }\n\n async startWebSocket(options?: { port?: number; requireAuth?: boolean; verifyToken?: (token: string) => Promise<any> }) {\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log('👋 Kyro CMS shut down');\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport { Registry, createRegistry, getRegistry, resetRegistry } from './registry/index.js';\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from './registry/types.js';\nexport type { Field, FieldType } from './fields/index.js';\nexport type { AccessControl, AccessArgs, WhereClause } from './access/index.js';\nexport type { Hook, HookArgs, User, Request } from './hooks/index.js';\nexport { DrizzleAdapter, createDrizzleAdapter } from './database/drizzle/index.js';\nexport { MongoDBAdapter, createMongoDBAdapter } from './database/mongodb/index.js';\nexport { KyroPubSub, KyroWSServer, createWSServer } from './api/ws/index.js';\nexport { createHonoApp } from './api/rest/index.js';\nexport { buildGraphQLSchema, createGraphQLSchema } from './api/graphql/index.js';\nexport { createKyroServer } from './api/trpc/index.js';\nexport { z } from 'zod';\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;\n position?: 'sidebar' | 'main';\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = 'text' | 'email' | 'password' | 'url' | 'id';\n\nexport interface TextField extends BaseField {\n type: 'text';\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: 'checkbox';\n}\n\nexport interface DateField extends BaseField {\n type: 'date';\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: 'email';\n}\n\nexport interface PasswordField extends BaseField {\n type: 'password';\n}\n\nexport interface TextareaField extends BaseField {\n type: 'textarea';\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: 'select';\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: 'radio';\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: 'color';\n format?: 'hex' | 'rgb' | 'hsl';\n defaultValue?: string;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: 'richtext';\n editor?: 'lexical' | 'slate' | 'blocks';\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: 'json';\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: 'code';\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: 'upload';\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: 'markdown';\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: 'relationship';\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: 'array';\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: 'group';\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n}\n\nexport interface BlocksField extends BaseField {\n type: 'blocks';\n blocks: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, 'name'> {\n type: 'row';\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, 'name'> {\n type: 'collapsible';\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, 'name'> {\n type: 'tabs';\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField;\n\nexport type FieldType = Field['type'];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === 'text';\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === 'number';\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === 'array';\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === 'group';\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === 'blocks';\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === 'richtext';\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === 'select';\n}\n\nexport function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField {\n return field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs';\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n 'text', 'number', 'checkbox', 'date', 'email', 'password',\n 'textarea', 'select', 'radio', 'color',\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n 'richtext', 'json', 'code', 'upload', 'markdown',\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n 'relationship', 'array', 'group', 'blocks',\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\n 'row', 'collapsible', 'tabs',\n] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n","// ============================================================================\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 type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\n super();\n \n if (options.db) {\n this.db = options.db;\n } else if (options.path) {\n // Dynamic import to handle optional dependency\n this.db = null;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n const Database = (await import('better-sqlite3')).default;\n this.db = new Database(':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log('[LocalAdapter] Connected to SQLite');\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(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of 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 if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\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 `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.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(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\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 { count: number };\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 const docs = rows.map((row: any) => this.rowToDoc(row, config));\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 } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.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 return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = 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.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.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 }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\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 = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.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: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.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: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\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 value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\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 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: (slug: string, extension: Partial<CollectionConfig>) => 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 = '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 { name: 'sitemap', type: 'checkbox', label: 'Enable Sitemap', defaultValue: true },\n { name: 'robotsTxt', type: 'textarea', label: 'robots.txt Content' },\n { name: 'canonicalUrl', type: 'text', variant: 'url' as any, label: 'Canonical URL' },\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 = '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: 'textarea', 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: 'textarea', required: true },\n { name: 'author', type: 'relationship', relationTo: 'customers' },\n { name: 'product', type: 'relationship', relationTo: 'products', required: true },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'verified', type: 'checkbox', label: 'Verified Purchase' },\n { name: 'helpful', type: 'number', label: 'Helpful Count', defaultValue: 0 },\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 { name: 'customer', type: 'relationship', relationTo: 'customers', required: true },\n { name: 'name', type: 'text', label: 'Wishlist Name', defaultValue: 'My Wishlist' },\n { name: 'items', type: 'blocks', label: 'Items', blocks: [\n {\n slug: 'wishlist-item',\n label: 'Item',\n fields: [\n { name: 'product', type: 'relationship', relationTo: 'products' },\n { name: 'quantity', type: 'number', defaultValue: 1 },\n { name: 'addedAt', type: 'date' },\n { name: 'priority', type: 'select', 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// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import bcrypt from 'bcrypt';\nimport jwt from 'jsonwebtoken';\nimport { randomUUID } from 'crypto';\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole\n} from './types.js';\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 passwordHash = await this.hashPassword(data.password);\n const user = await this.adapter.createUser({\n email: data.email,\n passwordHash,\n role: data.role ?? 'customer',\n tenant: data.tenant\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.findUserByEmail(credentials.email);\n if (!user || !user.passwordHash) {\n return { success: false, error: 'Invalid credentials' };\n }\n\n const valid = await this.adapter.verifyPassword(\n credentials.password,\n user.passwordHash\n );\n if (!valid) {\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 || 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 decoded = jwt.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience: 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 || !user.passwordHash) {\n return { success: false, error: 'User not found' };\n }\n\n const valid = await this.adapter.verifyPassword(\n currentPassword,\n user.passwordHash\n );\n if (!valid) {\n return { success: false, error: 'Current password is incorrect' };\n }\n\n const newHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(userId, { passwordHash: newHash });\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 const passwordHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(user.id, { passwordHash });\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 = this.generateToken(user);\n const refreshToken = randomUUID();\n const expiresAt = new Date(Date.now() + this.parseExpiresIn(this.config.refreshExpiresIn));\n\n const session = await this.adapter.createSession(user.id, refreshToken, expiresAt);\n\n return {\n success: true,\n user,\n session,\n token\n };\n }\n\n private generateToken(user: AuthUser): string {\n const payload: Omit<JWTPayload, 'iat' | 'exp'> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenant: user.tenant\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 jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\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': return num * 1000;\n case 'm': return num * 60000;\n case 'h': return num * 3600000;\n case 'd': return num * 86400000;\n default: return 86400000;\n }\n }\n}\n\nexport function createAuth(adapter: AuthAdapter, config: AuthTokenConfig): Auth {\n return new Auth(adapter, config);\n}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/security/audit-log.ts","../src/api/rest/auth-middleware.ts","../src/api/rest/auth-routes.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts"],"names":["z","fields","KyroPubSub","createHonoApp","buildGraphQLSchema","createKyroServer","createWSServer","AbstractBaseAdapter","randomBytes","jwt","PasswordPolicy","RedisAuthAdapter","EmailTransport","bcrypt"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from 'zod';\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from '../fields/types.js';\nimport type { CollectionConfig, GlobalConfig } from './types.js';\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case 'text':\n return textToZod(field);\n case 'number':\n return numberToZod(field);\n case 'checkbox':\n return checkboxToZod(field);\n case 'date':\n return dateToZod(field);\n case 'email':\n return emailToZod(field);\n case 'password':\n return passwordToZod(field);\n case 'textarea':\n return textareaToZod(field);\n case 'select':\n return selectToZod(field);\n case 'radio':\n return radioToZod(field);\n case 'color':\n return colorToZod(field);\n case 'richtext':\n return richTextToZod(field);\n case 'json':\n return jsonToZod(field);\n case 'code':\n return codeToZod(field);\n case 'upload':\n return uploadToZod(field);\n case 'markdown':\n return markdownToZod(field);\n case 'relationship':\n return relationshipToZod(field);\n case 'array':\n return arrayToZod(field);\n case 'group':\n return groupToZod(field);\n case 'blocks':\n return blocksToZod(field);\n case 'row':\n return rowToZod(field);\n case 'collapsible':\n return collapsibleToZod(field);\n case 'tabs':\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === 'email') schema = (schema as any).email();\n if (field.variant === 'url') schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().refine(\n (val) => !isNaN(Date.parse(val)),\n 'Invalid date format'\n );\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email('Invalid email');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().min(6, 'Password must be at least 6 characters');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === 'hex') schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === 'rgb') schema = (schema as any).regex(/^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/);\n if (field.format === 'hsl') schema = (schema as any).regex(/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }));\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blockSchemas = field.blocks.map(block => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n ),\n });\n });\n let schema: ZodTypeAny = z.array(z.discriminatedUnion('blockType', blockSchemas as any));\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(schema: ZodTypeAny, validate: (value: any, options: ValidateOptions) => string | true | Promise<string | true>): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: 'Custom validation failed',\n }\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n if (collection.timestamps) {\n shape['createdAt'] = z.string().optional();\n shape['updatedAt'] = z.string().optional();\n }\n \n if (collection.tenantScoped) {\n shape['tenantID'] = z.string().optional();\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n\nexport function collectionToCreateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z.object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n }).optional();\n }\n }\n \n shape['AND'] = z.array(z.lazy(() => z.object(shape))).optional();\n shape['OR'] = z.array(z.lazy(() => z.object(shape))).optional();\n \n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields (id, createdAt, etc.) before validation\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n const errors = validateCollection(finalConfig);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from './registry/index.js';\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from './registry/types.js';\nimport { KyroPubSub, createWSServer, type KyroWSServer } from './api/ws/index.js';\nimport { createHonoApp } from './api/rest/index.js';\nimport { buildGraphQLSchema } from './api/graphql/index.js';\nimport { createKyroServer } from './api/trpc/index.js';\nimport type { User, Request } from './hooks/types.js';\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(this.registry.getCollections(), this.registry.getGlobals());\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log('✅ Kyro CMS initialized');\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n });\n }\n\n async startWebSocket(options?: { port?: number; requireAuth?: boolean; verifyToken?: (token: string) => Promise<any> }) {\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log('👋 Kyro CMS shut down');\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport { Registry, createRegistry, getRegistry, resetRegistry } from './registry/index.js';\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from './registry/types.js';\nexport type { Field, FieldType } from './fields/index.js';\nexport type { AccessControl, AccessArgs, WhereClause } from './access/index.js';\nexport type { Hook, HookArgs, User, Request } from './hooks/index.js';\nexport { DrizzleAdapter, createDrizzleAdapter } from './database/drizzle/index.js';\nexport { MongoDBAdapter, createMongoDBAdapter } from './database/mongodb/index.js';\nexport { KyroPubSub, KyroWSServer, createWSServer } from './api/ws/index.js';\nexport { createHonoApp } from './api/rest/index.js';\nexport { buildGraphQLSchema, createGraphQLSchema } from './api/graphql/index.js';\nexport { createKyroServer } from './api/trpc/index.js';\nexport { z } from 'zod';\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;\n position?: 'sidebar' | 'main';\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = 'text' | 'email' | 'password' | 'url' | 'id';\n\nexport interface TextField extends BaseField {\n type: 'text';\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: 'checkbox';\n}\n\nexport interface DateField extends BaseField {\n type: 'date';\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: 'email';\n}\n\nexport interface PasswordField extends BaseField {\n type: 'password';\n}\n\nexport interface TextareaField extends BaseField {\n type: 'textarea';\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: 'select';\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: 'radio';\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: 'color';\n format?: 'hex' | 'rgb' | 'hsl';\n defaultValue?: string;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: 'richtext';\n editor?: 'lexical' | 'slate' | 'blocks';\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: 'json';\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: 'code';\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: 'upload';\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: 'markdown';\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: 'relationship';\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: 'array';\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: 'group';\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n}\n\nexport interface BlocksField extends BaseField {\n type: 'blocks';\n blocks: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, 'name'> {\n type: 'row';\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, 'name'> {\n type: 'collapsible';\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, 'name'> {\n type: 'tabs';\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField;\n\nexport type FieldType = Field['type'];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === 'text';\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === 'number';\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === 'array';\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === 'group';\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === 'blocks';\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === 'richtext';\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === 'select';\n}\n\nexport function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField {\n return field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs';\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n 'text', 'number', 'checkbox', 'date', 'email', 'password',\n 'textarea', 'select', 'radio', 'color',\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n 'richtext', 'json', 'code', 'upload', 'markdown',\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n 'relationship', 'array', 'group', 'blocks',\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\n 'row', 'collapsible', 'tabs',\n] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n","// ============================================================================\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 type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\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 const Database = (await import('better-sqlite3')).default;\n this.db = new Database(this.path || ':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log(`[LocalAdapter] Connected to SQLite (${this.path || 'memory'})`);\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(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of 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 if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\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 `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.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(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\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 { count: number };\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 const docs = rows.map((row: any) => this.rowToDoc(row, config));\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 } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.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 return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = 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.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.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 }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\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 = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.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: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.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: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\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 value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\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 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: (slug: string, extension: Partial<CollectionConfig>) => 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 = '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 { name: 'sitemap', type: 'checkbox', label: 'Enable Sitemap', defaultValue: true },\n { name: 'robotsTxt', type: 'textarea', label: 'robots.txt Content' },\n { name: 'canonicalUrl', type: 'text', variant: 'url' as any, label: 'Canonical URL' },\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 = '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: 'textarea', 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: 'textarea', required: true },\n { name: 'author', type: 'relationship', relationTo: 'customers' },\n { name: 'product', type: 'relationship', relationTo: 'products', required: true },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'verified', type: 'checkbox', label: 'Verified Purchase' },\n { name: 'helpful', type: 'number', label: 'Helpful Count', defaultValue: 0 },\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 { name: 'customer', type: 'relationship', relationTo: 'customers', required: true },\n { name: 'name', type: 'text', label: 'Wishlist Name', defaultValue: 'My Wishlist' },\n { name: 'items', type: 'blocks', label: 'Items', blocks: [\n {\n slug: 'wishlist-item',\n label: 'Item',\n fields: [\n { name: 'product', type: 'relationship', relationTo: 'products' },\n { name: 'quantity', type: 'number', defaultValue: 1 },\n { name: 'addedAt', type: 'date' },\n { name: 'priority', type: 'select', 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// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import 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 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 Redis from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: log.timestamp.toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import jwt from \"jsonwebtoken\";\nimport type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n extractToken?: (req: Request) => string | null;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n error?: string;\n status: number;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\n}\n","import jwt from \"jsonwebtoken\";\nimport { randomBytes } from \"crypto\";\nimport { RedisAuthAdapter } from \"../../auth/redis-adapter.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { AccountLockout } from \"../../auth/security/lockout.js\";\nimport { RateLimiter } from \"../../auth/security/rate-limit.js\";\nimport {\n AuditLogger,\n createAuditContext,\n type AuditAction,\n} from \"../../auth/security/audit-log.js\";\nimport { generateToken, defaultExtractToken } from \"./auth-middleware.js\";\nimport type {\n AuthUser,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n Session,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: RedisAuthAdapter;\n email?: EmailTransport;\n jwtSecret: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n passwordPolicy?: PasswordPolicy;\n lockout?: AccountLockout;\n rateLimiter?: RateLimiter;\n auditLogger?: AuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private redis: RedisAuthAdapter;\n private email?: EmailTransport;\n private jwtSecret: string;\n private jwtExpiresIn: string;\n private jwtIssuer?: string;\n private jwtAudience?: string;\n private passwordPolicy: PasswordPolicy;\n private lockout?: AccountLockout;\n private rateLimiter?: RateLimiter;\n private auditLogger?: AuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.redis = config.redis;\n this.email = config.email;\n this.jwtSecret = config.jwtSecret;\n this.jwtExpiresIn = config.jwtExpiresIn || \"24h\";\n this.jwtIssuer = config.jwtIssuer;\n this.jwtAudience = config.jwtAudience;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.redis.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const passwordHash = await this.redis.hashPassword(body.password);\n const user = await this.redis.createUser({\n email: body.email,\n passwordHash,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.redis.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.redis.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const validPassword = user.passwordHash\n ? await this.redis.verifyPassword(body.password, user.passwordHash)\n : false;\n if (!validPassword) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n const session = await this.redis.createSession(user.id, {\n ipAddress,\n userAgent,\n });\n\n const payload: JWTPayload = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 86400,\n };\n\n const accessToken = generateToken(payload, this.jwtSecret, {\n expiresIn: this.jwtExpiresIn,\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n });\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.redis.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n accessToken,\n refreshToken: session.refreshToken,\n expiresIn: this.jwtExpiresIn,\n });\n } catch (error) {\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.decode(token) as JWTPayload;\n if (payload && payload.sub) {\n await this.redis.deleteUserSessions(payload.sub);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: payload.sub,\n userEmail: payload.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { refreshToken?: string };\n const { refreshToken } = body;\n\n if (!refreshToken) {\n return this.errorResponse(\"Refresh token required\", 400);\n }\n\n return this.jsonResponse({ success: true, accessToken: \"\" });\n } catch (error) {\n return this.errorResponse(\"Token refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const payload = jwt.verify(token, this.jwtSecret, {\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n }) as JWTPayload;\n\n const user = await this.redis.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error) {\n return this.errorResponse(\"Authentication failed\", 401);\n }\n }\n\n async changePassword(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.verify(token, this.jwtSecret) as JWTPayload;\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.redis.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.redis.verifyPassword(currentPassword, user.passwordHash)\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.redis.getPasswordHistory(user.id, 5);\n const isReused = await this.redis.isPasswordInHistory(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.redis.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.redis.addPasswordToHistory(user.id, user.passwordHash);\n }\n await this.redis.updateUser(user.id, { passwordHash: newPasswordHash });\n\n await this.redis.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.redis.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset_request\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private rateLimitResponse(limit: { retryAfter?: number }): Response {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import Redis from \"ioredis\";\nimport { RedisAuthAdapter } from \"../auth/redis-adapter.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AccountLockout } from \"../auth/security/lockout.js\";\nimport { RateLimiter } from \"../auth/security/rate-limit.js\";\nimport { AuditLogger } from \"../auth/security/audit-log.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\n\nexport interface KyroAuthConfig {\n redis: RedisAuthAdapter;\n redisClient: Redis;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: AccountLockout;\n rateLimiter?: RateLimiter;\n auditLogger?: AuditLogger;\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\nexport async function createAuthConfig(): Promise<KyroAuthConfig> {\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisKeyPrefix = getEnv(\"REDIS_KEY_PREFIX\", \"kyro:auth:\");\n const redisSessionTTL = getEnvNum(\"REDIS_SESSION_TTL\", 86400);\n const redisRefreshTTL = getEnvNum(\"REDIS_REFRESH_TOKEN_TTL\", 604800);\n\n const redisAdapter = new RedisAuthAdapter({\n url: redisUrl,\n keyPrefix: redisKeyPrefix,\n tokenExpiration: redisSessionTTL,\n refreshTokenExpiration: redisRefreshTTL,\n tls: getEnvBool(\"REDIS_TLS\", false),\n });\n\n await redisAdapter.connect();\n\n const redisClient = (redisAdapter as any).redis as Redis;\n\n const emailConfig = getEmailConfig();\n const email = emailConfig ? new EmailTransport(emailConfig) : 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: AccountLockout | undefined;\n if (getEnvBool(\"LOCKOUT_ENABLED\", true)) {\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n }\n\n let rateLimiter: RateLimiter | undefined;\n if (getEnvBool(\"RATE_LIMIT_ENABLED\", true)) {\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 }\n\n let auditLogger: AuditLogger | undefined;\n if (getEnvBool(\"AUDIT_LOG_ENABLED\", true)) {\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n }\n\n const routes = new AuthRoutes({\n redis: redisAdapter,\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 return {\n redis: redisAdapter,\n redisClient,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nfunction getEmailConfig():\n | ConstructorParameters<typeof EmailTransport>[0]\n | undefined {\n const host = getEnv(\"SMTP_HOST\");\n if (!host) return undefined;\n\n return {\n host,\n port: getEnvNum(\"SMTP_PORT\", 587),\n secure: getEnvBool(\"SMTP_SECURE\", false),\n auth: {\n user: getEnv(\"SMTP_USER\"),\n pass: getEnv(\"SMTP_PASS\"),\n },\n from: getEnv(\"SMTP_FROM\", \"noreply@example.com\"),\n fromName: getEnv(\"SMTP_FROM_NAME\", \"Kyro CMS\"),\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import bcrypt from \"bcrypt\";\nimport jwt from \"jsonwebtoken\";\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\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 passwordHash = await this.hashPassword(data.password);\n const user = await this.adapter.createUser({\n email: data.email,\n passwordHash,\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.findUserByEmail(credentials.email);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n credentials.password,\n user.passwordHash,\n );\n if (!valid) {\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 decoded = jwt.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 || !user.passwordHash) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n const newHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(userId, { passwordHash: newHash });\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 const passwordHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(user.id, { passwordHash });\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 = 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 generateToken(user: AuthUser): string {\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 jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\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 } from \"./config.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"]}
|