@kyro-cms/core 0.3.2 → 0.3.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 (201) hide show
  1. package/dist/{WebhookService-BznDc2AT.d.ts → WebhookService-118ZTFis.d.ts} +2 -2
  2. package/dist/{WebhookService-mZZ75syh.d.cts → WebhookService-AefJfqX0.d.cts} +2 -2
  3. package/dist/api-handler.cjs +52 -0
  4. package/dist/api-handler.cjs.map +1 -0
  5. package/dist/api-handler.d.cts +9 -0
  6. package/dist/api-handler.d.ts +9 -0
  7. package/dist/api-handler.js +46 -0
  8. package/dist/api-handler.js.map +1 -0
  9. package/dist/{base-Hu6ij8sZ.d.ts → base-DvvNqnM-.d.cts} +16 -5
  10. package/dist/{base-Db9LkB1N.d.cts → base-eVegJ_Pr.d.ts} +16 -5
  11. package/dist/bootstrap-DGJ3N7SO.js +6 -0
  12. package/dist/{bootstrap-LL6O7PWO.js.map → bootstrap-DGJ3N7SO.js.map} +1 -1
  13. package/dist/bootstrap-O5UGUTYU.cjs +31 -0
  14. package/dist/{bootstrap-BMWVB2T6.cjs.map → bootstrap-O5UGUTYU.cjs.map} +1 -1
  15. package/dist/{chunk-QKOFKITP.js → chunk-2HFJUUFZ.js} +3 -11
  16. package/dist/chunk-2HFJUUFZ.js.map +1 -0
  17. package/dist/chunk-2UOI5MUC.cjs +1276 -0
  18. package/dist/chunk-2UOI5MUC.cjs.map +1 -0
  19. package/dist/{chunk-DIC236EW.js → chunk-342BJNBI.js} +167 -24
  20. package/dist/chunk-342BJNBI.js.map +1 -0
  21. package/dist/{chunk-OUGKLCYF.js → chunk-3AJE4SEG.js} +4 -3
  22. package/dist/chunk-3AJE4SEG.js.map +1 -0
  23. package/dist/chunk-4UD44U4Z.js +5818 -0
  24. package/dist/chunk-4UD44U4Z.js.map +1 -0
  25. package/dist/chunk-5FTY2DLG.js +1258 -0
  26. package/dist/chunk-5FTY2DLG.js.map +1 -0
  27. package/dist/{chunk-BXMWDUED.js → chunk-A4USRVTQ.js} +2 -2
  28. package/dist/chunk-A4USRVTQ.js.map +1 -0
  29. package/dist/chunk-ADLJSJSN.cjs +13 -0
  30. package/dist/chunk-ADLJSJSN.cjs.map +1 -0
  31. package/dist/chunk-ATBOUGQP.cjs +513 -0
  32. package/dist/chunk-ATBOUGQP.cjs.map +1 -0
  33. package/dist/chunk-BQ2T4WRS.js +140 -0
  34. package/dist/chunk-BQ2T4WRS.js.map +1 -0
  35. package/dist/{chunk-U74F3YZU.js → chunk-DBUYB32X.js} +15 -3
  36. package/dist/chunk-DBUYB32X.js.map +1 -0
  37. package/dist/chunk-DE7OQOMD.cjs +5842 -0
  38. package/dist/chunk-DE7OQOMD.cjs.map +1 -0
  39. package/dist/chunk-DLHUQO25.cjs +1746 -0
  40. package/dist/chunk-DLHUQO25.cjs.map +1 -0
  41. package/dist/{chunk-GE5DMB44.js → chunk-E3BZLMX6.js} +55 -49
  42. package/dist/chunk-E3BZLMX6.js.map +1 -0
  43. package/dist/{chunk-44BF6ALS.cjs → chunk-H4XCAPA6.cjs} +55 -49
  44. package/dist/chunk-H4XCAPA6.cjs.map +1 -0
  45. package/dist/{chunk-VIONYQ2K.cjs → chunk-IBG6V56E.cjs} +16 -32
  46. package/dist/chunk-IBG6V56E.cjs.map +1 -0
  47. package/dist/{chunk-LIJVWQKU.cjs → chunk-IX3ABYKZ.cjs} +43 -31
  48. package/dist/chunk-IX3ABYKZ.cjs.map +1 -0
  49. package/dist/chunk-JYGIFBBS.cjs +146 -0
  50. package/dist/chunk-JYGIFBBS.cjs.map +1 -0
  51. package/dist/{chunk-42JPONZU.cjs → chunk-K7JPTH3G.cjs} +17 -16
  52. package/dist/chunk-K7JPTH3G.cjs.map +1 -0
  53. package/dist/{chunk-RLTG4YZM.cjs → chunk-KOCTZKPV.cjs} +2 -2
  54. package/dist/chunk-KOCTZKPV.cjs.map +1 -0
  55. package/dist/{chunk-EWP5AT6A.cjs → chunk-N4H37VN4.cjs} +2 -11
  56. package/dist/chunk-N4H37VN4.cjs.map +1 -0
  57. package/dist/chunk-P2YW545G.js +11 -0
  58. package/dist/chunk-P2YW545G.js.map +1 -0
  59. package/dist/chunk-Q23JB3KL.js +488 -0
  60. package/dist/chunk-Q23JB3KL.js.map +1 -0
  61. package/dist/{chunk-E5X75WNB.js → chunk-QXIQWPAP.js} +14 -30
  62. package/dist/chunk-QXIQWPAP.js.map +1 -0
  63. package/dist/chunk-R3XIBBAW.cjs +34 -0
  64. package/dist/chunk-R3XIBBAW.cjs.map +1 -0
  65. package/dist/chunk-R4C4O4SE.cjs +622 -0
  66. package/dist/chunk-R4C4O4SE.cjs.map +1 -0
  67. package/dist/{chunk-KWGNR4HM.js → chunk-REK7AYOC.js} +82 -9
  68. package/dist/chunk-REK7AYOC.js.map +1 -0
  69. package/dist/chunk-RGIQKTZ7.js +68 -0
  70. package/dist/chunk-RGIQKTZ7.js.map +1 -0
  71. package/dist/chunk-RYDGMBIG.js +1737 -0
  72. package/dist/chunk-RYDGMBIG.js.map +1 -0
  73. package/dist/chunk-SDMNUYVU.js +30 -0
  74. package/dist/chunk-SDMNUYVU.js.map +1 -0
  75. package/dist/{chunk-FTSSDDZQ.cjs → chunk-VJT6P4N6.cjs} +82 -9
  76. package/dist/chunk-VJT6P4N6.cjs.map +1 -0
  77. package/dist/{chunk-HT6VE4NW.cjs → chunk-W3KPQX7V.cjs} +168 -25
  78. package/dist/chunk-W3KPQX7V.cjs.map +1 -0
  79. package/dist/{chunk-LTRCYJAG.js → chunk-WOWUL7ZY.js} +3 -2
  80. package/dist/chunk-WOWUL7ZY.js.map +1 -0
  81. package/dist/{chunk-7YITG2US.cjs → chunk-WQBRWOQT.cjs} +3 -2
  82. package/dist/chunk-WQBRWOQT.cjs.map +1 -0
  83. package/dist/{chunk-KB6QF4HO.js → chunk-WSCJQI2B.js} +305 -152
  84. package/dist/chunk-WSCJQI2B.js.map +1 -0
  85. package/dist/chunk-X3CU27OO.cjs +78 -0
  86. package/dist/chunk-X3CU27OO.cjs.map +1 -0
  87. package/dist/chunk-Y3TM7WH7.js +617 -0
  88. package/dist/chunk-Y3TM7WH7.js.map +1 -0
  89. package/dist/{chunk-PNBZZ76A.cjs → chunk-Z2OVHWHB.cjs} +305 -151
  90. package/dist/chunk-Z2OVHWHB.cjs.map +1 -0
  91. package/dist/cli/index.cjs +2 -2
  92. package/dist/cli/index.js +2 -2
  93. package/dist/client.cjs +23 -13
  94. package/dist/client.d.cts +4 -2
  95. package/dist/client.d.ts +4 -2
  96. package/dist/client.js +3 -1
  97. package/dist/drizzle/index.cjs +20 -19
  98. package/dist/drizzle/index.d.cts +28 -7
  99. package/dist/drizzle/index.d.ts +28 -7
  100. package/dist/drizzle/index.js +5 -4
  101. package/dist/fields/index.cjs +105 -0
  102. package/dist/fields/index.cjs.map +1 -0
  103. package/dist/fields/index.d.cts +27 -0
  104. package/dist/fields/index.d.ts +27 -0
  105. package/dist/fields/index.js +4 -0
  106. package/dist/fields/index.js.map +1 -0
  107. package/dist/graphql/index.cjs +4 -3
  108. package/dist/graphql/index.d.cts +3 -2
  109. package/dist/graphql/index.d.ts +3 -2
  110. package/dist/graphql/index.js +2 -1
  111. package/dist/{index-Ci6r4xnN.d.ts → index-CLp-DRKA.d.ts} +2 -1
  112. package/dist/{index-11MDNKce.d.cts → index-DfO7G4kN.d.cts} +2 -1
  113. package/dist/index.cjs +2659 -6670
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.d.cts +138 -47
  116. package/dist/index.d.ts +138 -47
  117. package/dist/index.js +2356 -6529
  118. package/dist/index.js.map +1 -1
  119. package/dist/integration.cjs +68 -0
  120. package/dist/integration.cjs.map +1 -0
  121. package/dist/integration.d.cts +27 -0
  122. package/dist/integration.d.ts +27 -0
  123. package/dist/integration.js +61 -0
  124. package/dist/integration.js.map +1 -0
  125. package/dist/mongodb/index.cjs +4 -4
  126. package/dist/mongodb/index.d.cts +20 -6
  127. package/dist/mongodb/index.d.ts +20 -6
  128. package/dist/mongodb/index.js +2 -2
  129. package/dist/postgres-auth-adapter-7F3ECO7I.js +5 -0
  130. package/dist/{postgres-auth-adapter-OTRWSTT5.js.map → postgres-auth-adapter-7F3ECO7I.js.map} +1 -1
  131. package/dist/postgres-auth-adapter-Z463NYJZ.cjs +14 -0
  132. package/dist/{postgres-auth-adapter-EVRPO7BQ.cjs.map → postgres-auth-adapter-Z463NYJZ.cjs.map} +1 -1
  133. package/dist/redis-adapter-LPUWLE4Y.cjs +13 -0
  134. package/dist/{redis-adapter-E7PMN5HW.cjs.map → redis-adapter-LPUWLE4Y.cjs.map} +1 -1
  135. package/dist/redis-adapter-THYDCGQR.js +4 -0
  136. package/dist/{redis-adapter-HOO67RBQ.js.map → redis-adapter-THYDCGQR.js.map} +1 -1
  137. package/dist/rest/index.cjs +9 -5
  138. package/dist/rest/index.d.cts +6 -3
  139. package/dist/rest/index.d.ts +6 -3
  140. package/dist/rest/index.js +7 -3
  141. package/dist/{schema-CNB2DDTX.js → schema-6Q4W6AE6.js} +3 -3
  142. package/dist/{schema-CNB2DDTX.js.map → schema-6Q4W6AE6.js.map} +1 -1
  143. package/dist/{schema-Y777CQQS.cjs → schema-TIYTCIKX.cjs} +14 -14
  144. package/dist/{schema-Y777CQQS.cjs.map → schema-TIYTCIKX.cjs.map} +1 -1
  145. package/dist/templates/index.cjs +27 -23
  146. package/dist/templates/index.d.cts +8 -2
  147. package/dist/templates/index.d.ts +8 -2
  148. package/dist/templates/index.js +1 -1
  149. package/dist/trpc/index.cjs +12 -11
  150. package/dist/trpc/index.d.cts +3 -2
  151. package/dist/trpc/index.d.ts +3 -2
  152. package/dist/trpc/index.js +3 -2
  153. package/dist/{types-1u353OHN.d.ts → types-BnTm7oJG.d.cts} +7 -3
  154. package/dist/{types-1u353OHN.d.cts → types-BnTm7oJG.d.ts} +7 -3
  155. package/dist/{types-kGfsGdos.d.cts → types-Bs1up4yP.d.ts} +76 -244
  156. package/dist/{types-kGfsGdos.d.ts → types-J3R9nVsZ.d.cts} +76 -244
  157. package/dist/types-VtjUxIMp.d.cts +246 -0
  158. package/dist/types-VtjUxIMp.d.ts +246 -0
  159. package/package.json +16 -9
  160. package/dist/bootstrap-BMWVB2T6.cjs +0 -31
  161. package/dist/bootstrap-LL6O7PWO.js +0 -6
  162. package/dist/chunk-42JPONZU.cjs.map +0 -1
  163. package/dist/chunk-44BF6ALS.cjs.map +0 -1
  164. package/dist/chunk-4M5PHMUE.cjs +0 -947
  165. package/dist/chunk-4M5PHMUE.cjs.map +0 -1
  166. package/dist/chunk-6MSSF46R.js +0 -941
  167. package/dist/chunk-6MSSF46R.js.map +0 -1
  168. package/dist/chunk-7YITG2US.cjs.map +0 -1
  169. package/dist/chunk-BTOE3VUK.js +0 -330
  170. package/dist/chunk-BTOE3VUK.js.map +0 -1
  171. package/dist/chunk-BXMWDUED.js.map +0 -1
  172. package/dist/chunk-DIC236EW.js.map +0 -1
  173. package/dist/chunk-E5X75WNB.js.map +0 -1
  174. package/dist/chunk-E63IF3MD.cjs +0 -951
  175. package/dist/chunk-E63IF3MD.cjs.map +0 -1
  176. package/dist/chunk-EWP5AT6A.cjs.map +0 -1
  177. package/dist/chunk-FTSSDDZQ.cjs.map +0 -1
  178. package/dist/chunk-GE5DMB44.js.map +0 -1
  179. package/dist/chunk-GVFB5C6O.cjs +0 -345
  180. package/dist/chunk-GVFB5C6O.cjs.map +0 -1
  181. package/dist/chunk-HT6VE4NW.cjs.map +0 -1
  182. package/dist/chunk-HVSQDZZJ.cjs +0 -765
  183. package/dist/chunk-HVSQDZZJ.cjs.map +0 -1
  184. package/dist/chunk-HYC4GNHX.js +0 -758
  185. package/dist/chunk-HYC4GNHX.js.map +0 -1
  186. package/dist/chunk-KB6QF4HO.js.map +0 -1
  187. package/dist/chunk-KWGNR4HM.js.map +0 -1
  188. package/dist/chunk-LIJVWQKU.cjs.map +0 -1
  189. package/dist/chunk-LTRCYJAG.js.map +0 -1
  190. package/dist/chunk-OUGKLCYF.js.map +0 -1
  191. package/dist/chunk-PNBZZ76A.cjs.map +0 -1
  192. package/dist/chunk-QKOFKITP.js.map +0 -1
  193. package/dist/chunk-RLTG4YZM.cjs.map +0 -1
  194. package/dist/chunk-RRYXQMZG.js +0 -935
  195. package/dist/chunk-RRYXQMZG.js.map +0 -1
  196. package/dist/chunk-U74F3YZU.js.map +0 -1
  197. package/dist/chunk-VIONYQ2K.cjs.map +0 -1
  198. package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +0 -14
  199. package/dist/postgres-auth-adapter-OTRWSTT5.js +0 -5
  200. package/dist/redis-adapter-E7PMN5HW.cjs +0 -13
  201. package/dist/redis-adapter-HOO67RBQ.js +0 -4
@@ -0,0 +1,622 @@
1
+ 'use strict';
2
+
3
+ var chunkKOCTZKPV_cjs = require('./chunk-KOCTZKPV.cjs');
4
+ var drizzleOrm = require('drizzle-orm');
5
+
6
+ function fieldToDrizzleType(field, dialect = "postgres") {
7
+ switch (field.type) {
8
+ case "text":
9
+ case "email":
10
+ case "password":
11
+ case "textarea":
12
+ case "color":
13
+ case "code":
14
+ case "markdown":
15
+ return dialect === "sqlite" ? "text" : "varchar";
16
+ case "number":
17
+ return field.integer ? "integer" : "decimal";
18
+ case "checkbox":
19
+ return "boolean";
20
+ case "date":
21
+ return "timestamp";
22
+ case "select":
23
+ case "radio":
24
+ return dialect === "sqlite" ? "text" : "varchar";
25
+ case "richtext":
26
+ case "json":
27
+ case "array":
28
+ case "group":
29
+ case "blocks":
30
+ case "row":
31
+ case "collapsible":
32
+ case "tabs":
33
+ return "jsonb";
34
+ case "relationship":
35
+ return dialect === "sqlite" ? "text" : "varchar";
36
+ case "upload":
37
+ return dialect === "sqlite" ? "text" : "varchar";
38
+ default:
39
+ return "jsonb";
40
+ }
41
+ }
42
+ function collectionToDrizzleSchema(collection, dialect = "postgres") {
43
+ const tableName = collection.slug.replace(/-/g, "_");
44
+ const lines = [];
45
+ lines.push(`export const ${tableName} = ${dialect === "mysql" ? "mysqlTable" : "pgTable"}('${tableName}', {`);
46
+ lines.push(` id: ${dialect === "mysql" ? "varchar" : "uuid"}('${dialect === "mysql" ? "id" : "id"}').${dialect === "mysql" ? "primaryKey().default(sql`UUID()`)" : "primaryKey().defaultRandom()"},`);
47
+ for (const field of collection.fields) {
48
+ if (field.name === "id") continue;
49
+ const dbType = fieldToDrizzleType(field, dialect);
50
+ const isRequired = field.required;
51
+ let fieldDef = ` ${field.name}: ${dialect === "mysql" ? "mysql" : "pg"}.${dbType}('${field.name}')`;
52
+ if (field.unique) fieldDef += ".unique()";
53
+ if (!isRequired) fieldDef += ".nullable()";
54
+ if (field.defaultValue !== void 0) {
55
+ if (typeof field.defaultValue === "string") {
56
+ fieldDef += `.default('${field.defaultValue}')`;
57
+ } else if (typeof field.defaultValue === "boolean") {
58
+ fieldDef += `.default(${field.defaultValue})`;
59
+ } else {
60
+ fieldDef += `.default(sql\`${JSON.stringify(field.defaultValue)}\`)`;
61
+ }
62
+ }
63
+ fieldDef += ",";
64
+ lines.push(fieldDef);
65
+ }
66
+ if (collection.timestamps) {
67
+ lines.push(` createdAt: ${dialect === "mysql" ? "mysql" : "pg"}.timestamp('created_at').defaultNow(),`);
68
+ lines.push(` updatedAt: ${dialect === "mysql" ? "mysql" : "pg"}.timestamp('updated_at').defaultNow(),`);
69
+ }
70
+ lines.push(` _status: ${dialect === "sqlite" ? "mysql" : "pg"}.varchar('_status').default('published'),`);
71
+ lines.push(` _has_draft: ${dialect === "sqlite" ? "mysql" : "pg"}.boolean('_has_draft').default(false),`);
72
+ lines.push("});");
73
+ return lines.join("\n");
74
+ }
75
+ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
76
+ client;
77
+ schema;
78
+ dialect;
79
+ draftsTableReady = false;
80
+ versionsTableReady = false;
81
+ constructor(options) {
82
+ super();
83
+ this.client = options.client;
84
+ this.schema = options.schema || {};
85
+ this.dialect = options.type;
86
+ }
87
+ prepareData(data, config) {
88
+ const result = super.prepareData(data, config);
89
+ for (const field of config.fields) {
90
+ if (field.type === "tabs" && "tabs" in field && field.name) {
91
+ const tabData = data[field.name];
92
+ if (tabData && typeof tabData === "object") {
93
+ const processedTabData = {};
94
+ for (const [key, value] of Object.entries(tabData)) {
95
+ const tabField = field.tabs.flatMap((t) => t.fields).find((f) => f.name === key);
96
+ if ((tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value) {
97
+ if (Array.isArray(value)) {
98
+ processedTabData[key] = JSON.stringify(value);
99
+ } else if (typeof value === "object") {
100
+ processedTabData[key] = JSON.stringify(value);
101
+ } else {
102
+ processedTabData[key] = value;
103
+ }
104
+ } else {
105
+ processedTabData[key] = value;
106
+ }
107
+ }
108
+ result[field.name] = JSON.stringify(processedTabData);
109
+ }
110
+ }
111
+ if (["upload", "image", "list", "relationship-block"].includes(field.type) && field.name) {
112
+ const value = data[field.name];
113
+ if (value) {
114
+ if (Array.isArray(value)) {
115
+ result[field.name] = JSON.stringify(value);
116
+ } else if (typeof value === "object") {
117
+ result[field.name] = JSON.stringify(value);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ return result;
123
+ }
124
+ async connect() {
125
+ this.connected = true;
126
+ console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);
127
+ }
128
+ async disconnect() {
129
+ this.connected = false;
130
+ console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);
131
+ }
132
+ async find(args) {
133
+ const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
134
+ const config = this.getCollection(slug);
135
+ const table = this.getTable(slug);
136
+ const filters = this.buildWhereClause(where, config, table, tenantID);
137
+ if (!draft) {
138
+ filters.push(table._status.equals("published"));
139
+ }
140
+ const sortOption = this.parseSort(sort);
141
+ const totalDocs = await this.count({ collection: slug, where: { ...where, _status: draft ? void 0 : "published" }, tenantID });
142
+ const offset = (page - 1) * limit;
143
+ let results = [];
144
+ try {
145
+ results = await this.client.select().from(table).where(filters).orderBy(sortOption.direction === "asc" ? table[sortOption.field] : void 0).limit(limit).offset(offset);
146
+ } catch (error) {
147
+ console.error(`[DrizzleAdapter] Query error:`, error);
148
+ }
149
+ let docs = results.map((doc) => this.processResult(doc, config));
150
+ if (draft) {
151
+ docs = await Promise.all(docs.map(async (doc) => {
152
+ if (doc._has_draft) {
153
+ const versions = await this.findVersions({
154
+ collection: slug,
155
+ documentId: doc.id,
156
+ limit: 1,
157
+ sort: "-createdAt"
158
+ });
159
+ if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
160
+ return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
161
+ }
162
+ }
163
+ return doc;
164
+ }));
165
+ }
166
+ return {
167
+ docs,
168
+ ...this.calculatePagination(page, limit, totalDocs)
169
+ };
170
+ }
171
+ async findByID(args) {
172
+ const { collection: slug, id, tenantID, draft } = args;
173
+ const config = this.getCollection(slug);
174
+ const table = this.getTable(slug);
175
+ let query = this.client.select().from(table).where(table.id.equals(id));
176
+ if (tenantID) {
177
+ query = query.where(table.tenantId.equals(tenantID));
178
+ }
179
+ if (!draft) {
180
+ query = query.where(table._status.equals("published"));
181
+ }
182
+ const results = await query.limit(1);
183
+ if (results.length === 0) return null;
184
+ let doc = this.processResult(results[0], config);
185
+ if (draft && doc._has_draft) {
186
+ const versions = await this.findVersions({
187
+ collection: slug,
188
+ documentId: doc.id,
189
+ limit: 1,
190
+ sort: "-createdAt"
191
+ });
192
+ if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
193
+ doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
194
+ }
195
+ }
196
+ return doc;
197
+ }
198
+ async create(args) {
199
+ const { collection: slug, data, tenantID } = args;
200
+ const config = this.getCollection(slug);
201
+ const table = this.getTable(slug);
202
+ const insertData = this.prepareData(data, config);
203
+ if (tenantID) {
204
+ insertData.tenantId = tenantID;
205
+ }
206
+ const result = await this.client.insert(table).values(insertData).returning();
207
+ return this.processResult(result[0], config);
208
+ }
209
+ async update(args) {
210
+ const { collection: slug, id, data, tenantID } = args;
211
+ const config = this.getCollection(slug);
212
+ const table = this.getTable(slug);
213
+ const updateData = this.prepareData(data, config);
214
+ if (tenantID) {
215
+ updateData.tenantId = tenantID;
216
+ }
217
+ const result = await this.client.update(table).set(updateData).where(drizzleOrm.eq(table.id, id)).returning();
218
+ return this.processResult(result[0], config);
219
+ }
220
+ async delete(args) {
221
+ const { collection: slug, id, tenantID } = args;
222
+ const config = this.getCollection(slug);
223
+ const table = this.getTable(slug);
224
+ let query = this.client.delete(table).where(drizzleOrm.eq(table.id, id)).returning();
225
+ if (tenantID) {
226
+ query = query.where(table.tenantId.equals(tenantID));
227
+ }
228
+ const result = await query;
229
+ if (result.length === 0) {
230
+ throw new Error(`Document not found: ${slug}/${id}`);
231
+ }
232
+ return this.processResult(result[0], config);
233
+ }
234
+ async count(args) {
235
+ const { collection: slug, where = {}, tenantID } = args;
236
+ const config = this.getCollection(slug);
237
+ const table = this.getTable(slug);
238
+ const filters = this.buildWhereClause(where, config, table, tenantID);
239
+ try {
240
+ const result = await this.client.select({ count: `count(*)` }).from(table).where(filters);
241
+ return parseInt(result[0]?.count || "0");
242
+ } catch {
243
+ return 0;
244
+ }
245
+ }
246
+ async findOne(args) {
247
+ const { collection: slug, where = {}, tenantID, draft } = args;
248
+ if (slug.startsWith("_globals_")) {
249
+ const globalSlug = slug.replace("_globals_", "");
250
+ const globalConfig = this.globals.get(globalSlug);
251
+ if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
252
+ const table = this.getTable(slug);
253
+ let query = this.client.select().from(table);
254
+ if (!draft) {
255
+ query = query.where(table._status.equals("published"));
256
+ }
257
+ const results = await query.limit(1);
258
+ if (results.length === 0) return null;
259
+ let doc = this.processResult(results[0], globalConfig);
260
+ if (draft && doc._has_draft) {
261
+ const versions = await this.findVersions({
262
+ collection: slug,
263
+ documentId: globalSlug,
264
+ limit: 1,
265
+ sort: "-createdAt"
266
+ });
267
+ if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
268
+ doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
269
+ }
270
+ }
271
+ return doc;
272
+ }
273
+ const result = await this.find({ ...args, limit: 1 });
274
+ return result.docs[0] || null;
275
+ }
276
+ async findVersions(args) {
277
+ await this.ensureVersionsTable();
278
+ const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;
279
+ const offset = (page - 1) * limit;
280
+ const countResult = await this.executeRaw(drizzleOrm.sql`
281
+ SELECT count(*) as count
282
+ FROM kyro_versions
283
+ WHERE collection_slug = ${slug}
284
+ AND document_id = ${documentId}
285
+ ${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
286
+ `);
287
+ const totalDocs = parseInt(countResult[0]?.count || "0");
288
+ const results = await this.executeRaw(drizzleOrm.sql`
289
+ SELECT *
290
+ FROM kyro_versions
291
+ WHERE collection_slug = ${slug}
292
+ AND document_id = ${documentId}
293
+ ${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
294
+ ORDER BY created_at DESC
295
+ LIMIT ${limit}
296
+ OFFSET ${offset}
297
+ `);
298
+ return {
299
+ docs: results.map((row) => ({
300
+ ...row,
301
+ data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
302
+ })),
303
+ ...this.calculatePagination(page, limit, totalDocs)
304
+ };
305
+ }
306
+ async findVersionByID(args) {
307
+ await this.ensureVersionsTable();
308
+ const results = await this.executeRaw(drizzleOrm.sql`
309
+ SELECT * FROM kyro_versions
310
+ WHERE id = ${args.versionId}
311
+ AND collection_slug = ${args.collection}
312
+ ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
313
+ LIMIT 1
314
+ `);
315
+ if (results.length === 0) return null;
316
+ const row = results[0];
317
+ return {
318
+ ...row,
319
+ data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
320
+ };
321
+ }
322
+ async createVersion(args) {
323
+ await this.ensureVersionsTable();
324
+ const id = Math.random().toString(36).substring(2, 15);
325
+ const now = (/* @__PURE__ */ new Date()).toISOString();
326
+ await this.executeRaw(drizzleOrm.sql`
327
+ INSERT INTO kyro_versions (
328
+ id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at
329
+ ) VALUES (
330
+ ${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
331
+ ${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null},
332
+ ${args.changeDescription || null}, ${now}, ${now}
333
+ )
334
+ `);
335
+ const config = this.getCollection(args.collection);
336
+ if (config.versions?.maxPerDoc) {
337
+ await this.deleteVersions({
338
+ collection: args.collection,
339
+ documentId: args.documentId,
340
+ keepLatest: config.versions.maxPerDoc,
341
+ tenantID: args.tenantID
342
+ });
343
+ }
344
+ return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
345
+ }
346
+ async deleteVersions(args) {
347
+ await this.ensureVersionsTable();
348
+ if (args.keepLatest) {
349
+ const toKeep = await this.executeRaw(drizzleOrm.sql`
350
+ SELECT id FROM kyro_versions
351
+ WHERE collection_slug = ${args.collection}
352
+ AND document_id = ${args.documentId}
353
+ ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
354
+ ORDER BY created_at DESC
355
+ LIMIT ${args.keepLatest}
356
+ `);
357
+ const keepIds = toKeep.map((r) => r.id);
358
+ if (keepIds.length > 0) {
359
+ await this.executeRaw(drizzleOrm.sql`
360
+ DELETE FROM kyro_versions
361
+ WHERE collection_slug = ${args.collection}
362
+ AND document_id = ${args.documentId}
363
+ AND id NOT IN (${drizzleOrm.sql.join(keepIds.map((id) => drizzleOrm.sql`${id}`), drizzleOrm.sql`, `)})
364
+ `);
365
+ }
366
+ } else {
367
+ await this.executeRaw(drizzleOrm.sql`
368
+ DELETE FROM kyro_versions
369
+ WHERE collection_slug = ${args.collection}
370
+ AND document_id = ${args.documentId}
371
+ ${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
372
+ `);
373
+ }
374
+ }
375
+ async findDraft(args) {
376
+ await this.ensureDraftsTable();
377
+ const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
378
+ const rows = await this.executeRaw(drizzleOrm.sql`
379
+ SELECT *
380
+ FROM kyro_drafts
381
+ WHERE id = ${draftId}
382
+ LIMIT 1
383
+ `);
384
+ const row = rows[0];
385
+ return row ? this.rowToDraft(row) : null;
386
+ }
387
+ async upsertDraft(args) {
388
+ await this.ensureDraftsTable();
389
+ const now = (/* @__PURE__ */ new Date()).toISOString();
390
+ const draftUpdatedAt = args.draftUpdatedAt || now;
391
+ const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
392
+ const existing = await this.findDraft(args);
393
+ if (existing) {
394
+ await this.executeRaw(drizzleOrm.sql`
395
+ UPDATE kyro_drafts
396
+ SET
397
+ data = ${JSON.stringify(args.data)},
398
+ base_updated_at = ${args.baseUpdatedAt ?? null},
399
+ draft_updated_at = ${draftUpdatedAt},
400
+ updated_at = ${now}
401
+ WHERE id = ${draftId}
402
+ `);
403
+ } else {
404
+ await this.executeRaw(drizzleOrm.sql`
405
+ INSERT INTO kyro_drafts (
406
+ id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
407
+ ) VALUES (
408
+ ${draftId},
409
+ ${args.collection},
410
+ ${args.documentId},
411
+ ${args.tenantID ?? null},
412
+ ${JSON.stringify(args.data)},
413
+ ${args.baseUpdatedAt ?? null},
414
+ ${draftUpdatedAt},
415
+ ${now},
416
+ ${now}
417
+ )
418
+ `);
419
+ }
420
+ const saved = await this.findDraft(args);
421
+ if (!saved) {
422
+ throw new Error("Failed to persist draft snapshot");
423
+ }
424
+ return saved;
425
+ }
426
+ async deleteDraft(args) {
427
+ await this.ensureDraftsTable();
428
+ const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
429
+ await this.executeRaw(drizzleOrm.sql`
430
+ DELETE FROM kyro_drafts
431
+ WHERE id = ${draftId}
432
+ `);
433
+ }
434
+ // ========================================================================
435
+ // Helper Methods
436
+ // ========================================================================
437
+ getTable(slug) {
438
+ const tableName = this.getTableName(slug);
439
+ const table = this.schema[tableName];
440
+ if (!table) {
441
+ throw new Error(`Table "${tableName}" not found in schema`);
442
+ }
443
+ return table;
444
+ }
445
+ buildWhereClause(where, config, table, tenantID) {
446
+ const conditions = [];
447
+ if (tenantID && config.tenantScoped) {
448
+ conditions.push({ tenantId: tenantID });
449
+ }
450
+ for (const [key, value] of Object.entries(where)) {
451
+ if (key === "AND" && Array.isArray(value)) {
452
+ for (const subCondition of value) {
453
+ conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));
454
+ }
455
+ } else if (key === "OR" && Array.isArray(value)) {
456
+ conditions.push(...value.flatMap(
457
+ (v) => Object.entries(v).map(([k, val]) => ({ [k]: val }))
458
+ ));
459
+ } else if (typeof value === "object" && value !== null) {
460
+ if (value.equals !== void 0) conditions.push(drizzleOrm.eq(table[key], value.equals));
461
+ if (value.not_equals !== void 0) conditions.push({ [key]: { not: value.not_equals } });
462
+ if (value.in) conditions.push({ [key]: { in: value.in } });
463
+ if (value.like) conditions.push({ [key]: { like: value.like } });
464
+ if (value.greater_than !== void 0) conditions.push({ [key]: { gt: value.greater_than } });
465
+ if (value.greater_than_equal !== void 0) conditions.push({ [key]: { gte: value.greater_than_equal } });
466
+ if (value.less_than !== void 0) conditions.push({ [key]: { lt: value.less_than } });
467
+ if (value.less_than_equal !== void 0) conditions.push({ [key]: { lte: value.less_than_equal } });
468
+ } else {
469
+ conditions.push({ [key]: value });
470
+ }
471
+ }
472
+ return conditions.length > 0 ? conditions : void 0;
473
+ }
474
+ processResult(data, config) {
475
+ if (!data) return null;
476
+ const result = { ...data };
477
+ if (data.id) {
478
+ result.id = String(data.id);
479
+ }
480
+ for (const field of config.fields) {
481
+ if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(field.type)) {
482
+ const f = field;
483
+ if (result[f.name] && typeof result[f.name] === "string") {
484
+ try {
485
+ const parsed = JSON.parse(result[f.name]);
486
+ result[f.name] = parsed;
487
+ } catch {
488
+ }
489
+ }
490
+ }
491
+ if (field.type === "tabs" && "tabs" in field && field.name) {
492
+ const tabData = {};
493
+ for (const tab of field.tabs) {
494
+ for (const tabField of tab.fields) {
495
+ if (tabField.name && result[tabField.name] !== void 0) {
496
+ let value = result[tabField.name];
497
+ if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(tabField.type)) {
498
+ if (value && typeof value === "string") {
499
+ try {
500
+ value = JSON.parse(value);
501
+ } catch {
502
+ }
503
+ }
504
+ }
505
+ tabData[tabField.name] = value;
506
+ delete result[tabField.name];
507
+ }
508
+ }
509
+ }
510
+ result[field.name] = tabData;
511
+ }
512
+ }
513
+ if (result.createdAt) {
514
+ result.createdAt = new Date(result.createdAt).toISOString();
515
+ }
516
+ if (result.updatedAt) {
517
+ result.updatedAt = new Date(result.updatedAt).toISOString();
518
+ }
519
+ return result;
520
+ }
521
+ async ensureDraftsTable() {
522
+ if (this.draftsTableReady) return;
523
+ const createTableSQL = this.dialect === "mysql" ? drizzleOrm.sql.raw(`
524
+ CREATE TABLE IF NOT EXISTS kyro_drafts (
525
+ id varchar(255) PRIMARY KEY,
526
+ collection_slug varchar(255) NOT NULL,
527
+ document_id varchar(255) NOT NULL,
528
+ tenant_id varchar(255),
529
+ data longtext NOT NULL,
530
+ base_updated_at varchar(255),
531
+ draft_updated_at varchar(255) NOT NULL,
532
+ created_at varchar(255) NOT NULL,
533
+ updated_at varchar(255) NOT NULL
534
+ )
535
+ `) : drizzleOrm.sql.raw(`
536
+ CREATE TABLE IF NOT EXISTS kyro_drafts (
537
+ id text PRIMARY KEY,
538
+ collection_slug text NOT NULL,
539
+ document_id text NOT NULL,
540
+ tenant_id text,
541
+ data text NOT NULL,
542
+ base_updated_at text,
543
+ draft_updated_at text NOT NULL,
544
+ created_at text NOT NULL,
545
+ updated_at text NOT NULL
546
+ )
547
+ `);
548
+ await this.executeRaw(createTableSQL);
549
+ this.draftsTableReady = true;
550
+ }
551
+ async ensureVersionsTable() {
552
+ if (this.versionsTableReady) return;
553
+ const createTableSQL = this.dialect === "mysql" ? drizzleOrm.sql.raw(`
554
+ CREATE TABLE IF NOT EXISTS kyro_versions (
555
+ id varchar(255) PRIMARY KEY,
556
+ collection_slug varchar(255) NOT NULL,
557
+ document_id varchar(255) NOT NULL,
558
+ tenant_id varchar(255),
559
+ data longtext NOT NULL,
560
+ status varchar(50) NOT NULL,
561
+ created_by varchar(255),
562
+ change_description text,
563
+ created_at varchar(255) NOT NULL,
564
+ updated_at varchar(255) NOT NULL
565
+ )
566
+ `) : drizzleOrm.sql.raw(`
567
+ CREATE TABLE IF NOT EXISTS kyro_versions (
568
+ id text PRIMARY KEY,
569
+ collection_slug text NOT NULL,
570
+ document_id text NOT NULL,
571
+ tenant_id text,
572
+ data text NOT NULL,
573
+ status text NOT NULL,
574
+ created_by text,
575
+ change_description text,
576
+ created_at text NOT NULL,
577
+ updated_at text NOT NULL
578
+ )
579
+ `);
580
+ await this.executeRaw(createTableSQL);
581
+ this.versionsTableReady = true;
582
+ }
583
+ getDraftId(collection, documentId, tenantID) {
584
+ return `${collection}::${documentId}::${tenantID || "global"}`;
585
+ }
586
+ async executeRaw(query) {
587
+ const result = await this.client.execute(query);
588
+ if (Array.isArray(result)) {
589
+ return result;
590
+ }
591
+ if (Array.isArray(result?.rows)) {
592
+ return result.rows;
593
+ }
594
+ if (Array.isArray(result?.[0])) {
595
+ return result[0];
596
+ }
597
+ return [];
598
+ }
599
+ rowToDraft(row) {
600
+ return {
601
+ id: String(row.id),
602
+ collection: row.collection_slug,
603
+ documentId: row.document_id,
604
+ tenantID: row.tenant_id ?? void 0,
605
+ data: row.data ? JSON.parse(row.data) : {},
606
+ baseUpdatedAt: row.base_updated_at ?? null,
607
+ draftUpdatedAt: row.draft_updated_at,
608
+ createdAt: row.created_at,
609
+ updatedAt: row.updated_at
610
+ };
611
+ }
612
+ };
613
+ function createDrizzleAdapter(options) {
614
+ return new DrizzleAdapter(options);
615
+ }
616
+
617
+ exports.DrizzleAdapter = DrizzleAdapter;
618
+ exports.collectionToDrizzleSchema = collectionToDrizzleSchema;
619
+ exports.createDrizzleAdapter = createDrizzleAdapter;
620
+ exports.fieldToDrizzleType = fieldToDrizzleType;
621
+ //# sourceMappingURL=chunk-R4C4O4SE.cjs.map
622
+ //# sourceMappingURL=chunk-R4C4O4SE.cjs.map