@kyro-cms/core 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/README.md +57 -589
  2. package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-CUTb9XOy.d.ts} +1 -1
  3. package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-Yg2UEOB4.d.cts} +1 -1
  4. package/dist/api-handler-graphql.cjs +44 -0
  5. package/dist/api-handler-graphql.cjs.map +1 -0
  6. package/dist/api-handler-graphql.d.cts +6 -0
  7. package/dist/api-handler-graphql.d.ts +6 -0
  8. package/dist/api-handler-graphql.js +41 -0
  9. package/dist/api-handler-graphql.js.map +1 -0
  10. package/dist/api-handler-trpc.cjs +38 -0
  11. package/dist/api-handler-trpc.cjs.map +1 -0
  12. package/dist/api-handler-trpc.d.cts +5 -0
  13. package/dist/api-handler-trpc.d.ts +5 -0
  14. package/dist/api-handler-trpc.js +36 -0
  15. package/dist/api-handler-trpc.js.map +1 -0
  16. package/dist/api-handler.cjs +31 -97
  17. package/dist/api-handler.cjs.map +1 -1
  18. package/dist/api-handler.d.cts +2 -1
  19. package/dist/api-handler.d.ts +2 -1
  20. package/dist/api-handler.js +19 -95
  21. package/dist/api-handler.js.map +1 -1
  22. package/dist/{tenant-B1YB0Jy8.d.ts → base-B71y_EAF.d.cts} +6 -12
  23. package/dist/{tenant-Cpeveji6.d.cts → base-DaqY2GhA.d.ts} +6 -12
  24. package/dist/bootstrap-5NLASFOG.cjs +32 -0
  25. package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-5NLASFOG.cjs.map} +1 -1
  26. package/dist/bootstrap-T5BK77LD.js +7 -0
  27. package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-T5BK77LD.js.map} +1 -1
  28. package/dist/{chunk-35U3FROB.js → chunk-22M4O4ZJ.js} +607 -63
  29. package/dist/chunk-22M4O4ZJ.js.map +1 -0
  30. package/dist/chunk-2HZRBATX.cjs +253 -0
  31. package/dist/chunk-2HZRBATX.cjs.map +1 -0
  32. package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
  33. package/dist/chunk-3HR772HI.cjs.map +1 -0
  34. package/dist/chunk-3KTWGODI.cjs +178 -0
  35. package/dist/chunk-3KTWGODI.cjs.map +1 -0
  36. package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
  37. package/dist/chunk-3UK5XBVJ.js.map +1 -0
  38. package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
  39. package/dist/chunk-4AO3A3JM.js.map +1 -0
  40. package/dist/chunk-4M7X5HAB.cjs +173 -0
  41. package/dist/chunk-4M7X5HAB.cjs.map +1 -0
  42. package/dist/chunk-5EPFQUQD.js +3243 -0
  43. package/dist/chunk-5EPFQUQD.js.map +1 -0
  44. package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
  45. package/dist/chunk-7OGPN7MP.js.map +1 -0
  46. package/dist/{chunk-WOWUL7ZY.js → chunk-AL5KX63J.js} +4 -3
  47. package/dist/chunk-AL5KX63J.js.map +1 -0
  48. package/dist/{chunk-2OL4O2TH.cjs → chunk-C36TMDTY.cjs} +66 -61
  49. package/dist/chunk-C36TMDTY.cjs.map +1 -0
  50. package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
  51. package/dist/chunk-CF7OL6HR.js.map +1 -0
  52. package/dist/chunk-CJONKRHJ.js +162 -0
  53. package/dist/chunk-CJONKRHJ.js.map +1 -0
  54. package/dist/{chunk-2KVHZE6O.cjs → chunk-COIASRDK.cjs} +202 -46
  55. package/dist/chunk-COIASRDK.cjs.map +1 -0
  56. package/dist/chunk-DEVFAKCQ.cjs +3291 -0
  57. package/dist/chunk-DEVFAKCQ.cjs.map +1 -0
  58. package/dist/{chunk-3ZFYL34R.js → chunk-DYTZ6FQ7.js} +12 -185
  59. package/dist/chunk-DYTZ6FQ7.js.map +1 -0
  60. package/dist/{chunk-QPPDLRNR.js → chunk-EJN2PAOE.js} +197 -41
  61. package/dist/chunk-EJN2PAOE.js.map +1 -0
  62. package/dist/chunk-FAXU7BMP.js +220 -0
  63. package/dist/chunk-FAXU7BMP.js.map +1 -0
  64. package/dist/{chunk-OHVB4AJ7.js → chunk-FOPGUM27.js} +22 -17
  65. package/dist/chunk-FOPGUM27.js.map +1 -0
  66. package/dist/chunk-GAOXD3XT.js +175 -0
  67. package/dist/chunk-GAOXD3XT.js.map +1 -0
  68. package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
  69. package/dist/chunk-GXFOGU7N.cjs.map +1 -0
  70. package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
  71. package/dist/chunk-IDVRRRAK.cjs.map +1 -0
  72. package/dist/{chunk-WQBRWOQT.cjs → chunk-JOPVMWTM.cjs} +3 -2
  73. package/dist/chunk-JOPVMWTM.cjs.map +1 -0
  74. package/dist/chunk-KC2GDBLS.cjs +84 -0
  75. package/dist/chunk-KC2GDBLS.cjs.map +1 -0
  76. package/dist/{chunk-K7JPTH3G.cjs → chunk-KNRSROWB.cjs} +132 -74
  77. package/dist/chunk-KNRSROWB.cjs.map +1 -0
  78. package/dist/{chunk-3AJE4SEG.js → chunk-KPA4AN4R.js} +125 -67
  79. package/dist/chunk-KPA4AN4R.js.map +1 -0
  80. package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
  81. package/dist/chunk-L46ROHUS.cjs.map +1 -0
  82. package/dist/chunk-L4EZKIEX.js +185 -0
  83. package/dist/chunk-L4EZKIEX.js.map +1 -0
  84. package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
  85. package/dist/chunk-L5UKKZQN.js.map +1 -0
  86. package/dist/chunk-NKPKR5BW.cjs +188 -0
  87. package/dist/chunk-NKPKR5BW.cjs.map +1 -0
  88. package/dist/{chunk-Y3QQN7PN.js → chunk-P2HKJ7P5.js} +13 -4
  89. package/dist/chunk-P2HKJ7P5.js.map +1 -0
  90. package/dist/{chunk-SA7NSSIQ.cjs → chunk-PI73NNOK.cjs} +13 -187
  91. package/dist/chunk-PI73NNOK.cjs.map +1 -0
  92. package/dist/{chunk-HXRD4B37.js → chunk-PU2Z5VWF.js} +1279 -556
  93. package/dist/chunk-PU2Z5VWF.js.map +1 -0
  94. package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
  95. package/dist/chunk-Q72BOAPK.js.map +1 -0
  96. package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
  97. package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
  98. package/dist/{chunk-YVUJBEXE.cjs → chunk-RAMGUDJN.cjs} +16 -7
  99. package/dist/chunk-RAMGUDJN.cjs.map +1 -0
  100. package/dist/{chunk-LINKCEG4.cjs → chunk-ROJHKAQ4.cjs} +617 -73
  101. package/dist/chunk-ROJHKAQ4.cjs.map +1 -0
  102. package/dist/{chunk-5KVM3WEY.cjs → chunk-RSF3UU7H.cjs} +1330 -602
  103. package/dist/chunk-RSF3UU7H.cjs.map +1 -0
  104. package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
  105. package/dist/chunk-SHTTJMLT.cjs.map +1 -0
  106. package/dist/chunk-SPBTLUN6.js +92 -0
  107. package/dist/chunk-SPBTLUN6.js.map +1 -0
  108. package/dist/{chunk-57P6MJKC.js → chunk-TXSZFA4G.js} +3 -3
  109. package/dist/chunk-TXSZFA4G.js.map +1 -0
  110. package/dist/chunk-UERVXYVK.cjs +99 -0
  111. package/dist/chunk-UERVXYVK.cjs.map +1 -0
  112. package/dist/{chunk-PDYFVNUX.cjs → chunk-V2TVSCV5.cjs} +16 -23
  113. package/dist/chunk-V2TVSCV5.cjs.map +1 -0
  114. package/dist/{chunk-DXHRBMGB.js → chunk-VO35MNPH.js} +12 -19
  115. package/dist/chunk-VO35MNPH.js.map +1 -0
  116. package/dist/{chunk-IA6AU5PI.cjs → chunk-WNCYAKF3.cjs} +3 -3
  117. package/dist/chunk-WNCYAKF3.cjs.map +1 -0
  118. package/dist/chunk-XEB7PH2E.js +81 -0
  119. package/dist/chunk-XEB7PH2E.js.map +1 -0
  120. package/dist/cli/index.cjs +5 -5
  121. package/dist/cli/index.cjs.map +1 -1
  122. package/dist/cli/index.js +5 -5
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/client.cjs +3 -3
  125. package/dist/client.d.cts +3 -3
  126. package/dist/client.d.ts +3 -3
  127. package/dist/client.js +1 -1
  128. package/dist/drizzle/index.cjs +14 -13
  129. package/dist/drizzle/index.d.cts +9 -7
  130. package/dist/drizzle/index.d.ts +9 -7
  131. package/dist/drizzle/index.js +5 -4
  132. package/dist/fields/index.cjs +21 -37
  133. package/dist/fields/index.d.cts +2 -22
  134. package/dist/fields/index.d.ts +2 -22
  135. package/dist/fields/index.js +1 -1
  136. package/dist/graphql/index.cjs +5 -4
  137. package/dist/graphql/index.d.cts +5 -3
  138. package/dist/graphql/index.d.ts +5 -3
  139. package/dist/graphql/index.js +3 -2
  140. package/dist/index-CJXPB_ot.d.ts +276 -0
  141. package/dist/index-CaTNnLGd.d.cts +276 -0
  142. package/dist/index.cjs +304 -162
  143. package/dist/index.cjs.map +1 -1
  144. package/dist/index.d.cts +129 -205
  145. package/dist/index.d.ts +129 -205
  146. package/dist/index.js +172 -33
  147. package/dist/index.js.map +1 -1
  148. package/dist/integration.cjs +2 -2
  149. package/dist/integration.js +1 -1
  150. package/dist/mongo-auth-adapter-ISOM7FSS.cjs +17 -0
  151. package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-ISOM7FSS.cjs.map} +1 -1
  152. package/dist/mongo-auth-adapter-MO6STCV3.js +4 -0
  153. package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-MO6STCV3.js.map} +1 -1
  154. package/dist/mongodb/index.cjs +8 -7
  155. package/dist/mongodb/index.d.cts +5 -7
  156. package/dist/mongodb/index.d.ts +5 -7
  157. package/dist/mongodb/index.js +4 -3
  158. package/dist/postgres-auth-adapter-DWDR7P5G.js +5 -0
  159. package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-DWDR7P5G.js.map} +1 -1
  160. package/dist/postgres-auth-adapter-WRWSJD4E.cjs +14 -0
  161. package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-WRWSJD4E.cjs.map} +1 -1
  162. package/dist/redis-adapter-HGTPWIGV.js +4 -0
  163. package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-HGTPWIGV.js.map} +1 -1
  164. package/dist/redis-adapter-KJ3YOOT6.cjs +13 -0
  165. package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-KJ3YOOT6.cjs.map} +1 -1
  166. package/dist/rest/index.cjs +15 -14
  167. package/dist/rest/index.d.cts +4 -4
  168. package/dist/rest/index.d.ts +4 -4
  169. package/dist/rest/index.js +13 -12
  170. package/dist/{schema-5PHL5IVB.js → schema-6I5OFR4Z.js} +3 -3
  171. package/dist/{schema-5PHL5IVB.js.map → schema-6I5OFR4Z.js.map} +1 -1
  172. package/dist/{schema-37SE2F4B.cjs → schema-TTFE4467.cjs} +14 -14
  173. package/dist/{schema-37SE2F4B.cjs.map → schema-TTFE4467.cjs.map} +1 -1
  174. package/dist/sqlite-adapter-6GEUSVXQ.js +4 -0
  175. package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-6GEUSVXQ.js.map} +1 -1
  176. package/dist/sqlite-adapter-CSIZE5SX.cjs +13 -0
  177. package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-CSIZE5SX.cjs.map} +1 -1
  178. package/dist/templates/index.cjs +133 -31
  179. package/dist/templates/index.d.cts +52 -9
  180. package/dist/templates/index.d.ts +52 -9
  181. package/dist/templates/index.js +3 -1
  182. package/dist/trpc/index.cjs +13 -12
  183. package/dist/trpc/index.d.cts +55 -49
  184. package/dist/trpc/index.d.ts +55 -49
  185. package/dist/trpc/index.js +4 -3
  186. package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
  187. package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
  188. package/dist/{types-Bs1up4yP.d.ts → types-CyCQ6SAI.d.ts} +28 -2
  189. package/dist/{types-J3R9nVsZ.d.cts → types-DJxD9394.d.cts} +28 -2
  190. package/dist/{types-VtjUxIMp.d.cts → types-Z6FBiqa2.d.cts} +35 -14
  191. package/dist/{types-VtjUxIMp.d.ts → types-Z6FBiqa2.d.ts} +35 -14
  192. package/package.json +22 -4
  193. package/dist/bootstrap-AKAUP6F6.cjs +0 -32
  194. package/dist/bootstrap-JCML6NFO.js +0 -7
  195. package/dist/chunk-2KVHZE6O.cjs.map +0 -1
  196. package/dist/chunk-2OL4O2TH.cjs.map +0 -1
  197. package/dist/chunk-35U3FROB.js.map +0 -1
  198. package/dist/chunk-3AJE4SEG.js.map +0 -1
  199. package/dist/chunk-3J4MFTI3.js +0 -3872
  200. package/dist/chunk-3J4MFTI3.js.map +0 -1
  201. package/dist/chunk-3ZFYL34R.js.map +0 -1
  202. package/dist/chunk-4DA7QPLA.cjs.map +0 -1
  203. package/dist/chunk-57P6MJKC.js.map +0 -1
  204. package/dist/chunk-5KVM3WEY.cjs.map +0 -1
  205. package/dist/chunk-6IMPH6WV.cjs +0 -3897
  206. package/dist/chunk-6IMPH6WV.cjs.map +0 -1
  207. package/dist/chunk-ATBOUGQP.cjs +0 -513
  208. package/dist/chunk-ATBOUGQP.cjs.map +0 -1
  209. package/dist/chunk-DXHRBMGB.js.map +0 -1
  210. package/dist/chunk-ES5HNFFT.js.map +0 -1
  211. package/dist/chunk-FXYP2HA6.js.map +0 -1
  212. package/dist/chunk-H727JIG7.js.map +0 -1
  213. package/dist/chunk-HXRD4B37.js.map +0 -1
  214. package/dist/chunk-I7HHI6QV.cjs.map +0 -1
  215. package/dist/chunk-IA6AU5PI.cjs.map +0 -1
  216. package/dist/chunk-IBG6V56E.cjs.map +0 -1
  217. package/dist/chunk-K7JPTH3G.cjs.map +0 -1
  218. package/dist/chunk-LINKCEG4.cjs.map +0 -1
  219. package/dist/chunk-OHVB4AJ7.js.map +0 -1
  220. package/dist/chunk-PDYFVNUX.cjs.map +0 -1
  221. package/dist/chunk-Q23JB3KL.js +0 -488
  222. package/dist/chunk-Q23JB3KL.js.map +0 -1
  223. package/dist/chunk-QPPDLRNR.js.map +0 -1
  224. package/dist/chunk-QUW2RZTM.cjs.map +0 -1
  225. package/dist/chunk-QXIQWPAP.js.map +0 -1
  226. package/dist/chunk-R3XIBBAW.cjs +0 -34
  227. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  228. package/dist/chunk-REK7AYOC.js.map +0 -1
  229. package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
  230. package/dist/chunk-SDMNUYVU.js +0 -30
  231. package/dist/chunk-SDMNUYVU.js.map +0 -1
  232. package/dist/chunk-V3LKPM3O.cjs.map +0 -1
  233. package/dist/chunk-VJT6P4N6.cjs.map +0 -1
  234. package/dist/chunk-WOWUL7ZY.js.map +0 -1
  235. package/dist/chunk-WQBRWOQT.cjs.map +0 -1
  236. package/dist/chunk-Y3N7UUDO.js.map +0 -1
  237. package/dist/chunk-Y3QQN7PN.js.map +0 -1
  238. package/dist/chunk-YVUJBEXE.cjs.map +0 -1
  239. package/dist/index-CLp-DRKA.d.ts +0 -64
  240. package/dist/index-DfO7G4kN.d.cts +0 -64
  241. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
  242. package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
  243. package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
  244. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
  245. package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
  246. package/dist/redis-adapter-VQXD7ESY.js +0 -4
  247. package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
  248. package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/types.ts","../src/plugins/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts","../src/lib/seo.ts","../src/lib/storage/browser.ts","../src/lib/storage/encryption.ts","../src/lib/storage/node.ts","../src/lib/storage/factory.ts","../src/index.ts"],"names":["RedisAuthAdapter","getEncryptionKey","crypto","createStorage"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type { CollectionConfig, GlobalConfig } from \"../registry/types.js\";\nimport type { Field } from \"../fields/types.js\";\nimport type { Hook } from \"../hooks/types.js\";\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (\n slug: string,\n extension: Partial<CollectionConfig>,\n ) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super(\"seo\");\n this.description =\n \"Advanced SEO features including sitemaps, robots.txt, and structured data\";\n\n this.collections.push({\n slug: \"seo-settings\",\n label: \"SEO Settings\",\n fields: [\n {\n name: \"sitemap\",\n type: \"checkbox\",\n label: \"Enable Sitemap\",\n defaultValue: true,\n },\n { name: \"robotsTxt\", type: \"richtext\", label: \"robots.txt Content\" },\n {\n name: \"canonicalUrl\",\n type: \"text\",\n variant: \"url\" as any,\n label: \"Canonical URL\",\n },\n { name: \"ogImage\", type: \"text\", label: \"Default OG Image URL\" },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super(\"analytics\");\n this.description =\n \"Analytics integration for tracking page views and events\";\n\n this.collections.push({\n slug: \"analytics-events\",\n label: \"Analytics Events\",\n fields: [\n { name: \"name\", type: \"text\", required: true },\n { name: \"properties\", type: \"json\", label: \"Event Properties\" },\n { name: \"timestamp\", type: \"date\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"sessionId\", type: \"text\", label: \"Session ID\" },\n ],\n });\n\n this.adminComponents[\"AnalyticsDashboard\"] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super(\"comments\");\n this.description = \"Commenting system for products and posts\";\n\n this.collections.push({\n slug: \"comments\",\n label: \"Comments\",\n fields: [\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"text\", required: true },\n { name: \"email\", type: \"email\" },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"parent\", type: \"text\", label: \"Parent Comment ID\" },\n { name: \"resourceType\", type: \"text\", required: true },\n { name: \"resourceId\", type: \"text\", required: true },\n ],\n });\n\n this.adminComponents[\"CommentModeration\"] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super(\"reviews\");\n this.description = \"Product reviews and ratings\";\n\n this.collections.push({\n slug: \"reviews\",\n label: \"Reviews\",\n fields: [\n { name: \"rating\", type: \"number\", required: true, min: 1, max: 5 },\n { name: \"title\", type: \"text\" },\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"relationship\", relationTo: \"customers\" },\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n required: true,\n },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"verified\", type: \"checkbox\", label: \"Verified Purchase\" },\n {\n name: \"helpful\",\n type: \"number\",\n label: \"Helpful Count\",\n defaultValue: 0,\n },\n ],\n });\n\n this.adminComponents[\"ReviewModeration\"] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super(\"wishlist\");\n this.description = \"Customer wishlists\";\n\n this.collections.push({\n slug: \"wishlists\",\n label: \"Wishlists\",\n fields: [\n {\n name: \"customer\",\n type: \"relationship\",\n relationTo: \"customers\",\n required: true,\n },\n {\n name: \"name\",\n type: \"text\",\n label: \"Wishlist Name\",\n defaultValue: \"My Wishlist\",\n },\n {\n name: \"items\",\n type: \"blocks\",\n label: \"Items\",\n blocks: [\n {\n slug: \"wishlist-item\",\n label: \"Item\",\n fields: [\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n },\n { name: \"quantity\", type: \"number\", defaultValue: 1 },\n { name: \"addedAt\", type: \"date\" },\n {\n name: \"priority\",\n type: \"select\",\n options: [\n { label: \"Low\", value: \"low\" },\n { label: \"Medium\", value: \"medium\" },\n { label: \"High\", value: \"high\" },\n ],\n },\n ],\n },\n ],\n },\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","import type { Redis } from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import type { Redis } from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map();\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map();\n private emailVerificationTokens: Map<string, { userId: string; expiresAt: Date }> = new Map();\n private passwordResetTokens: Map<string, { userId: string; expiresAt: Date }> = new Map();\n private auditLogs: Array<Record<string, unknown>> = [];\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user || !user.passwordHash) return null;\n const bcrypt = (await import(\"bcryptjs\")).default;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n const sessionId = this.refreshTokens.get(refreshToken);\n if (!sessionId) return null;\n const session = this.sessions.get(sessionId);\n return session || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async createEmailVerificationToken(userId: string): Promise<{ token: string; expiresAt: Date }> {\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);\n this.emailVerificationTokens.set(token, { userId, expiresAt });\n return { token, expiresAt };\n }\n\n async verifyEmailToken(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n const data = this.emailVerificationTokens.get(token);\n if (!data || data.expiresAt < new Date()) {\n this.emailVerificationTokens.delete(token);\n return { success: false, error: \"Invalid or expired token\" };\n }\n this.emailVerificationTokens.delete(token);\n return { success: true, userId: data.userId };\n }\n\n async createPasswordResetToken(email: string): Promise<{ token: string; expiresAt: Date; error?: string }> {\n const user = await this.findUserByEmail(email);\n if (!user) {\n return { token: \"\", expiresAt: new Date(), error: \"User not found\" };\n }\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000);\n this.passwordResetTokens.set(token, { userId: user.id, expiresAt });\n return { token, expiresAt };\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n const data = this.passwordResetTokens.get(token);\n if (!data || data.expiresAt < new Date()) {\n this.passwordResetTokens.delete(token);\n return { success: false, error: \"Invalid or expired token\" };\n }\n const passwordHash = await this.hashPassword(newPassword);\n await this.updateUser(data.userId, { passwordHash });\n this.passwordResetTokens.delete(token);\n return { success: true };\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n let logs = this.auditLogs.slice().reverse();\n if (filter.userId) logs = logs.filter((l) => l.userId === filter.userId);\n if (filter.action) {\n if (Array.isArray(filter.action)) {\n logs = logs.filter((l) => filter.action!.includes(String(l.action)));\n } else {\n logs = logs.filter((l) => l.action === filter.action);\n }\n }\n if (filter.resource)\n logs = logs.filter((l) => l.resource === filter.resource);\n if (filter.success !== undefined)\n logs = logs.filter((l) => l.success === filter.success);\n return { logs: logs.slice(offset, offset + limit), total: logs.length };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n this.auditLogs.push(log);\n return log;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { PostgresAuthAdapter } from \"../database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAuthAdapter } from \"../database/mongodb/mongo-auth-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\nimport { readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? join(cwd, \"..\") : cwd;\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"auth.db\");\n\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"postgres\": {\n try {\n const databaseUrl = getEnv(\"DATABASE_URL\", \"\");\n if (databaseUrl) {\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const postgres = await import(\"postgres\");\n const sql = postgres.default(databaseUrl, { onnotice: () => {} });\n const drizzleDb = drizzle(sql);\n return new PostgresAuthAdapter({ db: drizzleDb });\n }\n } catch (e) {\n console.warn(\"[Auth] Could not create PostgresAuthAdapter, falling back to SQLite auth adapter.\");\n }\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"mongodb\": {\n try {\n const mongoUri = getEnv(\"MONGODB_URI\", \"\");\n if (mongoUri) {\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(mongoUri);\n await client.connect();\n const url = new URL(mongoUri);\n const dbName = url.pathname.replace(/^\\//, \"\") || \"kyro_cms\";\n const mongoDb = client.db(dbName);\n return new MongoDBAuthAdapter({ db: mongoDb });\n }\n } catch (e) {\n console.warn(\"[Auth] Could not create MongoDBAuthAdapter, falling back to SQLite auth adapter.\");\n }\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const email = EmailTransport.fromEnv() || undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"APP_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nexport const authConfig = createAuthConfig().catch((err) => {\n console.warn(\"[AuthConfig] Failed to initialize auth config:\", err.message);\n return null as any;\n});\n","import type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\nimport type * as jwt from \"jsonwebtoken\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const user = await this.adapter.createUser({\n email: data.email,\n password: data.password,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.verifyPassword(\n credentials.email,\n credentials.password,\n );\n if (!user) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const decoded = jwtModule.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n user.email,\n currentPassword,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n await this.adapter.updateUser(userId, { password: newPassword });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.updateUser(user.id, { password: newPassword });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async sendEmailVerification(userId: string): Promise<{ success: boolean; error?: string }> {\n try {\n const { token, expiresAt } = await this.adapter.createEmailVerificationToken(userId);\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyEmail(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n try {\n return await this.adapter.verifyEmailToken(token);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async requestPasswordReset(email: string): Promise<{ success: boolean; error?: string }> {\n try {\n const result = await this.adapter.createPasswordResetToken(email);\n if (result.error) {\n return { success: false, error: result.error };\n }\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n try {\n return await this.adapter.resetPasswordWithToken(token, newPassword);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = await this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private async generateToken(user: AuthUser): Promise<string> {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwtModule.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n const { default: bcrypt } = await import(\"bcryptjs\");\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n bootstrapWithRetry,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n","export interface SeoTagsOptions {\n siteSettings: any;\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n}\n\n/**\n * Generates standard SEO meta tags based on global site settings and page overrides.\n */\nexport function generateSeoTags(options: SeoTagsOptions): string {\n const { siteSettings, title, description, image, url } = options;\n \n if (!siteSettings) return '';\n\n const siteName = siteSettings.siteName || '';\n const finalTitle = title ? `${title} | ${siteName}` : siteName;\n const finalDesc = description || siteSettings.siteDescription || '';\n const finalImage = image || (siteSettings.siteOgImage?.url) || '';\n const finalUrl = url || siteSettings.siteUrl || '';\n \n let tags = `\n <title>${finalTitle}</title>\n <meta name=\"description\" content=\"${finalDesc}\">\n `;\n\n if (siteSettings.siteFavicon?.url) {\n tags += `\\n <link rel=\"icon\" type=\"${siteSettings.siteFavicon.mimeType || 'image/x-icon'}\" href=\"${siteSettings.siteFavicon.url}\">`;\n }\n\n // Open Graph\n tags += `\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"${finalTitle}\">\n <meta property=\"og:description\" content=\"${finalDesc}\">\n <meta property=\"og:site_name\" content=\"${siteName}\">\n `;\n\n if (finalUrl) tags += `\\n <meta property=\"og:url\" content=\"${finalUrl}\">`;\n if (finalImage) tags += `\\n <meta property=\"og:image\" content=\"${finalImage}\">`;\n\n // Twitter\n tags += `\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:title\" content=\"${finalTitle}\">\n <meta name=\"twitter:description\" content=\"${finalDesc}\">\n `;\n\n if (finalImage) tags += `\\n <meta name=\"twitter:image\" content=\"${finalImage}\">`;\n\n // I18n\n if (siteSettings.enableI18n && siteSettings.i18n?.language) {\n tags += `\\n <meta http-equiv=\"content-language\" content=\"${siteSettings.i18n.language}\">`;\n }\n\n return tags;\n}\n\n/**\n * Generates analytics script tags based on global site settings.\n */\nexport function generateAnalyticsTags(siteSettings: any): string {\n if (!siteSettings || !siteSettings.analyticsEnabled || !siteSettings.analytics) {\n return '';\n }\n\n const { googleAnalyticsId, googleTagManagerId, plausibleDomain } = siteSettings.analytics;\n let scripts = '';\n\n if (googleAnalyticsId) {\n scripts += `\n <!-- Google Analytics -->\n <script async src=\"https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsId}\"></script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${googleAnalyticsId}');\n </script>\n `;\n }\n\n if (googleTagManagerId) {\n scripts += `\n <!-- Google Tag Manager -->\n <script>\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','${googleTagManagerId}');\n </script>\n `;\n }\n\n if (plausibleDomain) {\n scripts += `\n <!-- Plausible Analytics -->\n <script defer data-domain=\"${plausibleDomain}\" src=\"https://plausible.io/js/script.js\"></script>\n `;\n }\n\n return scripts;\n}\n","import { createStorage } from \"unstorage\";\nimport indexedbDriver from \"unstorage/drivers/indexedb\";\n\nexport interface BrowserStorageOptions {\n namespace?: string;\n ttl?: number;\n}\n\nexport async function createBrowserStorage(\n options: BrowserStorageOptions = {},\n): Promise<{\n storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> };\n cleanup?: () => Promise<void>;\n}> {\n const { namespace = \"kyro\", ttl } = options;\n\n const store = createStorage({\n driver: indexedbDriver({\n dbName: \"kyro-cms\",\n storeName: namespace,\n }),\n });\n\n const prefix = namespace ? `${namespace}:` : \"\";\n\n const storage = {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n };\n\n return {\n storage,\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import crypto from 'crypto';\n\nconst DEFAULT_ALGORITHM = 'AES-256-GCM';\n\nexport function getEncryptionOptions(secret?: string, algorithm?: string) {\n return {\n key: getEncryptionKey(secret),\n algorithm: algorithm || DEFAULT_ALGORITHM,\n };\n}\n\nexport function getEncryptionKey(secret?: string): string {\n const appSecret = secret || process.env.APP_SECRET || process.env.AUTH_SECRET || 'development-secret-key';\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}\n\nexport function hashData(data: string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function generateSessionId(): string {\n return crypto.randomUUID();\n}","import path from \"path\";\nimport { getEncryptionKey } from \"./encryption.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\nimport crypto from \"crypto\";\n\nexport interface NodeStorageOptions {\n adapter?: \"fs\";\n connectionString?: string;\n namespace?: string;\n ttl?: number;\n encryption?: boolean;\n secret?: string;\n basePath?: string;\n}\n\nfunction encrypt(text: string, key: string): string {\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n let encrypted = cipher.update(text, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const authTag = cipher.getAuthTag().toString(\"hex\");\n return `${iv.toString(\"hex\")}:${authTag}:${encrypted}`;\n}\n\nfunction decrypt(encryptedText: string, key: string): string {\n const [ivHex, authTagHex, encrypted] = encryptedText.split(\":\");\n const iv = Buffer.from(ivHex, \"hex\");\n const authTag = Buffer.from(authTagHex, \"hex\");\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n decipher.setAuthTag(authTag);\n let decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n}\n\nexport async function createNodeStorage(\n options: NodeStorageOptions = {}\n): Promise<{ storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> }; cleanup?: () => Promise<void> }> {\n const {\n namespace = \"kyro\",\n ttl,\n encryption = true,\n secret,\n basePath,\n } = options;\n\n const defaultPath = basePath\n ? path.join(basePath, \".astro\", \"kyro.json\")\n : path.join(process.cwd(), \".astro\", \"kyro.json\");\n\n const store = createStorage({\n driver: fsDriver({ base: defaultPath }),\n });\n\n const encKey = encryption ? getEncryptionKey(secret) : null;\n const prefix = namespace ? `${namespace}:` : \"\";\n\n return {\n storage: {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const data = encKey ? decrypt(raw, encKey) : raw;\n const parsed = JSON.parse(data);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, encKey ? encrypt(data, encKey) : data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n },\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import type { StorageConfig, StorageAdapter, CreateStorageResult } from './types.js';\nimport { createBrowserStorage } from './browser.js';\nimport { createNodeStorage } from './node.js';\nimport { getEncryptionKey } from './encryption.js';\n\nexport type { StorageConfig, StorageAdapter, Environment, EncryptionConfig } from './types.js';\nexport { getEncryptionKey } from './encryption.js';\n\nexport async function createStorage(config: StorageConfig): Promise<CreateStorageResult & { storage: _StateStorage }> {\n const { environment, adapter, connectionString, encryption } = config;\n\n const secret = process.env.APP_SECRET || process.env.AUTH_SECRET;\n\n const encryptionOptions = {\n enabled: encryption?.enabled ?? true,\n algorithm: encryption?.algorithm,\n };\n\n if (environment === 'browser') {\n return createBrowserStorage({\n namespace: 'kyro',\n });\n }\n\n return createNodeStorage({\n adapter: (adapter || 'fs') as \"fs\",\n connectionString,\n namespace: 'kyro',\n encryption: encryptionOptions.enabled,\n secret,\n });\n}\n\ntype _StateStorage = {\n getItem: (name: string) => string | null | Promise<string | null>;\n setItem: (name: string, value: string) => void | Promise<void>;\n removeItem: (name: string) => void | Promise<void>;\n};\n\nexport function createSyncStorage(config: StorageConfig): _StateStorage {\n const { environment } = config;\n\n if (typeof globalThis !== 'undefined' && (globalThis as any).window || environment === 'browser') {\n return {\n getItem: (name: string): string | null => {\n try {\n return localStorage.getItem(name);\n } catch {\n return null;\n }\n },\n setItem: (name: string, value: string): void => {\n try {\n localStorage.setItem(name, value);\n } catch (e) {\n console.error('Failed to save to localStorage:', e);\n }\n },\n removeItem: (name: string): void => {\n try {\n localStorage.removeItem(name);\n } catch (e) {\n console.error('Failed to remove from localStorage:', e);\n }\n },\n };\n }\n\n return {\n getItem: async (): Promise<string | null> => null,\n setItem: async (): Promise<void> => {},\n removeItem: async (): Promise<void> => {},\n };\n}\n\nexport async function createAuthStorage(config: StorageConfig): Promise<CreateStorageResult> {\n const storageConfig: StorageConfig = {\n ...config,\n encryption: {\n enabled: true,\n algorithm: config.encryption?.algorithm,\n },\n };\n\n return createStorage(storageConfig);\n}\n\nexport { createBrowserStorage } from './browser.js';\nexport { createNodeStorage } from './node.js';\n","// ============================================================================\n// @kyro-cms/core\n// Astro-native headless CMS with multi-database, multi-protocol, multi-vendor\n// ============================================================================\n\n// Main Factory\nexport { Kyro, createKyro } from \"./createKyro.js\";\n\n// Registry\nexport {\n Registry,\n getRegistry,\n resetRegistry,\n createRegistry,\n} from \"./registry/index.js\";\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n AdminConfig,\n UploadConfig,\n ImageSize,\n VersionConfig,\n AuthConfig,\n BaseAdapter,\n AdapterConfig,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from \"./registry/types.js\";\nexport {\n validateConfig,\n validateCollection,\n validateGlobal,\n validateFields,\n ConfigValidationError,\n} from \"./registry/validator.js\";\nexport {\n collectionToZod,\n collectionToCreateZod,\n collectionToUpdateZod,\n collectionToWhereZod,\n globalToZod,\n fieldToZod,\n} from \"./registry/zod-builder.js\";\n\n// Fields\nexport type {\n Field,\n FieldType,\n BaseField,\n FieldAdmin,\n ValidateOptions,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n ImageField,\n RichTextField,\n RichTextBlock,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n Block,\n RowField,\n CollapsibleField,\n TabsField,\n} from \"./fields/index.js\";\nexport {\n normalizeRichTextDocument,\n normalizeRichTextValue,\n renderRichText,\n richTextStyles,\n createColumnsNode,\n isTextField,\n isNumberField,\n isRelationshipField,\n isArrayField,\n isGroupField,\n isBlocksField,\n isUploadField,\n isImageField,\n isRichTextField,\n isSelectField,\n isLayoutField,\n PRIMITIVE_FIELD_TYPES,\n COMPLEX_FIELD_TYPES,\n RELATIONAL_FIELD_TYPES,\n LAYOUT_FIELD_TYPES,\n ALL_FIELD_TYPES,\n} from \"./fields/index.js\";\n\n// Access Control\nexport type {\n AccessControl,\n AccessArgs,\n WhereClause,\n CollectionAccess,\n GlobalAccess,\n FieldAccess,\n} from \"./access/index.js\";\nexport {\n evaluateAccess,\n mergeWhereClauses,\n getWhereClause,\n} from \"./access/index.js\";\n\n// Hooks\nexport type {\n Hook,\n HookArgs,\n CollectionHooks,\n FieldHooks,\n GlobalHooks,\n Request,\n User,\n} from \"./hooks/index.js\";\nexport { runHooks, runFieldHooks } from \"./hooks/index.js\";\n\n// Database Adapters\nexport { AbstractBaseAdapter } from \"./database/index.js\";\nexport type {\n DatabaseType as DbAdapterType,\n DatabaseConnectionOptions,\n DrizzleAdapterOptions,\n MongoDBAdapterOptions,\n AdapterOptions,\n} from \"./database/index.js\";\nexport {\n DrizzleAdapter,\n createDrizzleAdapter,\n fieldToDrizzleType,\n collectionToDrizzleSchema,\n} from \"./database/index.js\";\nexport { MongoDBAdapter, createMongoDBAdapter } from \"./database/index.js\";\nexport { LocalAdapter, createLocalAdapter } from \"./database/index.js\";\n\n// API Gateways\nexport {\n createContext,\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n createDynamicRouter,\n createKyroServer,\n} from \"./api/index.js\";\nexport { buildGraphQLSchema, createGraphQLSchema } from \"./api/index.js\";\nexport { createHonoApp, createRESTAPI } from \"./api/index.js\";\nexport {\n PubSub,\n KyroPubSub,\n KyroWSServer,\n createWSServer,\n} from \"./api/index.js\";\n\n// Plugin System\nexport {\n KyroPlugin,\n PluginManager,\n type PluginHooks,\n type PluginAPI,\n SEOPLugin,\n AnalyticsPlugin,\n CommentsPlugin,\n ReviewsPlugin,\n WishlistPlugin,\n presetPlugins,\n} from \"./plugins/index.js\";\n\n// Styling System\nexport {\n type StylingMode,\n type StylingConfig,\n type ThemeConfig,\n type ThemeColors,\n type ThemeFonts,\n type ThemeSpacing,\n type ThemeBorderRadius,\n type ThemeShadows,\n type FieldStyling,\n type AdminStylingConfig,\n CSSGenerator,\n generateTailwindConfig,\n generateCSSVariables,\n defaultLightTheme,\n defaultDarkTheme,\n ecommerce2026Theme,\n createAdminStyling,\n defaultFieldStyling,\n} from \"./styling/index.js\";\n\n// Authentication\nexport {\n Auth,\n createAuth,\n RedisAuthAdapter,\n InMemoryAuthAdapter,\n EmailTransport,\n AuditLogger,\n InMemoryAuditLogger,\n createAuditContext,\n PasswordPolicy,\n AccountLockout,\n InMemoryAccountLockout,\n RateLimiter,\n InMemoryRateLimiter,\n createAuthConfig,\n authConfig,\n} from \"./auth/index.js\";\nexport type {\n KyroAuthConfig,\n DatabaseType,\n AuthUser,\n UserRole,\n Session as AuthSession,\n Session,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n AuthAdapter,\n AuthTokenConfig,\n AuditLog,\n AuditAction,\n AuditLogFilter,\n} from \"./auth/index.js\";\n\nexport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\n\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n bootstrapWithRetry,\n} from \"./auth/bootstrap.js\";\n\n// Version History & Draft/Publish\nexport {\n VersionManager,\n createVersionManager,\n isPublished,\n isDraft,\n isArchived,\n type Version,\n type VersionStatus,\n type VersionDiff,\n type VersionAdapter,\n type CreateVersionOptions,\n type PublishVersionOptions,\n type CompareVersionsOptions,\n type VersionHistoryOptions,\n type DraftPublishConfig,\n type VersionPublishSchedule,\n getDefaultDraftPublishConfig,\n} from \"./versions/index.js\";\n\n// Zod re-export\nexport { z } from \"zod\";\n\n// Database - Drizzle (auth extensions)\nexport { PostgresAuthAdapter } from \"./database/drizzle/index.js\";\nexport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\nexport {\n createDatabase,\n runMigrations,\n seedDefaultRoles,\n type Dialect,\n} from \"./database/drizzle/index.js\";\n\n// Media Service\nexport { MediaService } from \"./storage/MediaService.js\";\nexport { resolveProvider, createLocalStorage } from \"./storage/index.js\";\n\n// Webhooks\nexport {\n WebhookService,\n createWebhookService,\n deliverWebhook,\n deliverWithRetry,\n signPayload,\n generateWebhookSecret,\n buildDeliveryRecord,\n createTestPayload,\n WEBHOOK_EVENTS,\n ALL_WEBHOOK_EVENTS,\n type WebhookEvent,\n type WebhookConfig,\n type CreateWebhookData,\n type UpdateWebhookData,\n type WebhookPayload,\n type WebhookDelivery,\n type WebhookTriggerResult,\n WEBHOOK_COLLECTION,\n WEBHOOK_DELIVERY_COLLECTION,\n type DeliveryResult,\n type DeliveryOptions,\n} from \"./webhooks/index.js\";\n\n// Templates\nexport {\n ecommerceCollections,\n ecommerceGlobals,\n blogCollections,\n blogGlobals,\n minimalCollections,\n kitchenSinkCollections,\n mediaCollections,\n allSettingsGlobals,\n coreSettingsGlobals,\n createTemplateConfig,\n} from \"./templates/index\";\nexport type { TemplateConfig } from \"./templates/index\";\n\n// Configuration Service\nexport {\n ConfigService,\n type StorageConfig,\n type EmailConfig,\n} from \"./config/ConfigService.js\";\n\n// Configuration Helper\nexport { defineConfig } from \"./registry/config.js\";\n\n// Astro Integration\nexport { default as kyro } from \"./integration.js\";\n\n// SEO & Analytics Helpers\nexport { generateSeoTags, generateAnalyticsTags, type SeoTagsOptions } from \"./lib/seo.js\";\n\n// Storage\nexport {\n createStorage,\n createAuthStorage,\n} from \"./lib/storage/index.js\";\nexport type {\n StorageAdapter,\n Environment,\n EncryptionConfig,\n StorageOptions,\n CreateStorageResult,\n} from \"./lib/storage/index.js\";\n\n// Secret Management\nexport {\n setDbAdapter,\n loadSecrets,\n getAppSecret,\n getEncryptionKey,\n getSessionConfig,\n} from \"./lib/secret.js\";\n"]}
1
+ {"version":3,"sources":["../src/hooks/types.ts","../src/plugins/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts","../src/lib/seo.ts","../src/lib/social.ts","../src/lib/store.ts","../src/lib/payment.ts","../src/lib/storage/browser.ts","../src/lib/storage/encryption.ts","../src/lib/storage/node.ts","../src/lib/storage/factory.ts","../src/index.ts"],"names":["RedisAuthAdapter","getEncryptionKey","crypto","createStorage"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type { CollectionConfig, GlobalConfig } from \"../registry/types.js\";\nimport type { Field } from \"../fields/types.js\";\nimport type { Hook } from \"../hooks/types.js\";\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (\n slug: string,\n extension: Partial<CollectionConfig>,\n ) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super(\"seo\");\n this.description =\n \"Advanced SEO features including sitemaps, robots.txt, and structured data\";\n\n this.collections.push({\n slug: \"seo-settings\",\n label: \"SEO Settings\",\n fields: [\n {\n name: \"sitemap\",\n type: \"checkbox\",\n label: \"Enable Sitemap\",\n defaultValue: true,\n },\n { name: \"robotsTxt\", type: \"richtext\", label: \"robots.txt Content\" },\n {\n name: \"canonicalUrl\",\n type: \"text\",\n variant: \"url\" as any,\n label: \"Canonical URL\",\n },\n { name: \"ogImage\", type: \"text\", label: \"Default OG Image URL\" },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super(\"analytics\");\n this.description =\n \"Analytics integration for tracking page views and events\";\n\n this.collections.push({\n slug: \"analytics-events\",\n label: \"Analytics Events\",\n fields: [\n { name: \"name\", type: \"text\", required: true },\n { name: \"properties\", type: \"json\", label: \"Event Properties\" },\n { name: \"timestamp\", type: \"date\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"sessionId\", type: \"text\", label: \"Session ID\" },\n ],\n });\n\n this.adminComponents[\"AnalyticsDashboard\"] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super(\"comments\");\n this.description = \"Commenting system for products and posts\";\n\n this.collections.push({\n slug: \"comments\",\n label: \"Comments\",\n fields: [\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"text\", required: true },\n { name: \"email\", type: \"email\" },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"parent\", type: \"text\", label: \"Parent Comment ID\" },\n { name: \"resourceType\", type: \"text\", required: true },\n { name: \"resourceId\", type: \"text\", required: true },\n ],\n });\n\n this.adminComponents[\"CommentModeration\"] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super(\"reviews\");\n this.description = \"Product reviews and ratings\";\n\n this.collections.push({\n slug: \"reviews\",\n label: \"Reviews\",\n fields: [\n { name: \"rating\", type: \"number\", required: true, min: 1, max: 5 },\n { name: \"title\", type: \"text\" },\n { name: \"content\", type: \"richtext\", required: true },\n { name: \"author\", type: \"relationship\", relationTo: \"customers\" },\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n required: true,\n },\n { name: \"approved\", type: \"checkbox\", defaultValue: false },\n { name: \"verified\", type: \"checkbox\", label: \"Verified Purchase\" },\n {\n name: \"helpful\",\n type: \"number\",\n label: \"Helpful Count\",\n defaultValue: 0,\n },\n ],\n });\n\n this.adminComponents[\"ReviewModeration\"] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super(\"wishlist\");\n this.description = \"Customer wishlists\";\n\n this.collections.push({\n slug: \"wishlists\",\n label: \"Wishlists\",\n fields: [\n {\n name: \"customer\",\n type: \"relationship\",\n relationTo: \"customers\",\n required: true,\n },\n {\n name: \"name\",\n type: \"text\",\n label: \"Wishlist Name\",\n defaultValue: \"My Wishlist\",\n },\n {\n name: \"items\",\n type: \"blocks\",\n label: \"Items\",\n blocks: [\n {\n slug: \"wishlist-item\",\n label: \"Item\",\n fields: [\n {\n name: \"product\",\n type: \"relationship\",\n relationTo: \"products\",\n },\n { name: \"quantity\", type: \"number\", defaultValue: 1 },\n { name: \"addedAt\", type: \"date\" },\n {\n name: \"priority\",\n type: \"select\",\n options: [\n { label: \"Low\", value: \"low\" },\n { label: \"Medium\", value: \"medium\" },\n { label: \"High\", value: \"high\" },\n ],\n },\n ],\n },\n ],\n },\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","import type { Redis } from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import type { Redis } from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map();\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map();\n private emailVerificationTokens: Map<string, { userId: string; expiresAt: Date }> = new Map();\n private passwordResetTokens: Map<string, { userId: string; expiresAt: Date }> = new Map();\n private auditLogs: Array<Record<string, unknown>> = [];\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n password: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n const passwordHash = await this.hashPassword(data.password);\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(\n email: string,\n password: string,\n ): Promise<AuthUser | null> {\n const user = await this.findUserByEmail(email);\n if (!user || !user.passwordHash) return null;\n const bcrypt = (await import(\"bcryptjs\")).default;\n const valid = await bcrypt.compare(password, user.passwordHash);\n return valid ? user : null;\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n const sessionId = this.refreshTokens.get(refreshToken);\n if (!sessionId) return null;\n const session = this.sessions.get(sessionId);\n return session || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async createEmailVerificationToken(userId: string): Promise<{ token: string; expiresAt: Date }> {\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);\n this.emailVerificationTokens.set(token, { userId, expiresAt });\n return { token, expiresAt };\n }\n\n async verifyEmailToken(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n const data = this.emailVerificationTokens.get(token);\n if (!data || data.expiresAt < new Date()) {\n this.emailVerificationTokens.delete(token);\n return { success: false, error: \"Invalid or expired token\" };\n }\n this.emailVerificationTokens.delete(token);\n return { success: true, userId: data.userId };\n }\n\n async createPasswordResetToken(email: string): Promise<{ token: string; expiresAt: Date; error?: string }> {\n const user = await this.findUserByEmail(email);\n if (!user) {\n return { token: \"\", expiresAt: new Date(), error: \"User not found\" };\n }\n const token = randomBytes(32).toString(\"hex\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000);\n this.passwordResetTokens.set(token, { userId: user.id, expiresAt });\n return { token, expiresAt };\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n const data = this.passwordResetTokens.get(token);\n if (!data || data.expiresAt < new Date()) {\n this.passwordResetTokens.delete(token);\n return { success: false, error: \"Invalid or expired token\" };\n }\n const passwordHash = await this.hashPassword(newPassword);\n await this.updateUser(data.userId, { passwordHash });\n this.passwordResetTokens.delete(token);\n return { success: true };\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n\n async findAuditLogs(filter: {\n userId?: string;\n action?: string | string[];\n resource?: string;\n success?: boolean;\n limit?: number;\n offset?: number;\n }): Promise<{ logs: any[]; total: number }> {\n const { limit = 50, offset = 0 } = filter;\n let logs = this.auditLogs.slice().reverse();\n if (filter.userId) logs = logs.filter((l) => l.userId === filter.userId);\n if (filter.action) {\n if (Array.isArray(filter.action)) {\n logs = logs.filter((l) => filter.action!.includes(String(l.action)));\n } else {\n logs = logs.filter((l) => l.action === filter.action);\n }\n }\n if (filter.resource)\n logs = logs.filter((l) => l.resource === filter.resource);\n if (filter.success !== undefined)\n logs = logs.filter((l) => l.success === filter.success);\n return { logs: logs.slice(offset, offset + limit), total: logs.length };\n }\n\n async createAuditLog(data: any): Promise<any> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n const log = { ...data, id, timestamp };\n this.auditLogs.push(log);\n return log;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { PostgresAuthAdapter } from \"../database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAuthAdapter } from \"../database/mongodb/mongo-auth-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\nimport { readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n const cwd = process.cwd();\n const rootDir = cwd.endsWith(\"admin\") ? join(cwd, \"..\") : cwd;\n const defaultAuthDbPath = resolve(rootDir, \"data\", \"auth.db\");\n\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n case \"postgres\": {\n try {\n const databaseUrl = getEnv(\"DATABASE_URL\", \"\");\n if (databaseUrl) {\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const postgres = await import(\"postgres\");\n const sql = postgres.default(databaseUrl, { onnotice: () => {} });\n const drizzleDb = drizzle(sql);\n return new PostgresAuthAdapter({ db: drizzleDb });\n }\n } catch (e) {\n console.warn(\"[Auth] Could not create PostgresAuthAdapter, falling back to SQLite auth adapter.\");\n }\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"mongodb\": {\n try {\n const mongoUri = getEnv(\"MONGODB_URI\", \"\");\n if (mongoUri) {\n const { MongoClient } = await import(\"mongodb\");\n const client = new MongoClient(mongoUri);\n await client.connect();\n const url = new URL(mongoUri);\n const dbName = url.pathname.replace(/^\\//, \"\") || \"kyro_cms\";\n const mongoDb = client.db(dbName);\n return new MongoDBAuthAdapter({ db: mongoDb });\n }\n } catch (e) {\n console.warn(\"[Auth] Could not create MongoDBAuthAdapter, falling back to SQLite auth adapter.\");\n }\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", defaultAuthDbPath),\n });\n }\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n db?: any,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const email = db\n ? (await EmailTransport.fromConfig(db).catch(() => null)) || EmailTransport.fromEnv() || undefined\n : EmailTransport.fromEnv() || undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"APP_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nexport const authConfig = createAuthConfig().catch((err) => {\n console.warn(\"[AuthConfig] Failed to initialize auth config:\", err.message);\n return null as any;\n});\n","import type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\nimport type * as jwt from \"jsonwebtoken\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const user = await this.adapter.createUser({\n email: data.email,\n password: data.password,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.verifyPassword(\n credentials.email,\n credentials.password,\n );\n if (!user) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const decoded = jwtModule.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n user.email,\n currentPassword,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n await this.adapter.updateUser(userId, { password: newPassword });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.updateUser(user.id, { password: newPassword });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async sendEmailVerification(userId: string): Promise<{ success: boolean; error?: string }> {\n try {\n const { token, expiresAt } = await this.adapter.createEmailVerificationToken(userId);\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyEmail(token: string): Promise<{ success: boolean; userId?: string; error?: string }> {\n try {\n return await this.adapter.verifyEmailToken(token);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async requestPasswordReset(email: string): Promise<{ success: boolean; error?: string }> {\n try {\n const result = await this.adapter.createPasswordResetToken(email);\n if (result.error) {\n return { success: false, error: result.error };\n }\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPasswordWithToken(token: string, newPassword: string): Promise<{ success: boolean; error?: string }> {\n try {\n return await this.adapter.resetPasswordWithToken(token, newPassword);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = await this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private async generateToken(user: AuthUser): Promise<string> {\n const { default: jwtModule } = await import(\"jsonwebtoken\");\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwtModule.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n const { default: bcrypt } = await import(\"bcryptjs\");\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n bootstrapWithRetry,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n\nexport const defineKyroConfig = defineConfig;\n","export interface SeoTagsOptions {\n siteSettings: any;\n seoSettings?: any;\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n}\n\n/**\n * Generates standard SEO meta tags based on global site settings and page overrides.\n */\nexport function generateSeoTags(options: SeoTagsOptions): string {\n const { siteSettings, seoSettings, title, description, image, url } = options;\n \n if (!siteSettings) return '';\n\n const siteName = siteSettings.siteName || '';\n\n // Title resolution: page title → seo defaultTitle → siteName\n const rawTitle = title || seoSettings?.defaultTitle || siteName;\n const titleTemplate = seoSettings?.titleTemplate;\n const separator = seoSettings?.separator || ' | ';\n const siteNameInTitle = seoSettings?.siteNameInTitle !== false;\n\n const finalTitle = titleTemplate\n ? titleTemplate\n .replace(/\\{\\{title\\}\\}/g, rawTitle)\n .replace(/\\{\\{siteName\\}\\}/g, siteNameInTitle ? siteName : '')\n .replace(/\\{\\{separator\\}\\}/g, separator)\n .replace(/\\s+/g, ' ')\n .trim()\n : rawTitle;\n\n const finalDesc = description || seoSettings?.defaultDescription || siteSettings.siteDescription || '';\n const finalImage = image || (siteSettings.siteOgImage?.url) || '';\n const finalUrl = url || siteSettings.siteUrl || '';\n\n let tags = `\n <title>${finalTitle}</title>\n <meta name=\"description\" content=\"${finalDesc}\">\n `;\n\n if (siteSettings.siteFavicon?.url) {\n tags += `\\n <link rel=\"icon\" type=\"${siteSettings.siteFavicon.mimeType || 'image/x-icon'}\" href=\"${siteSettings.siteFavicon.url}\">`;\n }\n\n // Robots meta\n const robots = seoSettings?.meta?.robots;\n if (robots) {\n tags += `\\n <meta name=\"robots\" content=\"${robots}\">`;\n }\n\n // Canonical\n const canonical = seoSettings?.meta?.canonicalUrl || finalUrl;\n if (canonical) {\n tags += `\\n <link rel=\"canonical\" href=\"${canonical}\">`;\n }\n\n // Open Graph\n const ogType = seoSettings?.meta?.ogType || 'website';\n tags += `\n <meta property=\"og:type\" content=\"${ogType}\">\n <meta property=\"og:title\" content=\"${finalTitle}\">\n <meta property=\"og:description\" content=\"${finalDesc}\">\n <meta property=\"og:site_name\" content=\"${siteName}\">\n `;\n\n if (finalUrl) tags += `\\n <meta property=\"og:url\" content=\"${finalUrl}\">`;\n if (finalImage) tags += `\\n <meta property=\"og:image\" content=\"${finalImage}\">`;\n\n // Facebook\n if (seoSettings?.social?.fbAppId) {\n tags += `\\n <meta property=\"fb:app_id\" content=\"${seoSettings.social.fbAppId}\">`;\n }\n\n // Twitter\n const twitterCard = seoSettings?.social?.twitterCardType || 'summary_large_image';\n tags += `\n <meta name=\"twitter:card\" content=\"${twitterCard}\">\n <meta name=\"twitter:title\" content=\"${finalTitle}\">\n <meta name=\"twitter:description\" content=\"${finalDesc}\">\n `;\n\n if (seoSettings?.social?.twitterHandle) {\n tags += `\\n <meta name=\"twitter:site\" content=\"${seoSettings.social.twitterHandle}\">`;\n }\n if (finalImage) tags += `\\n <meta name=\"twitter:image\" content=\"${finalImage}\">`;\n\n // I18n\n if (siteSettings.enableI18n && siteSettings.i18n?.language) {\n tags += `\\n <meta http-equiv=\"content-language\" content=\"${siteSettings.i18n.language}\">`;\n }\n\n return tags;\n}\n\n/**\n * Generates analytics script tags based on global site settings.\n */\nexport function generateAnalyticsTags(siteSettings: any): string {\n if (!siteSettings || !siteSettings.analyticsEnabled || !siteSettings.analytics) {\n return '';\n }\n\n const { googleAnalyticsId, googleTagManagerId, plausibleDomain } = siteSettings.analytics;\n let scripts = '';\n\n if (googleAnalyticsId) {\n scripts += `\n <!-- Google Analytics -->\n <script async src=\"https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsId}\"></script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${googleAnalyticsId}');\n </script>\n `;\n }\n\n if (googleTagManagerId) {\n scripts += `\n <!-- Google Tag Manager -->\n <script>\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','${googleTagManagerId}');\n </script>\n `;\n }\n\n if (plausibleDomain) {\n scripts += `\n <!-- Plausible Analytics -->\n <script defer data-domain=\"${plausibleDomain}\" src=\"https://plausible.io/js/script.js\"></script>\n `;\n }\n\n return scripts;\n}\n","import type { BaseAdapter } from \"../registry/types.js\";\n\nexport interface SocialLink {\n platform: string;\n url: string;\n label: string;\n}\n\nconst PLATFORM_META: Record<string, { label: string }> = {\n facebook: { label: \"Facebook\" },\n twitter: { label: \"Twitter / X\" },\n instagram: { label: \"Instagram\" },\n linkedin: { label: \"LinkedIn\" },\n youtube: { label: \"YouTube\" },\n tiktok: { label: \"TikTok\" },\n pinterest: { label: \"Pinterest\" },\n discord: { label: \"Discord\" },\n twitch: { label: \"Twitch\" },\n github: { label: \"GitHub\" },\n mastodon: { label: \"Mastodon\" },\n};\n\nconst ALL_PLATFORMS = [\n \"facebook\", \"twitter\", \"instagram\", \"linkedin\", \"youtube\",\n \"tiktok\", \"pinterest\", \"discord\", \"twitch\", \"github\", \"mastodon\",\n];\n\nexport function getSocialLinksFromSettings(socialSettings: any): SocialLink[] {\n if (!socialSettings) return [];\n\n const showAll = socialSettings.showAll === true;\n const links: SocialLink[] = [];\n\n for (const platform of ALL_PLATFORMS) {\n const url = socialSettings[platform];\n if (!url) continue;\n\n // skip niche platforms unless showAll is true\n const isNiche = [\"tiktok\", \"pinterest\", \"discord\", \"twitch\", \"github\", \"mastodon\"].includes(platform);\n if (isNiche && !showAll) continue;\n\n const meta = PLATFORM_META[platform];\n links.push({\n platform,\n url,\n label: meta?.label || platform,\n });\n }\n\n return links;\n}\n\nexport async function getSocialLinks(\n db: BaseAdapter,\n options?: { draft?: boolean },\n): Promise<SocialLink[]> {\n try {\n const doc = await db.findOne({\n collection: \"_globals_social-settings\",\n where: {},\n draft: options?.draft ?? false,\n });\n return getSocialLinksFromSettings(doc);\n } catch {\n return [];\n }\n}\n","import type { BaseAdapter } from \"../registry/types.js\";\n\nexport interface StoreConfig {\n storeName?: string;\n storeEmail?: string;\n storePhone?: string;\n address?: {\n street?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n };\n currency?: {\n code?: string;\n symbol?: string;\n position?: \"before\" | \"after\";\n decimals?: number;\n };\n tax?: {\n enabled?: boolean;\n rate?: number;\n includedInPrice?: boolean;\n taxId?: string;\n };\n shipping?: {\n enableLocalPickup?: boolean;\n flatRate?: number;\n freeShippingThreshold?: number;\n };\n orders?: {\n orderNumberPrefix?: string;\n allowGuestCheckout?: boolean;\n requirePhone?: boolean;\n };\n}\n\nexport function getStoreConfigFromSettings(settings: any): StoreConfig {\n if (!settings) return {};\n return {\n storeName: settings.storeName,\n storeEmail: settings.storeEmail,\n storePhone: settings.storePhone,\n address: settings.address,\n currency: settings.currency,\n tax: settings.tax,\n shipping: settings.shipping,\n orders: settings.orders,\n };\n}\n\nexport async function getStoreConfig(\n db: BaseAdapter,\n options?: { draft?: boolean },\n): Promise<StoreConfig> {\n try {\n const doc = await db.findOne({\n collection: \"_globals_store-settings\",\n where: {},\n draft: options?.draft ?? false,\n });\n return getStoreConfigFromSettings(doc);\n } catch {\n return {};\n }\n}\n","import type { BaseAdapter } from \"../registry/types.js\";\n\nexport interface PaymentConfig {\n testMode?: boolean;\n provider?: \"stripe\" | \"paypal\" | \"square\" | \"manual\";\n stripe?: {\n enabled?: boolean;\n publishableKey?: string;\n secretKey?: string;\n webhookSecret?: string;\n };\n paypal?: {\n enabled?: boolean;\n clientId?: string;\n clientSecret?: string;\n mode?: \"sandbox\" | \"live\";\n };\n square?: {\n enabled?: boolean;\n applicationId?: string;\n accessToken?: string;\n locationId?: string;\n };\n methods?: {\n cod?: boolean;\n bankTransfer?: boolean;\n cash?: boolean;\n check?: boolean;\n };\n bankTransfer?: {\n bankName?: string;\n accountName?: string;\n accountNumber?: string;\n routingNumber?: string;\n iban?: string;\n swift?: string;\n };\n}\n\nexport function getPaymentConfigFromSettings(settings: any): PaymentConfig {\n if (!settings) return {};\n return {\n testMode: settings.testMode,\n provider: settings.provider,\n stripe: settings.stripe,\n paypal: settings.paypal,\n square: settings.square,\n methods: settings.methods,\n bankTransfer: settings.bankTransfer,\n };\n}\n\nexport async function getPaymentConfig(\n db: BaseAdapter,\n options?: { draft?: boolean },\n): Promise<PaymentConfig> {\n try {\n const doc = await db.findOne({\n collection: \"_globals_payment-settings\",\n where: {},\n draft: options?.draft ?? false,\n });\n return getPaymentConfigFromSettings(doc);\n } catch {\n return {};\n }\n}\n","import { createStorage } from \"unstorage\";\nimport indexedbDriver from \"unstorage/drivers/indexedb\";\n\nexport interface BrowserStorageOptions {\n namespace?: string;\n ttl?: number;\n}\n\nexport async function createBrowserStorage(\n options: BrowserStorageOptions = {},\n): Promise<{\n storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> };\n cleanup?: () => Promise<void>;\n}> {\n const { namespace = \"kyro\", ttl } = options;\n\n const store = createStorage({\n driver: indexedbDriver({\n dbName: \"kyro-cms\",\n storeName: namespace,\n }),\n });\n\n const prefix = namespace ? `${namespace}:` : \"\";\n\n const storage = {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n };\n\n return {\n storage,\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import crypto from 'crypto';\n\nconst DEFAULT_ALGORITHM = 'AES-256-GCM';\n\nexport function getEncryptionOptions(secret?: string, algorithm?: string) {\n return {\n key: getEncryptionKey(secret),\n algorithm: algorithm || DEFAULT_ALGORITHM,\n };\n}\n\nexport function getEncryptionKey(secret?: string): string {\n const appSecret = secret || process.env.APP_SECRET || process.env.AUTH_SECRET || 'development-secret-key';\n return crypto.createHash('sha256').update(appSecret).digest('hex');\n}\n\nexport function hashData(data: string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\nexport function generateSessionId(): string {\n return crypto.randomUUID();\n}","import path from \"path\";\nimport { getEncryptionKey } from \"./encryption.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs\";\nimport crypto from \"crypto\";\n\nexport interface NodeStorageOptions {\n adapter?: \"fs\";\n connectionString?: string;\n namespace?: string;\n ttl?: number;\n encryption?: boolean;\n secret?: string;\n basePath?: string;\n}\n\nfunction encrypt(text: string, key: string): string {\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n let encrypted = cipher.update(text, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n const authTag = cipher.getAuthTag().toString(\"hex\");\n return `${iv.toString(\"hex\")}:${authTag}:${encrypted}`;\n}\n\nfunction decrypt(encryptedText: string, key: string): string {\n const [ivHex, authTagHex, encrypted] = encryptedText.split(\":\");\n const iv = Buffer.from(ivHex, \"hex\");\n const authTag = Buffer.from(authTagHex, \"hex\");\n const decipher = crypto.createDecipheriv(\"aes-256-gcm\", Buffer.from(key, \"hex\").subarray(0, 32), iv);\n decipher.setAuthTag(authTag);\n let decrypted = decipher.update(encrypted, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n return decrypted;\n}\n\nexport async function createNodeStorage(\n options: NodeStorageOptions = {}\n): Promise<{ storage: { getItem: (name: string) => Promise<string | null>; setItem: (name: string, value: string) => Promise<void>; removeItem: (name: string) => Promise<void> }; cleanup?: () => Promise<void> }> {\n const {\n namespace = \"kyro\",\n ttl,\n encryption = true,\n secret,\n basePath,\n } = options;\n\n const defaultPath = basePath\n ? path.join(basePath, \".astro\", \"kyro.json\")\n : path.join(process.cwd(), \".astro\", \"kyro.json\");\n\n const store = createStorage({\n driver: fsDriver({ base: defaultPath }),\n });\n\n const encKey = encryption ? getEncryptionKey(secret) : null;\n const prefix = namespace ? `${namespace}:` : \"\";\n\n return {\n storage: {\n getItem: async (name: string): Promise<string | null> => {\n const key = `${prefix}${name}`;\n const raw = await store.getItem<string>(key);\n if (raw == null) return null;\n try {\n const data = encKey ? decrypt(raw, encKey) : raw;\n const parsed = JSON.parse(data);\n if (parsed.expiry && Date.now() > parsed.expiry) {\n await store.removeItem(key);\n return null;\n }\n return parsed.value;\n } catch {\n return raw;\n }\n },\n setItem: async (name: string, value: string): Promise<void> => {\n const key = `${prefix}${name}`;\n const data = JSON.stringify(\n ttl ? { value, expiry: Date.now() + ttl } : { value }\n );\n await store.setItem(key, encKey ? encrypt(data, encKey) : data);\n },\n removeItem: async (name: string): Promise<void> => {\n await store.removeItem(`${prefix}${name}`);\n },\n },\n cleanup: async () => {\n await store.dispose?.();\n },\n };\n}\n","import type { StorageConfig, StorageAdapter, CreateStorageResult } from './types.js';\nimport { createBrowserStorage } from './browser.js';\nimport { createNodeStorage } from './node.js';\nimport { getEncryptionKey } from './encryption.js';\n\nexport type { StorageConfig, StorageAdapter, Environment, EncryptionConfig } from './types.js';\nexport { getEncryptionKey } from './encryption.js';\n\nexport async function createStorage(config: StorageConfig): Promise<CreateStorageResult & { storage: _StateStorage }> {\n const { environment, adapter, connectionString, encryption } = config;\n\n const secret = process.env.APP_SECRET || process.env.AUTH_SECRET;\n\n const encryptionOptions = {\n enabled: encryption?.enabled ?? true,\n algorithm: encryption?.algorithm,\n };\n\n if (environment === 'browser') {\n return createBrowserStorage({\n namespace: 'kyro',\n });\n }\n\n return createNodeStorage({\n adapter: (adapter || 'fs') as \"fs\",\n connectionString,\n namespace: 'kyro',\n encryption: encryptionOptions.enabled,\n secret,\n });\n}\n\ntype _StateStorage = {\n getItem: (name: string) => string | null | Promise<string | null>;\n setItem: (name: string, value: string) => void | Promise<void>;\n removeItem: (name: string) => void | Promise<void>;\n};\n\nexport function createSyncStorage(config: StorageConfig): _StateStorage {\n const { environment } = config;\n\n if (typeof globalThis !== 'undefined' && (globalThis as any).window || environment === 'browser') {\n return {\n getItem: (name: string): string | null => {\n try {\n return localStorage.getItem(name);\n } catch {\n return null;\n }\n },\n setItem: (name: string, value: string): void => {\n try {\n localStorage.setItem(name, value);\n } catch (e) {\n console.error('Failed to save to localStorage:', e);\n }\n },\n removeItem: (name: string): void => {\n try {\n localStorage.removeItem(name);\n } catch (e) {\n console.error('Failed to remove from localStorage:', e);\n }\n },\n };\n }\n\n return {\n getItem: async (): Promise<string | null> => null,\n setItem: async (): Promise<void> => {},\n removeItem: async (): Promise<void> => {},\n };\n}\n\nexport async function createAuthStorage(config: StorageConfig): Promise<CreateStorageResult> {\n const storageConfig: StorageConfig = {\n ...config,\n encryption: {\n enabled: true,\n algorithm: config.encryption?.algorithm,\n },\n };\n\n return createStorage(storageConfig);\n}\n\nexport { createBrowserStorage } from './browser.js';\nexport { createNodeStorage } from './node.js';\n","// ============================================================================\n// @kyro-cms/core\n// Astro-native headless CMS with multi-database, multi-protocol, multi-vendor\n// ============================================================================\n\n// Main Factory\nexport { Kyro, createKyro } from \"./createKyro.js\";\n\n// Registry\nexport {\n Registry,\n getRegistry,\n resetRegistry,\n createRegistry,\n} from \"./registry/index.js\";\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n AdminConfig,\n UploadConfig,\n ImageSize,\n VersionConfig,\n AuthConfig,\n BaseAdapter,\n AdapterConfig,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from \"./registry/types.js\";\nexport {\n validateConfig,\n validateCollection,\n validateGlobal,\n validateFields,\n ConfigValidationError,\n} from \"./registry/validator.js\";\nexport {\n collectionToZod,\n collectionToCreateZod,\n collectionToUpdateZod,\n collectionToWhereZod,\n globalToZod,\n fieldToZod,\n} from \"./registry/zod-builder.js\";\n\n// Fields\nexport type {\n Field,\n FieldType,\n BaseField,\n FieldAdmin,\n ValidateOptions,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n ImageField,\n RichTextField,\n RichTextBlock,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n Block,\n RowField,\n CollapsibleField,\n TabsField,\n} from \"./fields/index.js\";\nexport {\n normalizeRichTextValue,\n renderRichText,\n richTextStyles,\n isTextField,\n isNumberField,\n isRelationshipField,\n isArrayField,\n isGroupField,\n isBlocksField,\n isUploadField,\n isImageField,\n isRichTextField,\n isSelectField,\n isLayoutField,\n PRIMITIVE_FIELD_TYPES,\n COMPLEX_FIELD_TYPES,\n RELATIONAL_FIELD_TYPES,\n LAYOUT_FIELD_TYPES,\n ALL_FIELD_TYPES,\n} from \"./fields/index.js\";\n\n// Access Control\nexport type {\n AccessControl,\n AccessArgs,\n WhereClause,\n CollectionAccess,\n GlobalAccess,\n FieldAccess,\n} from \"./access/index.js\";\nexport {\n evaluateAccess,\n mergeWhereClauses,\n getWhereClause,\n} from \"./access/index.js\";\n\n// Hooks\nexport type {\n Hook,\n HookArgs,\n CollectionHooks,\n FieldHooks,\n GlobalHooks,\n Request,\n User,\n} from \"./hooks/index.js\";\nexport { runHooks, runFieldHooks } from \"./hooks/index.js\";\n\n// Database Adapters\nexport { AbstractBaseAdapter } from \"./database/index.js\";\nexport type {\n DatabaseType as DbAdapterType,\n DatabaseConnectionOptions,\n DrizzleAdapterOptions,\n MongoDBAdapterOptions,\n AdapterOptions,\n} from \"./database/index.js\";\nexport {\n DrizzleAdapter,\n createDrizzleAdapter,\n fieldToDrizzleType,\n collectionToDrizzleSchema,\n} from \"./database/index.js\";\nexport { MongoDBAdapter, createMongoDBAdapter } from \"./database/index.js\";\nexport { LocalAdapter, createLocalAdapter } from \"./database/index.js\";\n\n// API Gateways\nexport {\n createContext,\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n createDynamicRouter,\n createKyroServer,\n} from \"./api/index.js\";\nexport { buildGraphQLSchema, createGraphQLSchema } from \"./api/index.js\";\nexport { createHonoApp, createRESTAPI } from \"./api/index.js\";\nexport {\n PubSub,\n KyroPubSub,\n KyroWSServer,\n createWSServer,\n} from \"./api/index.js\";\n\n// Plugin System\nexport {\n KyroPlugin,\n PluginManager,\n type PluginHooks,\n type PluginAPI,\n SEOPLugin,\n AnalyticsPlugin,\n CommentsPlugin,\n ReviewsPlugin,\n WishlistPlugin,\n presetPlugins,\n} from \"./plugins/index.js\";\n\n// Styling System\nexport {\n type StylingMode,\n type StylingConfig,\n type ThemeConfig,\n type ThemeColors,\n type ThemeFonts,\n type ThemeSpacing,\n type ThemeBorderRadius,\n type ThemeShadows,\n type FieldStyling,\n type AdminStylingConfig,\n CSSGenerator,\n generateTailwindConfig,\n generateCSSVariables,\n defaultLightTheme,\n defaultDarkTheme,\n ecommerce2026Theme,\n createAdminStyling,\n defaultFieldStyling,\n} from \"./styling/index.js\";\n\n// Authentication\nexport {\n Auth,\n createAuth,\n RedisAuthAdapter,\n InMemoryAuthAdapter,\n EmailTransport,\n AuditLogger,\n InMemoryAuditLogger,\n createAuditContext,\n PasswordPolicy,\n AccountLockout,\n InMemoryAccountLockout,\n RateLimiter,\n InMemoryRateLimiter,\n createAuthConfig,\n authConfig,\n} from \"./auth/index.js\";\nexport type {\n KyroAuthConfig,\n DatabaseType,\n AuthUser,\n UserRole,\n Session as AuthSession,\n Session,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n AuthAdapter,\n AuthTokenConfig,\n AuditLog,\n AuditAction,\n AuditLogFilter,\n} from \"./auth/index.js\";\n\nexport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\n\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n bootstrapWithRetry,\n} from \"./auth/bootstrap.js\";\n\n// Version History & Draft/Publish\nexport {\n VersionManager,\n createVersionManager,\n isPublished,\n isDraft,\n isArchived,\n type Version,\n type VersionStatus,\n type VersionDiff,\n type VersionAdapter,\n type CreateVersionOptions,\n type PublishVersionOptions,\n type CompareVersionsOptions,\n type VersionHistoryOptions,\n type DraftPublishConfig,\n type VersionPublishSchedule,\n getDefaultDraftPublishConfig,\n} from \"./versions/index.js\";\n\n// Zod re-export\nexport { z } from \"zod\";\n\n// Database - Drizzle (auth extensions)\nexport { PostgresAuthAdapter } from \"./database/drizzle/index.js\";\nexport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\nexport {\n createDatabase,\n runMigrations,\n seedDefaultRoles,\n type Dialect,\n} from \"./database/drizzle/index.js\";\n\n// Media Service\nexport { MediaService } from \"./storage/MediaService.js\";\nexport { resolveProvider, createLocalStorage } from \"./storage/index.js\";\n\n// Webhooks\nexport {\n WebhookService,\n createWebhookService,\n deliverWebhook,\n deliverWithRetry,\n signPayload,\n generateWebhookSecret,\n buildDeliveryRecord,\n createTestPayload,\n WEBHOOK_EVENTS,\n ALL_WEBHOOK_EVENTS,\n type WebhookEvent,\n type WebhookConfig,\n type CreateWebhookData,\n type UpdateWebhookData,\n type WebhookPayload,\n type WebhookDelivery,\n type WebhookTriggerResult,\n WEBHOOK_COLLECTION,\n WEBHOOK_DELIVERY_COLLECTION,\n type DeliveryResult,\n type DeliveryOptions,\n} from \"./webhooks/index.js\";\n\n// Templates\nexport {\n ecommerceCollections,\n ecommerceGlobals,\n blogCollections,\n blogGlobals,\n minimalCollections,\n kitchenSinkCollections,\n mediaCollections,\n templateCollections,\n allSettingsGlobals,\n coreSettingsGlobals,\n createTemplateConfig,\n} from \"./templates/index\";\nexport type { TemplateConfig } from \"./templates/index\";\n\n// Configuration Service\nexport {\n ConfigService,\n type StorageConfig,\n type EmailConfig,\n} from \"./config/ConfigService.js\";\n\n// Configuration Helper\nexport { defineConfig, defineKyroConfig } from \"./registry/config.js\";\n\n// Astro Integration\nexport { default as kyro } from \"./integration.js\";\n\n// SEO & Analytics Helpers\nexport { generateSeoTags, generateAnalyticsTags, type SeoTagsOptions } from \"./lib/seo.js\";\n\n// Social Links\nexport {\n getSocialLinks,\n getSocialLinksFromSettings,\n type SocialLink,\n} from \"./lib/social.js\";\n\n// Store Config\nexport {\n getStoreConfig,\n getStoreConfigFromSettings,\n type StoreConfig,\n} from \"./lib/store.js\";\n\n// Payment Config\nexport {\n getPaymentConfig,\n getPaymentConfigFromSettings,\n type PaymentConfig,\n} from \"./lib/payment.js\";\n\n// Storage\nexport {\n createStorage,\n createAuthStorage,\n} from \"./lib/storage/index.js\";\nexport type {\n StorageAdapter,\n Environment,\n EncryptionConfig,\n StorageOptions,\n CreateStorageResult,\n} from \"./lib/storage/index.js\";\n\n// Secret Management\nexport {\n setDbAdapter,\n loadSecrets,\n getAppSecret,\n getEncryptionKey,\n getSessionConfig,\n} from \"./lib/secret.js\";\n"]}