@kyro-cms/core 0.10.3 → 0.10.5

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 (301) hide show
  1. package/dist/api-handler-graphql.cjs +1 -49
  2. package/dist/api-handler-graphql.js +1 -46
  3. package/dist/api-handler-trpc.cjs +1 -38
  4. package/dist/api-handler-trpc.js +1 -36
  5. package/dist/api-handler.cjs +1 -44
  6. package/dist/api-handler.js +1 -27
  7. package/dist/bootstrap-IVQWSJXZ.js +1 -0
  8. package/dist/bootstrap-OHGQGMRV.cjs +1 -0
  9. package/dist/chunk-2BTRHVT3.cjs +20 -0
  10. package/dist/chunk-2W4FK6CJ.js +122 -0
  11. package/dist/chunk-4ORJMSJU.cjs +1 -0
  12. package/dist/chunk-5J6HXUF6.js +1 -0
  13. package/dist/chunk-65G73T7Z.cjs +2 -0
  14. package/dist/chunk-6CLRVJPP.cjs +133 -0
  15. package/dist/chunk-7N6NKCRT.js +1 -0
  16. package/dist/chunk-7WOX27LK.js +259 -0
  17. package/dist/chunk-AE6GXUT7.js +1 -0
  18. package/dist/chunk-AHSFSERC.cjs +1 -0
  19. package/dist/chunk-AJAZ7D3W.cjs +259 -0
  20. package/dist/chunk-ATLSIYRH.cjs +1 -0
  21. package/dist/chunk-AU6IWTBO.js +2 -0
  22. package/dist/chunk-CIE3XMLH.cjs +2 -0
  23. package/dist/chunk-CVVW4LXZ.cjs +1 -0
  24. package/dist/chunk-DV4LFLPL.cjs +1 -0
  25. package/dist/chunk-ELICKLFM.cjs +3 -0
  26. package/dist/chunk-EQUQJBPP.cjs +2 -0
  27. package/dist/chunk-ET6NN2V2.cjs +122 -0
  28. package/dist/chunk-F3Z67QWS.cjs +86 -0
  29. package/dist/chunk-F7SR5IDT.cjs +1 -0
  30. package/dist/chunk-FO3HLBC7.js +1 -0
  31. package/dist/chunk-G6A7OSIG.js +2 -0
  32. package/dist/chunk-GFU7AOI3.cjs +1 -0
  33. package/dist/chunk-GYQMNXXW.cjs +114 -0
  34. package/dist/chunk-HLSB2MCK.js +1 -0
  35. package/dist/chunk-HVXO3OFB.cjs +1 -0
  36. package/dist/chunk-ISWMETHJ.cjs +1 -0
  37. package/dist/chunk-K6WUOU6P.js +1 -0
  38. package/dist/chunk-KDNYHLD2.js +1 -0
  39. package/dist/chunk-L6CZYN3L.cjs +20 -0
  40. package/dist/chunk-LZ6YFYQM.js +20 -0
  41. package/dist/chunk-MIOMMB23.cjs +1 -0
  42. package/dist/chunk-MSSRVZH6.js +1 -0
  43. package/dist/chunk-NGBJKZMT.js +90 -0
  44. package/dist/chunk-NRLIGDYF.js +1 -0
  45. package/dist/chunk-NY47CFVP.cjs +1 -0
  46. package/dist/chunk-NZ35PV5R.js +2 -0
  47. package/dist/chunk-OG7CNQGU.js +1 -0
  48. package/dist/chunk-P7CESLDJ.js +1 -0
  49. package/dist/chunk-POWTSLKC.js +21 -0
  50. package/dist/chunk-PP5S2UBV.js +0 -0
  51. package/dist/chunk-PWGS2GPI.js +86 -0
  52. package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
  53. package/dist/chunk-Q4CSLXCO.cjs +90 -0
  54. package/dist/chunk-QRXDCV6K.js +0 -0
  55. package/dist/chunk-R6UUTH3T.js +2 -0
  56. package/dist/chunk-RHCWCG3O.js +114 -0
  57. package/dist/chunk-SL3LZQCF.js +1 -0
  58. package/dist/chunk-TD6RULJU.cjs +21 -0
  59. package/dist/chunk-UBHFUFD4.cjs +1 -0
  60. package/dist/chunk-UBRYJP2G.js +1 -0
  61. package/dist/chunk-UDSJGML2.cjs +2 -0
  62. package/dist/chunk-UHFDH3PG.js +20 -0
  63. package/dist/chunk-UJNSOOYZ.cjs +1 -0
  64. package/dist/chunk-UVTS2IWM.js +1 -0
  65. package/dist/chunk-V65NPSR5.cjs +1 -0
  66. package/dist/chunk-VKXQUYYV.js +133 -0
  67. package/dist/chunk-WIZ6C5QZ.cjs +1 -0
  68. package/dist/chunk-Y7K26TBA.cjs +1 -0
  69. package/dist/chunk-ZAQOSRP6.js +1 -0
  70. package/dist/chunk-ZELCS7IC.js +3 -0
  71. package/dist/cli/index.cjs +35 -405
  72. package/dist/cli/index.js +35 -402
  73. package/dist/client.cjs +1 -55
  74. package/dist/client.js +1 -6
  75. package/dist/drizzle/index.cjs +1 -50
  76. package/dist/drizzle/index.d.cts +1 -2
  77. package/dist/drizzle/index.d.ts +1 -2
  78. package/dist/drizzle/index.js +1 -9
  79. package/dist/fields/index.cjs +1 -89
  80. package/dist/fields/index.js +1 -4
  81. package/dist/graphql/index.cjs +1 -31
  82. package/dist/graphql/index.d.cts +1 -1
  83. package/dist/graphql/index.d.ts +1 -1
  84. package/dist/graphql/index.js +1 -6
  85. package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
  86. package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
  87. package/dist/index.cjs +29 -2464
  88. package/dist/index.d.cts +2 -2
  89. package/dist/index.d.ts +2 -2
  90. package/dist/index.js +29 -1929
  91. package/dist/integration.cjs +1 -10
  92. package/dist/integration.js +1 -4
  93. package/dist/media-L5XDD47D.js +1 -0
  94. package/dist/media-OUBQTIQP.cjs +1 -0
  95. package/dist/mongo-auth-adapter-LG5O4LIH.js +1 -0
  96. package/dist/mongo-auth-adapter-YPONSOCY.cjs +1 -0
  97. package/dist/mongodb/index.cjs +1 -29
  98. package/dist/mongodb/index.d.cts +1 -2
  99. package/dist/mongodb/index.d.ts +1 -2
  100. package/dist/mongodb/index.js +1 -8
  101. package/dist/postgres-auth-adapter-33QOIRXT.js +1 -0
  102. package/dist/postgres-auth-adapter-JKDYYULH.cjs +1 -0
  103. package/dist/redis-adapter-KECGVSVX.cjs +1 -0
  104. package/dist/redis-adapter-VAXP43GR.js +1 -0
  105. package/dist/rest/index.cjs +1 -31
  106. package/dist/rest/index.d.cts +1 -1
  107. package/dist/rest/index.d.ts +1 -1
  108. package/dist/rest/index.js +1 -18
  109. package/dist/schema-HIUSHSUI.cjs +1 -0
  110. package/dist/schema-KFYUM674.js +1 -0
  111. package/dist/sqlite-adapter-FP45QCYK.js +1 -0
  112. package/dist/sqlite-adapter-Z3IBBI4X.cjs +1 -0
  113. package/dist/templates/index.cjs +1 -207
  114. package/dist/templates/index.js +1 -6
  115. package/dist/trpc/index.cjs +1 -48
  116. package/dist/trpc/index.js +1 -7
  117. package/dist/ws/index.cjs +1 -25
  118. package/dist/ws/index.js +1 -4
  119. package/package.json +49 -12
  120. package/dist/api-handler-graphql.cjs.map +0 -1
  121. package/dist/api-handler-graphql.js.map +0 -1
  122. package/dist/api-handler-trpc.cjs.map +0 -1
  123. package/dist/api-handler-trpc.js.map +0 -1
  124. package/dist/api-handler.cjs.map +0 -1
  125. package/dist/api-handler.js.map +0 -1
  126. package/dist/bootstrap-FUAPY2OF.cjs +0 -32
  127. package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
  128. package/dist/bootstrap-OXNVM7FP.js +0 -7
  129. package/dist/bootstrap-OXNVM7FP.js.map +0 -1
  130. package/dist/chunk-2HFJUUFZ.js +0 -250
  131. package/dist/chunk-2HFJUUFZ.js.map +0 -1
  132. package/dist/chunk-354ISGA4.js +0 -6457
  133. package/dist/chunk-354ISGA4.js.map +0 -1
  134. package/dist/chunk-3AKCVYDB.js +0 -162
  135. package/dist/chunk-3AKCVYDB.js.map +0 -1
  136. package/dist/chunk-3KTWGODI.cjs +0 -178
  137. package/dist/chunk-3KTWGODI.cjs.map +0 -1
  138. package/dist/chunk-3P5AHK2U.cjs +0 -2749
  139. package/dist/chunk-3P5AHK2U.cjs.map +0 -1
  140. package/dist/chunk-3YELQL7Z.cjs +0 -4
  141. package/dist/chunk-3YELQL7Z.cjs.map +0 -1
  142. package/dist/chunk-4CV4JOE5.js +0 -24
  143. package/dist/chunk-4CV4JOE5.js.map +0 -1
  144. package/dist/chunk-4OCMVGEY.cjs +0 -173
  145. package/dist/chunk-4OCMVGEY.cjs.map +0 -1
  146. package/dist/chunk-4PWRCMTQ.cjs +0 -15
  147. package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
  148. package/dist/chunk-526M5MOA.js +0 -103
  149. package/dist/chunk-526M5MOA.js.map +0 -1
  150. package/dist/chunk-53NYVYVX.js +0 -3243
  151. package/dist/chunk-53NYVYVX.js.map +0 -1
  152. package/dist/chunk-5GFQPHGT.cjs +0 -156
  153. package/dist/chunk-5GFQPHGT.cjs.map +0 -1
  154. package/dist/chunk-5RPRLTTN.js +0 -861
  155. package/dist/chunk-5RPRLTTN.js.map +0 -1
  156. package/dist/chunk-7OGPN7MP.js +0 -352
  157. package/dist/chunk-7OGPN7MP.js.map +0 -1
  158. package/dist/chunk-7OS7TX2Q.cjs +0 -495
  159. package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
  160. package/dist/chunk-ADLJSJSN.cjs +0 -13
  161. package/dist/chunk-ADLJSJSN.cjs.map +0 -1
  162. package/dist/chunk-AN2L2CJZ.js +0 -2728
  163. package/dist/chunk-AN2L2CJZ.js.map +0 -1
  164. package/dist/chunk-BYBMTIMT.js +0 -419
  165. package/dist/chunk-BYBMTIMT.js.map +0 -1
  166. package/dist/chunk-CF7OL6HR.js +0 -355
  167. package/dist/chunk-CF7OL6HR.js.map +0 -1
  168. package/dist/chunk-CJX74IYK.js +0 -489
  169. package/dist/chunk-CJX74IYK.js.map +0 -1
  170. package/dist/chunk-CKVOU6MX.cjs +0 -52
  171. package/dist/chunk-CKVOU6MX.cjs.map +0 -1
  172. package/dist/chunk-CZLDE2OZ.cjs +0 -28
  173. package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
  174. package/dist/chunk-DPA3KWPY.cjs +0 -205
  175. package/dist/chunk-DPA3KWPY.cjs.map +0 -1
  176. package/dist/chunk-EEJUFDMF.cjs +0 -424
  177. package/dist/chunk-EEJUFDMF.cjs.map +0 -1
  178. package/dist/chunk-FIAMXNTH.js +0 -220
  179. package/dist/chunk-FIAMXNTH.js.map +0 -1
  180. package/dist/chunk-GAOXD3XT.js +0 -175
  181. package/dist/chunk-GAOXD3XT.js.map +0 -1
  182. package/dist/chunk-GTGRLD4Y.js +0 -3
  183. package/dist/chunk-GTGRLD4Y.js.map +0 -1
  184. package/dist/chunk-GUUB5EAG.cjs +0 -223
  185. package/dist/chunk-GUUB5EAG.cjs.map +0 -1
  186. package/dist/chunk-GXFOGU7N.cjs +0 -359
  187. package/dist/chunk-GXFOGU7N.cjs.map +0 -1
  188. package/dist/chunk-GYIJ3JJM.cjs +0 -1069
  189. package/dist/chunk-GYIJ3JJM.cjs.map +0 -1
  190. package/dist/chunk-GZS4LMR7.js +0 -422
  191. package/dist/chunk-GZS4LMR7.js.map +0 -1
  192. package/dist/chunk-HY6B7B5A.js +0 -150
  193. package/dist/chunk-HY6B7B5A.js.map +0 -1
  194. package/dist/chunk-IDVRRRAK.cjs +0 -824
  195. package/dist/chunk-IDVRRRAK.cjs.map +0 -1
  196. package/dist/chunk-ISKYUUP4.cjs +0 -6486
  197. package/dist/chunk-ISKYUUP4.cjs.map +0 -1
  198. package/dist/chunk-KC2GDBLS.cjs +0 -84
  199. package/dist/chunk-KC2GDBLS.cjs.map +0 -1
  200. package/dist/chunk-L4EZKIEX.js +0 -185
  201. package/dist/chunk-L4EZKIEX.js.map +0 -1
  202. package/dist/chunk-LNTFRAHF.cjs +0 -473
  203. package/dist/chunk-LNTFRAHF.cjs.map +0 -1
  204. package/dist/chunk-MTIRYI7F.cjs +0 -4
  205. package/dist/chunk-MTIRYI7F.cjs.map +0 -1
  206. package/dist/chunk-N4GN6Q3V.cjs +0 -869
  207. package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
  208. package/dist/chunk-N4H37VN4.cjs +0 -259
  209. package/dist/chunk-N4H37VN4.cjs.map +0 -1
  210. package/dist/chunk-N5QSHUA6.js +0 -1135
  211. package/dist/chunk-N5QSHUA6.js.map +0 -1
  212. package/dist/chunk-NKPKR5BW.cjs +0 -188
  213. package/dist/chunk-NKPKR5BW.cjs.map +0 -1
  214. package/dist/chunk-NQJJYRLP.cjs +0 -110
  215. package/dist/chunk-NQJJYRLP.cjs.map +0 -1
  216. package/dist/chunk-OJ2AM75W.cjs +0 -253
  217. package/dist/chunk-OJ2AM75W.cjs.map +0 -1
  218. package/dist/chunk-OX6GOIPH.js +0 -516
  219. package/dist/chunk-OX6GOIPH.js.map +0 -1
  220. package/dist/chunk-P2YW545G.js +0 -11
  221. package/dist/chunk-P2YW545G.js.map +0 -1
  222. package/dist/chunk-PHJRNPHY.cjs +0 -3291
  223. package/dist/chunk-PHJRNPHY.cjs.map +0 -1
  224. package/dist/chunk-Q72BOAPK.js +0 -817
  225. package/dist/chunk-Q72BOAPK.js.map +0 -1
  226. package/dist/chunk-QU2RFFH4.js +0 -3
  227. package/dist/chunk-QU2RFFH4.js.map +0 -1
  228. package/dist/chunk-RP7VZUEL.js +0 -49
  229. package/dist/chunk-RP7VZUEL.js.map +0 -1
  230. package/dist/chunk-SHTTJMLT.cjs +0 -361
  231. package/dist/chunk-SHTTJMLT.cjs.map +0 -1
  232. package/dist/chunk-THBQG64D.cjs +0 -425
  233. package/dist/chunk-THBQG64D.cjs.map +0 -1
  234. package/dist/chunk-TQG7G7YI.cjs +0 -526
  235. package/dist/chunk-TQG7G7YI.cjs.map +0 -1
  236. package/dist/chunk-U3VVLYXG.cjs +0 -189
  237. package/dist/chunk-U3VVLYXG.cjs.map +0 -1
  238. package/dist/chunk-UUDTPZX6.js +0 -193
  239. package/dist/chunk-UUDTPZX6.js.map +0 -1
  240. package/dist/chunk-VKREAIBA.cjs +0 -1139
  241. package/dist/chunk-VKREAIBA.cjs.map +0 -1
  242. package/dist/chunk-WDTTHKDS.js +0 -458
  243. package/dist/chunk-WDTTHKDS.js.map +0 -1
  244. package/dist/chunk-WXVB364T.js +0 -218
  245. package/dist/chunk-WXVB364T.js.map +0 -1
  246. package/dist/chunk-X4BPPD6K.js +0 -181
  247. package/dist/chunk-X4BPPD6K.js.map +0 -1
  248. package/dist/chunk-XEB7PH2E.js +0 -81
  249. package/dist/chunk-XEB7PH2E.js.map +0 -1
  250. package/dist/chunk-XHAAAEXX.js +0 -1055
  251. package/dist/chunk-XHAAAEXX.js.map +0 -1
  252. package/dist/chunk-YT7HXXVN.js +0 -13
  253. package/dist/chunk-YT7HXXVN.js.map +0 -1
  254. package/dist/cli/index.cjs.map +0 -1
  255. package/dist/cli/index.js.map +0 -1
  256. package/dist/client.cjs.map +0 -1
  257. package/dist/client.js.map +0 -1
  258. package/dist/drizzle/index.cjs.map +0 -1
  259. package/dist/drizzle/index.js.map +0 -1
  260. package/dist/fields/index.cjs.map +0 -1
  261. package/dist/fields/index.js.map +0 -1
  262. package/dist/graphql/index.cjs.map +0 -1
  263. package/dist/graphql/index.js.map +0 -1
  264. package/dist/index.cjs.map +0 -1
  265. package/dist/index.js.map +0 -1
  266. package/dist/integration.cjs.map +0 -1
  267. package/dist/integration.js.map +0 -1
  268. package/dist/media-7WDX4BDJ.js +0 -4
  269. package/dist/media-7WDX4BDJ.js.map +0 -1
  270. package/dist/media-TUSLVRQ6.cjs +0 -17
  271. package/dist/media-TUSLVRQ6.cjs.map +0 -1
  272. package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
  273. package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
  274. package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
  275. package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
  276. package/dist/mongodb/index.cjs.map +0 -1
  277. package/dist/mongodb/index.js.map +0 -1
  278. package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
  279. package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
  280. package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
  281. package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
  282. package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
  283. package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
  284. package/dist/redis-adapter-XALOGWY3.js +0 -4
  285. package/dist/redis-adapter-XALOGWY3.js.map +0 -1
  286. package/dist/rest/index.cjs.map +0 -1
  287. package/dist/rest/index.js.map +0 -1
  288. package/dist/schema-6QL3USNB.cjs +0 -67
  289. package/dist/schema-6QL3USNB.cjs.map +0 -1
  290. package/dist/schema-FNNWEAAW.js +0 -6
  291. package/dist/schema-FNNWEAAW.js.map +0 -1
  292. package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
  293. package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
  294. package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
  295. package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
  296. package/dist/templates/index.cjs.map +0 -1
  297. package/dist/templates/index.js.map +0 -1
  298. package/dist/trpc/index.cjs.map +0 -1
  299. package/dist/trpc/index.js.map +0 -1
  300. package/dist/ws/index.cjs.map +0 -1
  301. package/dist/ws/index.js.map +0 -1
@@ -0,0 +1,133 @@
1
+ 'use strict';var chunkDV4LFLPL_cjs=require('./chunk-DV4LFLPL.cjs'),drizzleOrm=require('drizzle-orm'),pgCore=require('drizzle-orm/pg-core'),sqliteCore=require('drizzle-orm/sqlite-core'),postgresJs=require('drizzle-orm/postgres-js'),ne=require('postgres'),crypto=require('crypto'),promises=require('fs/promises'),path=require('path'),module$1=require('module');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ne__default=/*#__PURE__*/_interopDefault(ne);var F=false;function b(f,s="postgres"){switch(f.type){case "text":case "email":case "password":case "color":return s==="sqlite"?"text":"varchar";case "textarea":case "code":case "markdown":case "secret":return "text";case "number":return f.integer?"integer":"decimal";case "checkbox":return "boolean";case "date":return "timestamp";case "select":case "radio":return s==="sqlite"?"text":"varchar";case "richtext":case "json":case "array":case "group":case "blocks":case "row":case "collapsible":case "tabs":return "jsonb";case "relationship":return s==="sqlite"?"text":"varchar";case "upload":return "jsonb";default:return "jsonb"}}function Ee(f,s="postgres"){let n=f.slug.replace(/-/g,"_"),e=[];e.push(`export const ${n} = pgTable('${n}', {`),e.push(" id: uuid('id').primaryKey().defaultRandom(),");for(let t of f.fields){if(t.name==="id")continue;let o=b(t,s),r=t.required,a=` ${t.name}: pg.${o}('${t.name}')`;t.unique&&(a+=".unique()"),r||(a+=".nullable()"),t.defaultValue!==void 0&&(typeof t.defaultValue=="string"?a+=`.default('${t.defaultValue}')`:typeof t.defaultValue=="boolean"?a+=`.default(${t.defaultValue})`:a+=`.default(sql\`${JSON.stringify(t.defaultValue)}\`)`),a+=",",e.push(a);}return f.timestamps&&(e.push(" createdAt: pg.timestamp('created_at').defaultNow(),"),e.push(" updatedAt: pg.timestamp('updated_at').defaultNow(),")),e.push(` status: ${s==="sqlite"?"sqlite":"pg"}.varchar('status').default('draft'),`),e.push(` hasDraft: ${s==="sqlite"?"sqlite":"pg"}.boolean('hasDraft').default(false),`),e.push("});"),e.join(`
2
+ `)}var C=class extends chunkDV4LFLPL_cjs.a{client;schema;dialect;connectionString;versionsTableReady=false;constructor(s){if(super(),this.schema=s.schema||{},s.connectionString){this.connectionString=s.connectionString;let n=s.connectionString.toLowerCase();n.startsWith("postgres://")||n.startsWith("postgresql://")?this.dialect="postgres":n.includes(".db")||n.includes("sqlite")||n.includes("file:")?this.dialect="sqlite":this.dialect=s.type||"postgres";}else this.client=s.client,this.dialect=s.type||"sqlite";}prepareData(s,n){let e=super.prepareData(s,n);e.createdAt&&typeof e.createdAt=="string"&&(e.createdAt=new Date(e.createdAt)),e.updatedAt&&typeof e.updatedAt=="string"&&(e.updatedAt=new Date(e.updatedAt));for(let t of n.fields)if(t.type==="date"&&t.name){let o=e[t.name];o&&typeof o=="string"&&(e[t.name]=new Date(o));}for(let t of n.fields){let r=b(t,this.dialect)==="jsonb";if(t.type==="tabs"&&"tabs"in t&&t.name){let a=s[t.name];if(a&&typeof a=="object"){let i={};for(let[c,u]of Object.entries(a)){let l=t.tabs.flatMap(h=>h.fields).find(h=>h.name===c);(l?.type==="upload"||l?.type==="image"||l?.type==="list"||l?.type==="relationship-block")&&u?i[c]=Array.isArray(u)||typeof u=="object"?JSON.stringify(u):u:i[c]=u;}e[t.name]=r?i:JSON.stringify(i);}}if((t.type==="upload"||t.type==="image"||t.type==="list"||t.type==="relationship-block")&&t.name){let a=s[t.name];a&&(e[t.name]=r?a:Array.isArray(a)||typeof a=="object"?JSON.stringify(a):a);}}for(let t of n.fields)if(t.name&&e[t.name]===""){let o=b(t,this.dialect);(o==="timestamp"||o==="jsonb"||o==="decimal"||o==="integer"||o==="numeric"||o==="boolean")&&(e[t.name]=null);}return e}async connect(){if(this.connectionString&&!this.client){if(this.dialect==="postgres"){let{default:s}=await import('postgres'),{drizzle:n}=await import('drizzle-orm/postgres-js'),e=s(this.connectionString,{onnotice:()=>{}});this.client=n(e,{schema:this.schema});}else if(this.dialect==="sqlite"){let{default:s}=await import('better-sqlite3'),{drizzle:n}=await import('drizzle-orm/better-sqlite3'),e=new s(this.connectionString.replace("file:",""));this.client=n(e,{schema:this.schema});}}this.connected=true;}async init(s,n=[]){if(await super.init(s,n),this.connectionString&&!this.client&&await this.connect(),this.client&&!F){for(let t of s){let o=this.getTableName(t.slug);this.schema[o]||(this.schema[o]=this.createTableFromConfig(t));}await this.ensureCollectionTables(s);let e=n.map(t=>({slug:`_globals_${t.slug}`,fields:t.fields,label:t.label}));for(let t of e){let o=this.getTableName(t.slug);this.schema[o]||(this.schema[o]=this.createTableFromConfig(t,true)),this.collections.has(t.slug)||this.collections.set(t.slug,t);}await this.ensureCollectionTables(e),F=true;}}createTableFromConfig(s,n=false){let e=this.getTableName(s.slug),t={id:n?pgCore.text("id").primaryKey():pgCore.uuid("id").primaryKey().defaultRandom()};for(let o of s.fields){if(!o.name||o.name==="id")continue;let r=b(o,this.dialect),a=o.name.replace(/-/g,"_"),i=a.replace(/([A-Z])/g,"_$1").toLowerCase(),c;if(this.dialect==="sqlite")switch(r){case "varchar":case "text":c=sqliteCore.text(i);break;case "integer":c=sqliteCore.integer(i);break;case "decimal":case "numeric":c=sqliteCore.numeric(i);break;case "boolean":c=sqliteCore.integer(i,{mode:"boolean"});break;case "timestamp":c=sqliteCore.text(i);break;case "jsonb":c=sqliteCore.text(i);break;default:c=sqliteCore.text(i);}else switch(r){case "varchar":c=pgCore.varchar(i,{length:255});break;case "integer":c=pgCore.integer(i);break;case "decimal":c=pgCore.decimal(i);break;case "boolean":c=pgCore.boolean(i);break;case "timestamp":c=pgCore.timestamp(i);break;case "jsonb":c=pgCore.jsonb(i);break;default:c=pgCore.text(i);}o.required||(c=c.default(null)),t[a]=c;}return t.createdAt||(t.createdAt=this.dialect==="sqlite"?sqliteCore.text("created_at").default(new Date().toISOString()):pgCore.timestamp("created_at").defaultNow()),t.updatedAt||(t.updatedAt=this.dialect==="sqlite"?sqliteCore.text("updated_at").default(new Date().toISOString()):pgCore.timestamp("updated_at").defaultNow()),t.status=this.dialect==="sqlite"?sqliteCore.text("status").default("draft"):pgCore.varchar("status",{length:20}).default("draft"),t.hasDraft=this.dialect==="sqlite"?sqliteCore.integer("hasDraft",{mode:"boolean"}).default(false):pgCore.boolean("hasDraft").default(false),this.dialect==="sqlite"?sqliteCore.sqliteTable(e,t):pgCore.pgTable(e,t)}async ensureCollectionTables(s){let n=[];for(let e of s){let t=e.slug.startsWith("_globals_"),o=this.getTableName(e.slug),r=this.generateCreateColumns(e),a=e.fields.some(l=>l.name==="createdAt"),i=e.fields.some(l=>l.name==="updatedAt"),c=e.fields.some(l=>l.name==="status"),u=e.fields.some(l=>l.name==="hasDraft");if(this.dialect==="postgres"){let l=t?'"id" TEXT PRIMARY KEY':'"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';n.push(`
3
+ CREATE TABLE IF NOT EXISTS "${o}" (
4
+ ${l},
5
+ ${r}
6
+ ${a?"":'"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
7
+ ${i?"":'"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
8
+ ${c?"":`"status" VARCHAR(20) DEFAULT 'draft',`}
9
+ ${u?"":'"hasDraft" BOOLEAN DEFAULT false'}
10
+ )
11
+ `);}else n.push(`
12
+ CREATE TABLE IF NOT EXISTS "${o}" (
13
+ "id" TEXT PRIMARY KEY,
14
+ ${r}
15
+ ${a?"":`"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
16
+ ${i?"":`"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
17
+ ${c?"":`"status" TEXT DEFAULT 'draft',`}
18
+ ${u?"":'"hasDraft" INTEGER DEFAULT 0'}
19
+ )
20
+ `);}if(n.length>0)if(this.dialect==="postgres")await this.client.execute(drizzleOrm.sql.raw(n.join(`;
21
+ `)));else for(let e of n)await this.client.execute(drizzleOrm.sql.raw(e));for(let e of s){let t=this.getTableName(e.slug);t==="users"||t==="audit_logs"||await this.syncTableColumns(e,t);}}getColumnSqlDefinition(s,n){let e=b(s,n),t=s.name.replace(/-/g,"_").replace(/([A-Z])/g,"_$1").toLowerCase(),o=this.columnSqlType(e,n);return `"${t}" ${o} DEFAULT NULL`}columnSqlType(s,n){if(n==="sqlite")switch(s){case "varchar":return "TEXT";case "text":return "TEXT";case "integer":return "INTEGER";case "decimal":case "numeric":return "NUMERIC";case "boolean":return "INTEGER";case "timestamp":return "TEXT";case "jsonb":return "TEXT";default:return "TEXT"}switch(s){case "varchar":return "VARCHAR(255)";case "text":return "TEXT";case "integer":return "INTEGER";case "decimal":case "numeric":return "DECIMAL";case "boolean":return "BOOLEAN";case "timestamp":return "TIMESTAMP";case "jsonb":return "JSONB";default:return "TEXT"}}getExpectedColumnDefs(s,n){let e={},t=s.slug.startsWith("_globals_"),o=s.fields.some(c=>c.name==="createdAt"),r=s.fields.some(c=>c.name==="updatedAt"),a=s.fields.some(c=>c.name==="status"),i=s.fields.some(c=>c.name==="hasDraft");this.dialect==="postgres"?(e.id=t?'"id" TEXT PRIMARY KEY':'"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()',o||(e.created_at='"created_at" TIMESTAMP DEFAULT NULL'),r||(e.updated_at='"updated_at" TIMESTAMP DEFAULT NULL'),a||(e.status='"status" VARCHAR(20) DEFAULT NULL'),i||(e.hasDraft='"hasDraft" BOOLEAN DEFAULT NULL')):(e.id='"id" TEXT PRIMARY KEY',o||(e.created_at='"created_at" TEXT DEFAULT NULL'),r||(e.updated_at='"updated_at" TEXT DEFAULT NULL'),a||(e.status='"status" TEXT DEFAULT NULL'),i||(e.hasDraft='"hasDraft" INTEGER DEFAULT NULL'));for(let c of s.fields){if(!c.name||c.name==="id")continue;let u=this.getColumnSqlDefinition(c,this.dialect),l=c.name.replace(/-/g,"_").replace(/([A-Z])/g,"_$1").toLowerCase();e[l]=u;}return e}async syncTableColumns(s,n){let e;try{if(this.dialect==="postgres"){let r=await this.client.execute(drizzleOrm.sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${n}`);e=new Map(r.map(a=>[a.column_name,{type:a.data_type,maxLen:a.character_maximum_length}]));}else {let r=await this.client.execute(drizzleOrm.sql`PRAGMA table_info("${drizzleOrm.sql.raw(n)}")`);e=new Map(r.map(a=>[a.name,{type:a.type,maxLen:null}]));}}catch{return}let t=this.getExpectedColumnDefs(s,n),o=Object.keys(t).filter(r=>!e.has(r));if(o.length>0){let r=o.map(a=>`ALTER TABLE "${n}" ADD COLUMN ${t[a]}`);await this.executeRaw(drizzleOrm.sql.raw(r.join(`;
22
+ `)));}if(this.dialect==="postgres")for(let r of s.fields){if(!r.name||r.name==="id")continue;let a=b(r,this.dialect),i=r.name.replace(/-/g,"_").replace(/([A-Z])/g,"_$1").toLowerCase(),c=e.get(i);!c||c.type!=="character varying"||(a==="text"?await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${n}" ALTER COLUMN "${i}" TYPE TEXT`)):a==="jsonb"&&(await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${n}" ALTER COLUMN "${i}" DROP DEFAULT`)),await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${n}" ALTER COLUMN "${i}" TYPE JSONB USING (CASE WHEN "${i}" IS NULL THEN NULL WHEN "${i}"::text ~ '^\\s*\\{' THEN "${i}"::jsonb ELSE jsonb_build_object('id', "${i}"::text) END)`))));}}generateCreateColumns(s){let n=[];for(let e of s.fields){if(!e.name||e.name==="id")continue;let t=b(e,this.dialect),o=e.name.replace(/-/g,"_").replace(/([A-Z])/g,"_$1").toLowerCase(),r=e.required?"NOT NULL":"DEFAULT NULL",a;if(this.dialect==="sqlite")switch(t){case "varchar":case "text":a=`TEXT ${r}`;break;case "integer":a=`INTEGER ${r}`;break;case "decimal":case "numeric":a=`NUMERIC ${r}`;break;case "boolean":a=`INTEGER ${r}`;break;case "timestamp":a=`TEXT ${r}`;break;case "jsonb":a=`TEXT ${r}`;break;default:a=`TEXT ${r}`;}else switch(t){case "varchar":a=`VARCHAR(255) ${r}`;break;case "integer":a=`INTEGER ${r}`;break;case "decimal":a=`DECIMAL ${r}`;break;case "boolean":a=`BOOLEAN ${r}`;break;case "timestamp":a=`TIMESTAMP ${r}`;break;case "jsonb":a=`JSONB ${r}`;break;default:a=`TEXT ${r}`;}n.push(`"${o}" ${a}`);}return n.join(`,
23
+ `)+(n.length>0?",":"")}async disconnect(){this.connected=false;}async find(s){let{collection:n,where:e={},sort:t,limit:o=10,page:r=1,tenantID:a,select:i,draft:c}=s,u=this.getCollection(n),l=this.getTable(n),p={...e};this.tenantContext&&u.tenantScoped&&(p=chunkDV4LFLPL_cjs.c({where:p},n,this.tenantContext,chunkDV4LFLPL_cjs.b).where||{});let h=this.buildWhereClause(p,u,l,a);!c&&l.status&&h.push(drizzleOrm.eq(l.status,"published"));let y=this.parseSort(t),N=!c&&l.status?{...p,status:"published"}:p,M=await this.count({collection:n,where:N,tenantID:a}),P=(r-1)*o,$=[];try{let m=l[y.field]||l.createdAt||l.id,L=y.direction==="asc"?m:drizzleOrm.desc(m),T=this.client.select().from(l);h.length>0&&(T=T.where(drizzleOrm.and(...h))),$=await T.orderBy(L).limit(o).offset(P);}catch(m){console.error("[DrizzleAdapter] Query error:",m);}let D=$.map(m=>this.processResult(m,u));return this.tenantContext&&!this.tenantContext.isSuperAdmin&&(D=D.filter(m=>chunkDV4LFLPL_cjs.d(m,n,this.tenantContext,chunkDV4LFLPL_cjs.b))),c&&(D=await Promise.all(D.map(async m=>{let L=await this.executeRaw(drizzleOrm.sql`
24
+ SELECT * FROM kyro_versions
25
+ WHERE collection_slug = ${n}
26
+ AND document_id = ${m.id}
27
+ ORDER BY created_at DESC
28
+ LIMIT 1
29
+ `);if(L.length>0){let T=L[0],j=typeof T.data=="string"?JSON.parse(T.data):T.data;return {...m,...j,status:m.status}}return m}))),{docs:D,...this.calculatePagination(r,o,M)}}async findByID(s){let{collection:n,id:e,tenantID:t,draft:o}=s,r=this.getCollection(n),a=this.getTable(n);if(this.tenantContext&&r.tenantScoped){let p={id:e,tenantId:this.tenantContext.tenantId};if(!chunkDV4LFLPL_cjs.d(p,n,this.tenantContext,chunkDV4LFLPL_cjs.b))return null}let i=[drizzleOrm.eq(a.id,e)];t&&a.tenantId&&i.push(drizzleOrm.eq(a.tenantId,t)),!o&&a.status&&i.push(drizzleOrm.eq(a.status,"published"));let c=i.length>1?drizzleOrm.and(...i):i[0],u=await this.client.select().from(a).where(c);if(u.length===0)return null;let l=this.processResult(u[0],r);if(o){let p=await this.executeRaw(drizzleOrm.sql`
30
+ SELECT * FROM kyro_versions
31
+ WHERE collection_slug = ${n}
32
+ AND document_id = ${l.id}
33
+ ORDER BY created_at DESC
34
+ LIMIT 1
35
+ `);if(p.length>0){let h=p[0],y=typeof h.data=="string"?JSON.parse(h.data):h.data;l={...l,...y,status:l.status};}}return l}async create(s){let{collection:n,data:e,tenantID:t}=s,o=this.getCollection(n),r=this.getTable(n),a=this.prepareData(e,o);t&&(a.tenantId=t);let i=await this.client.insert(r).values(a).returning();return this.processResult(i[0],o)}async update(s){let{collection:n,id:e,data:t,tenantID:o}=s,r=this.getCollection(n),a=this.getTable(n),i=this.prepareData(t,r);delete i.id;let c=[drizzleOrm.eq(a.id,e)];o&&a.tenantId&&c.push(drizzleOrm.eq(a.tenantId,o));let u=await this.client.update(a).set(i).where(drizzleOrm.and(...c)).returning();if(u.length===0)throw new Error(`Document not found: ${n}/${e}`);return this.processResult(u[0],r)}async delete(s){let{collection:n,id:e,tenantID:t}=s,o=this.getCollection(n),r=this.getTable(n),a=[drizzleOrm.eq(r.id,e)];t&&r.tenantId&&a.push(drizzleOrm.eq(r.tenantId,t));let i=await this.client.delete(r).where(drizzleOrm.and(...a)).returning();if(i.length===0)throw new Error(`Document not found: ${n}/${e}`);return this.processResult(i[0],o)}async count(s){let{collection:n,where:e={},tenantID:t}=s,o=this.getCollection(n),r=this.getTable(n),a=this.buildWhereClause(e,o,r,t);try{let i=this.client.select({count:drizzleOrm.sql`count(*)`}).from(r);a.length>0&&(i=i.where(drizzleOrm.and(...a)));let c=await i;return Number(c[0]?.count||0)}catch{return 0}}async findOne(s){let{collection:n,where:e={},tenantID:t,draft:o}=s;if(n.startsWith("_globals_")){let a=n.replace("_globals_",""),i=this.globals.get(a);if(!i)throw new Error(`Global "${a}" not found`);let c=this.getTable(n),u=this.client.select().from(c);!o&&c.status&&(u=u.where(drizzleOrm.eq(c.status,"published")));let l=await u.limit(1);if(l.length===0)return null;let p=this.processResult(l[0],i);if(o){let h=await this.executeRaw(drizzleOrm.sql`
36
+ SELECT * FROM kyro_versions
37
+ WHERE collection_slug = ${n}
38
+ AND document_id = ${a}
39
+ ORDER BY created_at DESC
40
+ LIMIT 1
41
+ `);if(h.length>0){let y=h[0],N=typeof y.data=="string"?JSON.parse(y.data):y.data;p={...p,...N,status:p.status};}}return p}return (await this.find({...s,limit:1})).docs[0]||null}async findVersions(s){await this.ensureVersionsTable();let{collection:n,documentId:e,limit:t=10,page:o=1,tenantID:r}=s,a=(o-1)*t,i=await this.executeRaw(drizzleOrm.sql`
42
+ SELECT count(*) as count
43
+ FROM kyro_versions
44
+ WHERE collection_slug = ${n}
45
+ AND document_id = ${e}
46
+ AND autosave = 0
47
+ ${r?drizzleOrm.sql`AND tenant_id = ${r}`:drizzleOrm.sql``}
48
+ `),c=parseInt(i[0]?.count||"0");return {docs:(await this.executeRaw(drizzleOrm.sql`
49
+ SELECT *
50
+ FROM kyro_versions
51
+ WHERE collection_slug = ${n}
52
+ AND document_id = ${e}
53
+ AND autosave = 0
54
+ ${r?drizzleOrm.sql`AND tenant_id = ${r}`:drizzleOrm.sql``}
55
+ ORDER BY created_at DESC
56
+ LIMIT ${t}
57
+ OFFSET ${a}
58
+ `)).map(l=>({...l,data:typeof l.data=="string"?JSON.parse(l.data):l.data})),...this.calculatePagination(o,t,c)}}async findVersionByID(s){await this.ensureVersionsTable();let n=await this.executeRaw(drizzleOrm.sql`
59
+ SELECT * FROM kyro_versions
60
+ WHERE id = ${s.versionId}
61
+ AND collection_slug = ${s.collection}
62
+ ${s.tenantID?drizzleOrm.sql`AND tenant_id = ${s.tenantID}`:drizzleOrm.sql``}
63
+ LIMIT 1
64
+ `);if(n.length===0)return null;let e=n[0];return {...e,data:typeof e.data=="string"?JSON.parse(e.data):e.data}}async createVersion(s){await this.ensureVersionsTable();let n=new Date().toISOString();if(s.autosave){let t=await this.executeRaw(drizzleOrm.sql`
65
+ SELECT * FROM kyro_versions
66
+ WHERE collection_slug = ${s.collection}
67
+ AND document_id = ${s.documentId}
68
+ AND autosave = 1
69
+ ${s.tenantID?drizzleOrm.sql`AND tenant_id = ${s.tenantID}`:drizzleOrm.sql``}
70
+ LIMIT 1
71
+ `);if(t.length>0)return await this.executeRaw(drizzleOrm.sql`
72
+ UPDATE kyro_versions
73
+ SET data = ${JSON.stringify(s.data)},
74
+ status = ${s.status},
75
+ updated_at = ${n}
76
+ WHERE id = ${t[0].id}
77
+ `),this.findVersionByID({collection:s.collection,versionId:t[0].id,tenantID:s.tenantID})}let e=Math.random().toString(36).substring(2,15);if(await this.executeRaw(drizzleOrm.sql`
78
+ INSERT INTO kyro_versions (
79
+ id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
80
+ ) VALUES (
81
+ ${e}, ${s.collection}, ${s.documentId}, ${s.tenantID||null},
82
+ ${JSON.stringify(s.data)}, ${s.status}, ${s.autosave?1:0}, ${s.createdBy||null},
83
+ ${s.changeDescription||null}, ${n}, ${n}
84
+ )
85
+ `),!s.autosave){let t=this.getCollection(s.collection);t.versions?.maxPerDoc&&await this.deleteVersions({collection:s.collection,documentId:s.documentId,keepLatest:t.versions.maxPerDoc,tenantID:s.tenantID});}return this.findVersionByID({collection:s.collection,versionId:e,tenantID:s.tenantID})}async updateLatestVersion(s){return this.createVersion({...s,autosave:true})}async deleteVersions(s){if(await this.ensureVersionsTable(),s.keepLatest){let e=(await this.executeRaw(drizzleOrm.sql`
86
+ SELECT id FROM kyro_versions
87
+ WHERE collection_slug = ${s.collection}
88
+ AND document_id = ${s.documentId}
89
+ AND autosave = 0
90
+ ${s.tenantID?drizzleOrm.sql`AND tenant_id = ${s.tenantID}`:drizzleOrm.sql``}
91
+ ORDER BY created_at DESC
92
+ LIMIT ${s.keepLatest}
93
+ `)).map(t=>t.id);e.length>0&&await this.executeRaw(drizzleOrm.sql`
94
+ DELETE FROM kyro_versions
95
+ WHERE collection_slug = ${s.collection}
96
+ AND document_id = ${s.documentId}
97
+ AND autosave = 0
98
+ AND id NOT IN (${drizzleOrm.sql.join(e.map(t=>drizzleOrm.sql`${t}`),drizzleOrm.sql`, `)})
99
+ `);}else await this.executeRaw(drizzleOrm.sql`
100
+ DELETE FROM kyro_versions
101
+ WHERE collection_slug = ${s.collection}
102
+ AND document_id = ${s.documentId}
103
+ ${s.tenantID?drizzleOrm.sql`AND tenant_id = ${s.tenantID}`:drizzleOrm.sql``}
104
+ `);}getTable(s){let n=this.getTableName(s),e=this.schema[n];if(!e)throw new Error(`Table "${n}" not found in schema`);return e}buildWhereClause(s,n,e,t){let o=[];t&&n.tenantScoped&&e.tenantId&&o.push(drizzleOrm.eq(e.tenantId,t));for(let[r,a]of Object.entries(s))if(r==="AND"&&Array.isArray(a)){let i=a.map(c=>this.buildWhereClause(c,n,e)).flat().filter(Boolean);i.length>0&&o.push(drizzleOrm.and(...i));}else if(r==="OR"&&Array.isArray(a)){let i=a.map(c=>this.buildWhereClause(c,n,e)).flat().filter(Boolean);i.length>0&&o.push(drizzleOrm.or(...i));}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)){let i=e[r];if(!i)continue;a.equals!==void 0&&o.push(drizzleOrm.eq(i,a.equals)),a.not_equals!==void 0&&o.push(drizzleOrm.ne(i,a.not_equals)),a.in&&Array.isArray(a.in)&&o.push(drizzleOrm.inArray(i,a.in)),a.like!==void 0&&o.push(drizzleOrm.like(i,a.like)),a.contains!==void 0&&o.push(drizzleOrm.like(i,`%${a.contains}%`)),a.greater_than!==void 0&&o.push(drizzleOrm.gt(i,a.greater_than)),a.greater_than_equal!==void 0&&o.push(drizzleOrm.gte(i,a.greater_than_equal)),a.less_than!==void 0&&o.push(drizzleOrm.lt(i,a.less_than)),a.less_than_equal!==void 0&&o.push(drizzleOrm.lte(i,a.less_than_equal));}else {let i=e[r];i&&o.push(drizzleOrm.eq(i,a));}return o}processResult(s,n){if(!s)return null;let e={...s};s.id&&(e.id=String(s.id));for(let t of n.fields){if(!t.name)continue;let o=t.name.replace(/-/g,"_").replace(/([A-Z])/g,"_$1").toLowerCase();o!==t.name&&e[o]!==void 0&&e[t.name]===void 0&&(e[t.name]=e[o],delete e[o]);}for(let t of n.fields){if(["json","richtext","array","group","blocks","upload","image","list","relationship-block"].includes(t.type)){let o=t;if(e[o.name]&&typeof e[o.name]=="string")try{let r=JSON.parse(e[o.name]);e[o.name]=r;}catch{}}if(t.type==="tabs"&&"tabs"in t&&t.name){if(typeof e[t.name]=="object"&&e[t.name]!==null&&!Array.isArray(e[t.name])){for(let r of t.tabs)for(let a of r.fields)if((a.type==="upload"||a.type==="image")&&a.name){let i=e[t.name][a.name];if(typeof i=="string")try{let c=JSON.parse(i);e[t.name][a.name]=Array.isArray(c)?c.map(u=>u&&typeof u=="object"&&typeof u.id=="string"?u.id:String(u||"")):typeof c.id=="string"?c.id:String(c.id||"");}catch{}else i&&typeof i=="object"&&(e[t.name][a.name]=Array.isArray(i)?i.map(c=>c&&typeof c=="object"&&typeof c.id=="string"?c.id:String(c||"")):typeof i.id=="string"?i.id:String(i.id||""));}continue}if(typeof e[t.name]=="string")try{let r=JSON.parse(e[t.name]);if(typeof r=="object"&&r!==null){e[t.name]=r;continue}}catch{}let o={};for(let r of t.tabs)for(let a of r.fields)if(a.name&&e[a.name]!==void 0){let i=e[a.name];if(["json","richtext","array","group","blocks","upload","image","list","relationship-block"].includes(a.type)){if(i&&typeof i=="string")try{i=JSON.parse(i);}catch{}(a.type==="upload"||a.type==="image")&&i&&typeof i=="object"&&(i=Array.isArray(i)?i.map(c=>c&&typeof c=="object"&&typeof c.id=="string"?c.id:String(c||"")):typeof i.id=="string"?i.id:String(i.id||""));}o[a.name]=i,delete e[a.name];}e[t.name]=o;}}return e.createdAt&&(e.createdAt=new Date(e.createdAt).toISOString()),e.updatedAt&&(e.updatedAt=new Date(e.updatedAt).toISOString()),e}async ensureVersionsTable(){if(this.versionsTableReady)return;let s;this.dialect==="sqlite"?s=`
105
+ CREATE TABLE IF NOT EXISTS kyro_versions (
106
+ id text PRIMARY KEY,
107
+ collection_slug text NOT NULL,
108
+ document_id text NOT NULL,
109
+ tenant_id text,
110
+ data text NOT NULL,
111
+ status text NOT NULL DEFAULT 'draft',
112
+ autosave integer NOT NULL DEFAULT 0,
113
+ created_by text,
114
+ change_description text,
115
+ created_at text DEFAULT (datetime('now')),
116
+ updated_at text DEFAULT (datetime('now'))
117
+ )
118
+ `:s=`
119
+ CREATE TABLE IF NOT EXISTS kyro_versions (
120
+ id text PRIMARY KEY,
121
+ collection_slug text NOT NULL,
122
+ document_id text NOT NULL,
123
+ tenant_id text,
124
+ data text NOT NULL,
125
+ status text NOT NULL,
126
+ autosave integer NOT NULL DEFAULT 0,
127
+ created_by text,
128
+ change_description text,
129
+ created_at text NOT NULL,
130
+ updated_at text NOT NULL
131
+ )
132
+ `,await this.executeRaw(drizzleOrm.sql.raw(s));try{this.dialect==="postgres"?await this.executeRaw(drizzleOrm.sql.raw("ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0")):await this.executeRaw(drizzleOrm.sql.raw("ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0"));}catch{}this.versionsTableReady=true;}async executeRaw(s){let n=await this.client.execute(s);return Array.isArray(n)?n:Array.isArray(n?.rows)?n.rows:Array.isArray(n?.[0])?n[0]:[]}};function be(f){return new C(f)}var de=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-6CLRVJPP.cjs', document.baseURI).href))),ue="node:sqlite",{DatabaseSync:fe}=de(ue);function pe(){return process.env.DB_TYPE==="postgres"?"postgres":"sqlite"}function k(){return crypto.randomBytes(16).toString("hex")}async function Ie(){let f=pe();if(f==="sqlite"){let r=path.resolve(process.cwd(),"data","kyro.db");await promises.mkdir(path.dirname(r),{recursive:true});let a=new fe(r);return a.exec("PRAGMA journal_mode = WAL"),{db:a,dialect:f,genId:k}}let s=process.env.DATABASE_URL||"postgresql://postgres:postgres@localhost:5432/kyro_cms",n=parseInt(process.env.DB_POOL_MAX||"10",10),e=process.env.DB_SSL==="true",t=ne__default.default(s,{max:n,ssl:e?"require":false,onnotice:()=>{}});return {db:postgresJs.drizzle(t),dialect:f,genId:k}}async function Ce(f,s){}async function $e(f){let{roles:s}=await import('./schema-HIUSHSUI.cjs');await f.insert(s).values({name:"super_admin",level:100,inherits:[],description:"Full system access across all tenants",isSystem:true}).onConflictDoNothing();}
133
+ exports.a=b;exports.b=Ee;exports.c=C;exports.d=be;exports.e=k;exports.f=Ie;exports.g=Ce;exports.h=$e;
@@ -0,0 +1 @@
1
+ import {c,n,a,b as b$1}from'./chunk-UVTS2IWM.js';import {f,e,g}from'./chunk-HLSB2MCK.js';async function $(e$1){let o=n(e$1.db),t={db:e$1.db,registry:e$1.registry,req:e$1.req,user:e$1.user,tenantID:e$1.tenantID,webhookService:o,settings:e$1.settings},n$1=f(e$1.req);if(n$1){let r=await e(n$1,e$1.db,async a=>{try{return await e$1.db.findByID({collection:"users",id:a})||null}catch{return null}});r.valid&&(t.user=r.user||e$1.user,t.tenantID=r.tenantId||e$1.tenantID,t.apiKey=g(r));}return t}var T={_media:{create:c.MEDIA_UPLOAD,update:c.MEDIA_UPLOAD,delete:c.MEDIA_DELETE}};function w(e,o){let t=T[e];return t?t[o]:`collection.${o}`}async function k(e,o,t){if(e.webhookService)try{await e.webhookService.trigger(o,{collection:t.collection,operation:t.operation,data:t.data,previousData:t.previousData,user:e.user?{id:e.user.id,email:e.user.email,role:e.user.role}:void 0,tenantId:e.tenantID});}catch(n){console.error(`[Webhook] Failed to trigger ${o}:`,n);}}function b(e,o){if(!(!e||typeof e!="object"))for(let t of o){if(!t.name||!(t.name in e))continue;if(e[t.name]===""&&(t.type==="text"||t.type==="textarea"||t.type==="code"||t.type==="markdown"||t.type==="email"||t.type==="password"||t.type==="color"||(e[t.name]=null)),t.type==="tabs"&&t.name&&Array.isArray(t.tabs)&&e[t.name]&&typeof e[t.name]=="object")for(let r of t.tabs)Array.isArray(r.fields)&&b(e[t.name],r.fields);else if((t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&e[t.name]&&typeof e[t.name]=="object")b(e[t.name],t.fields);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(e[t.name]))for(let r of e[t.name])r&&typeof r=="object"&&b(r,t.fields);else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(e[t.name]))for(let r of e[t.name]){if(!r||typeof r!="object")continue;let a=r.type||r.blockType;if(!a)continue;let s=t.blocks.find(i=>i.slug===a);if(!s||!Array.isArray(s.fields))continue;let l=r.data&&typeof r.data=="object"?r.data:r;b(l,s.fields);}}}async function p(e,o,t){let n=await a(e,o,{user:t.user,req:t.req,tenantID:t.tenantID,apiKey:t.apiKey});if(!n.allowed)throw new Error(n.error||"Access denied");t.tenantID&&t.db.setTenantContext({tenantId:t.tenantID,userId:t.user?.id??"",role:t.user?.role,isSuperAdmin:t.user?.role==="super_admin"});}function A(e){return async o=>{let{collection:t,where:n,sort:r,limit:a,page:s,depth:l,select:i,draft:d}=o,c=e.registry.getCollection(t);if(await p(c,"read",e),c.hooks?.beforeRead)for(let f of c.hooks.beforeRead)await f({collection:t,req:e.req,user:e.user,tenantID:e.tenantID,operation:"read",where:n});let u=d??!!e.user,D=await e.db.find({collection:t,where:n||{},sort:r,limit:a||10,page:s||1,depth:l||0,tenantID:e.tenantID,select:i,draft:u});if(c.hooks?.afterRead)for(let f of D.docs)for(let I of c.hooks.afterRead)await I({collection:t,doc:f,req:e.req,user:e.user,tenantID:e.tenantID,operation:"read"});return D}}function C(e){return async o=>{let{collection:t,id:n,depth:r,select:a,draft:s}=o,l=e.registry.getCollection(t);await p(l,"read",e);let i=s??!!e.user,d=await e.db.findByID({collection:t,id:n,depth:r||0,tenantID:e.tenantID,select:a,draft:i});if(!d)throw new Error(`Document not found: ${t}/${n}`);if(l.hooks?.afterRead)for(let c of l.hooks.afterRead)await c({collection:t,doc:d,req:e.req,user:e.user,tenantID:e.tenantID,operation:"read",id:n});return d}}function R(e){return async o=>{let{collection:t,data:n,depth:r,select:a}=o,s=e.registry.getCollection(t);await p(s,"create",e);let i=e.registry.getCreateZodSchema(t).parse(n);if(s.tenantScoped&&e.tenantID&&(i.tenantID=e.tenantID),s.hooks?.beforeValidate)for(let c of s.hooks.beforeValidate){let u=await c({collection:t,data:i,req:e.req,user:e.user,tenantID:e.tenantID,operation:"create"});u&&Object.assign(i,u);}if(s.hooks?.beforeChange)for(let c of s.hooks.beforeChange){let u=await c({collection:t,data:i,req:e.req,user:e.user,tenantID:e.tenantID,operation:"create"});u&&Object.assign(i,u);}let d=await e.db.create({collection:t,data:i,depth:r||0,tenantID:e.tenantID,select:a});if(s.hooks?.afterChange)for(let c of s.hooks.afterChange)await c({collection:t,doc:d,data:i,req:e.req,user:e.user,tenantID:e.tenantID,operation:"create"});return await k(e,w(t,"create"),{collection:t,data:d,operation:"create"}),{doc:d}}}function q(e){return async o=>{let{collection:t,id:n,data:r,depth:a,select:s,baseUpdatedAt:l}=o,i=e.registry.getCollection(t);await p(i,"update",e);let d=await e.db.findByID({collection:t,id:n,tenantID:e.tenantID,draft:true});if(!d)throw new Error(`Document not found: ${t}/${n}`);if(l&&d.updatedAt&&l!==d.updatedAt)throw new Error(`Revision conflict: document has changed since ${l}. Current updatedAt: ${d.updatedAt}`);b(r,i.fields);let u=e.registry.getUpdateZodSchema(t).parse(r);if(i.tenantScoped&&e.tenantID&&(u.tenantID=e.tenantID),i.hooks?.beforeValidate)for(let g of i.hooks.beforeValidate){let h=await g({collection:t,data:u,originalDoc:d,req:e.req,user:e.user,tenantID:e.tenantID,operation:"update",id:n});h&&Object.assign(u,h);}if(i.hooks?.beforeChange)for(let g of i.hooks.beforeChange){let h=await g({collection:t,data:u,originalDoc:d,req:e.req,user:e.user,tenantID:e.tenantID,operation:"update",id:n});h&&Object.assign(u,h);}let D=e.req&&typeof e.req.headers?.get=="function"&&e.req.headers.get("x-draft")==="true"||o.draft===true,f=i.versions?.drafts===true,I=e.req?.query?.autosave==="true"||e.req?.url?.includes("autosave=true")||o.autosave===true,y;if(f&&D?(await e.db.createVersion({collection:t,documentId:n,data:u,status:"draft",autosave:I,createdBy:e.user?.id,tenantID:e.tenantID}),y=await e.db.findByID({collection:t,id:n,tenantID:e.tenantID,draft:true})):f?(y=await e.db.update({collection:t,id:n,data:{...u,status:"published"},depth:a||0,tenantID:e.tenantID,select:s}),await e.db.createVersion({collection:t,documentId:n,data:u,status:"published",createdBy:e.user?.id,tenantID:e.tenantID})):y=await e.db.update({collection:t,id:n,data:u,depth:a||0,tenantID:e.tenantID,select:s}),i.hooks?.afterChange)for(let g of i.hooks.afterChange)await g({collection:t,doc:y,data:u,originalDoc:d,req:e.req,user:e.user,tenantID:e.tenantID,operation:"update",id:n});return await k(e,w(t,"update"),{collection:t,data:y,previousData:d,operation:"update"}),{doc:y}}}function P(e){return async o=>{let{collection:t,id:n}=o,r=e.registry.getCollection(t);await p(r,"delete",e);let a=await e.db.findByID({collection:t,id:n,tenantID:e.tenantID,draft:true});if(!a)throw new Error(`Document not found: ${t}/${n}`);if(r.hooks?.beforeDelete)for(let l of r.hooks.beforeDelete)await l({collection:t,doc:a,req:e.req,user:e.user,tenantID:e.tenantID,operation:"delete",id:n});let s=await e.db.delete({collection:t,id:n,tenantID:e.tenantID});if(r.hooks?.afterDelete)for(let l of r.hooks.afterDelete)await l({collection:t,doc:s,req:e.req,user:e.user,tenantID:e.tenantID,operation:"delete",id:n});return await k(e,w(t,"delete"),{collection:t,data:s,previousData:a,operation:"delete"}),{doc:s,message:"Deleted successfully"}}}function v(e){return async o=>{let{collection:t,where:n}=o,r=e.registry.getCollection(t);return await p(r,"read",e),{totalDocs:await e.db.count({collection:t,where:n||{},tenantID:e.tenantID})}}}async function F(e,o,t){let n=await b$1(e,o,{user:t.user,req:t.req,tenantID:t.tenantID});if(!n.allowed)throw new Error(n.error||"Access denied");t.tenantID&&t.db.setTenantContext({tenantId:t.tenantID,userId:t.user?.id??"",role:t.user?.role,isSuperAdmin:t.user?.role==="super_admin"});}function U(e){let o={},t=e.registry.getCollections();for(let r of t){let a=r.slug;o[a]={find:A(e),findByID:C(e),create:R(e),update:q(e),delete:P(e),count:v(e)};}let n=e.registry.getGlobals();for(let r of n){let a=r.slug;o[`_globals_${a}`]={get:async()=>(await F(r,"read",e),await e.db.findOne({collection:`_globals_${a}`,where:{},tenantID:e.tenantID})),update:async s=>{await F(r,"update",e);let i=e.registry.getZodSchema(a).parse(s.data),d=await e.db.findOne({collection:`_globals_${a}`,where:{},tenantID:e.tenantID,draft:true}),c;return d?c=await e.db.update({collection:`_globals_${a}`,id:d.id,data:i,tenantID:e.tenantID}):c=await e.db.create({collection:`_globals_${a}`,data:{...i,id:a},tenantID:e.tenantID}),c}};}return o}function W(e){if(e.settings?.access?.apiAccess?.trpcEnabled===false)throw new Error("tRPC API is disabled");return U(e)}export{$ as a,A as b,C as c,R as d,q as e,P as f,v as g,U as h,W as i};
@@ -0,0 +1,259 @@
1
+ import {a}from'./chunk-K6WUOU6P.js';var u=false,p=class o{db;cache={};loaded=false;static SENSITIVE_KEYS=["storage.s3.secret_access_key","storage.r2.secret_access_key","storage.gcs.private_key","storage.backblaze.application_key","storage.wasabi.secret_access_key","storage.ftp.password","storage.bunny.api_key","storage.cloudinary.api_secret","storage.imgix.sign_key","email.smtp.pass","auth.jwt_secret","auth.github_secret","auth.google_secret","auth.app_secret","database.url","redis.url","auth.admin_password"];constructor(e){this.db=e;}async load(){if(!this.loaded){await this.ensureSettingsTable();try{if(typeof this.db?.select=="function"){let e=await this.db.select().from(a);this.cache=e.reduce((t,s)=>(t[s.key]=s.value,t),{});}await this.loadFromGlobals();}catch{console.warn("ConfigService: Could not load settings from database, using environment fallbacks.");}this.loaded=true;}}async ensureSettingsTable(){if(!u)try{if(typeof this.db?.execute=="function"){let{sql:e}=await import('drizzle-orm');await this.db.execute(e`
2
+ CREATE TABLE IF NOT EXISTS "settings" (
3
+ "key" VARCHAR(255) PRIMARY KEY,
4
+ "value" TEXT NOT NULL,
5
+ "description" TEXT,
6
+ "updated_at" TIMESTAMP DEFAULT NOW()
7
+ )
8
+ `),u=!0;}else typeof this.db?.exec=="function"&&(this.db.exec(`
9
+ CREATE TABLE IF NOT EXISTS settings (
10
+ key TEXT PRIMARY KEY,
11
+ value TEXT NOT NULL,
12
+ description TEXT,
13
+ updated_at TEXT
14
+ )
15
+ `),u=!0);}catch{}}async loadFromGlobals(){try{let e=null;if(typeof this.db?.execute=="function"){let{sql:r}=await import('drizzle-orm'),i=['"_globals_storage-settings"','"_globals_storage_settings"','"global_storage_settings"'];for(let a of i)try{let n=await this.db.execute(r`SELECT * FROM ${r.raw(a)} LIMIT 1`);if(e=Array.isArray(n)?n[0]:n?.rows?n.rows[0]:null,e)break}catch{}}else if(typeof this.db?.prepare=="function"){let r=['"_globals_storage-settings"','"_globals_storage_settings"','"global_storage_settings"'];for(let i of r)try{if(e=this.db.prepare(`SELECT * FROM ${i} LIMIT 1`).get(),e)break}catch{}}if(!e)return;let t=r=>{if(!r)return null;if(typeof r=="string")try{return JSON.parse(r)}catch{return null}return r},s=e.provider||"local";if(this.cache["storage.type"]=s==="aws"?"s3":s,s==="local"){let r=t(e.local);this.cache["storage.local.dir"]=r?.uploadDir||"./public/uploads",this.cache["storage.local.url"]=r?.baseUrl||"/uploads";}if(s==="aws"){let r=t(e.aws);this.cache["storage.s3.bucket"]=r?.bucket||"",this.cache["storage.s3.region"]=r?.region||"us-east-1",this.cache["storage.s3.access_key_id"]=r?.accessKeyId||"",this.cache["storage.s3.secret_access_key"]=r?.secretAccessKey||"",this.cache["storage.s3.endpoint"]=r?.endpoint||"",this.cache["storage.s3.cdn_url"]=r?.cdnUrl||"",this.cache["storage.s3.prefix"]=r?.prefix||"";}if(s==="r2"){let r=t(e.r2);this.cache["storage.r2.account_id"]=r?.accountId||"",this.cache["storage.r2.access_key_id"]=r?.accessKeyId||"",this.cache["storage.r2.secret_access_key"]=r?.secretAccessKey||"",this.cache["storage.r2.bucket"]=r?.bucket||"",this.cache["storage.r2.cdn_url"]=r?.cdnUrl||"",this.cache["storage.r2.prefix"]=r?.prefix||"";}if(s==="cloudinary"){let r=t(e.cloudinary);this.cache["storage.cloudinary.cloud_name"]=r?.cloudName||"",this.cache["storage.cloudinary.api_key"]=r?.apiKey||"",this.cache["storage.cloudinary.api_secret"]=r?.apiSecret||"",this.cache["storage.cloudinary.folder"]=r?.folder||"";}if(s==="ftp"){let r=t(e.ftp);this.cache["storage.ftp.host"]=r?.host||"",this.cache["storage.ftp.port"]=String(r?.port||"21"),this.cache["storage.ftp.user"]=r?.user||"",this.cache["storage.ftp.password"]=r?.password||"",this.cache["storage.ftp.secure"]=r?.secure?"true":"false",this.cache["storage.ftp.base_url"]=r?.baseUrl||"",this.cache["storage.ftp.prefix"]=r?.prefix||"";}}catch(e){console.warn("ConfigService: Could not load storage settings from globals table:",e);}try{let e=null;if(typeof this.db?.execute=="function"){let{sql:t}=await import('drizzle-orm'),s=['"_globals_email-settings"','"_globals_email_settings"','"global_email_settings"'];for(let r of s)try{let i=await this.db.execute(t`SELECT * FROM ${t.raw(r)} LIMIT 1`);if(e=Array.isArray(i)?i[0]:i?.rows?i.rows[0]:null,e)break}catch{}}else if(typeof this.db?.prepare=="function"){let t=['"_globals_email-settings"','"_globals_email_settings"','"global_email_settings"'];for(let s of t)try{if(e=this.db.prepare(`SELECT * FROM ${s} LIMIT 1`).get(),e)break}catch{}}if(e){let t=s=>{if(!s)return null;if(typeof s=="string")try{return JSON.parse(s)}catch{return null}return s};if(this.cache["email.provider"]=e.provider||"smtp",this.cache["email.smtp.from"]=e.fromEmail||"",this.cache["email.smtp.from_name"]=e.fromName||"",this.cache["email.smtp.reply_to"]=e.replyTo||"",e.provider==="smtp"){let s=t(e.smtp);this.cache["email.smtp.host"]=s?.host||"",this.cache["email.smtp.port"]=String(s?.port||"587"),this.cache["email.smtp.user"]=s?.username||"",this.cache["email.smtp.pass"]=s?.password||"",this.cache["email.smtp.secure"]=s?.secure?"true":"false";}else if(e.provider==="resend"){let s=t(e.resend);this.cache["email.smtp.pass"]=s?.apiKey||"";}else if(e.provider==="sendgrid"){let s=t(e.sendgrid);this.cache["email.smtp.pass"]=s?.apiKey||"";}else if(e.provider==="mailgun"){let s=t(e.mailgun);this.cache["email.smtp.pass"]=s?.apiKey||"";}else if(e.provider==="ses"){let s=t(e.ses);this.cache["email.smtp.user"]=s?.accessKeyId||"",this.cache["email.smtp.pass"]=s?.secretAccessKey||"";}}}catch(e){console.warn("ConfigService: Could not load email settings from globals table:",e);}}get(e,t,s){return this.cache[e]?this.cache[e]:t&&process.env[t]?process.env[t]:s}getStorageConfig(){return {type:this.get("storage.type","STORAGE_TYPE","local"),s3:{bucket:this.get("storage.s3.bucket","STORAGE_BUCKET"),region:this.get("storage.s3.region","STORAGE_REGION","us-east-1"),accessKeyId:this.get("storage.s3.access_key_id","STORAGE_ACCESS_KEY_ID"),secretAccessKey:this.get("storage.s3.secret_access_key","STORAGE_SECRET_ACCESS_KEY"),endpoint:this.get("storage.s3.endpoint","STORAGE_ENDPOINT"),cdnUrl:this.get("storage.s3.cdn_url","STORAGE_CDN_URL"),prefix:this.get("storage.s3.prefix","STORAGE_PREFIX")},r2:{accountId:this.get("storage.r2.account_id","R2_ACCOUNT_ID"),accessKeyId:this.get("storage.r2.access_key_id","R2_ACCESS_KEY_ID"),secretAccessKey:this.get("storage.r2.secret_access_key","R2_SECRET_ACCESS_KEY"),bucket:this.get("storage.r2.bucket","R2_BUCKET"),cdnUrl:this.get("storage.r2.cdn_url","R2_CDN_URL"),prefix:this.get("storage.r2.prefix","R2_PREFIX")},gcs:{bucket:this.get("storage.gcs.bucket","GCS_BUCKET"),projectId:this.get("storage.gcs.project_id","GCS_PROJECT_ID"),clientEmail:this.get("storage.gcs.client_email","GCS_CLIENT_EMAIL"),privateKey:this.get("storage.gcs.private_key","GCS_PRIVATE_KEY"),cdnUrl:this.get("storage.gcs.cdn_url","GCS_CDN_URL"),prefix:this.get("storage.gcs.prefix","GCS_PREFIX")},digitalocean:{bucket:this.get("storage.digitalocean.bucket","DO_BUCKET"),region:this.get("storage.digitalocean.region","DO_REGION","nyc3"),accessKeyId:this.get("storage.digitalocean.access_key_id","DO_ACCESS_KEY_ID"),secretAccessKey:this.get("storage.digitalocean.secret_access_key","DO_SECRET_ACCESS_KEY"),cdnUrl:this.get("storage.digitalocean.cdn_url","DO_CDN_URL"),prefix:this.get("storage.digitalocean.prefix","DO_PREFIX")},backblaze:{bucket:this.get("storage.backblaze.bucket","BB_BUCKET"),accountId:this.get("storage.backblaze.account_id","BB_ACCOUNT_ID"),applicationKeyId:this.get("storage.backblaze.application_key_id","BB_APPLICATION_KEY_ID"),applicationKey:this.get("storage.backblaze.application_key","BB_APPLICATION_KEY"),cdnUrl:this.get("storage.backblaze.cdn_url","BB_CDN_URL"),prefix:this.get("storage.backblaze.prefix","BB_PREFIX")},wasabi:{bucket:this.get("storage.wasabi.bucket","WASABI_BUCKET"),region:this.get("storage.wasabi.region","WASABI_REGION","us-east-1"),accessKeyId:this.get("storage.wasabi.access_key_id","WASABI_ACCESS_KEY_ID"),secretAccessKey:this.get("storage.wasabi.secret_access_key","WASABI_SECRET_ACCESS_KEY"),cdnUrl:this.get("storage.wasabi.cdn_url","WASABI_CDN_URL"),prefix:this.get("storage.wasabi.prefix","WASABI_PREFIX")},bunny:{storageZone:this.get("storage.bunny.storage_zone","BUNNY_STORAGE_ZONE"),apiKey:this.get("storage.bunny.api_key","BUNNY_API_KEY"),cdnUrl:this.get("storage.bunny.cdn_url","BUNNY_CDN_URL"),prefix:this.get("storage.bunny.prefix","BUNNY_PREFIX")},ftp:{host:this.get("storage.ftp.host","FTP_HOST"),port:parseInt(this.get("storage.ftp.port","FTP_PORT","21"),10),user:this.get("storage.ftp.user","FTP_USER"),password:this.get("storage.ftp.password","FTP_PASSWORD"),secure:this.get("storage.ftp.secure","FTP_SECURE")==="true",baseUrl:this.get("storage.ftp.base_url","FTP_BASE_URL"),prefix:this.get("storage.ftp.prefix","FTP_PREFIX")},cloudinary:{cloudName:this.get("storage.cloudinary.cloud_name","CLOUDINARY_CLOUD_NAME"),apiKey:this.get("storage.cloudinary.api_key","CLOUDINARY_API_KEY"),apiSecret:this.get("storage.cloudinary.api_secret","CLOUDINARY_API_SECRET"),folder:this.get("storage.cloudinary.folder","CLOUDINARY_FOLDER")},imgix:{domain:this.get("storage.imgix.domain","IMGIX_DOMAIN"),signKey:this.get("storage.imgix.sign_key","IMGIX_SIGN_KEY")},local:{uploadDir:this.get("storage.local.dir","STORAGE_LOCAL_DIR","./public/uploads"),baseUrl:this.get("storage.local.url","STORAGE_LOCAL_URL","/uploads")}}}getEmailConfig(){return {provider:this.get("email.provider","EMAIL_PROVIDER","smtp"),host:this.get("email.smtp.host","SMTP_HOST"),port:parseInt(this.get("email.smtp.port","SMTP_PORT","587"),10),secure:this.get("email.smtp.secure","SMTP_SECURE")==="true",user:this.get("email.smtp.user","SMTP_USER"),pass:this.get("email.smtp.pass","SMTP_PASS"),from:this.get("email.smtp.from","SMTP_FROM","noreply@example.com"),fromName:this.get("email.smtp.from_name","SMTP_FROM_NAME","Kyro CMS"),replyTo:this.get("email.smtp.reply_to","SMTP_REPLY_TO")}}maskSensitive(e,t){return t&&(o.SENSITIVE_KEYS.includes(e)?"********":t)}async set(e,t,s){await this.db.insert(a).values({key:e,value:t,description:s,updatedAt:new Date}).onConflictDoUpdate({target:[a.key],set:{value:t,description:s,updatedAt:new Date}}),this.cache[e]=t;}};var b={verifyEmail:(o,e="User")=>({subject:"Verify your email address",html:`
16
+ <!DOCTYPE html>
17
+ <html>
18
+ <head>
19
+ <meta charset="utf-8">
20
+ <meta name="viewport" content="width=device-width, initial-scale=1">
21
+ <title>Verify Email</title>
22
+ <style>
23
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
24
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
25
+ .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }
26
+ .footer { margin-top: 30px; font-size: 12px; color: #666; }
27
+ </style>
28
+ </head>
29
+ <body>
30
+ <div class="container">
31
+ <h1>Welcome, ${e}!</h1>
32
+ <p>Please verify your email address by clicking the button below:</p>
33
+ <p style="text-align: center; margin: 30px 0;">
34
+ <a href="${o}" class="button">Verify Email</a>
35
+ </p>
36
+ <p>Or copy and paste this link into your browser:</p>
37
+ <p style="word-break: break-all; color: #666;">${o}</p>
38
+ <p>This link will expire in 24 hours.</p>
39
+ <div class="footer">
40
+ <p>If you didn't create an account, you can safely ignore this email.</p>
41
+ </div>
42
+ </div>
43
+ </body>
44
+ </html>
45
+ `,text:`Welcome ${e}!
46
+
47
+ Please verify your email by clicking this link: ${o}
48
+
49
+ This link will expire in 24 hours.
50
+
51
+ If you didn't create an account, you can safely ignore this email.`}),resetPassword:(o,e="User")=>({subject:"Reset your password",html:`
52
+ <!DOCTYPE html>
53
+ <html>
54
+ <head>
55
+ <meta charset="utf-8">
56
+ <meta name="viewport" content="width=device-width, initial-scale=1">
57
+ <title>Reset Password</title>
58
+ <style>
59
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
60
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
61
+ .button { display: inline-block; padding: 12px 24px; background: #dc2626; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }
62
+ .warning { background: #fef3c7; border: 1px solid #f59e0b; padding: 12px; border-radius: 6px; margin: 20px 0; }
63
+ .footer { margin-top: 30px; font-size: 12px; color: #666; }
64
+ </style>
65
+ </head>
66
+ <body>
67
+ <div class="container">
68
+ <h1>Password Reset Request</h1>
69
+ <p>Hello ${e},</p>
70
+ <p>We received a request to reset your password. Click the button below to create a new password:</p>
71
+ <p style="text-align: center; margin: 30px 0;">
72
+ <a href="${o}" class="button">Reset Password</a>
73
+ </p>
74
+ <p>Or copy and paste this link into your browser:</p>
75
+ <p style="word-break: break-all; color: #666;">${o}</p>
76
+ <div class="warning">
77
+ <strong>\u26A0\uFE0F Important:</strong> This link will expire in 1 hour. If you didn't request a password reset, please ignore this email or contact support if you have concerns.
78
+ </div>
79
+ <div class="footer">
80
+ <p>For security reasons, please don't share this email with anyone.</p>
81
+ </div>
82
+ </div>
83
+ </body>
84
+ </html>
85
+ `,text:`Password Reset Request
86
+
87
+ Hello ${e},
88
+
89
+ We received a request to reset your password. Click this link to create a new password: ${o}
90
+
91
+ This link will expire in 1 hour.
92
+
93
+ If you didn't request a password reset, please ignore this email.`}),welcome:(o="User")=>({subject:"Welcome to Kyro CMS",html:`
94
+ <!DOCTYPE html>
95
+ <html>
96
+ <head>
97
+ <meta charset="utf-8">
98
+ <meta name="viewport" content="width=device-width, initial-scale=1">
99
+ <title>Welcome</title>
100
+ <style>
101
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
102
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
103
+ .button { display: inline-block; padding: 12px 24px; background: #0b1222; color: white; text-decoration: none; border-radius: 6px; font-weight: 600; }
104
+ </style>
105
+ </head>
106
+ <body>
107
+ <div class="container">
108
+ <h1>Welcome to Kyro CMS, ${o}!</h1>
109
+ <p>Your account has been created successfully.</p>
110
+ <p>You can now:</p>
111
+ <ul>
112
+ <li>Manage your content collections</li>
113
+ <li>Upload and organize media</li>
114
+ <li>Configure settings</li>
115
+ <li>And much more...</li>
116
+ </ul>
117
+ <p style="text-align: center; margin: 30px 0;">
118
+ <a href="#" class="button">Get Started</a>
119
+ </p>
120
+ <p>If you have any questions, feel free to reach out to our support team.</p>
121
+ </div>
122
+ </body>
123
+ </html>
124
+ `,text:`Welcome to Kyro CMS, ${o}!
125
+
126
+ Your account has been created successfully.
127
+
128
+ You can now:
129
+ - Manage your content collections
130
+ - Upload and organize media
131
+ - Configure settings
132
+ - And much more...
133
+
134
+ Get started by logging into your dashboard.`}),accountLocked:(o,e,t="User")=>({subject:"Account Security Alert - Account Locked",html:`
135
+ <!DOCTYPE html>
136
+ <html>
137
+ <head>
138
+ <meta charset="utf-8">
139
+ <meta name="viewport" content="width=device-width, initial-scale=1">
140
+ <title>Account Locked</title>
141
+ <style>
142
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
143
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
144
+ .alert { background: #fef2f2; border: 1px solid #ef4444; padding: 16px; border-radius: 8px; margin: 20px 0; }
145
+ .footer { margin-top: 30px; font-size: 12px; color: #666; }
146
+ </style>
147
+ </head>
148
+ <body>
149
+ <div class="container">
150
+ <h1>Account Security Alert</h1>
151
+ <p>Hello ${t},</p>
152
+ <div class="alert">
153
+ <p><strong>\u26A0\uFE0F Your account has been temporarily locked due to multiple failed login attempts.</strong></p>
154
+ <p>Failed attempts: ${o}</p>
155
+ <p>Lockout duration: ${Math.round(e/6e4)} minutes</p>
156
+ </div>
157
+ <p>Your account will automatically unlock after the lockout period expires.</p>
158
+ <p>If this wasn't you, we recommend:</p>
159
+ <ul>
160
+ <li>Using a strong, unique password</li>
161
+ <li>Enabling two-factor authentication (coming soon)</li>
162
+ <li>Reviewing your recent account activity</li>
163
+ </ul>
164
+ <div class="footer">
165
+ <p>If you need immediate assistance, please contact support.</p>
166
+ </div>
167
+ </div>
168
+ </body>
169
+ </html>
170
+ `,text:`Account Security Alert
171
+
172
+ Hello ${t},
173
+
174
+ Your account has been temporarily locked due to multiple failed login attempts (${o}).
175
+
176
+ Lockout duration: ${Math.round(e/6e4)} minutes
177
+
178
+ Your account will automatically unlock after this period.
179
+
180
+ If this wasn't you, we recommend using a strong, unique password.`}),passwordChanged:(o="User")=>({subject:"Your password has been changed",html:`
181
+ <!DOCTYPE html>
182
+ <html>
183
+ <head>
184
+ <meta charset="utf-8">
185
+ <meta name="viewport" content="width=device-width, initial-scale=1">
186
+ <title>Password Changed</title>
187
+ <style>
188
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
189
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
190
+ .info { background: #f0fdf4; border: 1px solid #22c55e; padding: 12px; border-radius: 6px; margin: 20px 0; }
191
+ </style>
192
+ </head>
193
+ <body>
194
+ <div class="container">
195
+ <h1>Password Changed</h1>
196
+ <p>Hello ${o},</p>
197
+ <div class="info">
198
+ <p>Your password was recently changed.</p>
199
+ </div>
200
+ <p>If you did this, you can safely ignore this email.</p>
201
+ <p><strong>If you didn't change your password</strong>, please contact our support team immediately as your account may have been compromised.</p>
202
+ </div>
203
+ </body>
204
+ </html>
205
+ `,text:`Password Changed
206
+
207
+ Hello ${o},
208
+
209
+ Your password was recently changed.
210
+
211
+ If you did this, you can safely ignore this email.
212
+
213
+ If you didn't change your password, please contact support immediately.`}),newLogin:(o,e,t="User")=>({subject:"New login to your account",html:`
214
+ <!DOCTYPE html>
215
+ <html>
216
+ <head>
217
+ <meta charset="utf-8">
218
+ <meta name="viewport" content="width=device-width, initial-scale=1">
219
+ <title>New Login</title>
220
+ <style>
221
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
222
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
223
+ .info-box { background: #f8fafc; border: 1px solid #e2e8f0; padding: 16px; border-radius: 8px; margin: 20px 0; }
224
+ .footer { margin-top: 30px; font-size: 12px; color: #666; }
225
+ </style>
226
+ </head>
227
+ <body>
228
+ <div class="container">
229
+ <h1>New Login Detected</h1>
230
+ <p>Hello ${t},</p>
231
+ <p>We detected a new login to your account:</p>
232
+ <div class="info-box">
233
+ <p><strong>Location:</strong> ${o}</p>
234
+ <p><strong>Time:</strong> ${e}</p>
235
+ </div>
236
+ <p><strong>If this was you</strong>, no action is needed.</p>
237
+ <p><strong>If this wasn't you</strong>, your account may be compromised. Please:</p>
238
+ <ol>
239
+ <li>Change your password immediately</li>
240
+ <li>Review your recent account activity</li>
241
+ <li>Contact support if needed</li>
242
+ </ol>
243
+ <div class="footer">
244
+ <p>This is an automated security notification.</p>
245
+ </div>
246
+ </div>
247
+ </body>
248
+ </html>
249
+ `,text:`New Login Detected
250
+
251
+ Hello ${t},
252
+
253
+ We detected a new login to your account:
254
+
255
+ Location: ${o}
256
+ Time: ${e}
257
+
258
+ If this wasn't you, please change your password immediately and contact support.`})},h=class o{transporter;config;templates;transporterInitialized=false;constructor(e,t){this.config=e,this.templates={...b,...t};}async ensureTransporter(){if(this.transporterInitialized)return this.transporter;let{default:e}=await import('nodemailer');return this.config.provider==="smtp"&&this.config.smtp?this.transporter=e.createTransport({host:this.config.smtp.host,port:this.config.smtp.port,secure:this.config.smtp.secure,auth:this.config.smtp.auth}):this.config.provider==="ses"&&this.config.ses&&(this.transporter=e.createTransport({host:`email-smtp.${this.config.ses.region}.amazonaws.com`,port:587,secure:false,auth:{user:this.config.ses.accessKeyId,pass:this.config.ses.secretAccessKey}})),this.transporterInitialized=true,this.transporter}async send(e){let{provider:t,from:s,fromName:r,replyTo:i}=this.config,a=`"${r||"Kyro CMS"}" <${s}>`,n=e.replyTo||i;try{let c;switch(t){case "smtp":case "ses":{let l=await this.ensureTransporter();if(!l)throw new Error(`${t} transporter not initialized`);c=await l.sendMail({from:a,to:Array.isArray(e.to)?e.to.join(", "):e.to,subject:e.subject,html:e.html,text:e.text,replyTo:n});}break;case "resend":c=await this.sendViaResend(a,e,n);break;case "sendgrid":c=await this.sendViaSendGrid(a,e,n);break;case "mailgun":c=await this.sendViaMailgun(a,e,n);break;default:throw new Error(`Unsupported email provider: ${t}`)}return c}catch(c){throw console.error("[EmailTransport] FAILED to send email:",c.message),c.response&&console.error("[EmailTransport] Provider Error Detail:",JSON.stringify(c.response,null,2)),c}}async sendViaResend(e,t,s){let r=this.config.resend?.apiKey;if(!r)throw new Error("Resend API Key missing");let i={from:e,to:t.to,subject:t.subject,html:t.html,text:t.text,reply_to:s},a=await fetch("https://api.resend.com/emails",{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify(i)});if(!a.ok){let n=await a.json();throw new Error(`Resend Error: ${JSON.stringify(n)}`)}return a.json()}async sendViaSendGrid(e,t,s){let r=this.config.sendgrid?.apiKey;if(!r)throw new Error("SendGrid API Key missing");let i={personalizations:[{to:Array.isArray(t.to)?t.to.map(n=>({email:n})):[{email:t.to}]}],from:{email:e.match(/<(.+)>/)?.[1]||e,name:e.match(/"(.+)"/)?.[1]},subject:t.subject,content:[{type:"text/plain",value:t.text||""},{type:"text/html",value:t.html}],reply_to:s?{email:s}:void 0},a=await fetch("https://api.sendgrid.com/v3/mail/send",{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify(i)});if(!a.ok){let n=await a.json();throw new Error(`SendGrid Error: ${JSON.stringify(n)}`)}return {success:true}}async sendViaMailgun(e,t,s){let{apiKey:r,domain:i,region:a}=this.config.mailgun||{};if(!r||!i)throw new Error("Mailgun config missing");let n=a==="eu"?"api.eu.mailgun.net":"api.mailgun.net",c=btoa(`api:${r}`),l=new URLSearchParams;l.append("from",e);let f=Array.isArray(t.to)?t.to.join(", "):t.to;l.append("to",f),l.append("subject",t.subject),l.append("html",t.html),t.text&&l.append("text",t.text),s&&l.append("h:Reply-To",s);let d=await fetch(`https://${n}/v3/${i}/messages`,{method:"POST",headers:{Authorization:`Basic ${c}`,"Content-Type":"application/x-www-form-urlencoded"},body:l});if(!d.ok){let y=await d.json();throw new Error(`Mailgun Error: ${JSON.stringify(y)}`)}return d.json()}getTemplates(){return this.templates}async verifyConnection(){if(this.config.provider==="smtp"||this.config.provider==="ses")try{let e=await this.ensureTransporter();if(e)return await e.verify(),!0}catch{return false}return !!(this.config.resend?.apiKey||this.config.sendgrid?.apiKey||this.config.mailgun?.apiKey)}static async fromConfig(e){let t=new p(e);await t.load();let s=t.getEmailConfig();if(!s.provider)return this.fromEnv();let r={provider:s.provider||"smtp",from:s.from||"noreply@example.com",fromName:s.fromName,replyTo:s.replyTo,smtp:s.provider==="smtp"?{host:s.host||"",port:s.port||587,secure:s.secure||false,auth:{user:s.user||"",pass:s.pass||""}}:void 0,resend:s.provider==="resend"?{apiKey:s.pass||""}:void 0,sendgrid:s.provider==="sendgrid"?{apiKey:s.pass||""}:void 0,mailgun:s.provider==="mailgun"?{apiKey:s.pass||"",domain:s.host||"",region:s.secure?"eu":"us"}:void 0,ses:s.provider==="ses"?{accessKeyId:s.user||"",secretAccessKey:s.pass||"",region:s.host||"us-east-1"}:void 0};return new o(r)}static fromEnv(){let e=process.env.EMAIL_PROVIDER||"smtp",t=process.env.SMTP_FROM||process.env.DEFAULT_FROM||"noreply@example.com",s=process.env.SMTP_FROM_NAME||"Kyro CMS",r=process.env.SMTP_REPLY_TO;if(e==="smtp"){let i=process.env.SMTP_HOST,a=process.env.SMTP_USER,n=process.env.SMTP_PASS;return !i||!a||!n?null:new o({provider:"smtp",from:t,fromName:s,replyTo:r,smtp:{host:i,port:parseInt(process.env.SMTP_PORT||"587",10),secure:process.env.SMTP_SECURE==="true",auth:{user:a,pass:n}}})}if(e==="resend"){let i=process.env.RESEND_API_KEY||process.env.SMTP_PASS;return i?new o({provider:"resend",from:t,fromName:s,replyTo:r,resend:{apiKey:i}}):null}if(e==="sendgrid"){let i=process.env.SENDGRID_API_KEY||process.env.SMTP_PASS;return i?new o({provider:"sendgrid",from:t,fromName:s,replyTo:r,sendgrid:{apiKey:i}}):null}if(e==="mailgun"){let i=process.env.MAILGUN_API_KEY||process.env.SMTP_PASS,a=process.env.MAILGUN_DOMAIN||process.env.SMTP_HOST;return !i||!a?null:new o({provider:"mailgun",from:t,fromName:s,replyTo:r,mailgun:{apiKey:i,domain:a,region:process.env.MAILGUN_REGION||(process.env.SMTP_SECURE==="true"?"eu":"us")}})}if(e==="ses"){let i=process.env.AWS_ACCESS_KEY_ID||process.env.SMTP_USER,a=process.env.AWS_SECRET_ACCESS_KEY||process.env.SMTP_PASS,n=process.env.AWS_REGION||process.env.SMTP_HOST||"us-east-1";return !i||!a?null:new o({provider:"ses",from:t,fromName:s,replyTo:r,ses:{accessKeyId:i,secretAccessKey:a,region:n}})}return null}};var _={minLength:12,requireUppercase:true,requireLowercase:true,requireNumbers:true,requireSpecialChars:true,preventReuse:5,maxLength:128},m=class{config;constructor(e={}){this.config={..._,...e};}validate(e){let t=[];return this.config.maxLength&&e.length>this.config.maxLength&&t.push(`Password must not exceed ${this.config.maxLength} characters`),e.length<this.config.minLength&&t.push(`Password must be at least ${this.config.minLength} characters`),this.config.requireUppercase&&!/[A-Z]/.test(e)&&t.push("Password must contain at least one uppercase letter"),this.config.requireLowercase&&!/[a-z]/.test(e)&&t.push("Password must contain at least one lowercase letter"),this.config.requireNumbers&&!/[0-9]/.test(e)&&t.push("Password must contain at least one number"),this.config.requireSpecialChars&&!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(e)&&t.push("Password must contain at least one special character"),["password","123456","12345678","qwerty","abc123","monkey","1234567","letmein","trustno1","dragon","baseball","iloveyou","master","sunshine","ashley","football","password1","shadow","123123","654321"].includes(e.toLowerCase())&&t.push("This password is too common. Please choose a more secure password"),(/^[a-zA-Z]+$/.test(e)||/^[0-9]+$/.test(e))&&t.push("Password must contain a mix of letters, numbers, and/or special characters"),/(.)\1{2,}/.test(e)&&t.push("Password must not contain more than 2 consecutive identical characters"),/^(012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210)+$/i.test(e)&&t.push("Password must not contain sequential numbers or letters"),{valid:t.length===0,errors:t}}async checkReuse(e,t,s){return {valid:true,errors:[]}}async isInHistory(e,t,s){for(let r of t)if(await s(e,r))return true;return false}generatePassword(e=16){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s="abcdefghijklmnopqrstuvwxyz",r="0123456789",i="!@#$%^&*()_+-=[]{}|;:,.<>?",a="";a+=t[Math.floor(Math.random()*t.length)],a+=s[Math.floor(Math.random()*s.length)],a+=r[Math.floor(Math.random()*r.length)],a+=i[Math.floor(Math.random()*i.length)];let n=t+s+r+i;for(let c=a.length;c<e;c++)a+=n[Math.floor(Math.random()*n.length)];return a.split("").sort(()=>Math.random()-.5).join("")}getStrength(e){let t=0,s=[];e.length>=8&&(t+=1),e.length>=12&&(t+=1),e.length>=16&&(t+=1),/[a-z]/.test(e)&&(t+=1),/[A-Z]/.test(e)&&(t+=1),/[0-9]/.test(e)&&(t+=1),/[!@#$%^&*()_+\-=\[\]{}|;:,.<>?]/.test(e)&&(t+=1),e.length>8&&(t+=1),e.length>12&&(t+=1);let r=new Set(e).size;r>6&&(t+=1),r>10&&(t+=1);let i;return t<=3?(i="Weak",s.push("Add more characters"),s.push("Include uppercase and lowercase letters")):t<=5?(i="Fair",s.push("Add special characters"),s.push("Consider making it longer")):t<=7?(i="Good",s.push("Consider making it longer for extra security")):i="Strong",{score:t,label:i,feedback:s}}setConfig(e){this.config={...this.config,...e};}getConfig(){return {...this.config}}};
259
+ export{p as a,h as b,m as c};
@@ -0,0 +1 @@
1
+ var e={slug:"users",label:"Users",fields:[{name:"name",type:"text",label:"Name"},{name:"email",type:"email",required:true},{name:"passwordHash",type:"text",label:"Password Hash",admin:{hidden:true}},{name:"role",type:"select",options:[{label:"Super Admin",value:"super_admin"},{label:"Admin",value:"admin"},{label:"Editor",value:"editor"},{label:"Author",value:"author"},{label:"Customer",value:"customer"},{label:"Guest",value:"guest"}],required:true},{name:"avatar",type:"upload",relationTo:"media",label:"Profile Picture"},{name:"tenantId",type:"text",label:"Tenant"},{name:"emailVerified",type:"checkbox",label:"Email Verified"},{name:"locked",type:"checkbox"},{name:"lastLogin",type:"date",time:true,label:"Last Login",admin:{readOnly:true}},{name:"failedLoginAttempts",type:"number",label:"Failed Login Attempts",admin:{readOnly:true}}],timestamps:true,admin:{useAsTitle:"email",defaultColumns:["email","role","tenantId","lastLogin"]}},t={slug:"audit_logs",label:"Audit Logs",fields:[{name:"action",type:"text",required:true},{name:"userId",type:"text",label:"User ID"},{name:"userEmail",type:"email",label:"User Email"},{name:"role",type:"text"},{name:"resource",type:"text",label:"Resource"},{name:"ipAddress",type:"text",label:"IP Address"},{name:"success",type:"checkbox"},{name:"timestamp",type:"date",time:true,required:true,admin:{readOnly:true}}],admin:{defaultColumns:["action","userEmail","resource","success","timestamp"]}},a={users:e,audit_logs:t};export{e as a,a as b};
@@ -0,0 +1 @@
1
+ 'use strict';var e=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var k=(b,a)=>()=>(b&&(a=b(b=0)),a);var l=(b,a)=>{for(var d in a)e(b,d,{get:a[d],enumerable:true});},j=(b,a,d,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let c of h(a))!i.call(b,c)&&c!==d&&e(b,c,{get:()=>a[c],enumerable:!(f=g(a,c))||f.enumerable});return b};var m=b=>j(e({},"__esModule",{value:true}),b);exports.a=k;exports.b=l;exports.c=m;