@kyro-cms/core 0.3.2 → 0.3.4

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