@kyro-cms/core 0.9.0 → 0.9.2

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 (265) hide show
  1. package/README.md +55 -593
  2. package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-BKszZlG0.d.cts} +1 -1
  3. package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-Ccf1j-IN.d.ts} +1 -1
  4. package/dist/api-handler-graphql.cjs +44 -0
  5. package/dist/api-handler-graphql.cjs.map +1 -0
  6. package/dist/api-handler-graphql.d.cts +6 -0
  7. package/dist/api-handler-graphql.d.ts +6 -0
  8. package/dist/api-handler-graphql.js +41 -0
  9. package/dist/api-handler-graphql.js.map +1 -0
  10. package/dist/api-handler-trpc.cjs +38 -0
  11. package/dist/api-handler-trpc.cjs.map +1 -0
  12. package/dist/api-handler-trpc.d.cts +5 -0
  13. package/dist/api-handler-trpc.d.ts +5 -0
  14. package/dist/api-handler-trpc.js +36 -0
  15. package/dist/api-handler-trpc.js.map +1 -0
  16. package/dist/api-handler.cjs +33 -99
  17. package/dist/api-handler.cjs.map +1 -1
  18. package/dist/api-handler.d.cts +2 -1
  19. package/dist/api-handler.d.ts +2 -1
  20. package/dist/api-handler.js +21 -97
  21. package/dist/api-handler.js.map +1 -1
  22. package/dist/{tenant-B1YB0Jy8.d.ts → base-CIuXkrH4.d.cts} +7 -15
  23. package/dist/{tenant-Cpeveji6.d.cts → base-fFo4lqER.d.ts} +7 -15
  24. package/dist/bootstrap-3PV3GJ3S.js +7 -0
  25. package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-3PV3GJ3S.js.map} +1 -1
  26. package/dist/bootstrap-4CELFLJO.cjs +32 -0
  27. package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-4CELFLJO.cjs.map} +1 -1
  28. package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
  29. package/dist/chunk-3HR772HI.cjs.map +1 -0
  30. package/dist/chunk-3KTWGODI.cjs +178 -0
  31. package/dist/chunk-3KTWGODI.cjs.map +1 -0
  32. package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
  33. package/dist/chunk-3UK5XBVJ.js.map +1 -0
  34. package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
  35. package/dist/chunk-4AO3A3JM.js.map +1 -0
  36. package/dist/{chunk-Z6ZWNWWR.js → chunk-4CV4JOE5.js} +3 -9
  37. package/dist/{chunk-Z6ZWNWWR.js.map → chunk-4CV4JOE5.js.map} +1 -1
  38. package/dist/chunk-4M7X5HAB.cjs +173 -0
  39. package/dist/chunk-4M7X5HAB.cjs.map +1 -0
  40. package/dist/chunk-53NYVYVX.js +3243 -0
  41. package/dist/chunk-53NYVYVX.js.map +1 -0
  42. package/dist/{chunk-35U3FROB.js → chunk-5H3MWQJS.js} +714 -184
  43. package/dist/chunk-5H3MWQJS.js.map +1 -0
  44. package/dist/{chunk-YVUJBEXE.cjs → chunk-5PMQQFRE.cjs} +16 -7
  45. package/dist/chunk-5PMQQFRE.cjs.map +1 -0
  46. package/dist/{chunk-57P6MJKC.js → chunk-6UNONDW7.js} +94 -10
  47. package/dist/chunk-6UNONDW7.js.map +1 -0
  48. package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
  49. package/dist/chunk-7OGPN7MP.js.map +1 -0
  50. package/dist/{chunk-2OL4O2TH.cjs → chunk-7OS7TX2Q.cjs} +68 -62
  51. package/dist/chunk-7OS7TX2Q.cjs.map +1 -0
  52. package/dist/{chunk-3TPQ2BU6.js → chunk-BYBMTIMT.js} +2 -6
  53. package/dist/chunk-BYBMTIMT.js.map +1 -0
  54. package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
  55. package/dist/chunk-CF7OL6HR.js.map +1 -0
  56. package/dist/chunk-CJONKRHJ.js +162 -0
  57. package/dist/chunk-CJONKRHJ.js.map +1 -0
  58. package/dist/{chunk-OHVB4AJ7.js → chunk-CJX74IYK.js} +24 -18
  59. package/dist/chunk-CJX74IYK.js.map +1 -0
  60. package/dist/{chunk-5KVM3WEY.cjs → chunk-CNKT4PME.cjs} +1592 -868
  61. package/dist/chunk-CNKT4PME.cjs.map +1 -0
  62. package/dist/{chunk-G7VZBCD6.cjs → chunk-CZLDE2OZ.cjs} +2 -9
  63. package/dist/{chunk-G7VZBCD6.cjs.map → chunk-CZLDE2OZ.cjs.map} +1 -1
  64. package/dist/{chunk-WQBRWOQT.cjs → chunk-DPA3KWPY.cjs} +4 -3
  65. package/dist/chunk-DPA3KWPY.cjs.map +1 -0
  66. package/dist/{chunk-LINKCEG4.cjs → chunk-E2763JUP.cjs} +726 -196
  67. package/dist/chunk-E2763JUP.cjs.map +1 -0
  68. package/dist/chunk-E5UJBLQ7.js +220 -0
  69. package/dist/chunk-E5UJBLQ7.js.map +1 -0
  70. package/dist/{chunk-DVD5P72E.cjs → chunk-EEJUFDMF.cjs} +2 -6
  71. package/dist/chunk-EEJUFDMF.cjs.map +1 -0
  72. package/dist/chunk-FSKONGCX.cjs +253 -0
  73. package/dist/chunk-FSKONGCX.cjs.map +1 -0
  74. package/dist/{chunk-Y3QQN7PN.js → chunk-GAAHG2Z4.js} +13 -4
  75. package/dist/chunk-GAAHG2Z4.js.map +1 -0
  76. package/dist/chunk-GAOXD3XT.js +175 -0
  77. package/dist/chunk-GAOXD3XT.js.map +1 -0
  78. package/dist/{chunk-SA7NSSIQ.cjs → chunk-GUUB5EAG.cjs} +13 -187
  79. package/dist/chunk-GUUB5EAG.cjs.map +1 -0
  80. package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
  81. package/dist/chunk-GXFOGU7N.cjs.map +1 -0
  82. package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
  83. package/dist/chunk-IDVRRRAK.cjs.map +1 -0
  84. package/dist/{chunk-HXRD4B37.js → chunk-IPTZM3VE.js} +1423 -704
  85. package/dist/chunk-IPTZM3VE.js.map +1 -0
  86. package/dist/chunk-KC2GDBLS.cjs +84 -0
  87. package/dist/chunk-KC2GDBLS.cjs.map +1 -0
  88. package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
  89. package/dist/chunk-L46ROHUS.cjs.map +1 -0
  90. package/dist/chunk-L4EZKIEX.js +185 -0
  91. package/dist/chunk-L4EZKIEX.js.map +1 -0
  92. package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
  93. package/dist/chunk-L5UKKZQN.js.map +1 -0
  94. package/dist/chunk-NKPKR5BW.cjs +188 -0
  95. package/dist/chunk-NKPKR5BW.cjs.map +1 -0
  96. package/dist/chunk-NWUEVLQT.cjs +99 -0
  97. package/dist/chunk-NWUEVLQT.cjs.map +1 -0
  98. package/dist/{chunk-3AJE4SEG.js → chunk-OHC6UHFY.js} +208 -76
  99. package/dist/chunk-OHC6UHFY.js.map +1 -0
  100. package/dist/chunk-PHJRNPHY.cjs +3291 -0
  101. package/dist/chunk-PHJRNPHY.cjs.map +1 -0
  102. package/dist/{chunk-DXHRBMGB.js → chunk-PQ72Z6WC.js} +67 -112
  103. package/dist/chunk-PQ72Z6WC.js.map +1 -0
  104. package/dist/{chunk-K7JPTH3G.cjs → chunk-PV2I2KMI.cjs} +214 -82
  105. package/dist/chunk-PV2I2KMI.cjs.map +1 -0
  106. package/dist/{chunk-PDYFVNUX.cjs → chunk-Q23GAMLE.cjs} +71 -116
  107. package/dist/chunk-Q23GAMLE.cjs.map +1 -0
  108. package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
  109. package/dist/chunk-Q72BOAPK.js.map +1 -0
  110. package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
  111. package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
  112. package/dist/{chunk-2KVHZE6O.cjs → chunk-RFFSZSCL.cjs} +282 -190
  113. package/dist/chunk-RFFSZSCL.cjs.map +1 -0
  114. package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
  115. package/dist/chunk-SHTTJMLT.cjs.map +1 -0
  116. package/dist/{chunk-WOWUL7ZY.js → chunk-UUDTPZX6.js} +5 -4
  117. package/dist/chunk-UUDTPZX6.js.map +1 -0
  118. package/dist/{chunk-QPPDLRNR.js → chunk-V7KZQIZ6.js} +277 -185
  119. package/dist/chunk-V7KZQIZ6.js.map +1 -0
  120. package/dist/{chunk-3ZFYL34R.js → chunk-WXVB364T.js} +12 -185
  121. package/dist/chunk-WXVB364T.js.map +1 -0
  122. package/dist/chunk-XEB7PH2E.js +81 -0
  123. package/dist/chunk-XEB7PH2E.js.map +1 -0
  124. package/dist/{chunk-IA6AU5PI.cjs → chunk-Y7AQK4R4.cjs} +94 -10
  125. package/dist/chunk-Y7AQK4R4.cjs.map +1 -0
  126. package/dist/chunk-YFAVQQTU.js +92 -0
  127. package/dist/chunk-YFAVQQTU.js.map +1 -0
  128. package/dist/cli/index.cjs +6 -6
  129. package/dist/cli/index.cjs.map +1 -1
  130. package/dist/cli/index.js +6 -6
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/client.cjs +4 -4
  133. package/dist/client.d.cts +3 -3
  134. package/dist/client.d.ts +3 -3
  135. package/dist/client.js +2 -2
  136. package/dist/drizzle/index.cjs +15 -14
  137. package/dist/drizzle/index.d.cts +10 -14
  138. package/dist/drizzle/index.d.ts +10 -14
  139. package/dist/drizzle/index.js +6 -5
  140. package/dist/fields/index.cjs +22 -38
  141. package/dist/fields/index.d.cts +2 -22
  142. package/dist/fields/index.d.ts +2 -22
  143. package/dist/fields/index.js +2 -2
  144. package/dist/graphql/index.cjs +6 -5
  145. package/dist/graphql/index.d.cts +5 -3
  146. package/dist/graphql/index.d.ts +5 -3
  147. package/dist/graphql/index.js +4 -3
  148. package/dist/index-BKta3cBH.d.cts +277 -0
  149. package/dist/index-ClOqnkTO.d.ts +277 -0
  150. package/dist/index.cjs +310 -168
  151. package/dist/index.cjs.map +1 -1
  152. package/dist/index.d.cts +130 -211
  153. package/dist/index.d.ts +130 -211
  154. package/dist/index.js +174 -35
  155. package/dist/index.js.map +1 -1
  156. package/dist/integration.cjs +3 -3
  157. package/dist/integration.js +2 -2
  158. package/dist/media-7WDX4BDJ.js +4 -0
  159. package/dist/{media-GPPTZ43E.js.map → media-7WDX4BDJ.js.map} +1 -1
  160. package/dist/{media-XNTUFJZR.cjs → media-TUSLVRQ6.cjs} +3 -3
  161. package/dist/{media-XNTUFJZR.cjs.map → media-TUSLVRQ6.cjs.map} +1 -1
  162. package/dist/mongo-auth-adapter-GT4S7SCU.cjs +17 -0
  163. package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-GT4S7SCU.cjs.map} +1 -1
  164. package/dist/mongo-auth-adapter-M7VV4LNB.js +4 -0
  165. package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-M7VV4LNB.js.map} +1 -1
  166. package/dist/mongodb/index.cjs +9 -8
  167. package/dist/mongodb/index.d.cts +6 -13
  168. package/dist/mongodb/index.d.ts +6 -13
  169. package/dist/mongodb/index.js +5 -4
  170. package/dist/postgres-auth-adapter-AFAPISH7.js +5 -0
  171. package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-AFAPISH7.js.map} +1 -1
  172. package/dist/postgres-auth-adapter-SFDTLONT.cjs +14 -0
  173. package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-SFDTLONT.cjs.map} +1 -1
  174. package/dist/redis-adapter-UQX4EE3B.cjs +13 -0
  175. package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-UQX4EE3B.cjs.map} +1 -1
  176. package/dist/redis-adapter-XALOGWY3.js +4 -0
  177. package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-XALOGWY3.js.map} +1 -1
  178. package/dist/rest/index.cjs +16 -15
  179. package/dist/rest/index.d.cts +4 -4
  180. package/dist/rest/index.d.ts +4 -4
  181. package/dist/rest/index.js +14 -13
  182. package/dist/{schema-37SE2F4B.cjs → schema-6QL3USNB.cjs} +15 -15
  183. package/dist/{schema-37SE2F4B.cjs.map → schema-6QL3USNB.cjs.map} +1 -1
  184. package/dist/{schema-5PHL5IVB.js → schema-FNNWEAAW.js} +4 -4
  185. package/dist/{schema-5PHL5IVB.js.map → schema-FNNWEAAW.js.map} +1 -1
  186. package/dist/sqlite-adapter-AQB5TCGV.cjs +13 -0
  187. package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-AQB5TCGV.cjs.map} +1 -1
  188. package/dist/sqlite-adapter-N5H6IM2X.js +4 -0
  189. package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-N5H6IM2X.js.map} +1 -1
  190. package/dist/templates/index.cjs +134 -32
  191. package/dist/templates/index.d.cts +52 -9
  192. package/dist/templates/index.d.ts +52 -9
  193. package/dist/templates/index.js +4 -2
  194. package/dist/trpc/index.cjs +14 -13
  195. package/dist/trpc/index.d.cts +55 -49
  196. package/dist/trpc/index.d.ts +55 -49
  197. package/dist/trpc/index.js +5 -4
  198. package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
  199. package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
  200. package/dist/{types-VtjUxIMp.d.cts → types-DeSApf9T.d.cts} +36 -14
  201. package/dist/{types-VtjUxIMp.d.ts → types-DeSApf9T.d.ts} +36 -14
  202. package/dist/{types-J3R9nVsZ.d.cts → types-Dgzlftb7.d.ts} +32 -28
  203. package/dist/{types-Bs1up4yP.d.ts → types-Ds0tCA3L.d.cts} +32 -28
  204. package/dist/ws/index.cjs +6 -6
  205. package/dist/ws/index.js +2 -2
  206. package/package.json +22 -4
  207. package/dist/bootstrap-AKAUP6F6.cjs +0 -32
  208. package/dist/bootstrap-JCML6NFO.js +0 -7
  209. package/dist/chunk-2KVHZE6O.cjs.map +0 -1
  210. package/dist/chunk-2OL4O2TH.cjs.map +0 -1
  211. package/dist/chunk-35U3FROB.js.map +0 -1
  212. package/dist/chunk-3AJE4SEG.js.map +0 -1
  213. package/dist/chunk-3J4MFTI3.js +0 -3872
  214. package/dist/chunk-3J4MFTI3.js.map +0 -1
  215. package/dist/chunk-3TPQ2BU6.js.map +0 -1
  216. package/dist/chunk-3ZFYL34R.js.map +0 -1
  217. package/dist/chunk-4DA7QPLA.cjs.map +0 -1
  218. package/dist/chunk-57P6MJKC.js.map +0 -1
  219. package/dist/chunk-5KVM3WEY.cjs.map +0 -1
  220. package/dist/chunk-6IMPH6WV.cjs +0 -3897
  221. package/dist/chunk-6IMPH6WV.cjs.map +0 -1
  222. package/dist/chunk-ATBOUGQP.cjs +0 -513
  223. package/dist/chunk-ATBOUGQP.cjs.map +0 -1
  224. package/dist/chunk-DVD5P72E.cjs.map +0 -1
  225. package/dist/chunk-DXHRBMGB.js.map +0 -1
  226. package/dist/chunk-ES5HNFFT.js.map +0 -1
  227. package/dist/chunk-FXYP2HA6.js.map +0 -1
  228. package/dist/chunk-H727JIG7.js.map +0 -1
  229. package/dist/chunk-HXRD4B37.js.map +0 -1
  230. package/dist/chunk-I7HHI6QV.cjs.map +0 -1
  231. package/dist/chunk-IA6AU5PI.cjs.map +0 -1
  232. package/dist/chunk-IBG6V56E.cjs.map +0 -1
  233. package/dist/chunk-K7JPTH3G.cjs.map +0 -1
  234. package/dist/chunk-LINKCEG4.cjs.map +0 -1
  235. package/dist/chunk-OHVB4AJ7.js.map +0 -1
  236. package/dist/chunk-PDYFVNUX.cjs.map +0 -1
  237. package/dist/chunk-Q23JB3KL.js +0 -488
  238. package/dist/chunk-Q23JB3KL.js.map +0 -1
  239. package/dist/chunk-QPPDLRNR.js.map +0 -1
  240. package/dist/chunk-QUW2RZTM.cjs.map +0 -1
  241. package/dist/chunk-QXIQWPAP.js.map +0 -1
  242. package/dist/chunk-R3XIBBAW.cjs +0 -34
  243. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  244. package/dist/chunk-REK7AYOC.js.map +0 -1
  245. package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
  246. package/dist/chunk-SDMNUYVU.js +0 -30
  247. package/dist/chunk-SDMNUYVU.js.map +0 -1
  248. package/dist/chunk-V3LKPM3O.cjs.map +0 -1
  249. package/dist/chunk-VJT6P4N6.cjs.map +0 -1
  250. package/dist/chunk-WOWUL7ZY.js.map +0 -1
  251. package/dist/chunk-WQBRWOQT.cjs.map +0 -1
  252. package/dist/chunk-Y3N7UUDO.js.map +0 -1
  253. package/dist/chunk-Y3QQN7PN.js.map +0 -1
  254. package/dist/chunk-YVUJBEXE.cjs.map +0 -1
  255. package/dist/index-CLp-DRKA.d.ts +0 -64
  256. package/dist/index-DfO7G4kN.d.cts +0 -64
  257. package/dist/media-GPPTZ43E.js +0 -4
  258. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
  259. package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
  260. package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
  261. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
  262. package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
  263. package/dist/redis-adapter-VQXD7ESY.js +0 -4
  264. package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
  265. package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
@@ -1,4 +1,4 @@
1
- import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-3ZFYL34R.js';
1
+ import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-WXVB364T.js';
2
2
  import { sql, eq, desc, and, or, ne, inArray, like, gt, gte, lt, lte } from 'drizzle-orm';
3
3
  import { text, uuid, jsonb, timestamp, boolean, decimal, integer as integer$1, varchar, pgTable } from 'drizzle-orm/pg-core';
4
4
  import { text as text$1, integer, numeric, sqliteTable } from 'drizzle-orm/sqlite-core';
@@ -15,11 +15,13 @@ function fieldToDrizzleType(field, dialect = "postgres") {
15
15
  case "text":
16
16
  case "email":
17
17
  case "password":
18
- case "textarea":
19
18
  case "color":
19
+ return dialect === "sqlite" ? "text" : "varchar";
20
+ case "textarea":
20
21
  case "code":
21
22
  case "markdown":
22
- return dialect === "sqlite" ? "text" : "varchar";
23
+ case "secret":
24
+ return "text";
23
25
  case "number":
24
26
  return field.integer ? "integer" : "decimal";
25
27
  case "checkbox":
@@ -41,7 +43,7 @@ function fieldToDrizzleType(field, dialect = "postgres") {
41
43
  case "relationship":
42
44
  return dialect === "sqlite" ? "text" : "varchar";
43
45
  case "upload":
44
- return dialect === "sqlite" ? "text" : "varchar";
46
+ return "jsonb";
45
47
  default:
46
48
  return "jsonb";
47
49
  }
@@ -74,8 +76,8 @@ function collectionToDrizzleSchema(collection, dialect = "postgres") {
74
76
  lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);
75
77
  lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);
76
78
  }
77
- lines.push(` _status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('_status').default('published'),`);
78
- lines.push(` _has_draft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('_has_draft').default(false),`);
79
+ lines.push(` status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('status').default('draft'),`);
80
+ lines.push(` hasDraft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('hasDraft').default(false),`);
79
81
  lines.push("});");
80
82
  return lines.join("\n");
81
83
  }
@@ -84,15 +86,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
84
86
  schema;
85
87
  dialect;
86
88
  connectionString;
87
- draftsTableReady = false;
88
89
  versionsTableReady = false;
89
- tenantContext;
90
- setTenantContext(context) {
91
- this.tenantContext = context;
92
- }
93
- getTenantContext() {
94
- return this.tenantContext;
95
- }
96
90
  constructor(options) {
97
91
  super();
98
92
  this.schema = options.schema || {};
@@ -119,6 +113,14 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
119
113
  if (result.updatedAt && typeof result.updatedAt === "string") {
120
114
  result.updatedAt = new Date(result.updatedAt);
121
115
  }
116
+ for (const field of config.fields) {
117
+ if (field.type === "date" && field.name) {
118
+ const value = result[field.name];
119
+ if (value && typeof value === "string") {
120
+ result[field.name] = new Date(value);
121
+ }
122
+ }
123
+ }
122
124
  for (const field of config.fields) {
123
125
  const dbType = fieldToDrizzleType(field, this.dialect);
124
126
  const isJsonb = dbType === "jsonb";
@@ -147,6 +149,14 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
147
149
  }
148
150
  }
149
151
  }
152
+ for (const field of config.fields) {
153
+ if (field.name && result[field.name] === "") {
154
+ const dbType = fieldToDrizzleType(field, this.dialect);
155
+ if (dbType === "timestamp" || dbType === "jsonb" || dbType === "decimal" || dbType === "integer" || dbType === "numeric" || dbType === "boolean") {
156
+ result[field.name] = null;
157
+ }
158
+ }
159
+ }
150
160
  return result;
151
161
  }
152
162
  async connect() {
@@ -263,8 +273,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
263
273
  }
264
274
  if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? text$1("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : timestamp("created_at").defaultNow();
265
275
  if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? text$1("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : timestamp("updated_at").defaultNow();
266
- columns._status = this.dialect === "sqlite" ? text$1("_status").default("published") : varchar("_status", { length: 20 }).default("published");
267
- columns._has_draft = this.dialect === "sqlite" ? integer("_has_draft", { mode: "boolean" }).default(false) : boolean("_has_draft").default(false);
276
+ columns.status = this.dialect === "sqlite" ? text$1("status").default("draft") : varchar("status", { length: 20 }).default("draft");
277
+ columns.hasDraft = this.dialect === "sqlite" ? integer("hasDraft", { mode: "boolean" }).default(false) : boolean("hasDraft").default(false);
268
278
  return this.dialect === "sqlite" ? sqliteTable(tableName, columns) : pgTable(tableName, columns);
269
279
  }
270
280
  async ensureCollectionTables(collections) {
@@ -283,8 +293,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
283
293
  ${colDefs}
284
294
  ${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
285
295
  ${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
286
- "_status" VARCHAR(20) DEFAULT 'published',
287
- "_has_draft" BOOLEAN DEFAULT false
296
+ "status" VARCHAR(20) DEFAULT 'draft',
297
+ "hasDraft" BOOLEAN DEFAULT false
288
298
  )
289
299
  `);
290
300
  } else {
@@ -295,8 +305,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
295
305
  ${colDefs}
296
306
  ${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
297
307
  ${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
298
- "_status" TEXT DEFAULT 'published',
299
- "_has_draft" INTEGER DEFAULT 0
308
+ "status" TEXT DEFAULT 'draft',
309
+ "hasDraft" INTEGER DEFAULT 0
300
310
  )
301
311
  `);
302
312
  }
@@ -310,6 +320,126 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
310
320
  }
311
321
  }
312
322
  }
323
+ for (const config of collections) {
324
+ const tableName = this.getTableName(config.slug);
325
+ if (tableName === "users" || tableName === "audit_logs") continue;
326
+ await this.syncTableColumns(config, tableName);
327
+ }
328
+ }
329
+ getColumnSqlDefinition(field, dialect) {
330
+ const dbType = fieldToDrizzleType(field, dialect);
331
+ const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
332
+ const sqlType = this.columnSqlType(dbType, dialect);
333
+ return `"${sqlName}" ${sqlType} DEFAULT NULL`;
334
+ }
335
+ columnSqlType(dbType, dialect) {
336
+ if (dialect === "sqlite") {
337
+ switch (dbType) {
338
+ case "varchar":
339
+ return "TEXT";
340
+ case "text":
341
+ return "TEXT";
342
+ case "integer":
343
+ return "INTEGER";
344
+ case "decimal":
345
+ case "numeric":
346
+ return "NUMERIC";
347
+ case "boolean":
348
+ return "INTEGER";
349
+ case "timestamp":
350
+ return "TEXT";
351
+ case "jsonb":
352
+ return "TEXT";
353
+ default:
354
+ return "TEXT";
355
+ }
356
+ }
357
+ switch (dbType) {
358
+ case "varchar":
359
+ return "VARCHAR(255)";
360
+ case "text":
361
+ return "TEXT";
362
+ case "integer":
363
+ return "INTEGER";
364
+ case "decimal":
365
+ case "numeric":
366
+ return "DECIMAL";
367
+ case "boolean":
368
+ return "BOOLEAN";
369
+ case "timestamp":
370
+ return "TIMESTAMP";
371
+ case "jsonb":
372
+ return "JSONB";
373
+ default:
374
+ return "TEXT";
375
+ }
376
+ }
377
+ getExpectedColumnDefs(config, tableName) {
378
+ const defs = {};
379
+ const isGlobal = config.slug.startsWith("_globals_");
380
+ const hasCreated = config.fields.some((f) => f.name === "createdAt");
381
+ const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
382
+ if (this.dialect === "postgres") {
383
+ defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
384
+ if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
385
+ if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
386
+ defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
387
+ defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
388
+ } else {
389
+ defs["id"] = '"id" TEXT PRIMARY KEY';
390
+ if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
391
+ if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
392
+ defs["status"] = '"status" TEXT DEFAULT NULL';
393
+ defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
394
+ }
395
+ for (const field of config.fields) {
396
+ if (!field.name || field.name === "id") continue;
397
+ const def = this.getColumnSqlDefinition(field, this.dialect);
398
+ const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
399
+ defs[sqlName] = def;
400
+ }
401
+ return defs;
402
+ }
403
+ async syncTableColumns(config, tableName) {
404
+ let existingCols;
405
+ try {
406
+ if (this.dialect === "postgres") {
407
+ const result = await this.client.execute(
408
+ sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`
409
+ );
410
+ existingCols = new Map(result.map((r) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));
411
+ } else {
412
+ const result = await this.client.execute(
413
+ sql`PRAGMA table_info("${sql.raw(tableName)}")`
414
+ );
415
+ existingCols = new Map(result.map((r) => [r.name, { type: r.type, maxLen: null }]));
416
+ }
417
+ } catch {
418
+ return;
419
+ }
420
+ const expected = this.getExpectedColumnDefs(config, tableName);
421
+ const missing = Object.keys(expected).filter((k) => !existingCols.has(k));
422
+ if (missing.length > 0) {
423
+ const alterStmts = missing.map((k) => `ALTER TABLE "${tableName}" ADD COLUMN ${expected[k]}`);
424
+ await this.executeRaw(sql.raw(alterStmts.join(";\n")));
425
+ }
426
+ if (this.dialect === "postgres") {
427
+ for (const field of config.fields) {
428
+ if (!field.name || field.name === "id") continue;
429
+ const expectedDbType = fieldToDrizzleType(field, this.dialect);
430
+ const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
431
+ const info = existingCols.get(sqlName);
432
+ if (!info || info.type !== "character varying") continue;
433
+ if (expectedDbType === "text") {
434
+ await this.executeRaw(sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE TEXT`));
435
+ console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 TEXT`);
436
+ } else if (expectedDbType === "jsonb") {
437
+ await this.executeRaw(sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" DROP DEFAULT`));
438
+ await this.executeRaw(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)`));
439
+ console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 JSONB`);
440
+ }
441
+ }
442
+ }
313
443
  }
314
444
  generateCreateColumns(config) {
315
445
  const cols = [];
@@ -386,11 +516,12 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
386
516
  effectiveWhere = rlsQuery.where || {};
387
517
  }
388
518
  const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
389
- if (!draft && table._status) {
390
- filters.push(eq(table._status, "published"));
519
+ if (!draft && table.status) {
520
+ filters.push(eq(table.status, "published"));
391
521
  }
392
522
  const sortOption = this.parseSort(sort);
393
- const totalDocs = await this.count({ collection: slug, where: effectiveWhere, tenantID });
523
+ const countWhere = !draft && table.status ? { ...effectiveWhere, status: "published" } : effectiveWhere;
524
+ const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });
394
525
  const offset = (page - 1) * limit;
395
526
  let results = [];
396
527
  try {
@@ -410,16 +541,17 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
410
541
  }
411
542
  if (draft) {
412
543
  docs = await Promise.all(docs.map(async (doc) => {
413
- if (doc._has_draft) {
414
- const versions = await this.findVersions({
415
- collection: slug,
416
- documentId: doc.id,
417
- limit: 1,
418
- sort: "-createdAt"
419
- });
420
- if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
421
- return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
422
- }
544
+ const versions = await this.executeRaw(sql`
545
+ SELECT * FROM kyro_versions
546
+ WHERE collection_slug = ${slug}
547
+ AND document_id = ${doc.id}
548
+ ORDER BY created_at DESC
549
+ LIMIT 1
550
+ `);
551
+ if (versions.length > 0) {
552
+ const ver = versions[0];
553
+ const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
554
+ return { ...doc, ...versionData, status: doc.status };
423
555
  }
424
556
  return doc;
425
557
  }));
@@ -441,20 +573,23 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
441
573
  }
442
574
  const conditions = [eq(table.id, id)];
443
575
  if (tenantID && table.tenantId) conditions.push(eq(table.tenantId, tenantID));
444
- if (!draft && table._status) conditions.push(eq(table._status, "published"));
576
+ if (!draft && table.status) conditions.push(eq(table.status, "published"));
445
577
  const whereClause = conditions.length > 1 ? and(...conditions) : conditions[0];
446
578
  let allRows = await this.client.select().from(table).where(whereClause);
447
579
  if (allRows.length === 0) return null;
448
580
  let doc = this.processResult(allRows[0], config);
449
- if (draft && doc._has_draft) {
450
- const versions = await this.findVersions({
451
- collection: slug,
452
- documentId: doc.id,
453
- limit: 1,
454
- sort: "-createdAt"
455
- });
456
- if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
457
- doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
581
+ if (draft) {
582
+ const versions = await this.executeRaw(sql`
583
+ SELECT * FROM kyro_versions
584
+ WHERE collection_slug = ${slug}
585
+ AND document_id = ${doc.id}
586
+ ORDER BY created_at DESC
587
+ LIMIT 1
588
+ `);
589
+ if (versions.length > 0) {
590
+ const ver = versions[0];
591
+ const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
592
+ doc = { ...doc, ...versionData, status: doc.status };
458
593
  }
459
594
  }
460
595
  return doc;
@@ -475,21 +610,27 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
475
610
  const config = this.getCollection(slug);
476
611
  const table = this.getTable(slug);
477
612
  const updateData = this.prepareData(data, config);
478
- if (tenantID) {
479
- updateData.tenantId = tenantID;
613
+ delete updateData.id;
614
+ console.log(`[DrizzleAdapter.update] CALLED for ${slug}/${id}`);
615
+ const conditions = [eq(table.id, id)];
616
+ if (tenantID && table.tenantId) {
617
+ conditions.push(eq(table.tenantId, tenantID));
618
+ }
619
+ const result = await this.client.update(table).set(updateData).where(and(...conditions)).returning();
620
+ if (result.length === 0) {
621
+ throw new Error(`Document not found: ${slug}/${id}`);
480
622
  }
481
- const result = await this.client.update(table).set(updateData).where(eq(table.id, id)).returning();
482
623
  return this.processResult(result[0], config);
483
624
  }
484
625
  async delete(args) {
485
626
  const { collection: slug, id, tenantID } = args;
486
627
  const config = this.getCollection(slug);
487
628
  const table = this.getTable(slug);
488
- let query = this.client.delete(table).where(eq(table.id, id)).returning();
629
+ const conditions = [eq(table.id, id)];
489
630
  if (tenantID && table.tenantId) {
490
- query = query.where(eq(table.tenantId, tenantID));
631
+ conditions.push(eq(table.tenantId, tenantID));
491
632
  }
492
- const result = await query;
633
+ const result = await this.client.delete(table).where(and(...conditions)).returning();
493
634
  if (result.length === 0) {
494
635
  throw new Error(`Document not found: ${slug}/${id}`);
495
636
  }
@@ -519,21 +660,24 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
519
660
  if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
520
661
  const table = this.getTable(slug);
521
662
  let query = this.client.select().from(table);
522
- if (!draft && table._status) {
523
- query = query.where(eq(table._status, "published"));
663
+ if (!draft && table.status) {
664
+ query = query.where(eq(table.status, "published"));
524
665
  }
525
666
  const results = await query.limit(1);
526
667
  if (results.length === 0) return null;
527
668
  let doc = this.processResult(results[0], globalConfig);
528
- if (draft && doc._has_draft) {
529
- const versions = await this.findVersions({
530
- collection: slug,
531
- documentId: globalSlug,
532
- limit: 1,
533
- sort: "-createdAt"
534
- });
535
- if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
536
- doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
669
+ if (draft) {
670
+ const versions = await this.executeRaw(sql`
671
+ SELECT * FROM kyro_versions
672
+ WHERE collection_slug = ${slug}
673
+ AND document_id = ${globalSlug}
674
+ ORDER BY created_at DESC
675
+ LIMIT 1
676
+ `);
677
+ if (versions.length > 0) {
678
+ const ver = versions[0];
679
+ const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
680
+ doc = { ...doc, ...versionData, status: doc.status };
537
681
  }
538
682
  }
539
683
  return doc;
@@ -550,6 +694,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
550
694
  FROM kyro_versions
551
695
  WHERE collection_slug = ${slug}
552
696
  AND document_id = ${documentId}
697
+ AND autosave = 0
553
698
  ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
554
699
  `);
555
700
  const totalDocs = parseInt(countResult[0]?.count || "0");
@@ -558,6 +703,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
558
703
  FROM kyro_versions
559
704
  WHERE collection_slug = ${slug}
560
705
  AND document_id = ${documentId}
706
+ AND autosave = 0
561
707
  ${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
562
708
  ORDER BY created_at DESC
563
709
  LIMIT ${limit}
@@ -589,28 +735,53 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
589
735
  }
590
736
  async createVersion(args) {
591
737
  await this.ensureVersionsTable();
592
- const id = Math.random().toString(36).substring(2, 15);
593
738
  const now = (/* @__PURE__ */ new Date()).toISOString();
739
+ if (args.autosave) {
740
+ const existing = await this.executeRaw(sql`
741
+ SELECT * FROM kyro_versions
742
+ WHERE collection_slug = ${args.collection}
743
+ AND document_id = ${args.documentId}
744
+ AND autosave = 1
745
+ ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
746
+ LIMIT 1
747
+ `);
748
+ if (existing.length > 0) {
749
+ await this.executeRaw(sql`
750
+ UPDATE kyro_versions
751
+ SET data = ${JSON.stringify(args.data)},
752
+ status = ${args.status},
753
+ updated_at = ${now}
754
+ WHERE id = ${existing[0].id}
755
+ `);
756
+ return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });
757
+ }
758
+ }
759
+ const id = Math.random().toString(36).substring(2, 15);
594
760
  await this.executeRaw(sql`
595
761
  INSERT INTO kyro_versions (
596
- id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at
762
+ id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
597
763
  ) VALUES (
598
764
  ${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
599
- ${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null},
765
+ ${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null},
600
766
  ${args.changeDescription || null}, ${now}, ${now}
601
767
  )
602
768
  `);
603
- const config = this.getCollection(args.collection);
604
- if (config.versions?.maxPerDoc) {
605
- await this.deleteVersions({
606
- collection: args.collection,
607
- documentId: args.documentId,
608
- keepLatest: config.versions.maxPerDoc,
609
- tenantID: args.tenantID
610
- });
769
+ if (!args.autosave) {
770
+ const config = this.getCollection(args.collection);
771
+ if (config.versions?.maxPerDoc) {
772
+ await this.deleteVersions({
773
+ collection: args.collection,
774
+ documentId: args.documentId,
775
+ keepLatest: config.versions.maxPerDoc,
776
+ tenantID: args.tenantID
777
+ });
778
+ }
611
779
  }
612
780
  return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
613
781
  }
782
+ async updateLatestVersion(args) {
783
+ return this.createVersion({ ...args, autosave: true });
784
+ }
614
785
  async deleteVersions(args) {
615
786
  await this.ensureVersionsTable();
616
787
  if (args.keepLatest) {
@@ -618,6 +789,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
618
789
  SELECT id FROM kyro_versions
619
790
  WHERE collection_slug = ${args.collection}
620
791
  AND document_id = ${args.documentId}
792
+ AND autosave = 0
621
793
  ${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
622
794
  ORDER BY created_at DESC
623
795
  LIMIT ${args.keepLatest}
@@ -628,6 +800,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
628
800
  DELETE FROM kyro_versions
629
801
  WHERE collection_slug = ${args.collection}
630
802
  AND document_id = ${args.documentId}
803
+ AND autosave = 0
631
804
  AND id NOT IN (${sql.join(keepIds.map((id) => sql`${id}`), sql`, `)})
632
805
  `);
633
806
  }
@@ -640,65 +813,6 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
640
813
  `);
641
814
  }
642
815
  }
643
- async findDraft(args) {
644
- await this.ensureDraftsTable();
645
- const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
646
- const rows = await this.executeRaw(sql`
647
- SELECT *
648
- FROM kyro_drafts
649
- WHERE id = ${draftId}
650
- LIMIT 1
651
- `);
652
- const row = rows[0];
653
- return row ? this.rowToDraft(row) : null;
654
- }
655
- async upsertDraft(args) {
656
- await this.ensureDraftsTable();
657
- const now = (/* @__PURE__ */ new Date()).toISOString();
658
- const draftUpdatedAt = args.draftUpdatedAt || now;
659
- const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
660
- const existing = await this.findDraft(args);
661
- if (existing) {
662
- await this.executeRaw(sql`
663
- UPDATE kyro_drafts
664
- SET
665
- data = ${JSON.stringify(args.data)},
666
- base_updated_at = ${args.baseUpdatedAt ?? null},
667
- draft_updated_at = ${draftUpdatedAt},
668
- updated_at = ${now}
669
- WHERE id = ${draftId}
670
- `);
671
- } else {
672
- await this.executeRaw(sql`
673
- INSERT INTO kyro_drafts (
674
- id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
675
- ) VALUES (
676
- ${draftId},
677
- ${args.collection},
678
- ${args.documentId},
679
- ${args.tenantID ?? null},
680
- ${JSON.stringify(args.data)},
681
- ${args.baseUpdatedAt ?? null},
682
- ${draftUpdatedAt},
683
- ${now},
684
- ${now}
685
- )
686
- `);
687
- }
688
- const saved = await this.findDraft(args);
689
- if (!saved) {
690
- throw new Error("Failed to persist draft snapshot");
691
- }
692
- return saved;
693
- }
694
- async deleteDraft(args) {
695
- await this.ensureDraftsTable();
696
- const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
697
- await this.executeRaw(sql`
698
- DELETE FROM kyro_drafts
699
- WHERE id = ${draftId}
700
- `);
701
- }
702
816
  // ========================================================================
703
817
  // Helper Methods
704
818
  // ========================================================================
@@ -772,6 +886,22 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
772
886
  }
773
887
  if (field.type === "tabs" && "tabs" in field && field.name) {
774
888
  if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
889
+ for (const tab of field.tabs) {
890
+ for (const tabField of tab.fields) {
891
+ if ((tabField.type === "upload" || tabField.type === "image") && tabField.name) {
892
+ const val = result[field.name][tabField.name];
893
+ if (typeof val === "string") {
894
+ try {
895
+ const parsed = JSON.parse(val);
896
+ 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 || "");
897
+ } catch {
898
+ }
899
+ } else if (val && typeof val === "object") {
900
+ 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 || "");
901
+ }
902
+ }
903
+ }
904
+ }
775
905
  continue;
776
906
  }
777
907
  if (typeof result[field.name] === "string") {
@@ -796,6 +926,9 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
796
926
  } catch {
797
927
  }
798
928
  }
929
+ if ((tabField.type === "upload" || tabField.type === "image") && value && typeof value === "object") {
930
+ 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 || "");
931
+ }
799
932
  }
800
933
  tabData[tabField.name] = value;
801
934
  delete result[tabField.name];
@@ -813,43 +946,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
813
946
  }
814
947
  return result;
815
948
  }
816
- async ensureDraftsTable() {
817
- if (_schemaEnsured || this.draftsTableReady) return;
818
- let createTableSQL;
819
- if (this.dialect === "sqlite") {
820
- createTableSQL = `
821
- CREATE TABLE IF NOT EXISTS kyro_drafts (
822
- id text PRIMARY KEY,
823
- collection_slug text NOT NULL,
824
- document_id text NOT NULL,
825
- tenant_id text,
826
- data text NOT NULL,
827
- base_updated_at text,
828
- draft_updated_at text NOT NULL,
829
- created_at text DEFAULT (datetime('now')),
830
- updated_at text DEFAULT (datetime('now'))
831
- )
832
- `;
833
- } else {
834
- createTableSQL = `
835
- CREATE TABLE IF NOT EXISTS kyro_drafts (
836
- id text PRIMARY KEY,
837
- collection_slug text NOT NULL,
838
- document_id text NOT NULL,
839
- tenant_id text,
840
- data text NOT NULL,
841
- base_updated_at text,
842
- draft_updated_at text NOT NULL,
843
- created_at text NOT NULL,
844
- updated_at text NOT NULL
845
- )
846
- `;
847
- }
848
- await this.executeRaw(sql.raw(createTableSQL));
849
- this.draftsTableReady = true;
850
- }
851
949
  async ensureVersionsTable() {
852
- if (_schemaEnsured || this.versionsTableReady) return;
950
+ if (this.versionsTableReady) return;
853
951
  let createTableSQL;
854
952
  if (this.dialect === "sqlite") {
855
953
  createTableSQL = `
@@ -860,6 +958,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
860
958
  tenant_id text,
861
959
  data text NOT NULL,
862
960
  status text NOT NULL DEFAULT 'draft',
961
+ autosave integer NOT NULL DEFAULT 0,
863
962
  created_by text,
864
963
  change_description text,
865
964
  created_at text DEFAULT (datetime('now')),
@@ -875,6 +974,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
875
974
  tenant_id text,
876
975
  data text NOT NULL,
877
976
  status text NOT NULL,
977
+ autosave integer NOT NULL DEFAULT 0,
878
978
  created_by text,
879
979
  change_description text,
880
980
  created_at text NOT NULL,
@@ -883,11 +983,16 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
883
983
  `;
884
984
  }
885
985
  await this.executeRaw(sql.raw(createTableSQL));
986
+ try {
987
+ if (this.dialect === "postgres") {
988
+ await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));
989
+ } else {
990
+ await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));
991
+ }
992
+ } catch {
993
+ }
886
994
  this.versionsTableReady = true;
887
995
  }
888
- getDraftId(collection, documentId, tenantID) {
889
- return `${collection}::${documentId}::${tenantID || "global"}`;
890
- }
891
996
  async executeRaw(query) {
892
997
  const result = await this.client.execute(query);
893
998
  if (Array.isArray(result)) {
@@ -901,19 +1006,6 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
901
1006
  }
902
1007
  return [];
903
1008
  }
904
- rowToDraft(row) {
905
- return {
906
- id: String(row.id),
907
- collection: row.collection_slug,
908
- documentId: row.document_id,
909
- tenantID: row.tenant_id ?? void 0,
910
- data: row.data ? JSON.parse(row.data) : {},
911
- baseUpdatedAt: row.base_updated_at ?? null,
912
- draftUpdatedAt: row.draft_updated_at,
913
- createdAt: row.created_at,
914
- updatedAt: row.updated_at
915
- };
916
- }
917
1009
  };
918
1010
  function createDrizzleAdapter(options) {
919
1011
  return new DrizzleAdapter(options);
@@ -956,7 +1048,7 @@ async function runMigrations(_db, _dialect) {
956
1048
  );
957
1049
  }
958
1050
  async function seedDefaultRoles(db) {
959
- const { roles } = await import('./schema-5PHL5IVB.js');
1051
+ const { roles } = await import('./schema-FNNWEAAW.js');
960
1052
  await db.insert(roles).values({
961
1053
  name: "super_admin",
962
1054
  level: 100,
@@ -967,5 +1059,5 @@ async function seedDefaultRoles(db) {
967
1059
  }
968
1060
 
969
1061
  export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles };
970
- //# sourceMappingURL=chunk-QPPDLRNR.js.map
971
- //# sourceMappingURL=chunk-QPPDLRNR.js.map
1062
+ //# sourceMappingURL=chunk-V7KZQIZ6.js.map
1063
+ //# sourceMappingURL=chunk-V7KZQIZ6.js.map