@kyro-cms/core 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/api-handler-graphql.cjs +22 -17
  2. package/dist/api-handler-graphql.cjs.map +1 -1
  3. package/dist/api-handler-graphql.js +18 -13
  4. package/dist/api-handler-graphql.js.map +1 -1
  5. package/dist/api-handler-trpc.cjs +13 -13
  6. package/dist/api-handler-trpc.js +11 -11
  7. package/dist/api-handler.cjs +14 -14
  8. package/dist/api-handler.js +11 -11
  9. package/dist/{bootstrap-4CELFLJO.cjs → bootstrap-FUAPY2OF.cjs} +9 -9
  10. package/dist/{bootstrap-4CELFLJO.cjs.map → bootstrap-FUAPY2OF.cjs.map} +1 -1
  11. package/dist/bootstrap-OXNVM7FP.js +7 -0
  12. package/dist/{bootstrap-3PV3GJ3S.js.map → bootstrap-OXNVM7FP.js.map} +1 -1
  13. package/dist/{chunk-HA4MGAZJ.js → chunk-354ISGA4.js} +112 -49
  14. package/dist/chunk-354ISGA4.js.map +1 -0
  15. package/dist/{chunk-2GXALYKV.js → chunk-3AKCVYDB.js} +4 -109
  16. package/dist/chunk-3AKCVYDB.js.map +1 -0
  17. package/dist/{chunk-OVZO4KB6.cjs → chunk-3P5AHK2U.cjs} +34 -38
  18. package/dist/chunk-3P5AHK2U.cjs.map +1 -0
  19. package/dist/{chunk-KGJRJ7CU.cjs → chunk-4OCMVGEY.cjs} +4 -110
  20. package/dist/chunk-4OCMVGEY.cjs.map +1 -0
  21. package/dist/{chunk-EQTMBMDR.js → chunk-526M5MOA.js} +19 -8
  22. package/dist/chunk-526M5MOA.js.map +1 -0
  23. package/dist/{chunk-5PMQQFRE.cjs → chunk-5GFQPHGT.cjs} +6 -9
  24. package/dist/chunk-5GFQPHGT.cjs.map +1 -0
  25. package/dist/chunk-5RPRLTTN.js +861 -0
  26. package/dist/chunk-5RPRLTTN.js.map +1 -0
  27. package/dist/{chunk-ZFHTJ2YX.js → chunk-AN2L2CJZ.js} +16 -20
  28. package/dist/chunk-AN2L2CJZ.js.map +1 -0
  29. package/dist/{chunk-RFFSZSCL.cjs → chunk-GYIJ3JJM.cjs} +3 -11
  30. package/dist/chunk-GYIJ3JJM.cjs.map +1 -0
  31. package/dist/{chunk-PQ72Z6WC.js → chunk-GZS4LMR7.js} +2 -5
  32. package/dist/chunk-GZS4LMR7.js.map +1 -0
  33. package/dist/{chunk-GAAHG2Z4.js → chunk-HY6B7B5A.js} +4 -7
  34. package/dist/chunk-HY6B7B5A.js.map +1 -0
  35. package/dist/{chunk-2CBCU5ML.cjs → chunk-ISKYUUP4.cjs} +142 -79
  36. package/dist/chunk-ISKYUUP4.cjs.map +1 -0
  37. package/dist/{chunk-Z7OH3MWT.cjs → chunk-LNTFRAHF.cjs} +110 -2
  38. package/dist/chunk-LNTFRAHF.cjs.map +1 -0
  39. package/dist/chunk-N4GN6Q3V.cjs +869 -0
  40. package/dist/chunk-N4GN6Q3V.cjs.map +1 -0
  41. package/dist/{chunk-6UNONDW7.js → chunk-N5QSHUA6.js} +2 -11
  42. package/dist/chunk-N5QSHUA6.js.map +1 -0
  43. package/dist/{chunk-PJ7F4TCC.cjs → chunk-NQJJYRLP.cjs} +24 -13
  44. package/dist/chunk-NQJJYRLP.cjs.map +1 -0
  45. package/dist/{chunk-65DSXNQL.js → chunk-OX6GOIPH.js} +4 -4
  46. package/dist/{chunk-65DSXNQL.js.map → chunk-OX6GOIPH.js.map} +1 -1
  47. package/dist/{chunk-Q23GAMLE.cjs → chunk-THBQG64D.cjs} +2 -5
  48. package/dist/chunk-THBQG64D.cjs.map +1 -0
  49. package/dist/{chunk-W3GT55TY.cjs → chunk-TQG7G7YI.cjs} +13 -13
  50. package/dist/{chunk-W3GT55TY.cjs.map → chunk-TQG7G7YI.cjs.map} +1 -1
  51. package/dist/{chunk-Y7AQK4R4.cjs → chunk-VKREAIBA.cjs} +2 -11
  52. package/dist/chunk-VKREAIBA.cjs.map +1 -0
  53. package/dist/{chunk-2Z7YAJBS.js → chunk-WDTTHKDS.js} +109 -3
  54. package/dist/chunk-WDTTHKDS.js.map +1 -0
  55. package/dist/{chunk-V7KZQIZ6.js → chunk-XHAAAEXX.js} +2 -10
  56. package/dist/chunk-XHAAAEXX.js.map +1 -0
  57. package/dist/cli/index.cjs +145 -51
  58. package/dist/cli/index.cjs.map +1 -1
  59. package/dist/cli/index.js +145 -51
  60. package/dist/cli/index.js.map +1 -1
  61. package/dist/drizzle/index.cjs +9 -9
  62. package/dist/drizzle/index.js +1 -1
  63. package/dist/graphql/index.cjs +7 -7
  64. package/dist/graphql/index.d.cts +21 -13
  65. package/dist/graphql/index.d.ts +21 -13
  66. package/dist/graphql/index.js +2 -2
  67. package/dist/index.cjs +92 -94
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +6 -5
  70. package/dist/index.d.ts +6 -5
  71. package/dist/index.js +12 -14
  72. package/dist/index.js.map +1 -1
  73. package/dist/mongodb/index.cjs +3 -3
  74. package/dist/mongodb/index.js +1 -1
  75. package/dist/rest/index.cjs +8 -8
  76. package/dist/rest/index.js +6 -6
  77. package/dist/trpc/index.cjs +12 -12
  78. package/dist/trpc/index.js +3 -3
  79. package/package.json +1 -1
  80. package/dist/bootstrap-3PV3GJ3S.js +0 -7
  81. package/dist/chunk-2CBCU5ML.cjs.map +0 -1
  82. package/dist/chunk-2GXALYKV.js.map +0 -1
  83. package/dist/chunk-2Z7YAJBS.js.map +0 -1
  84. package/dist/chunk-5PMQQFRE.cjs.map +0 -1
  85. package/dist/chunk-6DURKQ6W.js +0 -1072
  86. package/dist/chunk-6DURKQ6W.js.map +0 -1
  87. package/dist/chunk-6UNONDW7.js.map +0 -1
  88. package/dist/chunk-EQTMBMDR.js.map +0 -1
  89. package/dist/chunk-GAAHG2Z4.js.map +0 -1
  90. package/dist/chunk-HA4MGAZJ.js.map +0 -1
  91. package/dist/chunk-KGJRJ7CU.cjs.map +0 -1
  92. package/dist/chunk-OVZO4KB6.cjs.map +0 -1
  93. package/dist/chunk-PF642V5O.cjs +0 -1080
  94. package/dist/chunk-PF642V5O.cjs.map +0 -1
  95. package/dist/chunk-PJ7F4TCC.cjs.map +0 -1
  96. package/dist/chunk-PQ72Z6WC.js.map +0 -1
  97. package/dist/chunk-Q23GAMLE.cjs.map +0 -1
  98. package/dist/chunk-RFFSZSCL.cjs.map +0 -1
  99. package/dist/chunk-V7KZQIZ6.js.map +0 -1
  100. package/dist/chunk-Y7AQK4R4.cjs.map +0 -1
  101. package/dist/chunk-Z7OH3MWT.cjs.map +0 -1
  102. package/dist/chunk-ZFHTJ2YX.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/graphql/schema.ts"],"names":["arrFields","groupFields"],"mappings":"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","file":"chunk-6DURKQ6W.js","sourcesContent":["import {\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLString,\n GraphQLInt,\n GraphQLBoolean,\n GraphQLFloat,\n GraphQLList,\n GraphQLNonNull,\n GraphQLInputObjectType,\n GraphQLEnumType,\n GraphQLUnionType,\n GraphQLDirective,\n DirectiveLocation,\n GraphQLError,\n type GraphQLFieldConfig,\n type GraphQLType,\n type GraphQLOutputType,\n type GraphQLInputType,\n type GraphQLInputFieldConfig,\n printSchema,\n} from \"graphql\";\nimport type {\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n} from \"../../registry/types.js\";\nimport { Registry } from \"../../registry/index.js\";\nimport type { Field, SelectField } from \"../../fields/types.js\";\nimport type { WhereClause } from \"../../access/types.js\";\nimport { checkCollectionAccess, checkGlobalAccess } from \"../../access/checker.js\";\nimport type { AccessContext } from \"../../access/checker.js\";\nimport type { User, Request } from \"../../hooks/types.js\";\n\n// ============================================================================\n// GraphQL Context — passed through Yoga/execute contextValue per request\n// ============================================================================\n\nexport interface GraphQLContext {\n db: BaseAdapter;\n registry: Registry;\n user?: User;\n req?: Request;\n tenantID?: string;\n apiKey?: any;\n relationLoader: RelationLoader;\n}\n\n// ============================================================================\n// Naming Helpers\n// ============================================================================\n\nfunction toPascalCase(slug: string): string {\n return slug.split(/[-_]/).map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\");\n}\n\nfunction toCamelCase(slug: string): string {\n const p = toPascalCase(slug);\n return p.charAt(0).toLowerCase() + p.slice(1);\n}\n\nfunction toPascalSingular(slug: string): string {\n const p = toPascalCase(slug);\n if (p.endsWith(\"s\") && p.length > 1) return p.slice(0, -1);\n return p;\n}\n\nfunction toCamelSingular(slug: string): string {\n return toCamelCase(slug).endsWith(\"s\") && slug.length > 1\n ? toCamelCase(slug).slice(0, -1)\n : toCamelCase(slug);\n}\n\n// ============================================================================\n// Simple DataLoader for Relationship N+1 Prevention\n// ============================================================================\n\ninterface LoaderOptions {\n db: BaseAdapter;\n tenantID?: string;\n user?: User;\n}\n\nexport class RelationLoader {\n private db: BaseAdapter;\n private tenantID?: string;\n private user?: User;\n private caches = new Map<string, Map<string, any>>();\n private pending = new Map<string, Set<string>>();\n\n constructor(opts: LoaderOptions) {\n this.db = opts.db;\n this.tenantID = opts.tenantID;\n this.user = opts.user;\n }\n\n private getCacheKey(collection: string): string {\n return collection;\n }\n\n async load(collection: string, id: string): Promise<any | undefined> {\n const key = this.getCacheKey(collection);\n let cache = this.caches.get(key);\n if (!cache) {\n cache = new Map();\n this.caches.set(key, cache);\n }\n if (cache.has(id)) {\n return cache.get(id);\n }\n // Mark as pending so batch knows\n let pendingSet = this.pending.get(key);\n if (!pendingSet) {\n pendingSet = new Set();\n this.pending.set(key, pendingSet);\n }\n pendingSet.add(id);\n // Placeholder — will be batch-resolved\n cache.set(id, undefined);\n return undefined;\n }\n\n async flushAll(): Promise<void> {\n for (const [key, ids] of this.pending) {\n if (ids.size === 0) continue;\n const cache = this.caches.get(key)!;\n const docs = await this.db.find({\n collection: key,\n where: { id: { in: Array.from(ids) } },\n limit: ids.size,\n tenantID: this.tenantID,\n draft: !!this.user,\n });\n for (const doc of (docs.docs || []) as any[]) {\n if (doc && doc.id) {\n cache.set(doc.id, doc);\n }\n }\n }\n this.pending.clear();\n }\n\n resolveOne(collection: string, id: string): any | undefined {\n return this.caches.get(this.getCacheKey(collection))?.get(id);\n }\n\n static async withBatch<T>(\n loader: RelationLoader,\n fn: () => Promise<T>,\n ): Promise<T> {\n const result = await fn();\n await loader.flushAll();\n return result;\n }\n}\n\n// ============================================================================\n// GraphQL Error Helpers\n// ============================================================================\n\nfunction gqlError(message: string, code: string): Error {\n const err = new Error(message);\n (err as any).extensions = { code };\n return err;\n}\n\n// ============================================================================\n// Depth Limiting — prevents runaway deeply-nested queries\n// ============================================================================\n\nexport function depthLimit(maxDepth: number) {\n return (validationContext: any) => {\n let depth = 0;\n return {\n Field() {\n depth++;\n if (depth > maxDepth) {\n validationContext.reportError(\n new GraphQLError(`Query exceeds max depth of ${maxDepth}`),\n );\n }\n },\n leaveField() { depth--; },\n };\n };\n}\n\n// ============================================================================\n// Access Check — wraps shared checker with GraphQL error throwing\n// ============================================================================\n\nasync function checkAccess(\n config: { access?: any; slug: string },\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n context: AccessContext,\n): Promise<WhereClause | undefined> {\n const result = await checkCollectionAccess(config, operation, context);\n if (!result.allowed) {\n throw gqlError(result.error || \"Access denied\", \"FORBIDDEN\");\n }\n return result.extraWhere;\n}\n\nasync function checkGqlGlobalAccess(\n config: { access?: any; slug: string },\n operation: \"read\" | \"update\",\n context: AccessContext,\n): Promise<void> {\n const result = await checkGlobalAccess(config, operation, context);\n if (!result.allowed) {\n throw gqlError(result.error || \"Access denied\", \"FORBIDDEN\");\n }\n}\n\n// ============================================================================\n// Field → GraphQL Type Mapping\n// ============================================================================\n\nfunction fieldToGraphQLType(\n field: Field,\n registry: Registry,\n collectionTypes?: Record<string, GraphQLObjectType>,\n isInputType = false,\n): GraphQLType {\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"textarea\":\n case \"color\":\n case \"code\":\n case \"markdown\":\n case \"date\":\n case \"select\":\n case \"radio\":\n case \"upload\":\n return GraphQLString;\n case \"number\":\n return field.integer ? GraphQLInt : GraphQLFloat;\n case \"checkbox\":\n return GraphQLBoolean;\n case \"json\":\n case \"richtext\":\n return GraphQLString;\n case \"relationship\":\n if (typeof field.relationTo === \"string\") {\n if (isInputType) {\n if (field.hasMany) {\n return new GraphQLList(GraphQLString);\n }\n return GraphQLString;\n }\n if (collectionTypes?.[field.relationTo]) {\n const refType = collectionTypes[field.relationTo];\n if (field.hasMany) {\n return new GraphQLList(refType);\n }\n return refType;\n }\n const relatedCollection = registry.getCollection(field.relationTo);\n if (relatedCollection) {\n const refType = new GraphQLObjectType({\n name: toPascalSingular(field.relationTo),\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(relatedCollection, registry, collectionTypes),\n }),\n });\n if (collectionTypes) {\n collectionTypes[field.relationTo] = refType;\n }\n if (field.hasMany) {\n return new GraphQLList(refType);\n }\n return refType;\n }\n }\n return field.hasMany ? new GraphQLList(GraphQLString) : GraphQLString;\n case \"array\": {\n if (isInputType) {\n const arrFields = (field as any).fields as Field[] | undefined;\n if (arrFields && arrFields.length > 0) {\n const arrTypeName = `${field.name?.replace(/-/g, \"_\") || \"array\"}_input_item`;\n return new GraphQLList(fieldsToGraphQLInputObjectType(arrTypeName, arrFields, registry));\n }\n return new GraphQLList(GraphQLString);\n }\n const arrFields = (field as any).fields as Field[] | undefined;\n if (arrFields && arrFields.length > 0) {\n const arrTypeName = `${field.name?.replace(/-/g, \"_\") || \"array\"}_item`;\n const itemType = fieldsToGraphQLObjectType(arrTypeName, arrFields, registry, collectionTypes);\n return new GraphQLList(itemType);\n }\n return new GraphQLList(GraphQLString);\n }\n case \"group\": {\n if (isInputType) {\n const groupFields = (field as any).fields as Field[] | undefined;\n if (groupFields && groupFields.length > 0) {\n const groupTypeName = `${field.name?.replace(/-/g, \"_\") || \"group\"}_input_group`;\n return fieldsToGraphQLInputObjectType(groupTypeName, groupFields, registry);\n }\n return GraphQLString;\n }\n const groupFields = (field as any).fields as Field[] | undefined;\n if (groupFields && groupFields.length > 0) {\n const groupTypeName = `${field.name?.replace(/-/g, \"_\") || \"group\"}_group`;\n return fieldsToGraphQLObjectType(groupTypeName, groupFields, registry, collectionTypes);\n }\n return GraphQLString;\n }\n case \"blocks\": {\n if (isInputType) return GraphQLString; // GraphQL has no input unions — accept JSON\n const blocks = (field as any).blocks as Array<{ slug: string; label: string; fields: Field[] }> | undefined;\n if (blocks && blocks.length > 0) {\n const blockTypes: GraphQLObjectType[] = [];\n for (const block of blocks) {\n const blockTypeName = `Block${toPascalCase(block.slug)}`;\n const bType = new GraphQLObjectType({\n name: blockTypeName,\n fields: () => {\n const out: Record<string, GraphQLFieldConfig<any, any>> = {\n blockType: { type: new GraphQLNonNull(GraphQLString) },\n id: { type: GraphQLString },\n };\n if (block.fields) {\n for (const bf of block.fields) {\n if (!bf.name) continue;\n const bfConfig = buildFieldConfig(bf, registry, collectionTypes);\n if (bfConfig) out[bf.name] = bfConfig;\n }\n }\n return out;\n },\n });\n blockTypes.push(bType);\n }\n if (blockTypes.length > 0) {\n const unionName = `${field.name?.replace(/-/g, \"_\") || \"blocks\"}_union`;\n return new GraphQLUnionType({\n name: unionName,\n types: blockTypes,\n resolveType(value: any) {\n const blockName = `Block${value?.blockType ? toPascalCase(value.blockType) : \"\"}`;\n const blockType = blockTypes.find(\n (bt) => bt.name === blockName,\n );\n return blockType?.name || undefined;\n },\n });\n }\n }\n return new GraphQLList(GraphQLString);\n }\n case \"row\":\n case \"collapsible\":\n case \"tabs\":\n return GraphQLString;\n default:\n return GraphQLString;\n }\n}\n\nfunction buildFieldsFromCollection(\n config: CollectionConfig,\n registry: Registry,\n collectionTypes?: Record<string, GraphQLObjectType>,\n): Record<string, GraphQLFieldConfig<any, any>> {\n const fields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n for (const field of config.fields) {\n if (field.name && field.admin?.hidden !== true) {\n const fc = buildFieldConfig(field, registry, collectionTypes);\n if (fc) fields[field.name] = fc;\n }\n }\n\n return fields;\n}\n\n// ============================================================================\n// Sort Enum Builder\n// ============================================================================\n\nfunction buildSortEnum(\n config: CollectionConfig,\n): GraphQLEnumType | undefined {\n const sortFields: Record<string, { value: string }> = {\n id: { value: \"id\" },\n createdAt: { value: \"createdAt\" },\n updatedAt: { value: \"updatedAt\" },\n };\n\n for (const field of config.fields) {\n if (field.name) {\n sortFields[field.name] = { value: field.name };\n sortFields[`${field.name}_asc`] = { value: `${field.name}` };\n sortFields[`${field.name}_desc`] = { value: `-${field.name}` };\n }\n }\n\n return new GraphQLEnumType({\n name: `${toPascalSingular(config.slug)}Sort`,\n values: sortFields,\n });\n}\n\n// ============================================================================\n// Typed Filter Input Builders\n// ============================================================================\n\nfunction buildFieldFilterType(\n field: Field,\n namePrefix: string,\n): GraphQLInputObjectType | undefined {\n const safeName = `${namePrefix}_${field.name?.replace(/-/g, \"_\") || \"field\"}_filter`;\n\n const stringOps: Record<string, { type: GraphQLType }> = {\n equals: { type: GraphQLString },\n not_equals: { type: GraphQLString },\n contains: { type: GraphQLString },\n not_contains: { type: GraphQLString },\n in: { type: new GraphQLList(GraphQLString) },\n not_in: { type: new GraphQLList(GraphQLString) },\n exists: { type: GraphQLBoolean },\n };\n\n const numberOps: Record<string, { type: GraphQLType }> = {\n equals: { type: GraphQLFloat },\n not_equals: { type: GraphQLFloat },\n greater_than: { type: GraphQLFloat },\n less_than: { type: GraphQLFloat },\n greater_than_equal: { type: GraphQLFloat },\n less_than_equal: { type: GraphQLFloat },\n in: { type: new GraphQLList(GraphQLFloat) },\n not_in: { type: new GraphQLList(GraphQLFloat) },\n exists: { type: GraphQLBoolean },\n };\n\n const boolOps: Record<string, { type: GraphQLType }> = {\n equals: { type: GraphQLBoolean },\n exists: { type: GraphQLBoolean },\n };\n\n const dateOps: Record<string, { type: GraphQLType }> = {\n equals: { type: GraphQLString },\n not_equals: { type: GraphQLString },\n greater_than: { type: GraphQLString },\n less_than: { type: GraphQLString },\n exists: { type: GraphQLBoolean },\n };\n\n const relationOps: Record<string, { type: GraphQLType }> = {\n equals: { type: GraphQLString },\n not_equals: { type: GraphQLString },\n in: { type: new GraphQLList(GraphQLString) },\n not_in: { type: new GraphQLList(GraphQLString) },\n exists: { type: GraphQLBoolean },\n };\n\n const jsonOps: Record<string, { type: GraphQLType }> = {\n exists: { type: GraphQLBoolean },\n };\n\n let ops: Record<string, { type: GraphQLType }>;\n\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 \"select\":\n case \"radio\":\n case \"upload\":\n ops = stringOps;\n break;\n case \"number\":\n ops = numberOps;\n break;\n case \"checkbox\":\n ops = boolOps;\n break;\n case \"date\":\n ops = dateOps;\n break;\n case \"relationship\":\n ops = relationOps;\n break;\n case \"json\":\n case \"richtext\":\n ops = jsonOps;\n break;\n default:\n ops = { exists: { type: GraphQLBoolean } };\n }\n\n return new GraphQLInputObjectType({\n name: safeName,\n fields: ops as any,\n });\n}\n\nfunction buildCollectionFilterType(\n config: CollectionConfig,\n namePrefix: string,\n): GraphQLInputObjectType {\n const fields: Record<string, { type: GraphQLType }> = {\n AND: { type: new GraphQLList(GraphQLString) },\n OR: { type: new GraphQLList(GraphQLString) },\n };\n\n for (const field of config.fields) {\n if (!field.name) continue;\n const filterType = buildFieldFilterType(field, namePrefix);\n if (filterType) {\n fields[field.name] = { type: filterType };\n }\n }\n\n return new GraphQLInputObjectType({\n name: `${namePrefix}Filter`,\n fields: fields as any,\n });\n}\n\nfunction translateFilter(filter: Record<string, any>): Record<string, any> {\n if (!filter || typeof filter !== \"object\") return filter || {};\n \n const result: Record<string, any> = {};\n \n for (const [key, value] of Object.entries(filter)) {\n if (key === \"AND\" || key === \"OR\") continue; // compound operators not yet supported at DB level\n result[key] = value;\n }\n \n return result;\n}\n\n// ============================================================================\n// Complex Field Type Helpers\n// ============================================================================\n\nfunction fieldsToGraphQLInputObjectType(\n name: string,\n fields: Field[],\n registry: Registry,\n): GraphQLInputObjectType {\n return new GraphQLInputObjectType({\n name,\n fields: () => {\n const out: Record<string, GraphQLInputFieldConfig> = {};\n for (const field of fields) {\n if (!field.name) continue;\n if (field.type === \"row\" || field.type === \"collapsible\") {\n const subFields = (field as any).fields as Field[];\n if (subFields) {\n for (const sf of subFields) {\n if (!sf.name) continue;\n out[sf.name] = { type: fieldToGraphQLType(sf, registry, undefined, true) as GraphQLInputType };\n }\n }\n } else if (field.type === \"tabs\") {\n const tabs = (field as any).tabs as Array<{ label: string; fields: Field[] }>;\n if (tabs) {\n for (const tab of tabs) {\n if (tab.fields) {\n for (const sf of tab.fields) {\n if (!sf.name) continue;\n out[sf.name] = { type: fieldToGraphQLType(sf, registry, undefined, true) as GraphQLInputType };\n }\n }\n }\n }\n } else {\n out[field.name] = { type: fieldToGraphQLType(field, registry, undefined, true) as GraphQLInputType };\n }\n }\n return out;\n },\n });\n}\n\nfunction fieldsToGraphQLObjectType(\n name: string,\n fields: Field[],\n registry: Registry,\n collectionTypes?: Record<string, any>,\n): GraphQLObjectType {\n return new GraphQLObjectType({\n name,\n fields: () => {\n const out: Record<string, GraphQLFieldConfig<any, any>> = {};\n for (const field of fields) {\n if (!field.name) continue;\n if (field.type === \"row\" || field.type === \"collapsible\") {\n const subFields = (field as any).fields as Field[];\n if (subFields) {\n for (const sf of subFields) {\n if (!sf.name) continue;\n const fc = buildFieldConfig(sf, registry, collectionTypes);\n if (fc) out[sf.name] = fc;\n }\n }\n } else if (field.type === \"tabs\") {\n const tabs = (field as any).tabs as Array<{ label: string; fields: Field[] }>;\n if (tabs) {\n for (const tab of tabs) {\n if (tab.fields) {\n for (const sf of tab.fields) {\n if (!sf.name) continue;\n const fc = buildFieldConfig(sf, registry, collectionTypes);\n if (fc) out[sf.name] = fc;\n }\n }\n }\n }\n } else {\n const fc = buildFieldConfig(field, registry, collectionTypes);\n if (fc) out[field.name] = fc;\n }\n }\n return out;\n},\n });\n}\n\nfunction buildFieldConfig(\n field: Field,\n registry: Registry,\n collectionTypes?: Record<string, any>,\n): GraphQLFieldConfig<any, any> | null {\n if (!field.name) return null;\n const deprecationReason = (field as any).deprecated || undefined;\n if (field.type === \"relationship\" && !(field as any).hasMany) {\n const gqlType = fieldToGraphQLType(field, registry, collectionTypes, false) as GraphQLOutputType;\n return {\n type: field.required ? new GraphQLNonNull(gqlType) : gqlType,\n description: field.admin?.description || field.label,\n deprecationReason,\n resolve: (source: any, args: any, ctx: any) => {\n const loader: RelationLoader | undefined = ctx?.relationLoader;\n const relField = field as any;\n const id = source?.[relField.name];\n if (!id) return null;\n if (loader && typeof id === \"string\") {\n const cached = loader.resolveOne(relField.relationTo, id);\n if (cached) return cached;\n loader.load(relField.relationTo, id);\n }\n return { id };\n },\n };\n }\n if (field.type === \"relationship\" && (field as any).hasMany) {\n const gqlType = fieldToGraphQLType(field, registry, collectionTypes, false) as GraphQLOutputType;\n return {\n type: gqlType,\n description: field.admin?.description || field.label,\n deprecationReason,\n resolve: (source: any, args: any, ctx: any) => {\n const loader: RelationLoader | undefined = ctx?.relationLoader;\n const relField = field as any;\n const ids: string[] = source?.[relField.name] || [];\n if (!ids.length) return [];\n if (loader) {\n const results: any[] = [];\n for (const id of ids) {\n const cached = loader.resolveOne(relField.relationTo, id);\n if (cached) results.push(cached);\n else {\n loader.load(relField.relationTo, id);\n results.push({ id });\n }\n }\n return results;\n }\n return ids.map((id: string) => ({ id }));\n },\n };\n }\n return {\n type: field.required\n ? new GraphQLNonNull(fieldToGraphQLType(field, registry, collectionTypes, false) as any)\n : (fieldToGraphQLType(field, registry, collectionTypes, false) as any),\n description: field.admin?.description || field.label,\n deprecationReason,\n };\n}\n\n// ============================================================================\n// GraphQL Schema Builder\n// ============================================================================\n\nexport interface GraphQLSchemaOptions {\n registry: Registry;\n db: BaseAdapter;\n settings?: Record<string, any>;\n}\n\nexport function buildGraphQLSchema(\n options: GraphQLSchemaOptions,\n): GraphQLSchema {\n const { registry, db, settings } = options;\n\n // Check if GraphQL is disabled in settings\n const apiAccess = settings?.access?.apiAccess;\n if (apiAccess?.graphqlEnabled === false) {\n throw new Error(\"GraphQL API is disabled\");\n }\n\n const collections = registry.getCollections();\n const globals = registry.getGlobals();\n\n // Build collection types\n const collectionTypes: Record<string, GraphQLObjectType> = {};\n const collectionInputTypes: Record<string, GraphQLInputObjectType> = {};\n\n for (const collection of collections) {\n // Output type\n collectionTypes[collection.slug] = new GraphQLObjectType({\n name: toPascalSingular(collection.slug),\n fields: () => ({\n id: { type: new GraphQLNonNull(GraphQLString) },\n ...buildFieldsFromCollection(collection, registry, collectionTypes),\n ...(collection.timestamps\n ? {\n createdAt: { type: GraphQLString },\n updatedAt: { type: GraphQLString },\n }\n : {}),\n ...(collection.tenantScoped\n ? {\n tenantID: { type: GraphQLString },\n }\n : {}),\n }),\n });\n\n // Input type for create/update\n const inputFields: Record<string, { type: GraphQLType }> = {};\n for (const field of collection.fields) {\n if (field.name && field.name !== \"id\") {\n inputFields[field.name] = {\n type: fieldToGraphQLType(field, registry, collectionTypes, true) as any,\n };\n }\n }\n\n collectionInputTypes[collection.slug] = new GraphQLInputObjectType({\n name: `${toPascalSingular(collection.slug)}Input`,\n fields: () => inputFields as any,\n });\n }\n\n // Build global types and input types\n const globalTypes: Record<string, GraphQLObjectType> = {};\n const globalInputTypes: Record<string, GraphQLInputObjectType> = {};\n\n for (const global of globals) {\n globalTypes[global.slug] = new GraphQLObjectType({\n name: toPascalCase(global.slug),\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(\n { slug: global.slug, fields: global.fields } as CollectionConfig,\n registry,\n collectionTypes,\n ),\n }),\n });\n\n globalInputTypes[global.slug] = new GraphQLInputObjectType({\n name: `${toPascalCase(global.slug)}Input`,\n fields: () => {\n const inputFields: Record<string, { type: GraphQLType }> = {};\n for (const field of global.fields) {\n if (field.name && field.name !== \"id\") {\n inputFields[field.name] = {\n type: fieldToGraphQLType(field, registry, collectionTypes, true) as any,\n };\n }\n }\n return inputFields as any;\n },\n });\n }\n\n // Shared Relay PageInfo type\n const pageInfoType = new GraphQLObjectType({\n name: \"PageInfo\",\n fields: {\n hasNextPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n hasPreviousPage: { type: new GraphQLNonNull(GraphQLBoolean) },\n startCursor: { type: GraphQLString },\n endCursor: { type: GraphQLString },\n },\n });\n\n // Build query type\n const queryFields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n // List queries for each collection\n for (const collection of collections) {\n const type = collectionTypes[collection.slug];\n if (!type) continue;\n\n // Filter and sort types for this collection\n const filterType = buildCollectionFilterType(collection, toPascalSingular(collection.slug));\n const sortEnum = buildSortEnum(collection);\n\n // FindMany query (page/limit)\n queryFields[toCamelCase(collection.slug)] = {\n type: new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}FindResult`,\n fields: {\n docs: { type: new GraphQLList(type) },\n totalDocs: { type: GraphQLInt },\n page: { type: GraphQLInt },\n totalPages: { type: GraphQLInt },\n hasNextPage: { type: GraphQLBoolean },\n hasPrevPage: { type: GraphQLBoolean },\n },\n }),\n args: {\n where: { type: filterType },\n sort: { type: sortEnum || GraphQLString },\n limit: { type: GraphQLInt },\n page: { type: GraphQLInt },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb, relationLoader: ctxLoader } = ctx as GraphQLContext;\n const extraWhere = await checkAccess(collection, \"read\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n let where: Record<string, any> = {};\n if (args.where) {\n if (typeof args.where === \"string\") {\n try { where = JSON.parse(args.where); } catch {}\n } else {\n where = translateFilter(args.where);\n }\n }\n\n if (extraWhere) {\n where = { ...where, ...extraWhere };\n }\n\n const isDraft = args.draft ?? !!ctxUser;\n\n return RelationLoader.withBatch(ctxLoader, async () => {\n return ctxDb.find({\n collection: collection.slug,\n where,\n sort: args.sort,\n limit: args.limit || 10,\n page: args.page || 1,\n tenantID: ctxTenant,\n draft: isDraft,\n });\n });\n },\n };\n\n // FindByID query\n queryFields[toCamelSingular(collection.slug)] = {\n type,\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb, relationLoader: ctxLoader } = ctx as GraphQLContext;\n const access = await checkAccess(collection, \"read\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const isDraft = args.draft ?? !!ctxUser;\n return RelationLoader.withBatch(ctxLoader, async () => {\n const doc = await ctxDb.findByID({\n collection: collection.slug,\n id: args.id,\n tenantID: ctxTenant,\n draft: isDraft,\n });\n return doc;\n });\n },\n };\n\n // Count query\n queryFields[`count${toPascalSingular(collection.slug)}s`] = {\n type: new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}Count`,\n fields: {\n totalDocs: { type: GraphQLInt },\n },\n }),\n args: {\n where: { type: GraphQLString },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb } = ctx as GraphQLContext;\n await checkAccess(collection, \"read\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n let where = {};\n if (args.where) {\n if (typeof args.where === \"string\") {\n try { where = JSON.parse(args.where); } catch {}\n } else {\n where = translateFilter(args.where);\n }\n }\n const count = await ctxDb.count({\n collection: collection.slug,\n where,\n tenantID: ctxTenant,\n });\n return { totalDocs: count };\n },\n };\n\n // Relay-style connection query\n const edgeType = new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}Edge`,\n fields: {\n node: { type },\n cursor: { type: new GraphQLNonNull(GraphQLString) },\n },\n });\n const connectionType = new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}Connection`,\n fields: {\n edges: { type: new GraphQLList(edgeType) },\n pageInfo: { type: new GraphQLNonNull(pageInfoType) },\n totalCount: { type: GraphQLInt },\n },\n });\n queryFields[`${toCamelCase(collection.slug)}Connection`] = {\n type: connectionType,\n args: {\n first: { type: GraphQLInt },\n after: { type: GraphQLString },\n last: { type: GraphQLInt },\n before: { type: GraphQLString },\n where: { type: filterType },\n sort: { type: sortEnum || GraphQLString },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb, relationLoader: ctxLoader } = ctx as GraphQLContext;\n const extraWhere = await checkAccess(collection, \"read\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n let where: Record<string, any> = {};\n if (args.where) {\n if (typeof args.where === \"string\") {\n try { where = JSON.parse(args.where); } catch {}\n } else {\n where = translateFilter(args.where);\n }\n }\n if (extraWhere) where = { ...where, ...extraWhere };\n\n const isDraft = args.draft ?? !!ctxUser;\n\n return RelationLoader.withBatch(ctxLoader, async () => {\n let page = 1;\n let limit = args.first || args.last || 10;\n\n if (args.after) {\n try {\n const afterIdx = parseInt(Buffer.from(args.after, \"base64\").toString(\"utf-8\"), 10);\n if (!isNaN(afterIdx)) page = Math.floor(afterIdx / limit) + 1;\n } catch {}\n } else if (args.before) {\n try {\n const beforeIdx = parseInt(Buffer.from(args.before, \"base64\").toString(\"utf-8\"), 10);\n if (!isNaN(beforeIdx)) page = Math.max(1, Math.floor(beforeIdx / limit));\n } catch {}\n }\n\n const result = await ctxDb.find({\n collection: collection.slug,\n where,\n sort: args.sort,\n limit,\n page,\n tenantID: ctxTenant,\n draft: isDraft,\n });\n\n const edges = (result.docs || []).map((doc: any, idx: number) => {\n const cursorIdx = (page - 1) * limit + idx;\n return {\n node: doc,\n cursor: Buffer.from(String(cursorIdx)).toString(\"base64\"),\n };\n });\n\n return {\n edges,\n pageInfo: {\n hasNextPage: result.hasNextPage || false,\n hasPreviousPage: result.hasPrevPage || false,\n startCursor: edges.length > 0 ? edges[0].cursor : null,\n endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null,\n },\n totalCount: result.totalDocs,\n };\n });\n },\n };\n }\n\n // Global queries\n for (const global of globals) {\n const type = globalTypes[global.slug];\n if (!type) continue;\n\n queryFields[toCamelCase(global.slug)] = {\n type,\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, db: ctxDb } = ctx as GraphQLContext;\n await checkGqlGlobalAccess(global, \"read\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n });\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n return ctxDb.findOne({\n collection: `_globals_${global.slug}`,\n where: {},\n tenantID: ctxTenant,\n });\n },\n };\n }\n\n const Query = new GraphQLObjectType({\n name: \"Query\",\n fields: queryFields,\n });\n\n // Build mutation type\n const mutationFields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n for (const collection of collections) {\n const type = collectionTypes[collection.slug];\n const inputType = collectionInputTypes[collection.slug];\n if (!type || !inputType) continue;\n\n // Create mutation\n mutationFields[`create${toPascalSingular(collection.slug)}`] = {\n type: new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}CreateResult`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n data: { type: new GraphQLNonNull(inputType) },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb, registry: ctxRegistry } = ctx as GraphQLContext;\n await checkAccess(collection, \"create\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n const createSchema = ctxRegistry.getCreateZodSchema(collection.slug);\n\n let validated: Record<string, any>;\n try {\n validated = createSchema.parse(args.data);\n } catch (err: any) {\n if (err?.issues) {\n const msg = err.issues.map((i: any) => `${i.path?.join(\".\")}: ${i.message}`).join(\"; \");\n throw gqlError(msg, \"BAD_USER_INPUT\");\n }\n throw err;\n }\n\n const doc = await ctxDb.create({\n collection: collection.slug,\n data: validated,\n tenantID: ctxTenant,\n });\n\n return { doc, message: \"Created successfully\" };\n },\n };\n\n // Update mutation\n mutationFields[`update${toPascalSingular(collection.slug)}`] = {\n type: new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}UpdateResult`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n data: { type: new GraphQLNonNull(inputType) },\n baseUpdatedAt: { type: GraphQLString },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb, registry: ctxRegistry } = ctx as GraphQLContext;\n await checkAccess(collection, \"update\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n // Revision conflict detection\n if (args.baseUpdatedAt) {\n const originalDoc = await ctxDb.findByID<Record<string, any>>({\n collection: collection.slug,\n id: args.id,\n tenantID: ctxTenant,\n draft: true,\n });\n if (originalDoc && originalDoc.updatedAt && args.baseUpdatedAt !== originalDoc.updatedAt) {\n throw gqlError(\n `Revision conflict: document has changed since ${args.baseUpdatedAt}. Current updatedAt: ${originalDoc.updatedAt}`,\n \"CONFLICT\",\n );\n }\n }\n\n const updateSchema = ctxRegistry.getUpdateZodSchema(collection.slug);\n\n let validated: Record<string, any>;\n try {\n validated = updateSchema.parse(args.data);\n } catch (err: any) {\n if (err?.issues) {\n const msg = err.issues.map((i: any) => `${i.path?.join(\".\")}: ${i.message}`).join(\"; \");\n throw gqlError(msg, \"BAD_USER_INPUT\");\n }\n throw err;\n }\n\n const doc = await ctxDb.update({\n collection: collection.slug,\n id: args.id,\n data: validated,\n tenantID: ctxTenant,\n });\n\n return { doc, message: \"Updated successfully\" };\n },\n };\n\n // Delete mutation\n mutationFields[`delete${toPascalSingular(collection.slug)}`] = {\n type: new GraphQLObjectType({\n name: `${toPascalSingular(collection.slug)}DeleteResult`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, apiKey: ctxApiKey, db: ctxDb } = ctx as GraphQLContext;\n await checkAccess(collection, \"delete\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n apiKey: ctxApiKey,\n });\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n const doc = await ctxDb.delete({\n collection: collection.slug,\n id: args.id,\n tenantID: ctxTenant,\n });\n\n return { doc, message: \"Deleted successfully\" };\n },\n };\n }\n\n // Global mutations\n for (const global of globals) {\n const inputType = globalInputTypes[global.slug];\n if (!inputType) continue;\n\n mutationFields[`update${toPascalCase(global.slug)}`] = {\n type: new GraphQLObjectType({\n name: `${toPascalCase(global.slug)}UpdateResult`,\n fields: {\n doc: { type: globalTypes[global.slug] || GraphQLString },\n message: { type: GraphQLString },\n },\n }),\n args: {\n data: { type: new GraphQLNonNull(inputType) },\n },\n resolve: async (_: any, args: any, ctx: any) => {\n const { user: ctxUser, req: ctxReq, tenantID: ctxTenant, db: ctxDb } = ctx as GraphQLContext;\n await checkGqlGlobalAccess(global, \"update\", {\n user: ctxUser,\n req: ctxReq,\n tenantID: ctxTenant,\n });\n if (ctxTenant) {\n ctxDb.setTenantContext({ tenantId: ctxTenant, userId: ctxUser?.id ?? '', role: ctxUser?.role, isSuperAdmin: ctxUser?.role === 'super_admin' });\n }\n\n const doc = await ctxDb.findOne({\n collection: `_globals_${global.slug}`,\n where: {},\n tenantID: ctxTenant,\n });\n\n let result;\n if (doc) {\n result = await ctxDb.update({\n collection: `_globals_${global.slug}`,\n id: doc.id,\n data: args.data,\n tenantID: ctxTenant,\n });\n } else {\n result = await ctxDb.create({\n collection: `_globals_${global.slug}`,\n data: args.data,\n tenantID: ctxTenant,\n });\n }\n\n return { doc: result, message: \"Updated successfully\" };\n },\n };\n }\n\n const Mutation = new GraphQLObjectType({\n name: \"Mutation\",\n fields: mutationFields,\n });\n\n // Federation @key directive\n const keyDirective = new GraphQLDirective({\n name: \"key\",\n locations: [DirectiveLocation.OBJECT, DirectiveLocation.INTERFACE],\n args: {\n fields: { type: new GraphQLNonNull(GraphQLString) },\n },\n });\n\n // Federation _service query — compute SDL before adding _service to avoid circularity\n const serviceSdl = printSchema(new GraphQLSchema({\n query: new GraphQLObjectType({ name: \"Query\", fields: { ...queryFields } }),\n mutation: Mutation,\n directives: [keyDirective],\n }));\n queryFields._service = {\n type: new GraphQLObjectType({\n name: \"_Service\",\n fields: {\n sdl: { type: GraphQLString },\n },\n }),\n resolve: () => ({ sdl: serviceSdl }),\n };\n\n return new GraphQLSchema({\n query: Query,\n mutation: Mutation,\n directives: [keyDirective],\n });\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createGraphQLSchema(\n registry: Registry,\n db: BaseAdapter,\n): GraphQLSchema & { sdl: string } {\n const schema = buildGraphQLSchema({ registry, db });\n return Object.assign(schema, { sdl: printSchema(schema) });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/ConfigService.ts","../src/auth/nodemailer-transport.ts","../src/auth/security/password-policy.ts"],"names":[],"mappings":"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","file":"chunk-6UNONDW7.js","sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { settings as settingsSchema } from \"../database/drizzle/schema/settings.js\";\n\nlet _settingsTableEnsured = false;\n\nexport interface S3CompatibleConfig {\n bucket?: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n endpoint?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface R2Config {\n accountId?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n bucket?: string;\n cdnUrl?: string;\n prefix?: string;\n publicDevUrl?: string;\n}\n\nexport interface GCSConfig {\n bucket?: string;\n projectId?: string;\n clientEmail?: string;\n privateKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BackblazeConfig {\n bucket?: string;\n accountId?: string;\n applicationKeyId?: string;\n applicationKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface BunnyConfig {\n storageZone?: string;\n apiKey?: string;\n cdnUrl?: string;\n prefix?: string;\n}\n\nexport interface FTPConfig {\n host?: string;\n port?: number;\n user?: string;\n password?: string;\n secure?: boolean;\n baseUrl?: string;\n prefix?: string;\n}\n\nexport interface StorageConfig {\n type: string;\n s3: S3CompatibleConfig;\n r2: R2Config;\n gcs: GCSConfig;\n digitalocean: S3CompatibleConfig;\n backblaze: BackblazeConfig;\n wasabi: S3CompatibleConfig;\n bunny: BunnyConfig;\n ftp: FTPConfig;\n cloudinary: {\n cloudName?: string;\n apiKey?: string;\n apiSecret?: string;\n folder?: string;\n };\n imgix: {\n domain?: string;\n signKey?: string;\n };\n local: {\n uploadDir?: string;\n baseUrl?: string;\n };\n}\n\nexport interface EmailConfig {\n provider?: string;\n host?: string;\n port?: number;\n secure?: boolean;\n user?: string;\n pass?: string;\n from?: string;\n fromName?: string;\n replyTo?: string;\n}\n\nexport class ConfigService {\n private db: any;\n private cache: Record<string, string> = {};\n private loaded = false;\n private static readonly SENSITIVE_KEYS = [\n \"storage.s3.secret_access_key\",\n \"storage.r2.secret_access_key\",\n \"storage.gcs.private_key\",\n \"storage.backblaze.application_key\",\n \"storage.wasabi.secret_access_key\",\n \"storage.ftp.password\",\n \"storage.bunny.api_key\",\n \"storage.cloudinary.api_secret\",\n \"storage.imgix.sign_key\",\n \"email.smtp.pass\",\n \"auth.jwt_secret\",\n \"auth.github_secret\",\n \"auth.google_secret\",\n \"auth.app_secret\",\n \"database.url\",\n \"redis.url\",\n \"auth.admin_password\",\n ];\n\n constructor(db: any) {\n this.db = db;\n }\n\n /**\n * Initialize the service by loading all settings from the database\n */\n async load(): Promise<void> {\n if (this.loaded) return;\n\n await this.ensureSettingsTable();\n\n try {\n if (typeof this.db?.select === \"function\") {\n const allSettings = await this.db.select().from(settingsSchema);\n this.cache = allSettings.reduce((acc: any, row: any) => {\n acc[row.key] = row.value;\n return acc;\n }, {});\n }\n \n // Always try to load from globals to pick up CMS-configured storage settings\n await this.loadFromGlobals();\n } catch (error) {\n console.warn(\n \"ConfigService: Could not load settings from database, using environment fallbacks.\",\n );\n }\n\n this.loaded = true;\n }\n\n private async ensureSettingsTable(): Promise<void> {\n if (_settingsTableEnsured) return;\n\n try {\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS \"settings\" (\n \"key\" VARCHAR(255) PRIMARY KEY,\n \"value\" TEXT NOT NULL,\n \"description\" TEXT,\n \"updated_at\" TIMESTAMP DEFAULT NOW()\n )\n `);\n _settingsTableEnsured = true;\n } else if (typeof this.db?.exec === \"function\") {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n description TEXT,\n updated_at TEXT\n )\n `);\n _settingsTableEnsured = true;\n }\n } catch {\n // Table creation failed — will fall back to env vars\n }\n }\n\n /**\n * Load settings from the _globals_storage-settings table (SQLite fallback)\n * Maps nested global structure to flat key-value cache\n */\n private async loadFromGlobals(): Promise<void> {\n try {\n let row: any = null;\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n const variants = ['\"_globals_storage-settings\"', '\"_globals_storage_settings\"', '\"global_storage_settings\"'];\n for (const name of variants) {\n try {\n const result = await this.db.execute(sql`SELECT * FROM ${sql.raw(name)} LIMIT 1`);\n row = Array.isArray(result) ? result[0] : (result?.rows ? result.rows[0] : null);\n if (row) break;\n } catch {}\n }\n } else if (typeof this.db?.prepare === \"function\") {\n const variants = ['\"_globals_storage-settings\"', '\"_globals_storage_settings\"', '\"global_storage_settings\"'];\n for (const name of variants) {\n try {\n row = this.db.prepare(`SELECT * FROM ${name} LIMIT 1`).get();\n if (row) break;\n } catch {}\n }\n }\n\n if (!row) return;\n\n const parseJSON = (val: any) => {\n if (!val) return null;\n if (typeof val === \"string\") {\n try {\n return JSON.parse(val);\n } catch {\n return null;\n }\n }\n return val;\n };\n\n const provider = row.provider || \"local\";\n this.cache[\"storage.type\"] = provider === \"aws\" ? \"s3\" : provider;\n\n if (provider === \"local\") {\n const local = parseJSON(row.local);\n this.cache[\"storage.local.dir\"] =\n local?.uploadDir || \"./public/uploads\";\n this.cache[\"storage.local.url\"] = local?.baseUrl || \"/uploads\";\n }\n\n if (provider === \"aws\") {\n const aws = parseJSON(row.aws);\n this.cache[\"storage.s3.bucket\"] = aws?.bucket || \"\";\n this.cache[\"storage.s3.region\"] = aws?.region || \"us-east-1\";\n this.cache[\"storage.s3.access_key_id\"] = aws?.accessKeyId || \"\";\n this.cache[\"storage.s3.secret_access_key\"] = aws?.secretAccessKey || \"\";\n this.cache[\"storage.s3.endpoint\"] = aws?.endpoint || \"\";\n this.cache[\"storage.s3.cdn_url\"] = aws?.cdnUrl || \"\";\n this.cache[\"storage.s3.prefix\"] = aws?.prefix || \"\";\n }\n\n if (provider === \"r2\") {\n const r2 = parseJSON(row.r2);\n this.cache[\"storage.r2.account_id\"] = r2?.accountId || \"\";\n this.cache[\"storage.r2.access_key_id\"] = r2?.accessKeyId || \"\";\n this.cache[\"storage.r2.secret_access_key\"] = r2?.secretAccessKey || \"\";\n this.cache[\"storage.r2.bucket\"] = r2?.bucket || \"\";\n this.cache[\"storage.r2.cdn_url\"] = r2?.cdnUrl || \"\";\n this.cache[\"storage.r2.prefix\"] = r2?.prefix || \"\";\n }\n\n if (provider === \"cloudinary\") {\n const cloudinary = parseJSON(row.cloudinary);\n this.cache[\"storage.cloudinary.cloud_name\"] =\n cloudinary?.cloudName || \"\";\n this.cache[\"storage.cloudinary.api_key\"] = cloudinary?.apiKey || \"\";\n this.cache[\"storage.cloudinary.api_secret\"] =\n cloudinary?.apiSecret || \"\";\n this.cache[\"storage.cloudinary.folder\"] = cloudinary?.folder || \"\";\n }\n\n if (provider === \"ftp\") {\n const ftp = parseJSON(row.ftp);\n this.cache[\"storage.ftp.host\"] = ftp?.host || \"\";\n this.cache[\"storage.ftp.port\"] = String(ftp?.port || \"21\");\n this.cache[\"storage.ftp.user\"] = ftp?.user || \"\";\n this.cache[\"storage.ftp.password\"] = ftp?.password || \"\";\n this.cache[\"storage.ftp.secure\"] = ftp?.secure ? \"true\" : \"false\";\n this.cache[\"storage.ftp.base_url\"] = ftp?.baseUrl || \"\";\n this.cache[\"storage.ftp.prefix\"] = ftp?.prefix || \"\";\n }\n } catch (error) {\n console.warn(\"ConfigService: Could not load storage settings from globals table:\", error);\n }\n\n // Also load email-settings\n try {\n let row: any = null;\n if (typeof this.db?.execute === \"function\") {\n const { sql } = await import(\"drizzle-orm\");\n const variants = ['\"_globals_email-settings\"', '\"_globals_email_settings\"', '\"global_email_settings\"'];\n for (const name of variants) {\n try {\n const result = await this.db.execute(sql`SELECT * FROM ${sql.raw(name)} LIMIT 1`);\n row = Array.isArray(result) ? result[0] : (result?.rows ? result.rows[0] : null);\n if (row) break;\n } catch {}\n }\n } else if (typeof this.db?.prepare === \"function\") {\n const variants = ['\"_globals_email-settings\"', '\"_globals_email_settings\"', '\"global_email_settings\"'];\n for (const name of variants) {\n try {\n row = this.db.prepare(`SELECT * FROM ${name} LIMIT 1`).get();\n if (row) break;\n } catch {}\n }\n }\n\n if (row) {\n const parseJSON = (val: any) => {\n if (!val) return null;\n if (typeof val === \"string\") {\n try { return JSON.parse(val); } catch { return null; }\n }\n return val;\n };\n\n this.cache[\"email.provider\"] = row.provider || \"smtp\";\n this.cache[\"email.smtp.from\"] = row.fromEmail || \"\";\n this.cache[\"email.smtp.from_name\"] = row.fromName || \"\";\n this.cache[\"email.smtp.reply_to\"] = row.replyTo || \"\";\n\n if (row.provider === \"smtp\") {\n const smtp = parseJSON(row.smtp);\n this.cache[\"email.smtp.host\"] = smtp?.host || \"\";\n this.cache[\"email.smtp.port\"] = String(smtp?.port || \"587\");\n this.cache[\"email.smtp.user\"] = smtp?.username || \"\";\n this.cache[\"email.smtp.pass\"] = smtp?.password || \"\";\n this.cache[\"email.smtp.secure\"] = smtp?.secure ? \"true\" : \"false\";\n } else if (row.provider === \"resend\") {\n const resend = parseJSON(row.resend);\n this.cache[\"email.smtp.pass\"] = resend?.apiKey || \"\"; // We might use pass as apiKey\n } else if (row.provider === \"sendgrid\") {\n const sendgrid = parseJSON(row.sendgrid);\n this.cache[\"email.smtp.pass\"] = sendgrid?.apiKey || \"\";\n } else if (row.provider === \"mailgun\") {\n const mailgun = parseJSON(row.mailgun);\n this.cache[\"email.smtp.pass\"] = mailgun?.apiKey || \"\";\n } else if (row.provider === \"ses\") {\n const ses = parseJSON(row.ses);\n this.cache[\"email.smtp.user\"] = ses?.accessKeyId || \"\";\n this.cache[\"email.smtp.pass\"] = ses?.secretAccessKey || \"\";\n }\n }\n } catch (error) {\n console.warn(\"ConfigService: Could not load email settings from globals table:\", error);\n }\n }\n\n /**\n * Get a settings value with environment fallback\n */\n get(key: string, envKey?: string, defaultValue?: string): string | undefined {\n // 1. Check database cache\n if (this.cache[key]) return this.cache[key];\n\n // 2. Check environment variable\n if (envKey && process.env[envKey]) return process.env[envKey];\n\n // 3. Return default\n return defaultValue;\n }\n\n /**\n * Get storage configuration\n */\n getStorageConfig(): StorageConfig {\n return {\n type: this.get(\"storage.type\", \"STORAGE_TYPE\", \"local\")!,\n s3: {\n bucket: this.get(\"storage.s3.bucket\", \"STORAGE_BUCKET\"),\n region: this.get(\"storage.s3.region\", \"STORAGE_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.s3.access_key_id\",\n \"STORAGE_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.s3.secret_access_key\",\n \"STORAGE_SECRET_ACCESS_KEY\",\n ),\n endpoint: this.get(\"storage.s3.endpoint\", \"STORAGE_ENDPOINT\"),\n cdnUrl: this.get(\"storage.s3.cdn_url\", \"STORAGE_CDN_URL\"),\n prefix: this.get(\"storage.s3.prefix\", \"STORAGE_PREFIX\"),\n },\n r2: {\n accountId: this.get(\"storage.r2.account_id\", \"R2_ACCOUNT_ID\"),\n accessKeyId: this.get(\"storage.r2.access_key_id\", \"R2_ACCESS_KEY_ID\"),\n secretAccessKey: this.get(\n \"storage.r2.secret_access_key\",\n \"R2_SECRET_ACCESS_KEY\",\n ),\n bucket: this.get(\"storage.r2.bucket\", \"R2_BUCKET\"),\n cdnUrl: this.get(\"storage.r2.cdn_url\", \"R2_CDN_URL\"),\n prefix: this.get(\"storage.r2.prefix\", \"R2_PREFIX\"),\n },\n gcs: {\n bucket: this.get(\"storage.gcs.bucket\", \"GCS_BUCKET\"),\n projectId: this.get(\"storage.gcs.project_id\", \"GCS_PROJECT_ID\"),\n clientEmail: this.get(\"storage.gcs.client_email\", \"GCS_CLIENT_EMAIL\"),\n privateKey: this.get(\"storage.gcs.private_key\", \"GCS_PRIVATE_KEY\"),\n cdnUrl: this.get(\"storage.gcs.cdn_url\", \"GCS_CDN_URL\"),\n prefix: this.get(\"storage.gcs.prefix\", \"GCS_PREFIX\"),\n },\n digitalocean: {\n bucket: this.get(\"storage.digitalocean.bucket\", \"DO_BUCKET\"),\n region: this.get(\"storage.digitalocean.region\", \"DO_REGION\", \"nyc3\"),\n accessKeyId: this.get(\n \"storage.digitalocean.access_key_id\",\n \"DO_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.digitalocean.secret_access_key\",\n \"DO_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.digitalocean.cdn_url\", \"DO_CDN_URL\"),\n prefix: this.get(\"storage.digitalocean.prefix\", \"DO_PREFIX\"),\n },\n backblaze: {\n bucket: this.get(\"storage.backblaze.bucket\", \"BB_BUCKET\"),\n accountId: this.get(\"storage.backblaze.account_id\", \"BB_ACCOUNT_ID\"),\n applicationKeyId: this.get(\n \"storage.backblaze.application_key_id\",\n \"BB_APPLICATION_KEY_ID\",\n ),\n applicationKey: this.get(\n \"storage.backblaze.application_key\",\n \"BB_APPLICATION_KEY\",\n ),\n cdnUrl: this.get(\"storage.backblaze.cdn_url\", \"BB_CDN_URL\"),\n prefix: this.get(\"storage.backblaze.prefix\", \"BB_PREFIX\"),\n },\n wasabi: {\n bucket: this.get(\"storage.wasabi.bucket\", \"WASABI_BUCKET\"),\n region: this.get(\"storage.wasabi.region\", \"WASABI_REGION\", \"us-east-1\"),\n accessKeyId: this.get(\n \"storage.wasabi.access_key_id\",\n \"WASABI_ACCESS_KEY_ID\",\n ),\n secretAccessKey: this.get(\n \"storage.wasabi.secret_access_key\",\n \"WASABI_SECRET_ACCESS_KEY\",\n ),\n cdnUrl: this.get(\"storage.wasabi.cdn_url\", \"WASABI_CDN_URL\"),\n prefix: this.get(\"storage.wasabi.prefix\", \"WASABI_PREFIX\"),\n },\n bunny: {\n storageZone: this.get(\n \"storage.bunny.storage_zone\",\n \"BUNNY_STORAGE_ZONE\",\n ),\n apiKey: this.get(\"storage.bunny.api_key\", \"BUNNY_API_KEY\"),\n cdnUrl: this.get(\"storage.bunny.cdn_url\", \"BUNNY_CDN_URL\"),\n prefix: this.get(\"storage.bunny.prefix\", \"BUNNY_PREFIX\"),\n },\n ftp: {\n host: this.get(\"storage.ftp.host\", \"FTP_HOST\"),\n port: parseInt(this.get(\"storage.ftp.port\", \"FTP_PORT\", \"21\")!, 10),\n user: this.get(\"storage.ftp.user\", \"FTP_USER\"),\n password: this.get(\"storage.ftp.password\", \"FTP_PASSWORD\"),\n secure: this.get(\"storage.ftp.secure\", \"FTP_SECURE\") === \"true\",\n baseUrl: this.get(\"storage.ftp.base_url\", \"FTP_BASE_URL\"),\n prefix: this.get(\"storage.ftp.prefix\", \"FTP_PREFIX\"),\n },\n cloudinary: {\n cloudName: this.get(\n \"storage.cloudinary.cloud_name\",\n \"CLOUDINARY_CLOUD_NAME\",\n ),\n apiKey: this.get(\"storage.cloudinary.api_key\", \"CLOUDINARY_API_KEY\"),\n apiSecret: this.get(\n \"storage.cloudinary.api_secret\",\n \"CLOUDINARY_API_SECRET\",\n ),\n folder: this.get(\"storage.cloudinary.folder\", \"CLOUDINARY_FOLDER\"),\n },\n imgix: {\n domain: this.get(\"storage.imgix.domain\", \"IMGIX_DOMAIN\"),\n signKey: this.get(\"storage.imgix.sign_key\", \"IMGIX_SIGN_KEY\"),\n },\n local: {\n uploadDir: this.get(\"storage.local.dir\", \"STORAGE_LOCAL_DIR\", \"./public/uploads\"),\n baseUrl: this.get(\"storage.local.url\", \"STORAGE_LOCAL_URL\", \"/uploads\"),\n },\n };\n }\n\n /**\n * Get email configuration\n */\n getEmailConfig(): EmailConfig {\n return {\n provider: this.get(\"email.provider\", \"EMAIL_PROVIDER\", \"smtp\"),\n host: this.get(\"email.smtp.host\", \"SMTP_HOST\"),\n port: parseInt(this.get(\"email.smtp.port\", \"SMTP_PORT\", \"587\")!, 10),\n secure: this.get(\"email.smtp.secure\", \"SMTP_SECURE\") === \"true\",\n user: this.get(\"email.smtp.user\", \"SMTP_USER\"),\n pass: this.get(\"email.smtp.pass\", \"SMTP_PASS\"),\n from: this.get(\"email.smtp.from\", \"SMTP_FROM\", \"noreply@example.com\"),\n fromName: this.get(\"email.smtp.from_name\", \"SMTP_FROM_NAME\", \"Kyro CMS\"),\n replyTo: this.get(\"email.smtp.reply_to\", \"SMTP_REPLY_TO\"),\n };\n }\n\n /**\n * Mask sensitive values for display\n */\n maskSensitive(key: string, value: string | undefined): string | undefined {\n if (!value) return value;\n if (ConfigService.SENSITIVE_KEYS.includes(key)) {\n return \"********\";\n }\n return value;\n }\n\n /**\n * Update a setting in the database\n */\n async set(key: string, value: string, description?: string): Promise<void> {\n await this.db\n .insert(settingsSchema)\n .values({\n key,\n value,\n description,\n updatedAt: new Date(),\n })\n .onConflictDoUpdate({\n target: [settingsSchema.key],\n set: { value, description, updatedAt: new Date() },\n });\n this.cache[key] = value;\n }\n}\n","import type { Transporter, SentMessageInfo } from \"nodemailer\";\n\nexport interface EmailConfig {\n provider: \"smtp\" | \"resend\" | \"sendgrid\" | \"mailgun\" | \"ses\";\n from: string;\n fromName?: string;\n replyTo?: string;\n smtp?: {\n host: string;\n port: number;\n secure: boolean;\n auth: {\n user: string;\n pass: string;\n };\n };\n resend?: {\n apiKey: string;\n };\n sendgrid?: {\n apiKey: string;\n };\n mailgun?: {\n apiKey: string;\n domain: string;\n region?: \"us\" | \"eu\";\n };\n ses?: {\n accessKeyId: string;\n secretAccessKey: string;\n region: string;\n };\n}\n\nexport interface EmailOptions {\n to: string | string[];\n subject: string;\n html: string;\n text?: string;\n replyTo?: string;\n}\n\nexport interface EmailTemplates {\n verifyEmail: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n resetPassword: (\n link: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n welcome: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n accountLocked: (\n attempts: number,\n duration: number,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n passwordChanged: (userName?: string) => {\n subject: string;\n html: string;\n text: string;\n };\n newLogin: (\n location: string,\n time: string,\n userName?: string,\n ) => { subject: string; html: string; text: string };\n}\n\nconst defaultTemplates: EmailTemplates = {\n verifyEmail: (link, userName = \"User\") => ({\n subject: \"Verify your email address\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Verify Email</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome, ${userName}!</h1>\n <p>Please verify your email address by clicking the button below:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Verify Email</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <p>This link will expire in 24 hours.</p>\n <div class=\"footer\">\n <p>If you didn't create an account, you can safely ignore this email.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Welcome ${userName}!\\n\\nPlease verify your email by clicking this link: ${link}\\n\\nThis link will expire in 24 hours.\\n\\nIf you didn't create an account, you can safely ignore this email.`,\n }),\n\n resetPassword: (link, userName = \"User\") => ({\n subject: \"Reset your password\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Reset Password</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #dc2626; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n .warning { background: #fef3c7; border: 1px solid #f59e0b; padding: 12px; border-radius: 6px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Reset Request</h1>\n <p>Hello ${userName},</p>\n <p>We received a request to reset your password. Click the button below to create a new password:</p>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"${link}\" class=\"button\">Reset Password</a>\n </p>\n <p>Or copy and paste this link into your browser:</p>\n <p style=\"word-break: break-all; color: #666;\">${link}</p>\n <div class=\"warning\">\n <strong>⚠️ Important:</strong> This link will expire in 1 hour. If you didn't request a password reset, please ignore this email or contact support if you have concerns.\n </div>\n <div class=\"footer\">\n <p>For security reasons, please don't share this email with anyone.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Password Reset Request\\n\\nHello ${userName},\\n\\nWe received a request to reset your password. Click this link to create a new password: ${link}\\n\\nThis link will expire in 1 hour.\\n\\nIf you didn't request a password reset, please ignore this email.`,\n }),\n\n welcome: (userName = \"User\") => ({\n subject: \"Welcome to Kyro CMS\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Welcome</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Welcome to Kyro CMS, ${userName}!</h1>\n <p>Your account has been created successfully.</p>\n <p>You can now:</p>\n <ul>\n <li>Manage your content collections</li>\n <li>Upload and organize media</li>\n <li>Configure settings</li>\n <li>And much more...</li>\n </ul>\n <p style=\"text-align: center; margin: 30px 0;\">\n <a href=\"#\" class=\"button\">Get Started</a>\n </p>\n <p>If you have any questions, feel free to reach out to our support team.</p>\n </div>\n </body>\n </html>\n `,\n text: `Welcome to Kyro CMS, ${userName}!\\n\\nYour account has been created successfully.\\n\\nYou can now:\\n- Manage your content collections\\n- Upload and organize media\\n- Configure settings\\n- And much more...\\n\\nGet started by logging into your dashboard.`,\n }),\n\n accountLocked: (attempts, duration, userName = \"User\") => ({\n subject: \"Account Security Alert - Account Locked\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Account Locked</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .alert { background: #fef2f2; border: 1px solid #ef4444; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Account Security Alert</h1>\n <p>Hello ${userName},</p>\n <div class=\"alert\">\n <p><strong>⚠️ Your account has been temporarily locked due to multiple failed login attempts.</strong></p>\n <p>Failed attempts: ${attempts}</p>\n <p>Lockout duration: ${Math.round(duration / 60000)} minutes</p>\n </div>\n <p>Your account will automatically unlock after the lockout period expires.</p>\n <p>If this wasn't you, we recommend:</p>\n <ul>\n <li>Using a strong, unique password</li>\n <li>Enabling two-factor authentication (coming soon)</li>\n <li>Reviewing your recent account activity</li>\n </ul>\n <div class=\"footer\">\n <p>If you need immediate assistance, please contact support.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `Account Security Alert\\n\\nHello ${userName},\\n\\nYour account has been temporarily locked due to multiple failed login attempts (${attempts}).\\n\\nLockout duration: ${Math.round(duration / 60000)} minutes\\n\\nYour account will automatically unlock after this period.\\n\\nIf this wasn't you, we recommend using a strong, unique password.`,\n }),\n\n passwordChanged: (userName = \"User\") => ({\n subject: \"Your password has been changed\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Password Changed</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info { background: #f0fdf4; border: 1px solid #22c55e; padding: 12px; border-radius: 6px; margin: 20px 0; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Password Changed</h1>\n <p>Hello ${userName},</p>\n <div class=\"info\">\n <p>Your password was recently changed.</p>\n </div>\n <p>If you did this, you can safely ignore this email.</p>\n <p><strong>If you didn't change your password</strong>, please contact our support team immediately as your account may have been compromised.</p>\n </div>\n </body>\n </html>\n `,\n text: `Password Changed\\n\\nHello ${userName},\\n\\nYour password was recently changed.\\n\\nIf you did this, you can safely ignore this email.\\n\\nIf you didn't change your password, please contact support immediately.`,\n }),\n\n newLogin: (location, time, userName = \"User\") => ({\n subject: \"New login to your account\",\n html: `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>New Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }\n .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n .info-box { background: #f8fafc; border: 1px solid #e2e8f0; padding: 16px; border-radius: 8px; margin: 20px 0; }\n .footer { margin-top: 30px; font-size: 12px; color: #666; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>New Login Detected</h1>\n <p>Hello ${userName},</p>\n <p>We detected a new login to your account:</p>\n <div class=\"info-box\">\n <p><strong>Location:</strong> ${location}</p>\n <p><strong>Time:</strong> ${time}</p>\n </div>\n <p><strong>If this was you</strong>, no action is needed.</p>\n <p><strong>If this wasn't you</strong>, your account may be compromised. Please:</p>\n <ol>\n <li>Change your password immediately</li>\n <li>Review your recent account activity</li>\n <li>Contact support if needed</li>\n </ol>\n <div class=\"footer\">\n <p>This is an automated security notification.</p>\n </div>\n </div>\n </body>\n </html>\n `,\n text: `New Login Detected\\n\\nHello ${userName},\\n\\nWe detected a new login to your account:\\n\\nLocation: ${location}\\nTime: ${time}\\n\\nIf this wasn't you, please change your password immediately and contact support.`,\n }),\n};\n\nimport { ConfigService } from \"../config/ConfigService.js\";\n\nexport class EmailTransport {\n private transporter?: Transporter<SentMessageInfo>;\n private config: EmailConfig;\n private templates: EmailTemplates;\n private transporterInitialized: boolean = false;\n\n constructor(config: EmailConfig, templates?: Partial<EmailTemplates>) {\n this.config = config;\n this.templates = { ...defaultTemplates, ...templates };\n }\n\n private async ensureTransporter(): Promise<Transporter<SentMessageInfo>> {\n if (this.transporterInitialized) {\n return this.transporter!;\n }\n\n const { default: nodemailer } = await import(\"nodemailer\");\n\n if (this.config.provider === \"smtp\" && this.config.smtp) {\n this.transporter = nodemailer.createTransport({\n host: this.config.smtp.host,\n port: this.config.smtp.port,\n secure: this.config.smtp.secure,\n auth: this.config.smtp.auth,\n });\n } else if (this.config.provider === \"ses\" && this.config.ses) {\n this.transporter = nodemailer.createTransport({\n host: `email-smtp.${this.config.ses.region}.amazonaws.com`,\n port: 587,\n secure: false,\n auth: {\n user: this.config.ses.accessKeyId,\n pass: this.config.ses.secretAccessKey,\n },\n });\n }\n\n this.transporterInitialized = true;\n return this.transporter!;\n }\n\n async send(options: EmailOptions): Promise<any> {\n const { provider, from, fromName, replyTo: configReplyTo } = this.config;\n const fromFull = `\"${fromName || \"Kyro CMS\"}\" <${from}>`;\n const replyTo = options.replyTo || configReplyTo;\n\n console.log(`[EmailTransport] Sending email via ${provider}...`);\n console.log(\n `[EmailTransport] To: ${Array.isArray(options.to) ? options.to.join(\", \") : options.to}`,\n );\n console.log(`[EmailTransport] Subject: ${options.subject}`);\n\n try {\n let result;\n switch (provider) {\n case \"smtp\":\n case \"ses\":\n {\n const transporter = await this.ensureTransporter();\n if (!transporter)\n throw new Error(`${provider} transporter not initialized`);\n result = await transporter.sendMail({\n from: fromFull,\n to: Array.isArray(options.to)\n ? options.to.join(\", \")\n : options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n replyTo,\n });\n }\n break;\n\n case \"resend\":\n result = await this.sendViaResend(fromFull, options, replyTo);\n break;\n\n case \"sendgrid\":\n result = await this.sendViaSendGrid(fromFull, options, replyTo);\n break;\n\n case \"mailgun\":\n result = await this.sendViaMailgun(fromFull, options, replyTo);\n break;\n\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n console.log(`[EmailTransport] Success! Provider response received.`);\n return result;\n } catch (error: any) {\n console.error(`[EmailTransport] FAILED to send email:`, error.message);\n if (error.response) {\n console.error(\n `[EmailTransport] Provider Error Detail:`,\n JSON.stringify(error.response, null, 2),\n );\n }\n throw error;\n }\n }\n\n private async sendViaResend(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.resend?.apiKey;\n if (!apiKey) throw new Error(\"Resend API Key missing\");\n\n const body = {\n from,\n to: options.to,\n subject: options.subject,\n html: options.html,\n text: options.text,\n reply_to: replyTo,\n };\n\n console.log(`[EmailTransport] Calling Resend API...`);\n const resp = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Resend Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n private async sendViaSendGrid(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const apiKey = this.config.sendgrid?.apiKey;\n if (!apiKey) throw new Error(\"SendGrid API Key missing\");\n\n const body = {\n personalizations: [\n {\n to: Array.isArray(options.to)\n ? options.to.map((email) => ({ email }))\n : [{ email: options.to }],\n },\n ],\n from: {\n email: from.match(/<(.+)>/)?.[1] || from,\n name: from.match(/\"(.+)\"/)?.[1],\n },\n subject: options.subject,\n content: [\n { type: \"text/plain\", value: options.text || \"\" },\n { type: \"text/html\", value: options.html },\n ],\n reply_to: replyTo ? { email: replyTo } : undefined,\n };\n\n console.log(`[EmailTransport] Calling SendGrid API...`);\n const resp = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`SendGrid Error: ${JSON.stringify(error)}`);\n }\n return { success: true };\n }\n\n private async sendViaMailgun(\n from: string,\n options: EmailOptions,\n replyTo?: string,\n ) {\n const { apiKey, domain, region } = this.config.mailgun || {};\n if (!apiKey || !domain) throw new Error(\"Mailgun config missing\");\n\n const base = region === \"eu\" ? \"api.eu.mailgun.net\" : \"api.mailgun.net\";\n const auth = btoa(`api:${apiKey}`);\n\n const formData = new URLSearchParams();\n formData.append(\"from\", from);\n const to = Array.isArray(options.to) ? options.to.join(\", \") : options.to;\n formData.append(\"to\", to);\n formData.append(\"subject\", options.subject);\n formData.append(\"html\", options.html);\n if (options.text) formData.append(\"text\", options.text);\n if (replyTo) formData.append(\"h:Reply-To\", replyTo);\n\n console.log(`[EmailTransport] Calling Mailgun API (${region || \"us\"})...`);\n const resp = await fetch(`https://${base}/v3/${domain}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${auth}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: formData,\n });\n\n if (!resp.ok) {\n const error = await resp.json();\n throw new Error(`Mailgun Error: ${JSON.stringify(error)}`);\n }\n return resp.json();\n }\n\n getTemplates(): EmailTemplates {\n return this.templates;\n }\n\n async verifyConnection(): Promise<boolean> {\n if (this.config.provider === \"smtp\" || this.config.provider === \"ses\") {\n try {\n const transporter = await this.ensureTransporter();\n if (transporter) {\n await transporter.verify();\n return true;\n }\n } catch {\n return false;\n }\n }\n return !!(\n this.config.resend?.apiKey ||\n this.config.sendgrid?.apiKey ||\n this.config.mailgun?.apiKey\n );\n }\n\n static async fromConfig(db: any): Promise<EmailTransport | null> {\n const configService = new ConfigService(db);\n await configService.load();\n const config = configService.getEmailConfig();\n\n if (!config.provider) {\n return this.fromEnv();\n }\n\n const transformed: EmailConfig = {\n provider: (config.provider as any) || \"smtp\",\n from: config.from || \"noreply@example.com\",\n fromName: config.fromName,\n replyTo: config.replyTo,\n smtp:\n config.provider === \"smtp\"\n ? {\n host: config.host || \"\",\n port: config.port || 587,\n secure: config.secure || false,\n auth: { user: config.user || \"\", pass: config.pass || \"\" },\n }\n : undefined,\n resend:\n config.provider === \"resend\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n sendgrid:\n config.provider === \"sendgrid\"\n ? { apiKey: config.pass || \"\" }\n : undefined,\n mailgun:\n config.provider === \"mailgun\"\n ? {\n apiKey: config.pass || \"\",\n domain: config.host || \"\",\n region: (config.secure ? \"eu\" : \"us\") as any,\n }\n : undefined,\n ses:\n config.provider === \"ses\"\n ? {\n accessKeyId: config.user || \"\",\n secretAccessKey: config.pass || \"\",\n region: config.host || \"us-east-1\",\n }\n : undefined,\n };\n\n return new EmailTransport(transformed);\n }\n\n static fromEnv(): EmailTransport | null {\n const provider = (process.env.EMAIL_PROVIDER as any) || \"smtp\";\n const from =\n process.env.SMTP_FROM ||\n process.env.DEFAULT_FROM ||\n \"noreply@example.com\";\n const fromName = process.env.SMTP_FROM_NAME || \"Kyro CMS\";\n const replyTo = process.env.SMTP_REPLY_TO;\n\n if (provider === \"smtp\") {\n const host = process.env.SMTP_HOST;\n const user = process.env.SMTP_USER;\n const pass = process.env.SMTP_PASS;\n if (!host || !user || !pass) return null;\n\n return new EmailTransport({\n provider: \"smtp\",\n from,\n fromName,\n replyTo,\n smtp: {\n host,\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n secure: process.env.SMTP_SECURE === \"true\",\n auth: { user, pass },\n },\n });\n }\n\n if (provider === \"resend\") {\n const apiKey = process.env.RESEND_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"resend\",\n from,\n fromName,\n replyTo,\n resend: { apiKey },\n });\n }\n\n if (provider === \"sendgrid\") {\n const apiKey = process.env.SENDGRID_API_KEY || process.env.SMTP_PASS;\n if (!apiKey) return null;\n return new EmailTransport({\n provider: \"sendgrid\",\n from,\n fromName,\n replyTo,\n sendgrid: { apiKey },\n });\n }\n\n if (provider === \"mailgun\") {\n const apiKey = process.env.MAILGUN_API_KEY || process.env.SMTP_PASS;\n const domain = process.env.MAILGUN_DOMAIN || process.env.SMTP_HOST;\n if (!apiKey || !domain) return null;\n return new EmailTransport({\n provider: \"mailgun\",\n from,\n fromName,\n replyTo,\n mailgun: {\n apiKey,\n domain,\n region: (process.env.MAILGUN_REGION ||\n (process.env.SMTP_SECURE === \"true\" ? \"eu\" : \"us\")) as any,\n },\n });\n }\n\n if (provider === \"ses\") {\n const accessKeyId =\n process.env.AWS_ACCESS_KEY_ID || process.env.SMTP_USER;\n const secretAccessKey =\n process.env.AWS_SECRET_ACCESS_KEY || process.env.SMTP_PASS;\n const region =\n process.env.AWS_REGION || process.env.SMTP_HOST || \"us-east-1\";\n if (!accessKeyId || !secretAccessKey) return null;\n return new EmailTransport({\n provider: \"ses\",\n from,\n fromName,\n replyTo,\n ses: { accessKeyId, secretAccessKey, region },\n });\n }\n\n return null;\n }\n}\n","export interface PasswordPolicyConfig {\n minLength: number;\n requireUppercase: boolean;\n requireLowercase: boolean;\n requireNumbers: boolean;\n requireSpecialChars: boolean;\n preventReuse: number;\n maxLength?: number;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport const DEFAULT_PASSWORD_POLICY: PasswordPolicyConfig = {\n minLength: 12,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true,\n preventReuse: 5,\n maxLength: 128,\n};\n\nexport class PasswordPolicy {\n private config: PasswordPolicyConfig;\n\n constructor(config: Partial<PasswordPolicyConfig> = {}) {\n this.config = { ...DEFAULT_PASSWORD_POLICY, ...config };\n }\n\n validate(password: string): ValidationResult {\n const errors: string[] = [];\n\n if (this.config.maxLength && password.length > this.config.maxLength) {\n errors.push(\n `Password must not exceed ${this.config.maxLength} characters`,\n );\n }\n\n if (password.length < this.config.minLength) {\n errors.push(\n `Password must be at least ${this.config.minLength} characters`,\n );\n }\n\n if (this.config.requireUppercase && !/[A-Z]/.test(password)) {\n errors.push(\"Password must contain at least one uppercase letter\");\n }\n\n if (this.config.requireLowercase && !/[a-z]/.test(password)) {\n errors.push(\"Password must contain at least one lowercase letter\");\n }\n\n if (this.config.requireNumbers && !/[0-9]/.test(password)) {\n errors.push(\"Password must contain at least one number\");\n }\n\n if (\n this.config.requireSpecialChars &&\n !/[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]/.test(password)\n ) {\n errors.push(\"Password must contain at least one special character\");\n }\n\n const commonPasswords = [\n \"password\",\n \"123456\",\n \"12345678\",\n \"qwerty\",\n \"abc123\",\n \"monkey\",\n \"1234567\",\n \"letmein\",\n \"trustno1\",\n \"dragon\",\n \"baseball\",\n \"iloveyou\",\n \"master\",\n \"sunshine\",\n \"ashley\",\n \"football\",\n \"password1\",\n \"shadow\",\n \"123123\",\n \"654321\",\n ];\n\n if (commonPasswords.includes(password.toLowerCase())) {\n errors.push(\n \"This password is too common. Please choose a more secure password\",\n );\n }\n\n if (/^[a-zA-Z]+$/.test(password) || /^[0-9]+$/.test(password)) {\n errors.push(\n \"Password must contain a mix of letters, numbers, and/or special characters\",\n );\n }\n\n if (/(.)\\1{2,}/.test(password)) {\n errors.push(\n \"Password must not contain more than 2 consecutive identical characters\",\n );\n }\n\n if (\n /^(012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210)+$/i.test(\n password,\n )\n ) {\n errors.push(\"Password must not contain sequential numbers or letters\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n async checkReuse(\n passwordHash: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<ValidationResult> {\n return {\n valid: true,\n errors: [],\n };\n }\n\n async isInHistory(\n password: string,\n history: string[],\n verifyFn: (password: string, hash: string) => Promise<boolean>,\n ): Promise<boolean> {\n for (const hash of history) {\n if (await verifyFn(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n generatePassword(length: number = 16): string {\n const uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const lowercase = \"abcdefghijklmnopqrstuvwxyz\";\n const numbers = \"0123456789\";\n const special = \"!@#$%^&*()_+-=[]{}|;:,.<>?\";\n\n let password = \"\";\n\n password += uppercase[Math.floor(Math.random() * uppercase.length)];\n password += lowercase[Math.floor(Math.random() * lowercase.length)];\n password += numbers[Math.floor(Math.random() * numbers.length)];\n password += special[Math.floor(Math.random() * special.length)];\n\n const allChars = uppercase + lowercase + numbers + special;\n for (let i = password.length; i < length; i++) {\n password += allChars[Math.floor(Math.random() * allChars.length)];\n }\n\n return password\n .split(\"\")\n .sort(() => Math.random() - 0.5)\n .join(\"\");\n }\n\n getStrength(password: string): {\n score: number;\n label: string;\n feedback: string[];\n } {\n let score = 0;\n const feedback: string[] = [];\n\n if (password.length >= 8) score += 1;\n if (password.length >= 12) score += 1;\n if (password.length >= 16) score += 1;\n\n if (/[a-z]/.test(password)) score += 1;\n if (/[A-Z]/.test(password)) score += 1;\n if (/[0-9]/.test(password)) score += 1;\n if (/[!@#$%^&*()_+\\-=\\[\\]{}|;:,.<>?]/.test(password)) score += 1;\n\n if (password.length > 8) score += 1;\n if (password.length > 12) score += 1;\n\n const uniqueChars = new Set(password).size;\n if (uniqueChars > 6) score += 1;\n if (uniqueChars > 10) score += 1;\n\n let label: string;\n if (score <= 3) {\n label = \"Weak\";\n feedback.push(\"Add more characters\");\n feedback.push(\"Include uppercase and lowercase letters\");\n } else if (score <= 5) {\n label = \"Fair\";\n feedback.push(\"Add special characters\");\n feedback.push(\"Consider making it longer\");\n } else if (score <= 7) {\n label = \"Good\";\n feedback.push(\"Consider making it longer for extra security\");\n } else {\n label = \"Strong\";\n }\n\n return { score, label, feedback };\n }\n\n setConfig(config: Partial<PasswordPolicyConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): PasswordPolicyConfig {\n return { ...this.config };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api-handler.ts"],"names":[],"mappings":"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","file":"chunk-EQTMBMDR.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\nexport let kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n try {\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);\n }\n\n // Auto-start WebSocket (checks settings.access.apiAccess.wsEnabled internally)\n if (typeof kyroInstance.startWebSocket === \"function\") {\n kyroInstance.startWebSocket().catch((err: any) => {\n console.error(\"[Kyro] WebSocket auto-start failed:\", err);\n });\n }\n\n // Expose instance globally so admin SSR can read DB directly\n (globalThis as any).__KYRO_INSTANCE__ = kyroInstance;\n\n console.log(\"[Kyro API] Backend initialized via Astro Integration\");\n } catch (err) {\n kyroInstance = null;\n initPromise = null;\n console.error(\"[Kyro API] Init failed, will retry:\", err);\n throw err;\n }\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n try {\n await Promise.race([\n initPromise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000)\n ),\n ]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/bootstrap.ts"],"names":[],"mappings":"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","file":"chunk-GAAHG2Z4.js","sourcesContent":["import { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { EmailTransport, type EmailConfig } from \"./nodemailer-transport.js\";\nimport { PasswordPolicy } from \"./security/password-policy.js\";\nimport type { AuthUser, UserRole, AuthAdapter } from \"./types.js\";\n\nexport interface BootstrapConfig {\n authAdapter?: AuthAdapter;\n authDbPath?: string;\n adminEmail: string;\n adminPassword: string;\n adminRole?: string;\n tenantId?: string;\n emailConfig?: EmailConfig;\n sendWelcomeEmail?: boolean;\n}\n\nexport interface BootstrapResult {\n success: boolean;\n user?: AuthUser;\n error?: string;\n}\n\nexport async function bootstrapAdmin(\n config: BootstrapConfig,\n): Promise<BootstrapResult> {\n const {\n adminEmail,\n adminPassword,\n adminRole = \"super_admin\",\n tenantId,\n emailConfig,\n sendWelcomeEmail = false,\n } = config;\n\n const authAdapter =\n config.authAdapter ||\n new SQLiteAuthAdapter({\n path: config.authDbPath || \"./data/auth.db\",\n });\n\n try {\n await authAdapter.connect?.();\n } catch (error) {\n return {\n success: false,\n error: \"Failed to connect to auth storage\",\n };\n }\n\n const passwordPolicy = new PasswordPolicy();\n const passwordValidation = passwordPolicy.validate(adminPassword);\n if (!passwordValidation.valid) {\n await authAdapter.disconnect?.();\n return {\n success: false,\n error: `Invalid password: ${passwordValidation.errors.join(\", \")}`,\n };\n }\n\n const existingUser = await authAdapter.findUserByEmail(adminEmail);\n if (existingUser) {\n await authAdapter.disconnect?.();\n return {\n success: false,\n error: \"Admin user already exists\",\n };\n }\n\n try {\n const user = await authAdapter.createUser({\n email: adminEmail,\n password: adminPassword,\n role: (adminRole as UserRole) || \"admin\",\n tenantId,\n });\n\n if (sendWelcomeEmail && emailConfig) {\n const emailTransport = new EmailTransport(emailConfig);\n const templates = emailTransport.getTemplates();\n const welcomeTemplate = templates.welcome(adminEmail.split(\"@\")[0]);\n await emailTransport.send({\n to: adminEmail,\n ...welcomeTemplate,\n });\n }\n\n await authAdapter.disconnect?.();\n return {\n success: true,\n user,\n };\n } catch (error) {\n await authAdapter.disconnect?.();\n return {\n success: false,\n error:\n error instanceof Error ? error.message : \"Failed to create admin user\",\n };\n }\n}\n\nexport async function checkBootstrapRequired(\n authAdapter: AuthAdapter,\n adminEmail: string,\n): Promise<boolean> {\n const existingUser = await authAdapter.findUserByEmail(adminEmail);\n return !existingUser;\n}\n\nexport function getBootstrapFromEnv(): BootstrapConfig | null {\n const email = process.env.KYRO_ADMIN_EMAIL;\n const password = process.env.KYRO_ADMIN_PASSWORD;\n\n if (!email || !password) {\n return null;\n }\n\n return {\n authDbPath: process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\",\n adminEmail: email,\n adminPassword: password,\n adminRole: process.env.KYRO_ADMIN_ROLE || \"super_admin\",\n tenantId: process.env.KYRO_ADMIN_TENANT_ID,\n emailConfig: process.env.SMTP_HOST\n ? {\n provider: \"smtp\",\n smtp: {\n host: process.env.SMTP_HOST,\n port: parseInt(process.env.SMTP_PORT || \"587\", 10),\n secure: process.env.SMTP_SECURE === \"true\",\n auth: {\n user: process.env.SMTP_USER || \"\",\n pass: process.env.SMTP_PASS || \"\",\n },\n },\n from: process.env.SMTP_FROM || \"noreply@example.com\",\n fromName: process.env.SMTP_FROM_NAME,\n }\n : undefined,\n sendWelcomeEmail: process.env.KYRO_ADMIN_SEND_WELCOME === \"true\",\n };\n}\n\nexport async function autoBootstrap(\n authAdapter?: AuthAdapter,\n): Promise<BootstrapResult | null> {\n const config = getBootstrapFromEnv();\n if (!config) {\n return null;\n }\n\n if (authAdapter) {\n config.authAdapter = authAdapter;\n }\n\n // Check if bootstrap is actually needed before connecting\n try {\n await config.authAdapter?.connect?.();\n const existingUser = await config.authAdapter?.findUserByEmail(config.adminEmail);\n if (existingUser) {\n await config.authAdapter?.disconnect?.();\n return { success: false, error: \"Admin user already exists\" };\n }\n } catch {\n // Connection failed — let bootstrapAdmin handle the error\n }\n\n console.log(\"Auto-bootstrapping admin user...\");\n const result = await bootstrapAdmin(config);\n\n if (result.success) {\n console.log(`Admin user created: ${config.adminEmail}`);\n } else {\n console.error(`Bootstrap failed: ${result.error}`);\n }\n\n return result;\n}\n\nexport async function bootstrapWithRetry(\n config: BootstrapConfig,\n maxRetries: number = 3,\n retryDelayMs: number = 2000,\n): Promise<BootstrapResult> {\n let lastError: string = \"\";\n\n for (let i = 0; i < maxRetries; i++) {\n const result = await bootstrapAdmin(config);\n\n if (result.success) {\n return result;\n }\n\n lastError = result.error || \"Unknown error\";\n\n if (lastError.includes(\"already exists\")) {\n return result;\n }\n\n if (i < maxRetries - 1) {\n await new Promise((resolve) => setTimeout(resolve, retryDelayMs));\n }\n }\n\n return {\n success: false,\n error: `Failed after ${maxRetries} retries: ${lastError}`,\n };\n}\n"]}