@kyro-cms/core 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/{WebhookService-BznDc2AT.d.ts → WebhookService-BCpW2dyL.d.ts} +1 -1
  2. package/dist/{WebhookService-mZZ75syh.d.cts → WebhookService-DxYSFvNg.d.cts} +1 -1
  3. package/dist/api-handler.cjs +52 -0
  4. package/dist/api-handler.cjs.map +1 -0
  5. package/dist/api-handler.d.cts +9 -0
  6. package/dist/api-handler.d.ts +9 -0
  7. package/dist/api-handler.js +46 -0
  8. package/dist/api-handler.js.map +1 -0
  9. package/dist/{base-Hu6ij8sZ.d.ts → base-DvvNqnM-.d.cts} +16 -5
  10. package/dist/{base-Db9LkB1N.d.cts → base-eVegJ_Pr.d.ts} +16 -5
  11. package/dist/bootstrap-DGJ3N7SO.js +6 -0
  12. package/dist/{bootstrap-LL6O7PWO.js.map → bootstrap-DGJ3N7SO.js.map} +1 -1
  13. package/dist/bootstrap-O5UGUTYU.cjs +31 -0
  14. package/dist/{bootstrap-BMWVB2T6.cjs.map → bootstrap-O5UGUTYU.cjs.map} +1 -1
  15. package/dist/{chunk-QKOFKITP.js → chunk-2HFJUUFZ.js} +3 -11
  16. package/dist/chunk-2HFJUUFZ.js.map +1 -0
  17. package/dist/chunk-2SJATAN4.js +5514 -0
  18. package/dist/chunk-2SJATAN4.js.map +1 -0
  19. package/dist/{chunk-DIC236EW.js → chunk-342BJNBI.js} +167 -24
  20. package/dist/chunk-342BJNBI.js.map +1 -0
  21. package/dist/{chunk-OUGKLCYF.js → chunk-3AJE4SEG.js} +4 -3
  22. package/dist/chunk-3AJE4SEG.js.map +1 -0
  23. package/dist/chunk-6LPNEC6D.js +617 -0
  24. package/dist/chunk-6LPNEC6D.js.map +1 -0
  25. package/dist/{chunk-BXMWDUED.js → chunk-A4USRVTQ.js} +2 -2
  26. package/dist/chunk-A4USRVTQ.js.map +1 -0
  27. package/dist/chunk-ADLJSJSN.cjs +13 -0
  28. package/dist/chunk-ADLJSJSN.cjs.map +1 -0
  29. package/dist/chunk-ATBOUGQP.cjs +513 -0
  30. package/dist/chunk-ATBOUGQP.cjs.map +1 -0
  31. package/dist/{chunk-KB6QF4HO.js → chunk-B76I67F3.js} +246 -141
  32. package/dist/chunk-B76I67F3.js.map +1 -0
  33. package/dist/chunk-BQ2T4WRS.js +140 -0
  34. package/dist/chunk-BQ2T4WRS.js.map +1 -0
  35. package/dist/chunk-CZ3HWX2X.cjs +622 -0
  36. package/dist/chunk-CZ3HWX2X.cjs.map +1 -0
  37. package/dist/{chunk-PNBZZ76A.cjs → chunk-DAIBBBOL.cjs} +246 -140
  38. package/dist/chunk-DAIBBBOL.cjs.map +1 -0
  39. package/dist/{chunk-U74F3YZU.js → chunk-DBUYB32X.js} +15 -3
  40. package/dist/chunk-DBUYB32X.js.map +1 -0
  41. package/dist/chunk-DLHUQO25.cjs +1746 -0
  42. package/dist/chunk-DLHUQO25.cjs.map +1 -0
  43. package/dist/{chunk-GE5DMB44.js → chunk-E3BZLMX6.js} +55 -49
  44. package/dist/chunk-E3BZLMX6.js.map +1 -0
  45. package/dist/{chunk-44BF6ALS.cjs → chunk-H4XCAPA6.cjs} +55 -49
  46. package/dist/chunk-H4XCAPA6.cjs.map +1 -0
  47. package/dist/{chunk-VIONYQ2K.cjs → chunk-IBG6V56E.cjs} +16 -32
  48. package/dist/chunk-IBG6V56E.cjs.map +1 -0
  49. package/dist/{chunk-LIJVWQKU.cjs → chunk-IX3ABYKZ.cjs} +43 -31
  50. package/dist/chunk-IX3ABYKZ.cjs.map +1 -0
  51. package/dist/chunk-JYGIFBBS.cjs +146 -0
  52. package/dist/chunk-JYGIFBBS.cjs.map +1 -0
  53. package/dist/{chunk-42JPONZU.cjs → chunk-K7JPTH3G.cjs} +17 -16
  54. package/dist/chunk-K7JPTH3G.cjs.map +1 -0
  55. package/dist/{chunk-RLTG4YZM.cjs → chunk-KOCTZKPV.cjs} +2 -2
  56. package/dist/chunk-KOCTZKPV.cjs.map +1 -0
  57. package/dist/chunk-MMYAIYHJ.cjs +5538 -0
  58. package/dist/chunk-MMYAIYHJ.cjs.map +1 -0
  59. package/dist/{chunk-EWP5AT6A.cjs → chunk-N4H37VN4.cjs} +2 -11
  60. package/dist/chunk-N4H37VN4.cjs.map +1 -0
  61. package/dist/chunk-P2YW545G.js +11 -0
  62. package/dist/chunk-P2YW545G.js.map +1 -0
  63. package/dist/chunk-Q23JB3KL.js +488 -0
  64. package/dist/chunk-Q23JB3KL.js.map +1 -0
  65. package/dist/{chunk-E5X75WNB.js → chunk-QXIQWPAP.js} +14 -30
  66. package/dist/chunk-QXIQWPAP.js.map +1 -0
  67. package/dist/chunk-R3XIBBAW.cjs +34 -0
  68. package/dist/chunk-R3XIBBAW.cjs.map +1 -0
  69. package/dist/{chunk-KWGNR4HM.js → chunk-REK7AYOC.js} +82 -9
  70. package/dist/chunk-REK7AYOC.js.map +1 -0
  71. package/dist/chunk-RGIQKTZ7.js +68 -0
  72. package/dist/chunk-RGIQKTZ7.js.map +1 -0
  73. package/dist/chunk-RYDGMBIG.js +1737 -0
  74. package/dist/chunk-RYDGMBIG.js.map +1 -0
  75. package/dist/chunk-SDMNUYVU.js +30 -0
  76. package/dist/chunk-SDMNUYVU.js.map +1 -0
  77. package/dist/chunk-VEI5KQVC.cjs +1246 -0
  78. package/dist/chunk-VEI5KQVC.cjs.map +1 -0
  79. package/dist/{chunk-FTSSDDZQ.cjs → chunk-VJT6P4N6.cjs} +82 -9
  80. package/dist/chunk-VJT6P4N6.cjs.map +1 -0
  81. package/dist/{chunk-HT6VE4NW.cjs → chunk-W3KPQX7V.cjs} +168 -25
  82. package/dist/chunk-W3KPQX7V.cjs.map +1 -0
  83. package/dist/{chunk-LTRCYJAG.js → chunk-WOWUL7ZY.js} +3 -2
  84. package/dist/chunk-WOWUL7ZY.js.map +1 -0
  85. package/dist/{chunk-7YITG2US.cjs → chunk-WQBRWOQT.cjs} +3 -2
  86. package/dist/chunk-WQBRWOQT.cjs.map +1 -0
  87. package/dist/chunk-X3CU27OO.cjs +78 -0
  88. package/dist/chunk-X3CU27OO.cjs.map +1 -0
  89. package/dist/chunk-XIXGJGQW.js +1228 -0
  90. package/dist/chunk-XIXGJGQW.js.map +1 -0
  91. package/dist/cli/index.cjs +2 -2
  92. package/dist/cli/index.js +2 -2
  93. package/dist/client.cjs +23 -13
  94. package/dist/client.d.cts +4 -2
  95. package/dist/client.d.ts +4 -2
  96. package/dist/client.js +3 -1
  97. package/dist/drizzle/index.cjs +20 -19
  98. package/dist/drizzle/index.d.cts +28 -7
  99. package/dist/drizzle/index.d.ts +28 -7
  100. package/dist/drizzle/index.js +5 -4
  101. package/dist/fields/index.cjs +105 -0
  102. package/dist/fields/index.cjs.map +1 -0
  103. package/dist/fields/index.d.cts +27 -0
  104. package/dist/fields/index.d.ts +27 -0
  105. package/dist/fields/index.js +4 -0
  106. package/dist/fields/index.js.map +1 -0
  107. package/dist/graphql/index.cjs +4 -3
  108. package/dist/graphql/index.d.cts +3 -2
  109. package/dist/graphql/index.d.ts +3 -2
  110. package/dist/graphql/index.js +2 -1
  111. package/dist/{index-Ci6r4xnN.d.ts → index-CLp-DRKA.d.ts} +2 -1
  112. package/dist/{index-11MDNKce.d.cts → index-DfO7G4kN.d.cts} +2 -1
  113. package/dist/index.cjs +2621 -6672
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.d.cts +136 -47
  116. package/dist/index.d.ts +136 -47
  117. package/dist/index.js +2333 -6546
  118. package/dist/index.js.map +1 -1
  119. package/dist/integration.cjs +68 -0
  120. package/dist/integration.cjs.map +1 -0
  121. package/dist/integration.d.cts +27 -0
  122. package/dist/integration.d.ts +27 -0
  123. package/dist/integration.js +61 -0
  124. package/dist/integration.js.map +1 -0
  125. package/dist/mongodb/index.cjs +4 -4
  126. package/dist/mongodb/index.d.cts +20 -6
  127. package/dist/mongodb/index.d.ts +20 -6
  128. package/dist/mongodb/index.js +2 -2
  129. package/dist/postgres-auth-adapter-7F3ECO7I.js +5 -0
  130. package/dist/{postgres-auth-adapter-OTRWSTT5.js.map → postgres-auth-adapter-7F3ECO7I.js.map} +1 -1
  131. package/dist/postgres-auth-adapter-Z463NYJZ.cjs +14 -0
  132. package/dist/{postgres-auth-adapter-EVRPO7BQ.cjs.map → postgres-auth-adapter-Z463NYJZ.cjs.map} +1 -1
  133. package/dist/redis-adapter-LPUWLE4Y.cjs +13 -0
  134. package/dist/{redis-adapter-E7PMN5HW.cjs.map → redis-adapter-LPUWLE4Y.cjs.map} +1 -1
  135. package/dist/redis-adapter-THYDCGQR.js +4 -0
  136. package/dist/{redis-adapter-HOO67RBQ.js.map → redis-adapter-THYDCGQR.js.map} +1 -1
  137. package/dist/rest/index.cjs +8 -5
  138. package/dist/rest/index.d.cts +6 -3
  139. package/dist/rest/index.d.ts +6 -3
  140. package/dist/rest/index.js +6 -3
  141. package/dist/{schema-CNB2DDTX.js → schema-6Q4W6AE6.js} +3 -3
  142. package/dist/{schema-CNB2DDTX.js.map → schema-6Q4W6AE6.js.map} +1 -1
  143. package/dist/{schema-Y777CQQS.cjs → schema-TIYTCIKX.cjs} +14 -14
  144. package/dist/{schema-Y777CQQS.cjs.map → schema-TIYTCIKX.cjs.map} +1 -1
  145. package/dist/templates/index.cjs +27 -23
  146. package/dist/templates/index.d.cts +8 -2
  147. package/dist/templates/index.d.ts +8 -2
  148. package/dist/templates/index.js +1 -1
  149. package/dist/trpc/index.cjs +12 -11
  150. package/dist/trpc/index.d.cts +3 -2
  151. package/dist/trpc/index.d.ts +3 -2
  152. package/dist/trpc/index.js +3 -2
  153. package/dist/{types-kGfsGdos.d.cts → types-Bs1up4yP.d.ts} +76 -244
  154. package/dist/{types-1u353OHN.d.ts → types-Da83JLDk.d.cts} +6 -2
  155. package/dist/{types-1u353OHN.d.cts → types-Da83JLDk.d.ts} +6 -2
  156. package/dist/{types-kGfsGdos.d.ts → types-J3R9nVsZ.d.cts} +76 -244
  157. package/dist/types-VtjUxIMp.d.cts +246 -0
  158. package/dist/types-VtjUxIMp.d.ts +246 -0
  159. package/package.json +16 -9
  160. package/dist/bootstrap-BMWVB2T6.cjs +0 -31
  161. package/dist/bootstrap-LL6O7PWO.js +0 -6
  162. package/dist/chunk-42JPONZU.cjs.map +0 -1
  163. package/dist/chunk-44BF6ALS.cjs.map +0 -1
  164. package/dist/chunk-4M5PHMUE.cjs +0 -947
  165. package/dist/chunk-4M5PHMUE.cjs.map +0 -1
  166. package/dist/chunk-6MSSF46R.js +0 -941
  167. package/dist/chunk-6MSSF46R.js.map +0 -1
  168. package/dist/chunk-7YITG2US.cjs.map +0 -1
  169. package/dist/chunk-BTOE3VUK.js +0 -330
  170. package/dist/chunk-BTOE3VUK.js.map +0 -1
  171. package/dist/chunk-BXMWDUED.js.map +0 -1
  172. package/dist/chunk-DIC236EW.js.map +0 -1
  173. package/dist/chunk-E5X75WNB.js.map +0 -1
  174. package/dist/chunk-E63IF3MD.cjs +0 -951
  175. package/dist/chunk-E63IF3MD.cjs.map +0 -1
  176. package/dist/chunk-EWP5AT6A.cjs.map +0 -1
  177. package/dist/chunk-FTSSDDZQ.cjs.map +0 -1
  178. package/dist/chunk-GE5DMB44.js.map +0 -1
  179. package/dist/chunk-GVFB5C6O.cjs +0 -345
  180. package/dist/chunk-GVFB5C6O.cjs.map +0 -1
  181. package/dist/chunk-HT6VE4NW.cjs.map +0 -1
  182. package/dist/chunk-HVSQDZZJ.cjs +0 -765
  183. package/dist/chunk-HVSQDZZJ.cjs.map +0 -1
  184. package/dist/chunk-HYC4GNHX.js +0 -758
  185. package/dist/chunk-HYC4GNHX.js.map +0 -1
  186. package/dist/chunk-KB6QF4HO.js.map +0 -1
  187. package/dist/chunk-KWGNR4HM.js.map +0 -1
  188. package/dist/chunk-LIJVWQKU.cjs.map +0 -1
  189. package/dist/chunk-LTRCYJAG.js.map +0 -1
  190. package/dist/chunk-OUGKLCYF.js.map +0 -1
  191. package/dist/chunk-PNBZZ76A.cjs.map +0 -1
  192. package/dist/chunk-QKOFKITP.js.map +0 -1
  193. package/dist/chunk-RLTG4YZM.cjs.map +0 -1
  194. package/dist/chunk-RRYXQMZG.js +0 -935
  195. package/dist/chunk-RRYXQMZG.js.map +0 -1
  196. package/dist/chunk-U74F3YZU.js.map +0 -1
  197. package/dist/chunk-VIONYQ2K.cjs.map +0 -1
  198. package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +0 -14
  199. package/dist/postgres-auth-adapter-OTRWSTT5.js +0 -5
  200. package/dist/redis-adapter-E7PMN5HW.cjs +0 -13
  201. package/dist/redis-adapter-HOO67RBQ.js +0 -4
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/rest/auth-middleware.ts","../src/auth/security/in-memory-rate-limit.ts","../src/api/rest/hono-app.ts"],"names":["extractApiKeyFromRequest","validateApiKey","createApiKeyContext","jwt","WEBHOOK_EVENTS","evaluateAccess","hasApiKeyPermission","Hono","collections","EmailTransport"],"mappings":"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","file":"chunk-E63IF3MD.cjs","sourcesContent":["import jwt from \"jsonwebtoken\";\nimport type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\nimport type { BaseAdapter } from \"../../registry/types.js\";\nimport {\n validateApiKey,\n extractApiKeyFromRequest,\n createApiKeyContext,\n hasApiKeyPermission,\n} from \"../../auth/api-key.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n db?: BaseAdapter;\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>;\n extractToken?: (req: Request) => string | null;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n apiKeyContext?: ReturnType<typeof createApiKeyContext>;\n error?: string;\n status: number;\n authType?: \"jwt\" | \"apikey\";\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n db,\n userLookup,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n const apiKeyRaw = extractApiKeyFromRequest(req);\n\n if (apiKeyRaw && db) {\n const result = await validateApiKey(apiKeyRaw, db, userLookup);\n if (result.valid && result.user) {\n return {\n user: result.user,\n tenantContext: createTenantContextFromUser(result.user),\n apiKeyContext: createApiKeyContext(result),\n status: 200,\n authType: \"apikey\",\n };\n }\n if (result.error) {\n return {\n status: 401,\n error: result.error,\n };\n }\n }\n\n const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n authType: \"jwt\",\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport { hasApiKeyPermission };\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\n}\n","import type { RateLimitConfig, RateLimitResult } from \"./rate-limit.js\";\n\nexport class InMemoryRateLimiter {\n private storage: Map<string, { timestamp: number; count: number }[]> =\n new Map();\n private userStorage: Map<\n string,\n Map<string, { timestamp: number; count: number }[]>\n > = new Map();\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n ) {\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${type}:${identifier}`;\n }\n\n private getUserKey(type: string, userId: string, identifier: string): string {\n return `user:${type}:${userId}:${identifier}`;\n }\n\n private cleanupOldEntries(\n entries: { timestamp: number; count: number }[],\n window: number,\n ): void {\n const now = Date.now();\n const windowStart = now - window;\n\n // Remove entries older than the window\n while (entries.length > 0 && entries[0].timestamp < windowStart) {\n entries.shift();\n }\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const userMap = this.userStorage.get(userId);\n let entries: { timestamp: number; count: number }[] = [];\n\n if (userMap) {\n entries = userMap.get(this.getKey(type, identifier)) || [];\n } else {\n // Initialize user storage if not exists\n if (!this.userStorage.has(userId)) {\n this.userStorage.set(userId, new Map());\n }\n this.userStorage.get(userId)!.set(this.getKey(type, identifier), entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n this.storage.delete(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const userMap = this.userStorage.get(userId);\n if (userMap) {\n const key = this.getKey(type, identifier);\n userMap.delete(key);\n }\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createInMemoryRateLimiter(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n) {\n return new InMemoryRateLimiter(limits, userLimits);\n}\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n","import { Hono } from \"hono\";\nimport type {\n BaseAdapter,\n CollectionConfig,\n GlobalConfig,\n} from \"../../registry/types.js\";\nimport { Registry } from \"../../registry/index.js\";\nimport { evaluateAccess } from \"../../access/types.js\";\nimport type { User, Request as KyroRequest } from \"../../hooks/types.js\";\nimport {\n createAuthMiddleware,\n type AuthMiddlewareResult,\n hasApiKeyPermission,\n} from \"./auth-middleware.js\";\nimport {\n createWebhookService,\n WEBHOOK_EVENTS,\n type WebhookEvent,\n} from \"../../webhooks/index.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n authSecret?: string;\n user?: User;\n req?: any;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n settings?: {\n access?: {\n enablePublicAccess?: boolean;\n defaultCollectionAccess?: string;\n apiAccess?: {\n restEnabled?: boolean;\n graphqlEnabled?: boolean;\n trpcEnabled?: boolean;\n websocketEnabled?: boolean;\n requireAuth?: boolean;\n cors?: {\n allowedOrigins?: string[] | string;\n };\n };\n rateLimiting?: {\n enabled?: boolean;\n maxRequests?: number;\n windowMs?: number;\n };\n };\n };\n}\n\nconst COLLECTION_EVENT_MAP: Record<\n string,\n { create: WebhookEvent; update: WebhookEvent; delete: WebhookEvent }\n> = {\n _media: {\n create: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n update: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n delete: WEBHOOK_EVENTS.MEDIA_DELETE,\n },\n};\n\nfunction getWebhookEvent(\n collection: string,\n operation: \"create\" | \"update\" | \"delete\",\n): WebhookEvent {\n const mapped = COLLECTION_EVENT_MAP[collection];\n if (mapped) return mapped[operation];\n return `collection.${operation}` as WebhookEvent;\n}\n\n// ============================================================================\n// Access Check Helper\n// ============================================================================\n\ninterface AccessCheckResult {\n allowed: boolean;\n error?: string;\n status?: number;\n}\n\nasync function checkCollectionAccess(\n collection: CollectionConfig,\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n apiKeyContext?: any,\n enablePublicAccess: boolean = true,\n defaultCollectionAccess: string = \"read\",\n): Promise<AccessCheckResult> {\n const accessRule = collection.access?.[operation];\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n create: operation === \"read\" || operation === \"create\",\n update:\n operation === \"read\" ||\n operation === \"create\" ||\n operation === \"update\",\n admin: true,\n };\n const allowed = enablePublicAccess && accessLevels[defaultCollectionAccess];\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n if (apiKeyContext?.permissions?.length > 0) {\n const resource = collection.slug;\n const action =\n operation === \"read\"\n ? \"read\"\n : operation === \"create\"\n ? \"create\"\n : \"update\";\n const permission = `${resource}:${action}`;\n\n if (\n !hasApiKeyPermission(apiKeyContext.permissions, permission) &&\n !hasApiKeyPermission(apiKeyContext.permissions, `${resource}:admin`)\n ) {\n return {\n allowed: false,\n error: `Missing permission: ${permission}`,\n status: 403,\n };\n }\n }\n\n return { allowed: true };\n}\n\nasync function checkGlobalAccess(\n global: GlobalConfig,\n operation: \"read\" | \"update\",\n req: any,\n ctxUser?: User,\n ctxTenantID?: string,\n enablePublicAccess: boolean = true,\n): Promise<AccessCheckResult> {\n const accessRule = global.access?.[operation];\n\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req,\n user: ctxUser,\n tenantID: ctxTenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n } else if (!ctxUser) {\n const accessLevels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n update: operation === \"read\" || operation === \"update\",\n };\n const allowed =\n enablePublicAccess &&\n accessLevels[operation === \"read\" ? \"read\" : \"admin\"];\n if (!allowed) {\n return {\n allowed: false,\n error: \"Authentication required\",\n status: 401,\n };\n }\n }\n\n return { allowed: true };\n}\n\n// ============================================================================\n// Auth Context Resolution\n// ============================================================================\n\nasync function resolveAuthContext(\n req: globalThis.Request,\n authMw: ReturnType<typeof createAuthMiddleware> | null,\n staticUser?: User,\n staticTenantID?: string,\n): Promise<{\n user: User | undefined;\n tenantID: string | undefined;\n apiKeyContext: any;\n}> {\n if (!authMw) {\n return {\n user: staticUser,\n tenantID: staticTenantID,\n apiKeyContext: undefined,\n };\n }\n\n const result: AuthMiddlewareResult = await authMw(req);\n if (result.status === 401) {\n return { user: undefined, tenantID: undefined, apiKeyContext: undefined };\n }\n\n return {\n user: (result.user as User) || staticUser,\n tenantID: result.tenantContext?.tenantId || staticTenantID,\n apiKeyContext: result.apiKeyContext,\n };\n}\n\n// ============================================================================\n// Hono App Factory\n// ============================================================================\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const {\n registry,\n db,\n authSecret,\n user,\n tenantID,\n cors,\n webhookService,\n settings,\n } = options;\n const app = new Hono();\n\n // Check if REST API is disabled in settings\n const apiAccess = settings?.access?.apiAccess;\n if (apiAccess?.restEnabled === false) {\n app.all(\"/api/*\", (c) => {\n return c.json({ error: \"REST API is disabled\" }, 503);\n });\n return app;\n }\n\n const enablePublicAccess = settings?.access?.enablePublicAccess ?? true;\n const defaultCollectionAccess =\n settings?.access?.defaultCollectionAccess ?? \"read\";\n\n const requireAuth = apiAccess?.requireAuth;\n\n // Require auth secret if requireAuth is enabled in settings\n if (requireAuth && !authSecret) {\n throw new Error(\n \"authSecret is required when requireAuth is enabled in access settings\",\n );\n }\n\n const authMw = authSecret\n ? createAuthMiddleware({ secret: authSecret, db })\n : null;\n\n // CORS middleware\n const settingsCorsRaw = apiAccess?.cors?.allowedOrigins;\n const optionsCors = cors?.origins;\n const settingsCors = Array.isArray(settingsCorsRaw)\n ? settingsCorsRaw\n : typeof settingsCorsRaw === \"string\" && settingsCorsRaw\n ? settingsCorsRaw\n .split(\"\\n\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n : [];\n const allowedOrigins: string[] =\n settingsCors.length > 0 ? settingsCors : optionsCors || [];\n const corsEnabled = allowedOrigins.length > 0 || !!cors;\n\n if (corsEnabled) {\n app.use(\"*\", async (c, next) => {\n const origin = c.req.header(\"Origin\") || \"*\";\n\n if (allowedOrigins.length > 0 && !allowedOrigins.includes(origin)) {\n return c.json({ error: \"Origin not allowed\" }, 403);\n }\n\n const allowOrigin = allowedOrigins.length > 0 ? origin : \"*\";\n c.header(\"Access-Control-Allow-Origin\", allowOrigin);\n c.header(\n \"Access-Control-Allow-Methods\",\n \"GET, POST, PATCH, DELETE, OPTIONS\",\n );\n c.header(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization, X-API-Key\",\n );\n if (cors?.credentials) {\n c.header(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (c.req.method === \"OPTIONS\") {\n return c.text(\"\");\n }\n await next();\n });\n }\n\n // Rate limiting middleware\n const rateLimiting = settings?.access?.rateLimiting;\n let rateLimiter: InMemoryRateLimiter | undefined;\n\n if (rateLimiting?.enabled) {\n const maxRequests = rateLimiting.maxRequests || 100;\n const windowMs = rateLimiting.windowMs || 60000;\n\n rateLimiter = new InMemoryRateLimiter({\n \"api:general\": { window: windowMs, max: maxRequests },\n });\n\n app.use(\"/api/*\", async (c, next) => {\n if (!rateLimiter) {\n return next();\n }\n\n const ip =\n c.req.header(\"CF-Connecting-IP\") ||\n c.req.header(\"X-Forwarded-For\")?.split(\",\")[0]?.trim() ||\n c.req.header(\"X-Real-IP\") ||\n \"unknown\";\n\n const result = await rateLimiter.check(\"api:general\", ip);\n\n c.header(\"X-RateLimit-Limit\", String(maxRequests));\n c.header(\"X-RateLimit-Remaining\", String(result.remaining));\n c.header(\"X-RateLimit-Reset\", String(result.resetAt));\n\n if (!result.allowed) {\n return c.json(\n {\n error: \"Too many requests\",\n retryAfter: result.retryAfter,\n },\n 429,\n );\n }\n\n await next();\n });\n }\n\n // Health check\n app.get(\"/api/health\", (c) => {\n return c.json({\n status: \"ok\",\n version: \"0.1.0\",\n collections: registry.getCollectionSlugs(),\n timestamp: new Date().toISOString(),\n });\n });\n\n // List collections\n app.get(\"/api/collections\", (c) => {\n const collections = registry.getCollections().map((col) => ({\n slug: col.slug,\n label: col.label || col.slug,\n fields: col.fields\n .filter((f) => f.name)\n .map((f) => ({\n name: f.name,\n type: f.type,\n required: f.required,\n label: f.label,\n })),\n }));\n return c.json(collections);\n });\n\n // Global search - searches across all collections, media, and system content\n app.get(\"/api/search\", async (c) => {\n try {\n const query = c.req.query(\"q\") || \"\";\n const collectionsParam = c.req.query(\"collections\") || \"\";\n const limit = Math.min(parseInt(c.req.query(\"limit\") || \"10\"), 50);\n\n if (!query || query.length < 2) {\n return c.json({ results: [], message: \"Query too short\" });\n }\n\n console.log(\"[API /api/search] Query:\", query);\n const { user: ctxUser, tenantID: ctxTenantID } = await resolveAuthContext(\n c.req.raw,\n authMw,\n user,\n tenantID,\n );\n\n const targetCollections = collectionsParam\n ? collectionsParam.split(\",\").filter(Boolean)\n : registry.getCollectionSlugs();\n\n const results: Array<{\n collection: string;\n label: string;\n id: string;\n title: string;\n doc: any;\n }> = [];\n\n const regex = new RegExp(\n query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n \"i\",\n );\n\n for (const collection of registry.getCollections()) {\n if (!targetCollections.includes(collection.slug)) continue;\n if (collection.slug === \"users\") continue;\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n undefined,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) continue;\n\n const searchableFields = collection.fields\n .filter(\n (f) =>\n f.name &&\n f.name !== \"id\" &&\n (f.type === \"text\" ||\n f.type === \"email\" ||\n f.type === \"textarea\" ||\n f.type === \"richtext\" ||\n f.indexed) &&\n !f.admin?.hidden,\n )\n .map((f) => f.name!);\n\n if (searchableFields.length === 0) continue;\n\n try {\n const orConditions: Record<string, any>[] = searchableFields.map(\n (field) => {\n const condition: Record<string, any> = {};\n condition[field] = { like: `%${query}%` };\n return condition;\n },\n );\n\n const searchResult = await db.find({\n collection: collection.slug,\n where: { OR: orConditions },\n limit,\n tenantID: ctxTenantID,\n });\n\n for (const doc of searchResult.docs as any[]) {\n const titleField =\n collection.admin?.useAsTitle ||\n searchableFields.find(\n (f) =>\n f === \"title\" ||\n f === \"name\" ||\n f === \"heading\" ||\n f === \"slug\",\n );\n const title = titleField ? doc[titleField] : doc.id;\n\n results.push({\n collection: collection.slug,\n label: collection.label || collection.slug,\n id: doc.id,\n title: String(title || \"Untitled\"),\n doc,\n });\n }\n } catch (err) {\n console.error(`Search error for ${collection.slug}:`, err);\n }\n }\n\n results.sort((a, b) => a.label.localeCompare(b.label));\n\n return c.json({ results });\n } catch (error: any) {\n return c.json({ error: error.message, results: [] }, 500);\n }\n });\n\n // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n const basePath = `/api/${slug}`;\n\n // GET /api/:collection - List\n app.get(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get(\"page\") || \"1\");\n const limit = Math.min(\n parseInt(url.searchParams.get(\"limit\") || \"10\"),\n 100,\n );\n const sort = url.searchParams.get(\"sort\") || undefined;\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n\n let where = {};\n const whereParam = url.searchParams.get(\"where\");\n if (whereParam) {\n try {\n where = JSON.parse(whereParam);\n } catch {}\n }\n\n const result = await db.find({\n collection: slug,\n where,\n sort,\n limit,\n page,\n depth,\n tenantID: ctxTenantID,\n select,\n });\n\n return c.json(result);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id - Find by ID\n app.get(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const url = new URL(c.req.url);\n const depth = parseInt(url.searchParams.get(\"depth\") || \"0\");\n const select = url.searchParams.get(\"select\")?.split(\",\") || undefined;\n\n const doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID: ctxTenantID,\n select,\n });\n\n if (!doc) {\n return c.json({ error: \"Document not found\" }, 404);\n }\n\n return c.json(doc);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/:collection - Create\n app.post(basePath, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n const schema = registry.getCreateZodSchema(slug);\n const validated = schema.parse(body);\n\n if (collection.tenantScoped && ctxTenantID) {\n validated.tenantID = ctxTenantID;\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"create\"), {\n collection: slug,\n operation: \"create\",\n data: doc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ doc, message: \"Created successfully\" }, 201);\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n return c.json(\n { error: \"Validation failed\", details: error.errors },\n 400,\n );\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/:collection/:id - Update\n app.patch(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n const body = await c.req.json();\n const schema = registry.getUpdateZodSchema(slug);\n const validated = schema.parse(body);\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n const doc = await db.update({\n collection: slug,\n id,\n data: validated,\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"update\"), {\n collection: slug,\n operation: \"update\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ doc, message: \"Updated successfully\" });\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n return c.json(\n { error: \"Validation failed\", details: error.errors },\n 400,\n );\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // DELETE /api/:collection/:id - Delete\n app.delete(`${basePath}/:id`, async (c) => {\n try {\n const {\n user: ctxUser,\n tenantID: ctxTenantID,\n apiKeyContext,\n } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkCollectionAccess(\n collection,\n \"delete\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n apiKeyContext,\n enablePublicAccess,\n defaultCollectionAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const id = c.req.param(\"id\");\n\n const originalDoc = await db.findByID({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID: ctxTenantID,\n });\n\n if (webhookService) {\n webhookService\n .trigger(getWebhookEvent(slug, \"delete\"), {\n collection: slug,\n operation: \"delete\",\n data: doc,\n previousData: originalDoc,\n user: ctxUser\n ? { id: ctxUser.id, email: ctxUser.email, role: ctxUser.role }\n : undefined,\n tenantId: ctxTenantID,\n })\n .catch((err) => console.error(`[Webhook] Failed to trigger:`, err));\n }\n\n return c.json({ doc, message: \"Deleted successfully\" });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n }\n\n // Dynamic global routes\n for (const globalConfig of registry.getGlobals()) {\n const slug = globalConfig.slug;\n const basePath = `/api/globals/${slug}`;\n\n // GET /api/globals/:slug\n app.get(basePath, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"read\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const doc = await db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctxTenantID,\n });\n\n return c.json(doc || {});\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/globals/:slug - Update\n app.post(basePath, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json({ error: access.error }, (access.status || 403) as any);\n }\n\n const body = await c.req.json();\n const schema = registry.getZodSchema(slug);\n const validated = schema.parse(body);\n\n const doc = await db.create({\n collection: `_globals_${slug}`,\n data: { ...validated, id: slug },\n tenantID: ctxTenantID,\n });\n\n return c.json({ doc, message: \"Updated successfully\" });\n } catch (error: any) {\n if (error.name === \"ZodError\") {\n return c.json(\n { error: \"Validation failed\", details: error.errors },\n 400,\n );\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // Special handler for email settings test\n if (slug === \"email-settings\") {\n app.post(`${basePath}/test`, async (c) => {\n try {\n const { user: ctxUser, tenantID: ctxTenantID } =\n await resolveAuthContext(c.req.raw, authMw, user, tenantID);\n\n const access = await checkGlobalAccess(\n globalConfig,\n \"update\",\n c.req.raw,\n ctxUser,\n ctxTenantID,\n enablePublicAccess,\n );\n if (!access.allowed) {\n return c.json(\n { error: access.error },\n (access.status || 403) as any,\n );\n }\n\n const body = await c.req.json();\n\n // Map the raw body to the EmailConfig structure\n // AutoForm sends the same structure as defined in email.ts\n const transportConfig: any = {\n provider: body.provider,\n from: body.fromEmail || body.from,\n fromName: body.fromName,\n replyTo: body.replyTo,\n smtp: body.smtp\n ? {\n host: body.smtp.host,\n port: body.smtp.port,\n secure: body.smtp.secure,\n auth: {\n user: body.smtp.username || body.smtp.user,\n pass: body.smtp.password || body.smtp.pass,\n },\n }\n : undefined,\n resend: body.resend,\n sendgrid: body.sendgrid,\n mailgun: body.mailgun,\n ses: body.ses,\n };\n\n const transport = new EmailTransport(transportConfig);\n\n // Attempt to send a test email\n // The recipient is taken from the form body (testEmailSection.testEmail or testEmail)\n const recipient =\n body.testEmail ||\n (body.testEmailSection && body.testEmailSection.testEmail);\n\n if (!recipient) {\n return c.json({ error: \"No test recipient email provided\" }, 400);\n }\n\n await transport.send({\n to: recipient,\n subject: \"Kyro CMS - Test Email\",\n html: `\n <div style=\"font-family: sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e2e8f0; border-radius: 8px;\">\n <h1 style=\"color: #0b1222; margin-bottom: 16px;\">Success! 🚀</h1>\n <p style=\"font-size: 16px; color: #334155; line-height: 1.6;\">\n Your email settings in <b>Kyro CMS</b> are working correctly.\n </p>\n <div style=\"background: #f8fafc; padding: 16px; border-radius: 6px; margin: 24px 0;\">\n <p style=\"margin: 0; font-size: 14px; color: #64748b;\">\n <b>Provider:</b> ${body.provider.toUpperCase()}\n </p>\n <p style=\"margin: 8px 0 0; font-size: 14px; color: #64748b;\">\n <b>Sent at:</b> ${new Date().toLocaleString()}\n </p>\n </div>\n <p style=\"font-size: 12px; color: #94a3b8; margin-top: 32px; border-top: 1px solid #f1f5f9; padding-top: 16px;\">\n This is a test email sent from the Kyro CMS Admin Panel.\n </p>\n </div>\n `,\n text: `Success! Your email settings in Kyro CMS are working correctly.\\n\\nProvider: ${body.provider}\\nSent at: ${new Date().toLocaleString()}`,\n });\n\n return c.json({ message: \"Test email sent successfully!\" });\n } catch (error: any) {\n console.error(\"[Email Test] Failed:\", error);\n return c.json(\n { error: error.message || \"Failed to send test email\" },\n 500,\n );\n }\n });\n }\n }\n\n return app;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createRESTAPI(\n registry: Registry,\n db: BaseAdapter,\n options?: {\n authSecret?: string;\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n webhookService?: ReturnType<typeof createWebhookService>;\n },\n): Hono {\n return createHonoApp({\n registry,\n db,\n authSecret: options?.authSecret,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n cors: options?.cors,\n webhookService: options?.webhookService,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/styling/index.ts","../src/auth/security/context.ts"],"names":[],"mappings":"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","file":"chunk-EWP5AT6A.cjs","sourcesContent":["// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","export function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/graphql/schema.ts"],"names":["GraphQLString","GraphQLInt","GraphQLFloat","GraphQLBoolean","GraphQLObjectType","GraphQLList","GraphQLNonNull","GraphQLInputObjectType","GraphQLSchema"],"mappings":"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","file":"chunk-FTSSDDZQ.cjs","sourcesContent":["import {\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLString,\n GraphQLInt,\n GraphQLBoolean,\n GraphQLFloat,\n GraphQLList,\n GraphQLNonNull,\n GraphQLInputObjectType,\n type GraphQLFieldConfig,\n type GraphQLType,\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 { evaluateAccess } from \"../../access/types.js\";\nimport type { User, Request } from \"../../hooks/types.js\";\n\n// ============================================================================\n// Field → GraphQL Type Mapping\n// ============================================================================\n\nfunction fieldToGraphQLType(field: Field, registry: Registry): 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; // JSON as string\n case \"relationship\":\n if (typeof field.relationTo === \"string\") {\n const relatedCollection = registry.getCollection(field.relationTo);\n if (relatedCollection) {\n return new GraphQLObjectType({\n name: `${field.relationTo}_ref`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(relatedCollection, registry),\n }),\n });\n }\n }\n return GraphQLString;\n case \"array\":\n return new GraphQLList(GraphQLString); // Simplified\n case \"group\":\n return GraphQLString; // Simplified - JSON string\n case \"blocks\":\n return new GraphQLList(GraphQLString); // Simplified\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): 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 fields[field.name] = {\n type: field.required\n ? new GraphQLNonNull(fieldToGraphQLType(field, registry) as any)\n : (fieldToGraphQLType(field, registry) as any),\n description: field.admin?.description || field.label,\n };\n }\n }\n\n return fields;\n}\n\n// ============================================================================\n// GraphQL Schema Builder\n// ============================================================================\n\nexport interface GraphQLSchemaOptions {\n registry: Registry;\n db: BaseAdapter;\n user?: User;\n req?: Request;\n tenantID?: string;\n settings?: Record<string, any>;\n}\n\nexport function buildGraphQLSchema(\n options: GraphQLSchemaOptions,\n): GraphQLSchema {\n const { registry, db, user, req, tenantID, 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: `${collection.slug.replace(/-/g, \"_\")}_type`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(collection, registry),\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) as any,\n };\n }\n }\n\n collectionInputTypes[collection.slug] = new GraphQLInputObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_input`,\n fields: () => inputFields as any,\n });\n }\n\n // Build global types\n const globalTypes: Record<string, GraphQLObjectType> = {};\n\n for (const global of globals) {\n globalTypes[global.slug] = new GraphQLObjectType({\n name: `${global.slug.replace(/-/g, \"_\")}_global_type`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(\n { slug: global.slug, fields: global.fields } as CollectionConfig,\n registry,\n ),\n }),\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 // FindMany query\n queryFields[`${collection.slug}Find`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_find_result`,\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: GraphQLString },\n sort: { type: GraphQLString },\n limit: { type: GraphQLInt },\n page: { type: GraphQLInt },\n },\n resolve: async (_: any, args: any) => {\n let where = {};\n if (args.where) {\n try {\n where = JSON.parse(args.where);\n } catch {}\n }\n\n return db.find({\n collection: collection.slug,\n where,\n sort: args.sort,\n limit: args.limit || 10,\n page: args.page || 1,\n tenantID,\n });\n },\n };\n\n // FindByID query\n queryFields[`${collection.slug}FindByID`] = {\n type,\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n },\n resolve: async (_: any, args: any) => {\n const doc = await db.findByID({\n collection: collection.slug,\n id: args.id,\n tenantID,\n });\n return doc;\n },\n };\n\n // Count query\n queryFields[`${collection.slug}Count`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_count`,\n fields: {\n totalDocs: { type: GraphQLInt },\n },\n }),\n args: {\n where: { type: GraphQLString },\n },\n resolve: async (_: any, args: any) => {\n let where = {};\n if (args.where) {\n try {\n where = JSON.parse(args.where);\n } catch {}\n }\n const count = await db.count({\n collection: collection.slug,\n where,\n tenantID,\n });\n return { totalDocs: count };\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[`${global.slug}Get`] = {\n type,\n resolve: async () => {\n return db.findOne({\n collection: `_globals_${global.slug}`,\n where: {},\n tenantID,\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[`${collection.slug}Create`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_create_result`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n data: { type: new GraphQLNonNull(inputType) },\n },\n resolve: async (_: any, args: any) => {\n // Validate\n const schema = registry.getCreateZodSchema(collection.slug);\n const validated = schema.parse(args.data);\n\n const doc = await db.create({\n collection: collection.slug,\n data: validated,\n tenantID,\n });\n\n return { doc, message: \"Created successfully\" };\n },\n };\n\n // Update mutation\n mutationFields[`${collection.slug}Update`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_update_result`,\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 },\n resolve: async (_: any, args: any) => {\n // Validate\n const schema = registry.getUpdateZodSchema(collection.slug);\n const validated = schema.parse(args.data);\n\n const doc = await db.update({\n collection: collection.slug,\n id: args.id,\n data: validated,\n tenantID,\n });\n\n return { doc, message: \"Updated successfully\" };\n },\n };\n\n // Delete mutation\n mutationFields[`${collection.slug}Delete`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_delete_result`,\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) => {\n const doc = await db.delete({\n collection: collection.slug,\n id: args.id,\n tenantID,\n });\n\n return { doc, message: \"Deleted successfully\" };\n },\n };\n }\n\n const Mutation = new GraphQLObjectType({\n name: \"Mutation\",\n fields: mutationFields,\n });\n\n return new GraphQLSchema({\n query: Query,\n mutation: Mutation,\n });\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createGraphQLSchema(\n registry: Registry,\n db: BaseAdapter,\n options?: {\n user?: User;\n req?: Request;\n tenantID?: string;\n },\n): GraphQLSchema {\n return buildGraphQLSchema({\n registry,\n db,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/redis-adapter.ts"],"names":[],"mappings":"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","file":"chunk-GE5DMB44.js","sourcesContent":["import { Redis } from \"ioredis\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\nimport bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\n\nexport interface RedisAuthAdapterOptions {\n url?: string;\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n keyPrefix?: string;\n tokenExpiration?: number;\n refreshTokenExpiration?: number;\n tls?: boolean;\n}\n\nconst DEFAULT_PREFIX = \"kyro:auth:\";\nconst DEFAULT_TOKEN_EXPIRATION = 86400;\nconst DEFAULT_REFRESH_EXPIRATION = 604800;\n\nexport class RedisAuthAdapter implements AuthAdapter {\n private redis: Redis;\n private prefix: string;\n private tokenExpiration: number;\n private refreshExpiration: number;\n\n constructor(options: RedisAuthAdapterOptions = {}) {\n const url =\n options.url ||\n `redis://${options.host || \"localhost\"}:${options.port || 6379}`;\n\n this.redis = new Redis(url, {\n password: options.password,\n db: options.db,\n lazyConnect: true,\n tls: options.tls ? {} : undefined,\n });\n\n this.prefix = options.keyPrefix || DEFAULT_PREFIX;\n this.tokenExpiration = options.tokenExpiration || DEFAULT_TOKEN_EXPIRATION;\n this.refreshExpiration =\n options.refreshTokenExpiration || DEFAULT_REFRESH_EXPIRATION;\n }\n\n async connect(): Promise<void> {\n await this.redis.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.redis.quit();\n }\n\n private userKey(userId: string): string {\n return `${this.prefix}users:${userId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `${this.prefix}sessions:${sessionId}`;\n }\n\n private refreshKey(token: string): string {\n return `${this.prefix}refresh:${token}`;\n }\n\n private userByEmailKey(email: string): string {\n return `${this.prefix}users:email:${email.toLowerCase()}`;\n }\n\n private passwordHistoryKey(userId: string): string {\n return `${this.prefix}users:${userId}:password_history`;\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n const pipeline = this.redis.pipeline();\n\n pipeline.hset(this.userKey(userId), this.userToHash(user));\n pipeline.set(this.userByEmailKey(data.email), userId);\n\n await pipeline.exec();\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = await this.redis.get(\n this.userByEmailKey(email.toLowerCase()),\n );\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n const data = await this.redis.hgetall(this.userKey(userId));\n if (!data || Object.keys(data).length === 0) return null;\n return this.hashToUser(data);\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n if (data.email && data.email !== existing.email) {\n const pipeline = this.redis.pipeline();\n pipeline.del(this.userByEmailKey(existing.email));\n pipeline.set(this.userByEmailKey(data.email), userId);\n await pipeline.exec();\n }\n\n await this.redis.hset(this.userKey(userId), this.userToHash(updated));\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n const pipeline = this.redis.pipeline();\n pipeline.del(this.userKey(userId));\n pipeline.del(this.userByEmailKey(user.email));\n pipeline.del(this.passwordHistoryKey(userId));\n await pipeline.exec();\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const userId = await this.redis.get(this.userByEmailKey(email));\n if (!userId) return null;\n const user = await this.findUserById(userId);\n if (!user || !user.passwordHash) return null;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(\n now.getTime() + this.tokenExpiration * 1000,\n ).toISOString(),\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n const pipeline = this.redis.pipeline();\n\n pipeline.hset(this.sessionKey(sessionId), this.sessionToHash(session));\n pipeline.setex(\n this.refreshKey(refreshToken),\n this.refreshExpiration,\n sessionId,\n );\n\n await pipeline.exec();\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n const data = await this.redis.hgetall(this.sessionKey(token));\n if (!data || Object.keys(data).length === 0) return null;\n return this.hashToSession(data);\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = await this.redis.hgetall(this.sessionKey(sessionId));\n if (!session || Object.keys(session).length === 0) return false;\n\n const pipeline = this.redis.pipeline();\n pipeline.del(this.sessionKey(sessionId));\n if (session.refreshToken) {\n pipeline.del(this.refreshKey(session.refreshToken));\n }\n await pipeline.exec();\n\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n const pattern = `${this.prefix}sessions:*`;\n let cursor = \"0\";\n let deleted = 0;\n\n do {\n const [nextCursor, keys] = await this.redis.scan(\n cursor,\n \"MATCH\",\n pattern,\n \"COUNT\",\n 100,\n );\n cursor = nextCursor;\n\n for (const key of keys) {\n const sessionData = await this.redis.hgetall(key);\n if (sessionData.userId === userId) {\n const sessionId = key.replace(`${this.prefix}sessions:`, \"\");\n await this.deleteSession(sessionId);\n deleted++;\n }\n }\n } while (cursor !== \"0\");\n\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n await this.redis.lpush(this.passwordHistoryKey(userId), passwordHash);\n await this.redis.ltrim(this.passwordHistoryKey(userId), 0, 4);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.redis.lrange(this.passwordHistoryKey(userId), 0, count - 1);\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n\n return false;\n }\n\n private userToHash(user: AuthUser): Record<string, string> {\n const hash: Record<string, string> = {\n id: user.id,\n email: user.email,\n passwordHash: user.passwordHash || \"\",\n role: user.role,\n createdAt: user.createdAt,\n updatedAt: user.updatedAt,\n };\n\n if (user.tenantId) hash.tenantId = user.tenantId;\n if (user.emailVerified !== undefined)\n hash.emailVerified = String(user.emailVerified);\n if (user.locked !== undefined) hash.locked = String(user.locked);\n if (user.lastLogin) hash.lastLogin = user.lastLogin;\n if (user.failedLoginAttempts !== undefined)\n hash.failedLoginAttempts = String(user.failedLoginAttempts);\n\n return hash;\n }\n\n private hashToUser(hash: Record<string, string>): AuthUser {\n return {\n id: hash.id,\n email: hash.email,\n passwordHash: hash.passwordHash,\n role: hash.role as UserRole,\n tenantId: hash.tenantId,\n createdAt: hash.createdAt,\n updatedAt: hash.updatedAt,\n emailVerified: hash.emailVerified === \"true\",\n locked: hash.locked === \"true\",\n lastLogin: hash.lastLogin,\n failedLoginAttempts: hash.failedLoginAttempts\n ? parseInt(hash.failedLoginAttempts, 10)\n : 0,\n };\n }\n\n private sessionToHash(session: Session): Record<string, string> {\n const hash: Record<string, string> = {\n id: session.id,\n userId: session.userId,\n token: session.token,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n };\n\n if (session.refreshToken) hash.refreshToken = session.refreshToken;\n if (session.ipAddress) hash.ipAddress = session.ipAddress;\n if (session.userAgent) hash.userAgent = session.userAgent;\n\n return hash;\n }\n\n private hashToSession(hash: Record<string, string>): Session {\n return {\n id: hash.id,\n userId: hash.userId,\n token: hash.token,\n refreshToken: hash.refreshToken,\n expiresAt: hash.expiresAt,\n createdAt: hash.createdAt,\n ipAddress: hash.ipAddress,\n userAgent: hash.userAgent,\n };\n }\n\n private auditLogKey(id: string): string {\n return `${this.prefix}audit:logs:${id}`;\n }\n\n private auditLogIndexKey(): string {\n return `${this.prefix}audit:index`;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n const indexKey = this.auditLogIndexKey();\n const allIds = await this.redis.zrevrange(indexKey, 0, -1);\n const total = allIds.length;\n\n const pagedIds = allIds.slice(offset, offset + limit);\n const logs: any[] = [];\n\n for (const id of pagedIds) {\n const logData = await this.redis.get(this.auditLogKey(id));\n if (logData) {\n const log = JSON.parse(logData);\n if (\n (!filter.userId || log.userId === filter.userId) &&\n (!filter.action ||\n (Array.isArray(filter.action)\n ? filter.action.includes(log.action)\n : log.action === filter.action)) &&\n (!filter.resource || log.resource === filter.resource) &&\n (filter.success === undefined || log.success === filter.success)\n ) {\n logs.push({ ...log, timestamp: new Date(log.timestamp) });\n }\n }\n }\n\n return { logs, total };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n await this.redis.set(this.auditLogKey(id), JSON.stringify(log));\n await this.redis.zadd(this.auditLogIndexKey(), Date.now(), id);\n const count = await this.redis.zcard(this.auditLogIndexKey());\n if (count > 10000) {\n const oldIds = await this.redis.zrange(\n this.auditLogIndexKey(),\n 0,\n count - 10001,\n );\n for (const oldId of oldIds) {\n await this.redis.del(this.auditLogKey(oldId));\n await this.redis.zrem(this.auditLogIndexKey(), oldId);\n }\n }\n return log;\n }\n}\n"]}