@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
@@ -1,1069 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkGUUB5EAG_cjs = require('./chunk-GUUB5EAG.cjs');
4
- var drizzleOrm = require('drizzle-orm');
5
- var pgCore = require('drizzle-orm/pg-core');
6
- var sqliteCore = require('drizzle-orm/sqlite-core');
7
- var postgresJs = require('drizzle-orm/postgres-js');
8
- var postgres = require('postgres');
9
- var crypto = require('crypto');
10
- var promises = require('fs/promises');
11
- var path = require('path');
12
- var module$1 = require('module');
13
-
14
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
15
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
-
17
- var postgres__default = /*#__PURE__*/_interopDefault(postgres);
18
-
19
- var _schemaEnsured = false;
20
- function fieldToDrizzleType(field, dialect = "postgres") {
21
- switch (field.type) {
22
- case "text":
23
- case "email":
24
- case "password":
25
- case "color":
26
- return dialect === "sqlite" ? "text" : "varchar";
27
- case "textarea":
28
- case "code":
29
- case "markdown":
30
- case "secret":
31
- return "text";
32
- case "number":
33
- return field.integer ? "integer" : "decimal";
34
- case "checkbox":
35
- return "boolean";
36
- case "date":
37
- return "timestamp";
38
- case "select":
39
- case "radio":
40
- return dialect === "sqlite" ? "text" : "varchar";
41
- case "richtext":
42
- case "json":
43
- case "array":
44
- case "group":
45
- case "blocks":
46
- case "row":
47
- case "collapsible":
48
- case "tabs":
49
- return "jsonb";
50
- case "relationship":
51
- return dialect === "sqlite" ? "text" : "varchar";
52
- case "upload":
53
- return "jsonb";
54
- default:
55
- return "jsonb";
56
- }
57
- }
58
- function collectionToDrizzleSchema(collection, dialect = "postgres") {
59
- const tableName = collection.slug.replace(/-/g, "_");
60
- const lines = [];
61
- lines.push(`export const ${tableName} = pgTable('${tableName}', {`);
62
- lines.push(` id: uuid('id').primaryKey().defaultRandom(),`);
63
- for (const field of collection.fields) {
64
- if (field.name === "id") continue;
65
- const dbType = fieldToDrizzleType(field, dialect);
66
- const isRequired = field.required;
67
- let fieldDef = ` ${field.name}: pg.${dbType}('${field.name}')`;
68
- if (field.unique) fieldDef += ".unique()";
69
- if (!isRequired) fieldDef += ".nullable()";
70
- if (field.defaultValue !== void 0) {
71
- if (typeof field.defaultValue === "string") {
72
- fieldDef += `.default('${field.defaultValue}')`;
73
- } else if (typeof field.defaultValue === "boolean") {
74
- fieldDef += `.default(${field.defaultValue})`;
75
- } else {
76
- fieldDef += `.default(sql\`${JSON.stringify(field.defaultValue)}\`)`;
77
- }
78
- }
79
- fieldDef += ",";
80
- lines.push(fieldDef);
81
- }
82
- if (collection.timestamps) {
83
- lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);
84
- lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);
85
- }
86
- lines.push(` status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('status').default('draft'),`);
87
- lines.push(` hasDraft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('hasDraft').default(false),`);
88
- lines.push("});");
89
- return lines.join("\n");
90
- }
91
- var DrizzleAdapter = class extends chunkGUUB5EAG_cjs.AbstractBaseAdapter {
92
- client;
93
- schema;
94
- dialect;
95
- connectionString;
96
- versionsTableReady = false;
97
- constructor(options) {
98
- super();
99
- this.schema = options.schema || {};
100
- if (options.connectionString) {
101
- this.connectionString = options.connectionString;
102
- const connStr = options.connectionString.toLowerCase();
103
- if (connStr.startsWith("postgres://") || connStr.startsWith("postgresql://")) {
104
- this.dialect = "postgres";
105
- } else if (connStr.includes(".db") || connStr.includes("sqlite") || connStr.includes("file:")) {
106
- this.dialect = "sqlite";
107
- } else {
108
- this.dialect = options.type || "postgres";
109
- }
110
- } else {
111
- this.client = options.client;
112
- this.dialect = options.type || "sqlite";
113
- }
114
- }
115
- prepareData(data, config) {
116
- const result = super.prepareData(data, config);
117
- if (result.createdAt && typeof result.createdAt === "string") {
118
- result.createdAt = new Date(result.createdAt);
119
- }
120
- if (result.updatedAt && typeof result.updatedAt === "string") {
121
- result.updatedAt = new Date(result.updatedAt);
122
- }
123
- for (const field of config.fields) {
124
- if (field.type === "date" && field.name) {
125
- const value = result[field.name];
126
- if (value && typeof value === "string") {
127
- result[field.name] = new Date(value);
128
- }
129
- }
130
- }
131
- for (const field of config.fields) {
132
- const dbType = fieldToDrizzleType(field, this.dialect);
133
- const isJsonb = dbType === "jsonb";
134
- if (field.type === "tabs" && "tabs" in field && field.name) {
135
- const tabData = data[field.name];
136
- if (tabData && typeof tabData === "object") {
137
- const processedTabData = {};
138
- for (const [key, value] of Object.entries(tabData)) {
139
- const tabField = field.tabs.flatMap((t) => t.fields).find((f) => f.name === key);
140
- const needsStringify = (tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value;
141
- if (needsStringify) {
142
- processedTabData[key] = Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
143
- } else {
144
- processedTabData[key] = value;
145
- }
146
- }
147
- result[field.name] = isJsonb ? processedTabData : JSON.stringify(processedTabData);
148
- }
149
- }
150
- if (field.type === "upload" || field.type === "image" || field.type === "list" || field.type === "relationship-block") {
151
- if (field.name) {
152
- const value = data[field.name];
153
- if (value) {
154
- result[field.name] = isJsonb ? value : Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
155
- }
156
- }
157
- }
158
- }
159
- for (const field of config.fields) {
160
- if (field.name && result[field.name] === "") {
161
- const dbType = fieldToDrizzleType(field, this.dialect);
162
- if (dbType === "timestamp" || dbType === "jsonb" || dbType === "decimal" || dbType === "integer" || dbType === "numeric" || dbType === "boolean") {
163
- result[field.name] = null;
164
- }
165
- }
166
- }
167
- return result;
168
- }
169
- async connect() {
170
- if (this.connectionString && !this.client) {
171
- if (this.dialect === "postgres") {
172
- const { default: postgres2 } = await import('postgres');
173
- const { drizzle: drizzle2 } = await import('drizzle-orm/postgres-js');
174
- const sql2 = postgres2(this.connectionString, { onnotice: () => {
175
- } });
176
- this.client = drizzle2(sql2, { schema: this.schema });
177
- } else if (this.dialect === "sqlite") {
178
- const { default: betterSqlite3 } = await import('better-sqlite3');
179
- const { drizzle: drizzle2 } = await import('drizzle-orm/better-sqlite3');
180
- const db = new betterSqlite3(this.connectionString.replace("file:", ""));
181
- this.client = drizzle2(db, { schema: this.schema });
182
- }
183
- }
184
- this.connected = true;
185
- }
186
- async init(collections, globals = []) {
187
- await super.init(collections, globals);
188
- if (this.connectionString && !this.client) {
189
- await this.connect();
190
- }
191
- if (this.client && !_schemaEnsured) {
192
- for (const config of collections) {
193
- const tableName = this.getTableName(config.slug);
194
- if (!this.schema[tableName]) {
195
- this.schema[tableName] = this.createTableFromConfig(config);
196
- }
197
- }
198
- await this.ensureCollectionTables(collections);
199
- const globalCollections = globals.map((g) => ({
200
- slug: `_globals_${g.slug}`,
201
- fields: g.fields,
202
- label: g.label
203
- }));
204
- for (const gc of globalCollections) {
205
- const tableName = this.getTableName(gc.slug);
206
- if (!this.schema[tableName]) {
207
- this.schema[tableName] = this.createTableFromConfig(gc, true);
208
- }
209
- if (!this.collections.has(gc.slug)) {
210
- this.collections.set(gc.slug, gc);
211
- }
212
- }
213
- await this.ensureCollectionTables(globalCollections);
214
- _schemaEnsured = true;
215
- }
216
- }
217
- createTableFromConfig(config, useTextId = false) {
218
- const tableName = this.getTableName(config.slug);
219
- const columns = {
220
- id: useTextId ? pgCore.text("id").primaryKey() : pgCore.uuid("id").primaryKey().defaultRandom()
221
- };
222
- for (const field of config.fields) {
223
- if (!field.name || field.name === "id") continue;
224
- const dbType = fieldToDrizzleType(field, this.dialect);
225
- const propName = field.name.replace(/-/g, "_");
226
- const sqlName = propName.replace(/([A-Z])/g, "_$1").toLowerCase();
227
- let col;
228
- if (this.dialect === "sqlite") {
229
- switch (dbType) {
230
- case "varchar":
231
- case "text":
232
- col = sqliteCore.text(sqlName);
233
- break;
234
- case "integer":
235
- col = sqliteCore.integer(sqlName);
236
- break;
237
- case "decimal":
238
- case "numeric":
239
- col = sqliteCore.numeric(sqlName);
240
- break;
241
- case "boolean":
242
- col = sqliteCore.integer(sqlName, { mode: "boolean" });
243
- break;
244
- case "timestamp":
245
- col = sqliteCore.text(sqlName);
246
- break;
247
- case "jsonb":
248
- col = sqliteCore.text(sqlName);
249
- break;
250
- default:
251
- col = sqliteCore.text(sqlName);
252
- }
253
- } else {
254
- switch (dbType) {
255
- case "varchar":
256
- col = pgCore.varchar(sqlName, { length: 255 });
257
- break;
258
- case "integer":
259
- col = pgCore.integer(sqlName);
260
- break;
261
- case "decimal":
262
- col = pgCore.decimal(sqlName);
263
- break;
264
- case "boolean":
265
- col = pgCore.boolean(sqlName);
266
- break;
267
- case "timestamp":
268
- col = pgCore.timestamp(sqlName);
269
- break;
270
- case "jsonb":
271
- col = pgCore.jsonb(sqlName);
272
- break;
273
- default:
274
- col = pgCore.text(sqlName);
275
- }
276
- }
277
- if (!field.required) col = col.default(null);
278
- columns[propName] = col;
279
- }
280
- if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? sqliteCore.text("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("created_at").defaultNow();
281
- if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? sqliteCore.text("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("updated_at").defaultNow();
282
- columns.status = this.dialect === "sqlite" ? sqliteCore.text("status").default("draft") : pgCore.varchar("status", { length: 20 }).default("draft");
283
- columns.hasDraft = this.dialect === "sqlite" ? sqliteCore.integer("hasDraft", { mode: "boolean" }).default(false) : pgCore.boolean("hasDraft").default(false);
284
- return this.dialect === "sqlite" ? sqliteCore.sqliteTable(tableName, columns) : pgCore.pgTable(tableName, columns);
285
- }
286
- async ensureCollectionTables(collections) {
287
- const statements = [];
288
- for (const config of collections) {
289
- const isGlobal = config.slug.startsWith("_globals_");
290
- const tableName = this.getTableName(config.slug);
291
- const colDefs = this.generateCreateColumns(config);
292
- const hasCreated = config.fields.some((f) => f.name === "createdAt");
293
- const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
294
- if (this.dialect === "postgres") {
295
- const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
296
- statements.push(`
297
- CREATE TABLE IF NOT EXISTS "${tableName}" (
298
- ${idCol},
299
- ${colDefs}
300
- ${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
301
- ${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
302
- "status" VARCHAR(20) DEFAULT 'draft',
303
- "hasDraft" BOOLEAN DEFAULT false
304
- )
305
- `);
306
- } else {
307
- const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" TEXT PRIMARY KEY';
308
- statements.push(`
309
- CREATE TABLE IF NOT EXISTS "${tableName}" (
310
- ${idCol},
311
- ${colDefs}
312
- ${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
313
- ${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
314
- "status" TEXT DEFAULT 'draft',
315
- "hasDraft" INTEGER DEFAULT 0
316
- )
317
- `);
318
- }
319
- }
320
- if (statements.length > 0) {
321
- if (this.dialect === "postgres") {
322
- await this.client.execute(drizzleOrm.sql.raw(statements.join(";\n")));
323
- } else {
324
- for (const stmt of statements) {
325
- await this.client.execute(drizzleOrm.sql.raw(stmt));
326
- }
327
- }
328
- }
329
- for (const config of collections) {
330
- const tableName = this.getTableName(config.slug);
331
- if (tableName === "users" || tableName === "audit_logs") continue;
332
- await this.syncTableColumns(config, tableName);
333
- }
334
- }
335
- getColumnSqlDefinition(field, dialect) {
336
- const dbType = fieldToDrizzleType(field, dialect);
337
- const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
338
- const sqlType = this.columnSqlType(dbType, dialect);
339
- return `"${sqlName}" ${sqlType} DEFAULT NULL`;
340
- }
341
- columnSqlType(dbType, dialect) {
342
- if (dialect === "sqlite") {
343
- switch (dbType) {
344
- case "varchar":
345
- return "TEXT";
346
- case "text":
347
- return "TEXT";
348
- case "integer":
349
- return "INTEGER";
350
- case "decimal":
351
- case "numeric":
352
- return "NUMERIC";
353
- case "boolean":
354
- return "INTEGER";
355
- case "timestamp":
356
- return "TEXT";
357
- case "jsonb":
358
- return "TEXT";
359
- default:
360
- return "TEXT";
361
- }
362
- }
363
- switch (dbType) {
364
- case "varchar":
365
- return "VARCHAR(255)";
366
- case "text":
367
- return "TEXT";
368
- case "integer":
369
- return "INTEGER";
370
- case "decimal":
371
- case "numeric":
372
- return "DECIMAL";
373
- case "boolean":
374
- return "BOOLEAN";
375
- case "timestamp":
376
- return "TIMESTAMP";
377
- case "jsonb":
378
- return "JSONB";
379
- default:
380
- return "TEXT";
381
- }
382
- }
383
- getExpectedColumnDefs(config, tableName) {
384
- const defs = {};
385
- const isGlobal = config.slug.startsWith("_globals_");
386
- const hasCreated = config.fields.some((f) => f.name === "createdAt");
387
- const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
388
- if (this.dialect === "postgres") {
389
- defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
390
- if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
391
- if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
392
- defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
393
- defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
394
- } else {
395
- defs["id"] = '"id" TEXT PRIMARY KEY';
396
- if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
397
- if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
398
- defs["status"] = '"status" TEXT DEFAULT NULL';
399
- defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
400
- }
401
- for (const field of config.fields) {
402
- if (!field.name || field.name === "id") continue;
403
- const def = this.getColumnSqlDefinition(field, this.dialect);
404
- const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
405
- defs[sqlName] = def;
406
- }
407
- return defs;
408
- }
409
- async syncTableColumns(config, tableName) {
410
- let existingCols;
411
- try {
412
- if (this.dialect === "postgres") {
413
- const result = await this.client.execute(
414
- drizzleOrm.sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`
415
- );
416
- existingCols = new Map(result.map((r) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));
417
- } else {
418
- const result = await this.client.execute(
419
- drizzleOrm.sql`PRAGMA table_info("${drizzleOrm.sql.raw(tableName)}")`
420
- );
421
- existingCols = new Map(result.map((r) => [r.name, { type: r.type, maxLen: null }]));
422
- }
423
- } catch {
424
- return;
425
- }
426
- const expected = this.getExpectedColumnDefs(config, tableName);
427
- const missing = Object.keys(expected).filter((k) => !existingCols.has(k));
428
- if (missing.length > 0) {
429
- const alterStmts = missing.map((k) => `ALTER TABLE "${tableName}" ADD COLUMN ${expected[k]}`);
430
- await this.executeRaw(drizzleOrm.sql.raw(alterStmts.join(";\n")));
431
- }
432
- if (this.dialect === "postgres") {
433
- for (const field of config.fields) {
434
- if (!field.name || field.name === "id") continue;
435
- const expectedDbType = fieldToDrizzleType(field, this.dialect);
436
- const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
437
- const info = existingCols.get(sqlName);
438
- if (!info || info.type !== "character varying") continue;
439
- if (expectedDbType === "text") {
440
- await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE TEXT`));
441
- } else if (expectedDbType === "jsonb") {
442
- await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" DROP DEFAULT`));
443
- await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE JSONB USING (CASE WHEN "${sqlName}" IS NULL THEN NULL WHEN "${sqlName}"::text ~ '^\\s*\\{' THEN "${sqlName}"::jsonb ELSE jsonb_build_object('id', "${sqlName}"::text) END)`));
444
- }
445
- }
446
- }
447
- }
448
- generateCreateColumns(config) {
449
- const cols = [];
450
- for (const field of config.fields) {
451
- if (!field.name || field.name === "id") continue;
452
- const dbType = fieldToDrizzleType(field, this.dialect);
453
- const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
454
- const nullable = field.required ? "NOT NULL" : "DEFAULT NULL";
455
- let sqlType;
456
- if (this.dialect === "sqlite") {
457
- switch (dbType) {
458
- case "varchar":
459
- case "text":
460
- sqlType = `TEXT ${nullable}`;
461
- break;
462
- case "integer":
463
- sqlType = `INTEGER ${nullable}`;
464
- break;
465
- case "decimal":
466
- case "numeric":
467
- sqlType = `NUMERIC ${nullable}`;
468
- break;
469
- case "boolean":
470
- sqlType = `INTEGER ${nullable}`;
471
- break;
472
- case "timestamp":
473
- sqlType = `TEXT ${nullable}`;
474
- break;
475
- case "jsonb":
476
- sqlType = `TEXT ${nullable}`;
477
- break;
478
- default:
479
- sqlType = `TEXT ${nullable}`;
480
- }
481
- } else {
482
- switch (dbType) {
483
- case "varchar":
484
- sqlType = `VARCHAR(255) ${nullable}`;
485
- break;
486
- case "integer":
487
- sqlType = `INTEGER ${nullable}`;
488
- break;
489
- case "decimal":
490
- sqlType = `DECIMAL ${nullable}`;
491
- break;
492
- case "boolean":
493
- sqlType = `BOOLEAN ${nullable}`;
494
- break;
495
- case "timestamp":
496
- sqlType = `TIMESTAMP ${nullable}`;
497
- break;
498
- case "jsonb":
499
- sqlType = `JSONB ${nullable}`;
500
- break;
501
- default:
502
- sqlType = `TEXT ${nullable}`;
503
- }
504
- }
505
- cols.push(`"${sqlName}" ${sqlType}`);
506
- }
507
- return cols.join(",\n ") + (cols.length > 0 ? "," : "");
508
- }
509
- async disconnect() {
510
- this.connected = false;
511
- }
512
- async find(args) {
513
- const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
514
- const config = this.getCollection(slug);
515
- const table = this.getTable(slug);
516
- let effectiveWhere = { ...where };
517
- if (this.tenantContext && config.tenantScoped) {
518
- const rlsQuery = chunkGUUB5EAG_cjs.applyRLS({ where: effectiveWhere }, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG);
519
- effectiveWhere = rlsQuery.where || {};
520
- }
521
- const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
522
- if (!draft && table.status) {
523
- filters.push(drizzleOrm.eq(table.status, "published"));
524
- }
525
- const sortOption = this.parseSort(sort);
526
- const countWhere = !draft && table.status ? { ...effectiveWhere, status: "published" } : effectiveWhere;
527
- const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });
528
- const offset = (page - 1) * limit;
529
- let results = [];
530
- try {
531
- const sortCol = table[sortOption.field] || table.createdAt || table.id;
532
- const sorted = sortOption.direction === "asc" ? sortCol : drizzleOrm.desc(sortCol);
533
- let query = this.client.select().from(table);
534
- if (filters.length > 0) {
535
- query = query.where(drizzleOrm.and(...filters));
536
- }
537
- results = await query.orderBy(sorted).limit(limit).offset(offset);
538
- } catch (error) {
539
- console.error(`[DrizzleAdapter] Query error:`, error);
540
- }
541
- let docs = results.map((doc) => this.processResult(doc, config));
542
- if (this.tenantContext && !this.tenantContext.isSuperAdmin) {
543
- docs = docs.filter((doc) => chunkGUUB5EAG_cjs.canAccessDocument(doc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG));
544
- }
545
- if (draft) {
546
- docs = await Promise.all(docs.map(async (doc) => {
547
- const versions = await this.executeRaw(drizzleOrm.sql`
548
- SELECT * FROM kyro_versions
549
- WHERE collection_slug = ${slug}
550
- AND document_id = ${doc.id}
551
- ORDER BY created_at DESC
552
- LIMIT 1
553
- `);
554
- if (versions.length > 0) {
555
- const ver = versions[0];
556
- const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
557
- return { ...doc, ...versionData, status: doc.status };
558
- }
559
- return doc;
560
- }));
561
- }
562
- return {
563
- docs,
564
- ...this.calculatePagination(page, limit, totalDocs)
565
- };
566
- }
567
- async findByID(args) {
568
- const { collection: slug, id, tenantID, draft } = args;
569
- const config = this.getCollection(slug);
570
- const table = this.getTable(slug);
571
- if (this.tenantContext && config.tenantScoped) {
572
- const tempDoc = { id, tenantId: this.tenantContext.tenantId };
573
- if (!chunkGUUB5EAG_cjs.canAccessDocument(tempDoc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG)) {
574
- return null;
575
- }
576
- }
577
- const conditions = [drizzleOrm.eq(table.id, id)];
578
- if (tenantID && table.tenantId) conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
579
- if (!draft && table.status) conditions.push(drizzleOrm.eq(table.status, "published"));
580
- const whereClause = conditions.length > 1 ? drizzleOrm.and(...conditions) : conditions[0];
581
- let allRows = await this.client.select().from(table).where(whereClause);
582
- if (allRows.length === 0) return null;
583
- let doc = this.processResult(allRows[0], config);
584
- if (draft) {
585
- const versions = await this.executeRaw(drizzleOrm.sql`
586
- SELECT * FROM kyro_versions
587
- WHERE collection_slug = ${slug}
588
- AND document_id = ${doc.id}
589
- ORDER BY created_at DESC
590
- LIMIT 1
591
- `);
592
- if (versions.length > 0) {
593
- const ver = versions[0];
594
- const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
595
- doc = { ...doc, ...versionData, status: doc.status };
596
- }
597
- }
598
- return doc;
599
- }
600
- async create(args) {
601
- const { collection: slug, data, tenantID } = args;
602
- const config = this.getCollection(slug);
603
- const table = this.getTable(slug);
604
- const insertData = this.prepareData(data, config);
605
- if (tenantID) {
606
- insertData.tenantId = tenantID;
607
- }
608
- const result = await this.client.insert(table).values(insertData).returning();
609
- return this.processResult(result[0], config);
610
- }
611
- async update(args) {
612
- const { collection: slug, id, data, tenantID } = args;
613
- const config = this.getCollection(slug);
614
- const table = this.getTable(slug);
615
- const updateData = this.prepareData(data, config);
616
- delete updateData.id;
617
- const conditions = [drizzleOrm.eq(table.id, id)];
618
- if (tenantID && table.tenantId) {
619
- conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
620
- }
621
- const result = await this.client.update(table).set(updateData).where(drizzleOrm.and(...conditions)).returning();
622
- if (result.length === 0) {
623
- throw new Error(`Document not found: ${slug}/${id}`);
624
- }
625
- return this.processResult(result[0], config);
626
- }
627
- async delete(args) {
628
- const { collection: slug, id, tenantID } = args;
629
- const config = this.getCollection(slug);
630
- const table = this.getTable(slug);
631
- const conditions = [drizzleOrm.eq(table.id, id)];
632
- if (tenantID && table.tenantId) {
633
- conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
634
- }
635
- const result = await this.client.delete(table).where(drizzleOrm.and(...conditions)).returning();
636
- if (result.length === 0) {
637
- throw new Error(`Document not found: ${slug}/${id}`);
638
- }
639
- return this.processResult(result[0], config);
640
- }
641
- async count(args) {
642
- const { collection: slug, where = {}, tenantID } = args;
643
- const config = this.getCollection(slug);
644
- const table = this.getTable(slug);
645
- const filters = this.buildWhereClause(where, config, table, tenantID);
646
- try {
647
- let query = this.client.select({ count: drizzleOrm.sql`count(*)` }).from(table);
648
- if (filters.length > 0) {
649
- query = query.where(drizzleOrm.and(...filters));
650
- }
651
- const result = await query;
652
- return Number(result[0]?.count || 0);
653
- } catch {
654
- return 0;
655
- }
656
- }
657
- async findOne(args) {
658
- const { collection: slug, where = {}, tenantID, draft } = args;
659
- if (slug.startsWith("_globals_")) {
660
- const globalSlug = slug.replace("_globals_", "");
661
- const globalConfig = this.globals.get(globalSlug);
662
- if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
663
- const table = this.getTable(slug);
664
- let query = this.client.select().from(table);
665
- if (!draft && table.status) {
666
- query = query.where(drizzleOrm.eq(table.status, "published"));
667
- }
668
- const results = await query.limit(1);
669
- if (results.length === 0) return null;
670
- let doc = this.processResult(results[0], globalConfig);
671
- if (draft) {
672
- const versions = await this.executeRaw(drizzleOrm.sql`
673
- SELECT * FROM kyro_versions
674
- WHERE collection_slug = ${slug}
675
- AND document_id = ${globalSlug}
676
- ORDER BY created_at DESC
677
- LIMIT 1
678
- `);
679
- if (versions.length > 0) {
680
- const ver = versions[0];
681
- const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
682
- doc = { ...doc, ...versionData, status: doc.status };
683
- }
684
- }
685
- return doc;
686
- }
687
- const result = await this.find({ ...args, limit: 1 });
688
- return result.docs[0] || null;
689
- }
690
- async findVersions(args) {
691
- await this.ensureVersionsTable();
692
- const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;
693
- const offset = (page - 1) * limit;
694
- const countResult = await this.executeRaw(drizzleOrm.sql`
695
- SELECT count(*) as count
696
- FROM kyro_versions
697
- WHERE collection_slug = ${slug}
698
- AND document_id = ${documentId}
699
- AND autosave = 0
700
- ${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
701
- `);
702
- const totalDocs = parseInt(countResult[0]?.count || "0");
703
- const results = await this.executeRaw(drizzleOrm.sql`
704
- SELECT *
705
- FROM kyro_versions
706
- WHERE collection_slug = ${slug}
707
- AND document_id = ${documentId}
708
- AND autosave = 0
709
- ${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
710
- ORDER BY created_at DESC
711
- LIMIT ${limit}
712
- OFFSET ${offset}
713
- `);
714
- return {
715
- docs: results.map((row) => ({
716
- ...row,
717
- data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
718
- })),
719
- ...this.calculatePagination(page, limit, totalDocs)
720
- };
721
- }
722
- async findVersionByID(args) {
723
- await this.ensureVersionsTable();
724
- const results = await this.executeRaw(drizzleOrm.sql`
725
- SELECT * FROM kyro_versions
726
- WHERE id = ${args.versionId}
727
- AND collection_slug = ${args.collection}
728
- ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
729
- LIMIT 1
730
- `);
731
- if (results.length === 0) return null;
732
- const row = results[0];
733
- return {
734
- ...row,
735
- data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
736
- };
737
- }
738
- async createVersion(args) {
739
- await this.ensureVersionsTable();
740
- const now = (/* @__PURE__ */ new Date()).toISOString();
741
- if (args.autosave) {
742
- const existing = await this.executeRaw(drizzleOrm.sql`
743
- SELECT * FROM kyro_versions
744
- WHERE collection_slug = ${args.collection}
745
- AND document_id = ${args.documentId}
746
- AND autosave = 1
747
- ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
748
- LIMIT 1
749
- `);
750
- if (existing.length > 0) {
751
- await this.executeRaw(drizzleOrm.sql`
752
- UPDATE kyro_versions
753
- SET data = ${JSON.stringify(args.data)},
754
- status = ${args.status},
755
- updated_at = ${now}
756
- WHERE id = ${existing[0].id}
757
- `);
758
- return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });
759
- }
760
- }
761
- const id = Math.random().toString(36).substring(2, 15);
762
- await this.executeRaw(drizzleOrm.sql`
763
- INSERT INTO kyro_versions (
764
- id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
765
- ) VALUES (
766
- ${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
767
- ${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null},
768
- ${args.changeDescription || null}, ${now}, ${now}
769
- )
770
- `);
771
- if (!args.autosave) {
772
- const config = this.getCollection(args.collection);
773
- if (config.versions?.maxPerDoc) {
774
- await this.deleteVersions({
775
- collection: args.collection,
776
- documentId: args.documentId,
777
- keepLatest: config.versions.maxPerDoc,
778
- tenantID: args.tenantID
779
- });
780
- }
781
- }
782
- return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
783
- }
784
- async updateLatestVersion(args) {
785
- return this.createVersion({ ...args, autosave: true });
786
- }
787
- async deleteVersions(args) {
788
- await this.ensureVersionsTable();
789
- if (args.keepLatest) {
790
- const toKeep = await this.executeRaw(drizzleOrm.sql`
791
- SELECT id FROM kyro_versions
792
- WHERE collection_slug = ${args.collection}
793
- AND document_id = ${args.documentId}
794
- AND autosave = 0
795
- ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
796
- ORDER BY created_at DESC
797
- LIMIT ${args.keepLatest}
798
- `);
799
- const keepIds = toKeep.map((r) => r.id);
800
- if (keepIds.length > 0) {
801
- await this.executeRaw(drizzleOrm.sql`
802
- DELETE FROM kyro_versions
803
- WHERE collection_slug = ${args.collection}
804
- AND document_id = ${args.documentId}
805
- AND autosave = 0
806
- AND id NOT IN (${drizzleOrm.sql.join(keepIds.map((id) => drizzleOrm.sql`${id}`), drizzleOrm.sql`, `)})
807
- `);
808
- }
809
- } else {
810
- await this.executeRaw(drizzleOrm.sql`
811
- DELETE FROM kyro_versions
812
- WHERE collection_slug = ${args.collection}
813
- AND document_id = ${args.documentId}
814
- ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
815
- `);
816
- }
817
- }
818
- // ========================================================================
819
- // Helper Methods
820
- // ========================================================================
821
- getTable(slug) {
822
- const tableName = this.getTableName(slug);
823
- const table = this.schema[tableName];
824
- if (!table) {
825
- throw new Error(`Table "${tableName}" not found in schema`);
826
- }
827
- return table;
828
- }
829
- buildWhereClause(where, config, table, tenantID) {
830
- const conditions = [];
831
- if (tenantID && config.tenantScoped && table.tenantId) {
832
- conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
833
- }
834
- for (const [key, value] of Object.entries(where)) {
835
- if (key === "AND" && Array.isArray(value)) {
836
- const andConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
837
- if (andConditions.length > 0) {
838
- conditions.push(drizzleOrm.and(...andConditions));
839
- }
840
- } else if (key === "OR" && Array.isArray(value)) {
841
- const orConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
842
- if (orConditions.length > 0) {
843
- conditions.push(drizzleOrm.or(...orConditions));
844
- }
845
- } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
846
- const col = table[key];
847
- if (!col) continue;
848
- if (value.equals !== void 0) conditions.push(drizzleOrm.eq(col, value.equals));
849
- if (value.not_equals !== void 0) conditions.push(drizzleOrm.ne(col, value.not_equals));
850
- if (value.in && Array.isArray(value.in)) conditions.push(drizzleOrm.inArray(col, value.in));
851
- if (value.like !== void 0) conditions.push(drizzleOrm.like(col, value.like));
852
- if (value.contains !== void 0) conditions.push(drizzleOrm.like(col, `%${value.contains}%`));
853
- if (value.greater_than !== void 0) conditions.push(drizzleOrm.gt(col, value.greater_than));
854
- if (value.greater_than_equal !== void 0) conditions.push(drizzleOrm.gte(col, value.greater_than_equal));
855
- if (value.less_than !== void 0) conditions.push(drizzleOrm.lt(col, value.less_than));
856
- if (value.less_than_equal !== void 0) conditions.push(drizzleOrm.lte(col, value.less_than_equal));
857
- } else {
858
- const col = table[key];
859
- if (col) conditions.push(drizzleOrm.eq(col, value));
860
- }
861
- }
862
- return conditions;
863
- }
864
- processResult(data, config) {
865
- if (!data) return null;
866
- const result = { ...data };
867
- if (data.id) {
868
- result.id = String(data.id);
869
- }
870
- for (const field of config.fields) {
871
- if (!field.name) continue;
872
- const sqlKey = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
873
- if (sqlKey !== field.name && result[sqlKey] !== void 0 && result[field.name] === void 0) {
874
- result[field.name] = result[sqlKey];
875
- delete result[sqlKey];
876
- }
877
- }
878
- for (const field of config.fields) {
879
- if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(field.type)) {
880
- const f = field;
881
- if (result[f.name] && typeof result[f.name] === "string") {
882
- try {
883
- const parsed = JSON.parse(result[f.name]);
884
- result[f.name] = parsed;
885
- } catch {
886
- }
887
- }
888
- }
889
- if (field.type === "tabs" && "tabs" in field && field.name) {
890
- if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
891
- for (const tab of field.tabs) {
892
- for (const tabField of tab.fields) {
893
- if ((tabField.type === "upload" || tabField.type === "image") && tabField.name) {
894
- const val = result[field.name][tabField.name];
895
- if (typeof val === "string") {
896
- try {
897
- const parsed = JSON.parse(val);
898
- result[field.name][tabField.name] = Array.isArray(parsed) ? parsed.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof parsed.id === "string" ? parsed.id : String(parsed.id || "");
899
- } catch {
900
- }
901
- } else if (val && typeof val === "object") {
902
- result[field.name][tabField.name] = Array.isArray(val) ? val.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof val.id === "string" ? val.id : String(val.id || "");
903
- }
904
- }
905
- }
906
- }
907
- continue;
908
- }
909
- if (typeof result[field.name] === "string") {
910
- try {
911
- const parsed = JSON.parse(result[field.name]);
912
- if (typeof parsed === "object" && parsed !== null) {
913
- result[field.name] = parsed;
914
- continue;
915
- }
916
- } catch {
917
- }
918
- }
919
- const tabData = {};
920
- for (const tab of field.tabs) {
921
- for (const tabField of tab.fields) {
922
- if (tabField.name && result[tabField.name] !== void 0) {
923
- let value = result[tabField.name];
924
- if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(tabField.type)) {
925
- if (value && typeof value === "string") {
926
- try {
927
- value = JSON.parse(value);
928
- } catch {
929
- }
930
- }
931
- if ((tabField.type === "upload" || tabField.type === "image") && value && typeof value === "object") {
932
- value = Array.isArray(value) ? value.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof value.id === "string" ? value.id : String(value.id || "");
933
- }
934
- }
935
- tabData[tabField.name] = value;
936
- delete result[tabField.name];
937
- }
938
- }
939
- }
940
- result[field.name] = tabData;
941
- }
942
- }
943
- if (result.createdAt) {
944
- result.createdAt = new Date(result.createdAt).toISOString();
945
- }
946
- if (result.updatedAt) {
947
- result.updatedAt = new Date(result.updatedAt).toISOString();
948
- }
949
- return result;
950
- }
951
- async ensureVersionsTable() {
952
- if (this.versionsTableReady) return;
953
- let createTableSQL;
954
- if (this.dialect === "sqlite") {
955
- createTableSQL = `
956
- CREATE TABLE IF NOT EXISTS kyro_versions (
957
- id text PRIMARY KEY,
958
- collection_slug text NOT NULL,
959
- document_id text NOT NULL,
960
- tenant_id text,
961
- data text NOT NULL,
962
- status text NOT NULL DEFAULT 'draft',
963
- autosave integer NOT NULL DEFAULT 0,
964
- created_by text,
965
- change_description text,
966
- created_at text DEFAULT (datetime('now')),
967
- updated_at text DEFAULT (datetime('now'))
968
- )
969
- `;
970
- } else {
971
- createTableSQL = `
972
- CREATE TABLE IF NOT EXISTS kyro_versions (
973
- id text PRIMARY KEY,
974
- collection_slug text NOT NULL,
975
- document_id text NOT NULL,
976
- tenant_id text,
977
- data text NOT NULL,
978
- status text NOT NULL,
979
- autosave integer NOT NULL DEFAULT 0,
980
- created_by text,
981
- change_description text,
982
- created_at text NOT NULL,
983
- updated_at text NOT NULL
984
- )
985
- `;
986
- }
987
- await this.executeRaw(drizzleOrm.sql.raw(createTableSQL));
988
- try {
989
- if (this.dialect === "postgres") {
990
- await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));
991
- } else {
992
- await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));
993
- }
994
- } catch {
995
- }
996
- this.versionsTableReady = true;
997
- }
998
- async executeRaw(query) {
999
- const result = await this.client.execute(query);
1000
- if (Array.isArray(result)) {
1001
- return result;
1002
- }
1003
- if (Array.isArray(result?.rows)) {
1004
- return result.rows;
1005
- }
1006
- if (Array.isArray(result?.[0])) {
1007
- return result[0];
1008
- }
1009
- return [];
1010
- }
1011
- };
1012
- function createDrizzleAdapter(options) {
1013
- return new DrizzleAdapter(options);
1014
- }
1015
- var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-GYIJ3JJM.cjs', document.baseURI).href)));
1016
- var modPath = "node:sqlite";
1017
- var { DatabaseSync } = _require(modPath);
1018
- function getDialect() {
1019
- const val = process.env.DB_TYPE;
1020
- if (val === "postgres") return "postgres";
1021
- return "sqlite";
1022
- }
1023
- function genId() {
1024
- return crypto.randomBytes(16).toString("hex");
1025
- }
1026
- async function createDatabase() {
1027
- const dialect = getDialect();
1028
- if (dialect === "sqlite") {
1029
- const dbPath = path.resolve(process.cwd(), "data", "kyro.db");
1030
- await promises.mkdir(path.dirname(dbPath), { recursive: true });
1031
- const db2 = new DatabaseSync(dbPath);
1032
- db2.exec("PRAGMA journal_mode = WAL");
1033
- return { db: db2, dialect, genId };
1034
- }
1035
- const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
1036
- const maxConnections = parseInt(process.env.DB_POOL_MAX || "10", 10);
1037
- const ssl = process.env.DB_SSL === "true";
1038
- const client = postgres__default.default(databaseUrl, {
1039
- max: maxConnections,
1040
- ssl: ssl ? "require" : false,
1041
- onnotice: () => {
1042
- }
1043
- });
1044
- const db = postgresJs.drizzle(client);
1045
- return { db, dialect, genId };
1046
- }
1047
- async function runMigrations(_db, _dialect) {
1048
- }
1049
- async function seedDefaultRoles(db) {
1050
- const { roles } = await import('./schema-6QL3USNB.cjs');
1051
- await db.insert(roles).values({
1052
- name: "super_admin",
1053
- level: 100,
1054
- inherits: [],
1055
- description: "Full system access across all tenants",
1056
- isSystem: true
1057
- }).onConflictDoNothing();
1058
- }
1059
-
1060
- exports.DrizzleAdapter = DrizzleAdapter;
1061
- exports.collectionToDrizzleSchema = collectionToDrizzleSchema;
1062
- exports.createDatabase = createDatabase;
1063
- exports.createDrizzleAdapter = createDrizzleAdapter;
1064
- exports.fieldToDrizzleType = fieldToDrizzleType;
1065
- exports.genId = genId;
1066
- exports.runMigrations = runMigrations;
1067
- exports.seedDefaultRoles = seedDefaultRoles;
1068
- //# sourceMappingURL=chunk-GYIJ3JJM.cjs.map
1069
- //# sourceMappingURL=chunk-GYIJ3JJM.cjs.map