@kyro-cms/core 0.6.0 → 0.8.0

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 (145) hide show
  1. package/dist/api-handler.cjs +75 -35
  2. package/dist/api-handler.cjs.map +1 -1
  3. package/dist/api-handler.d.cts +2 -5
  4. package/dist/api-handler.d.ts +2 -5
  5. package/dist/api-handler.js +75 -36
  6. package/dist/api-handler.js.map +1 -1
  7. package/dist/bootstrap-AKAUP6F6.cjs +32 -0
  8. package/dist/{bootstrap-EE6BJZWL.cjs.map → bootstrap-AKAUP6F6.cjs.map} +1 -1
  9. package/dist/bootstrap-JCML6NFO.js +7 -0
  10. package/dist/{bootstrap-4MH44YKG.js.map → bootstrap-JCML6NFO.js.map} +1 -1
  11. package/dist/{chunk-WVPOPOEQ.cjs → chunk-2KVHZE6O.cjs} +286 -126
  12. package/dist/chunk-2KVHZE6O.cjs.map +1 -0
  13. package/dist/{chunk-RALQO47U.cjs → chunk-2OL4O2TH.cjs} +55 -2
  14. package/dist/chunk-2OL4O2TH.cjs.map +1 -0
  15. package/dist/{chunk-XU7AFF6V.js → chunk-35U3FROB.js} +982 -4
  16. package/dist/chunk-35U3FROB.js.map +1 -0
  17. package/dist/{chunk-WSCJQI2B.js → chunk-3J4MFTI3.js} +27 -11
  18. package/dist/chunk-3J4MFTI3.js.map +1 -0
  19. package/dist/chunk-3ZFYL34R.js +391 -0
  20. package/dist/chunk-3ZFYL34R.js.map +1 -0
  21. package/dist/chunk-4DA7QPLA.cjs +356 -0
  22. package/dist/chunk-4DA7QPLA.cjs.map +1 -0
  23. package/dist/{chunk-TP5YQFIX.js → chunk-57P6MJKC.js} +3 -715
  24. package/dist/chunk-57P6MJKC.js.map +1 -0
  25. package/dist/{chunk-R2YHJN6W.cjs → chunk-5KVM3WEY.cjs} +34 -208
  26. package/dist/chunk-5KVM3WEY.cjs.map +1 -0
  27. package/dist/{chunk-Z2OVHWHB.cjs → chunk-6IMPH6WV.cjs} +28 -11
  28. package/dist/chunk-6IMPH6WV.cjs.map +1 -0
  29. package/dist/{chunk-QKVA2SOG.js → chunk-DXHRBMGB.js} +27 -284
  30. package/dist/chunk-DXHRBMGB.js.map +1 -0
  31. package/dist/{chunk-E3BZLMX6.js → chunk-ES5HNFFT.js} +43 -2
  32. package/dist/chunk-ES5HNFFT.js.map +1 -0
  33. package/dist/{chunk-QYZKIPSD.js → chunk-FXYP2HA6.js} +34 -3
  34. package/dist/chunk-FXYP2HA6.js.map +1 -0
  35. package/dist/chunk-H727JIG7.js +809 -0
  36. package/dist/chunk-H727JIG7.js.map +1 -0
  37. package/dist/{chunk-AM4JKIPP.js → chunk-HXRD4B37.js} +9 -183
  38. package/dist/chunk-HXRD4B37.js.map +1 -0
  39. package/dist/chunk-I7HHI6QV.cjs +816 -0
  40. package/dist/chunk-I7HHI6QV.cjs.map +1 -0
  41. package/dist/{chunk-RDRJVCL5.cjs → chunk-IA6AU5PI.cjs} +2 -720
  42. package/dist/chunk-IA6AU5PI.cjs.map +1 -0
  43. package/dist/{chunk-55BNRTLW.cjs → chunk-LINKCEG4.cjs} +985 -4
  44. package/dist/chunk-LINKCEG4.cjs.map +1 -0
  45. package/dist/{chunk-TVVYZ2TH.js → chunk-OHVB4AJ7.js} +56 -3
  46. package/dist/chunk-OHVB4AJ7.js.map +1 -0
  47. package/dist/{chunk-XAEBVZTI.cjs → chunk-PDYFVNUX.cjs} +26 -289
  48. package/dist/chunk-PDYFVNUX.cjs.map +1 -0
  49. package/dist/{chunk-6WXQRYTW.js → chunk-QPPDLRNR.js} +286 -126
  50. package/dist/chunk-QPPDLRNR.js.map +1 -0
  51. package/dist/{chunk-WBCIEYHC.cjs → chunk-QUW2RZTM.cjs} +35 -4
  52. package/dist/chunk-QUW2RZTM.cjs.map +1 -0
  53. package/dist/chunk-SA7NSSIQ.cjs +397 -0
  54. package/dist/chunk-SA7NSSIQ.cjs.map +1 -0
  55. package/dist/{chunk-H4XCAPA6.cjs → chunk-V3LKPM3O.cjs} +43 -2
  56. package/dist/chunk-V3LKPM3O.cjs.map +1 -0
  57. package/dist/chunk-Y3N7UUDO.js +349 -0
  58. package/dist/chunk-Y3N7UUDO.js.map +1 -0
  59. package/dist/{chunk-S3FG2NY7.js → chunk-Y3QQN7PN.js} +4 -3
  60. package/dist/chunk-Y3QQN7PN.js.map +1 -0
  61. package/dist/{chunk-5HA5OMFH.cjs → chunk-YVUJBEXE.cjs} +7 -6
  62. package/dist/chunk-YVUJBEXE.cjs.map +1 -0
  63. package/dist/cli/index.cjs +103 -20
  64. package/dist/cli/index.cjs.map +1 -1
  65. package/dist/cli/index.js +103 -20
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/client.d.cts +1 -1
  68. package/dist/client.d.ts +1 -1
  69. package/dist/drizzle/index.cjs +12 -12
  70. package/dist/drizzle/index.d.cts +23 -2
  71. package/dist/drizzle/index.d.ts +23 -2
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/index.cjs +174 -1054
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +85 -7
  76. package/dist/index.d.ts +85 -7
  77. package/dist/index.js +91 -980
  78. package/dist/index.js.map +1 -1
  79. package/dist/integration.cjs +2 -2
  80. package/dist/integration.d.cts +3 -16
  81. package/dist/integration.d.ts +3 -16
  82. package/dist/integration.js +1 -1
  83. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +17 -0
  84. package/dist/mongo-auth-adapter-NHHUJHVH.cjs.map +1 -0
  85. package/dist/mongo-auth-adapter-NJQUUCTP.js +4 -0
  86. package/dist/mongo-auth-adapter-NJQUUCTP.js.map +1 -0
  87. package/dist/mongodb/index.cjs +9 -8
  88. package/dist/mongodb/index.d.cts +86 -5
  89. package/dist/mongodb/index.d.ts +86 -5
  90. package/dist/mongodb/index.js +3 -2
  91. package/dist/postgres-auth-adapter-3T2NKTSE.js +5 -0
  92. package/dist/{postgres-auth-adapter-B65BULNS.js.map → postgres-auth-adapter-3T2NKTSE.js.map} +1 -1
  93. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +14 -0
  94. package/dist/{postgres-auth-adapter-6742WDCF.cjs.map → postgres-auth-adapter-7IEENCKQ.cjs.map} +1 -1
  95. package/dist/redis-adapter-D2E2S3GB.cjs +13 -0
  96. package/dist/{redis-adapter-LPUWLE4Y.cjs.map → redis-adapter-D2E2S3GB.cjs.map} +1 -1
  97. package/dist/redis-adapter-VQXD7ESY.js +4 -0
  98. package/dist/{redis-adapter-THYDCGQR.js.map → redis-adapter-VQXD7ESY.js.map} +1 -1
  99. package/dist/rest/index.cjs +10 -8
  100. package/dist/rest/index.js +8 -6
  101. package/dist/sqlite-adapter-LVK5PS4T.cjs +13 -0
  102. package/dist/sqlite-adapter-LVK5PS4T.cjs.map +1 -0
  103. package/dist/sqlite-adapter-TR3U3W6Q.js +4 -0
  104. package/dist/sqlite-adapter-TR3U3W6Q.js.map +1 -0
  105. package/dist/templates/index.cjs +31 -27
  106. package/dist/templates/index.d.cts +8 -5
  107. package/dist/templates/index.d.ts +8 -5
  108. package/dist/templates/index.js +1 -1
  109. package/dist/{base-eVegJ_Pr.d.ts → tenant-B1YB0Jy8.d.ts} +10 -1
  110. package/dist/{base-DvvNqnM-.d.cts → tenant-Cpeveji6.d.cts} +10 -1
  111. package/dist/{types-DqN4ckOC.d.cts → types-D6ZLRGbH.d.cts} +19 -1
  112. package/dist/{types-DqN4ckOC.d.ts → types-D6ZLRGbH.d.ts} +19 -1
  113. package/package.json +56 -9
  114. package/dist/adapter-BSvBudTG.d.cts +0 -65
  115. package/dist/adapter-CXGB2Elb.d.ts +0 -65
  116. package/dist/bootstrap-4MH44YKG.js +0 -6
  117. package/dist/bootstrap-EE6BJZWL.cjs +0 -31
  118. package/dist/chunk-55BNRTLW.cjs.map +0 -1
  119. package/dist/chunk-5HA5OMFH.cjs.map +0 -1
  120. package/dist/chunk-6WXQRYTW.js.map +0 -1
  121. package/dist/chunk-A4USRVTQ.js +0 -115
  122. package/dist/chunk-A4USRVTQ.js.map +0 -1
  123. package/dist/chunk-AM4JKIPP.js.map +0 -1
  124. package/dist/chunk-E3BZLMX6.js.map +0 -1
  125. package/dist/chunk-H4XCAPA6.cjs.map +0 -1
  126. package/dist/chunk-KOCTZKPV.cjs +0 -117
  127. package/dist/chunk-KOCTZKPV.cjs.map +0 -1
  128. package/dist/chunk-QKVA2SOG.js.map +0 -1
  129. package/dist/chunk-QYZKIPSD.js.map +0 -1
  130. package/dist/chunk-R2YHJN6W.cjs.map +0 -1
  131. package/dist/chunk-RALQO47U.cjs.map +0 -1
  132. package/dist/chunk-RDRJVCL5.cjs.map +0 -1
  133. package/dist/chunk-S3FG2NY7.js.map +0 -1
  134. package/dist/chunk-TP5YQFIX.js.map +0 -1
  135. package/dist/chunk-TVVYZ2TH.js.map +0 -1
  136. package/dist/chunk-WBCIEYHC.cjs.map +0 -1
  137. package/dist/chunk-WSCJQI2B.js.map +0 -1
  138. package/dist/chunk-WVPOPOEQ.cjs.map +0 -1
  139. package/dist/chunk-XAEBVZTI.cjs.map +0 -1
  140. package/dist/chunk-XU7AFF6V.js.map +0 -1
  141. package/dist/chunk-Z2OVHWHB.cjs.map +0 -1
  142. package/dist/postgres-auth-adapter-6742WDCF.cjs +0 -14
  143. package/dist/postgres-auth-adapter-B65BULNS.js +0 -5
  144. package/dist/redis-adapter-LPUWLE4Y.cjs +0 -13
  145. package/dist/redis-adapter-THYDCGQR.js +0 -4
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkKOCTZKPV_cjs = require('./chunk-KOCTZKPV.cjs');
3
+ var chunkSA7NSSIQ_cjs = require('./chunk-SA7NSSIQ.cjs');
4
4
  var drizzleOrm = require('drizzle-orm');
5
5
  var pgCore = require('drizzle-orm/pg-core');
6
+ var sqliteCore = require('drizzle-orm/sqlite-core');
6
7
  var postgresJs = require('drizzle-orm/postgres-js');
7
8
  var postgres = require('postgres');
8
9
  var crypto = require('crypto');
@@ -85,13 +86,20 @@ function collectionToDrizzleSchema(collection, dialect = "postgres") {
85
86
  lines.push("});");
86
87
  return lines.join("\n");
87
88
  }
88
- var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
89
+ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
89
90
  client;
90
91
  schema;
91
92
  dialect;
92
93
  connectionString;
93
94
  draftsTableReady = false;
94
95
  versionsTableReady = false;
96
+ tenantContext;
97
+ setTenantContext(context) {
98
+ this.tenantContext = context;
99
+ }
100
+ getTenantContext() {
101
+ return this.tenantContext;
102
+ }
95
103
  constructor(options) {
96
104
  super();
97
105
  this.schema = options.schema || {};
@@ -100,8 +108,10 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
100
108
  const connStr = options.connectionString.toLowerCase();
101
109
  if (connStr.startsWith("postgres://") || connStr.startsWith("postgresql://")) {
102
110
  this.dialect = "postgres";
103
- } else {
111
+ } else if (connStr.includes(".db") || connStr.includes("sqlite") || connStr.includes("file:")) {
104
112
  this.dialect = "sqlite";
113
+ } else {
114
+ this.dialect = options.type || "postgres";
105
115
  }
106
116
  } else {
107
117
  this.client = options.client;
@@ -117,7 +127,7 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
117
127
  result.updatedAt = new Date(result.updatedAt);
118
128
  }
119
129
  for (const field of config.fields) {
120
- const dbType = fieldToDrizzleType(field, "postgres");
130
+ const dbType = fieldToDrizzleType(field, this.dialect);
121
131
  const isJsonb = dbType === "jsonb";
122
132
  if (field.type === "tabs" && "tabs" in field && field.name) {
123
133
  const tabData = data[field.name];
@@ -148,18 +158,28 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
148
158
  }
149
159
  async connect() {
150
160
  if (this.connectionString && !this.client) {
151
- const { default: postgres2 } = await import('postgres');
152
- const { drizzle: drizzle2 } = await import('drizzle-orm/postgres-js');
153
- const sql2 = postgres2(this.connectionString, { onnotice: () => {
154
- } });
155
- this.client = drizzle2(sql2, { schema: this.schema });
161
+ if (this.dialect === "postgres") {
162
+ const { default: postgres2 } = await import('postgres');
163
+ const { drizzle: drizzle2 } = await import('drizzle-orm/postgres-js');
164
+ const sql2 = postgres2(this.connectionString, { onnotice: () => {
165
+ } });
166
+ this.client = drizzle2(sql2, { schema: this.schema });
167
+ } else if (this.dialect === "sqlite") {
168
+ const { default: betterSqlite3 } = await import('better-sqlite3');
169
+ const { drizzle: drizzle2 } = await import('drizzle-orm/better-sqlite3');
170
+ const db = new betterSqlite3(this.connectionString.replace("file:", ""));
171
+ this.client = drizzle2(db, { schema: this.schema });
172
+ }
156
173
  }
157
174
  this.connected = true;
158
175
  console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);
159
176
  }
160
177
  async init(collections, globals = []) {
161
178
  await super.init(collections, globals);
162
- if (this.dialect === "postgres" && this.client && !_schemaEnsured) {
179
+ if (this.connectionString && !this.client) {
180
+ await this.connect();
181
+ }
182
+ if (this.client && !_schemaEnsured) {
163
183
  for (const config of collections) {
164
184
  const tableName = this.getTableName(config.slug);
165
185
  if (!this.schema[tableName]) {
@@ -192,91 +212,168 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
192
212
  };
193
213
  for (const field of config.fields) {
194
214
  if (!field.name || field.name === "id") continue;
195
- const dbType = fieldToDrizzleType(field, "postgres");
215
+ const dbType = fieldToDrizzleType(field, this.dialect);
196
216
  const propName = field.name.replace(/-/g, "_");
197
217
  const sqlName = propName.replace(/([A-Z])/g, "_$1").toLowerCase();
198
218
  let col;
199
- switch (dbType) {
200
- case "varchar":
201
- col = pgCore.varchar(sqlName, { length: 255 });
202
- break;
203
- case "integer":
204
- col = pgCore.integer(sqlName);
205
- break;
206
- case "decimal":
207
- col = pgCore.decimal(sqlName);
208
- break;
209
- case "boolean":
210
- col = pgCore.boolean(sqlName);
211
- break;
212
- case "timestamp":
213
- col = pgCore.timestamp(sqlName);
214
- break;
215
- case "jsonb":
216
- col = pgCore.jsonb(sqlName);
217
- break;
218
- default:
219
- col = pgCore.text(sqlName);
219
+ if (this.dialect === "sqlite") {
220
+ switch (dbType) {
221
+ case "varchar":
222
+ case "text":
223
+ col = sqliteCore.text(sqlName);
224
+ break;
225
+ case "integer":
226
+ col = sqliteCore.integer(sqlName);
227
+ break;
228
+ case "decimal":
229
+ case "numeric":
230
+ col = sqliteCore.numeric(sqlName);
231
+ break;
232
+ case "boolean":
233
+ col = sqliteCore.integer(sqlName, { mode: "boolean" });
234
+ break;
235
+ case "timestamp":
236
+ col = sqliteCore.text(sqlName);
237
+ break;
238
+ case "jsonb":
239
+ col = sqliteCore.text(sqlName);
240
+ break;
241
+ default:
242
+ col = sqliteCore.text(sqlName);
243
+ }
244
+ } else {
245
+ switch (dbType) {
246
+ case "varchar":
247
+ col = pgCore.varchar(sqlName, { length: 255 });
248
+ break;
249
+ case "integer":
250
+ col = pgCore.integer(sqlName);
251
+ break;
252
+ case "decimal":
253
+ col = pgCore.decimal(sqlName);
254
+ break;
255
+ case "boolean":
256
+ col = pgCore.boolean(sqlName);
257
+ break;
258
+ case "timestamp":
259
+ col = pgCore.timestamp(sqlName);
260
+ break;
261
+ case "jsonb":
262
+ col = pgCore.jsonb(sqlName);
263
+ break;
264
+ default:
265
+ col = pgCore.text(sqlName);
266
+ }
220
267
  }
221
268
  if (!field.required) col = col.default(null);
222
269
  columns[propName] = col;
223
270
  }
224
- if (!columns.createdAt) columns.createdAt = pgCore.timestamp("created_at").defaultNow();
225
- if (!columns.updatedAt) columns.updatedAt = pgCore.timestamp("updated_at").defaultNow();
226
- columns._status = pgCore.varchar("_status", { length: 20 }).default("published");
227
- columns._has_draft = pgCore.boolean("_has_draft").default(false);
228
- return pgCore.pgTable(tableName, columns);
271
+ if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? sqliteCore.text("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("created_at").defaultNow();
272
+ if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? sqliteCore.text("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("updated_at").defaultNow();
273
+ columns._status = this.dialect === "sqlite" ? sqliteCore.text("_status").default("published") : pgCore.varchar("_status", { length: 20 }).default("published");
274
+ columns._has_draft = this.dialect === "sqlite" ? sqliteCore.integer("_has_draft", { mode: "boolean" }).default(false) : pgCore.boolean("_has_draft").default(false);
275
+ return this.dialect === "sqlite" ? sqliteCore.sqliteTable(tableName, columns) : pgCore.pgTable(tableName, columns);
229
276
  }
230
277
  async ensureCollectionTables(collections) {
278
+ const statements = [];
231
279
  for (const config of collections) {
232
280
  const isGlobal = config.slug.startsWith("_globals_");
233
281
  const tableName = this.getTableName(config.slug);
234
- const tableIdent = drizzleOrm.sql.identifier(tableName);
235
282
  const colDefs = this.generateCreateColumns(config);
236
283
  const hasCreated = config.fields.some((f) => f.name === "createdAt");
237
284
  const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
238
- const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
239
- await this.client.execute(drizzleOrm.sql`
240
- CREATE TABLE IF NOT EXISTS ${tableIdent} (
241
- ${drizzleOrm.sql.raw(idCol)},
242
- ${drizzleOrm.sql.raw(colDefs)}
243
- ${hasCreated ? drizzleOrm.sql.raw("") : drizzleOrm.sql.raw('"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),')}
244
- ${hasUpdated ? drizzleOrm.sql.raw("") : drizzleOrm.sql.raw('"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),')}
245
- "_status" VARCHAR(20) DEFAULT 'published',
246
- "_has_draft" BOOLEAN DEFAULT false
247
- )
248
- `);
285
+ if (this.dialect === "postgres") {
286
+ const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
287
+ statements.push(`
288
+ CREATE TABLE IF NOT EXISTS "${tableName}" (
289
+ ${idCol},
290
+ ${colDefs}
291
+ ${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
292
+ ${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
293
+ "_status" VARCHAR(20) DEFAULT 'published',
294
+ "_has_draft" BOOLEAN DEFAULT false
295
+ )
296
+ `);
297
+ } else {
298
+ const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" TEXT PRIMARY KEY';
299
+ statements.push(`
300
+ CREATE TABLE IF NOT EXISTS "${tableName}" (
301
+ ${idCol},
302
+ ${colDefs}
303
+ ${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
304
+ ${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
305
+ "_status" TEXT DEFAULT 'published',
306
+ "_has_draft" INTEGER DEFAULT 0
307
+ )
308
+ `);
309
+ }
310
+ }
311
+ if (statements.length > 0) {
312
+ if (this.dialect === "postgres") {
313
+ await this.client.execute(drizzleOrm.sql.raw(statements.join(";\n")));
314
+ } else {
315
+ for (const stmt of statements) {
316
+ await this.client.execute(drizzleOrm.sql.raw(stmt));
317
+ }
318
+ }
249
319
  }
250
320
  }
251
321
  generateCreateColumns(config) {
252
322
  const cols = [];
253
323
  for (const field of config.fields) {
254
324
  if (!field.name || field.name === "id") continue;
255
- const dbType = fieldToDrizzleType(field, "postgres");
325
+ const dbType = fieldToDrizzleType(field, this.dialect);
256
326
  const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
257
327
  const nullable = field.required ? "NOT NULL" : "DEFAULT NULL";
258
328
  let sqlType;
259
- switch (dbType) {
260
- case "varchar":
261
- sqlType = `VARCHAR(255) ${nullable}`;
262
- break;
263
- case "integer":
264
- sqlType = `INTEGER ${nullable}`;
265
- break;
266
- case "decimal":
267
- sqlType = `DECIMAL ${nullable}`;
268
- break;
269
- case "boolean":
270
- sqlType = `BOOLEAN ${nullable}`;
271
- break;
272
- case "timestamp":
273
- sqlType = `TIMESTAMP ${nullable}`;
274
- break;
275
- case "jsonb":
276
- sqlType = `JSONB ${nullable}`;
277
- break;
278
- default:
279
- sqlType = `TEXT ${nullable}`;
329
+ if (this.dialect === "sqlite") {
330
+ switch (dbType) {
331
+ case "varchar":
332
+ case "text":
333
+ sqlType = `TEXT ${nullable}`;
334
+ break;
335
+ case "integer":
336
+ sqlType = `INTEGER ${nullable}`;
337
+ break;
338
+ case "decimal":
339
+ case "numeric":
340
+ sqlType = `NUMERIC ${nullable}`;
341
+ break;
342
+ case "boolean":
343
+ sqlType = `INTEGER ${nullable}`;
344
+ break;
345
+ case "timestamp":
346
+ sqlType = `TEXT ${nullable}`;
347
+ break;
348
+ case "jsonb":
349
+ sqlType = `TEXT ${nullable}`;
350
+ break;
351
+ default:
352
+ sqlType = `TEXT ${nullable}`;
353
+ }
354
+ } else {
355
+ switch (dbType) {
356
+ case "varchar":
357
+ sqlType = `VARCHAR(255) ${nullable}`;
358
+ break;
359
+ case "integer":
360
+ sqlType = `INTEGER ${nullable}`;
361
+ break;
362
+ case "decimal":
363
+ sqlType = `DECIMAL ${nullable}`;
364
+ break;
365
+ case "boolean":
366
+ sqlType = `BOOLEAN ${nullable}`;
367
+ break;
368
+ case "timestamp":
369
+ sqlType = `TIMESTAMP ${nullable}`;
370
+ break;
371
+ case "jsonb":
372
+ sqlType = `JSONB ${nullable}`;
373
+ break;
374
+ default:
375
+ sqlType = `TEXT ${nullable}`;
376
+ }
280
377
  }
281
378
  cols.push(`"${sqlName}" ${sqlType}`);
282
379
  }
@@ -290,22 +387,34 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
290
387
  const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
291
388
  const config = this.getCollection(slug);
292
389
  const table = this.getTable(slug);
293
- const filters = this.buildWhereClause(where, config, table, tenantID) || [];
390
+ let effectiveWhere = { ...where };
391
+ if (this.tenantContext && config.tenantScoped) {
392
+ const rlsQuery = chunkSA7NSSIQ_cjs.applyRLS({ where: effectiveWhere }, slug, this.tenantContext, chunkSA7NSSIQ_cjs.DEFAULT_RLS_CONFIG);
393
+ effectiveWhere = rlsQuery.where || {};
394
+ }
395
+ const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
294
396
  if (!draft && table._status) {
295
397
  filters.push(drizzleOrm.eq(table._status, "published"));
296
398
  }
297
399
  const sortOption = this.parseSort(sort);
298
- const totalDocs = await this.count({ collection: slug, where: { ...where, _status: draft ? void 0 : "published" }, tenantID });
400
+ const totalDocs = await this.count({ collection: slug, where: effectiveWhere, tenantID });
299
401
  const offset = (page - 1) * limit;
300
402
  let results = [];
301
403
  try {
302
404
  const sortCol = table[sortOption.field] || table.createdAt || table.id;
303
405
  const sorted = sortOption.direction === "asc" ? sortCol : drizzleOrm.desc(sortCol);
304
- results = await this.client.select().from(table).where(filters).orderBy(sorted).limit(limit).offset(offset);
406
+ let query = this.client.select().from(table);
407
+ if (filters.length > 0) {
408
+ query = query.where(drizzleOrm.and(...filters));
409
+ }
410
+ results = await query.orderBy(sorted).limit(limit).offset(offset);
305
411
  } catch (error) {
306
412
  console.error(`[DrizzleAdapter] Query error:`, error);
307
413
  }
308
414
  let docs = results.map((doc) => this.processResult(doc, config));
415
+ if (this.tenantContext && !this.tenantContext.isSuperAdmin) {
416
+ docs = docs.filter((doc) => chunkSA7NSSIQ_cjs.canAccessDocument(doc, slug, this.tenantContext, chunkSA7NSSIQ_cjs.DEFAULT_RLS_CONFIG));
417
+ }
309
418
  if (draft) {
310
419
  docs = await Promise.all(docs.map(async (doc) => {
311
420
  if (doc._has_draft) {
@@ -331,6 +440,12 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
331
440
  const { collection: slug, id, tenantID, draft } = args;
332
441
  const config = this.getCollection(slug);
333
442
  const table = this.getTable(slug);
443
+ if (this.tenantContext && config.tenantScoped) {
444
+ const tempDoc = { id, tenantId: this.tenantContext.tenantId };
445
+ if (!chunkSA7NSSIQ_cjs.canAccessDocument(tempDoc, slug, this.tenantContext, chunkSA7NSSIQ_cjs.DEFAULT_RLS_CONFIG)) {
446
+ return null;
447
+ }
448
+ }
334
449
  const conditions = [drizzleOrm.eq(table.id, id)];
335
450
  if (tenantID && table.tenantId) conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
336
451
  if (!draft && table._status) conditions.push(drizzleOrm.eq(table._status, "published"));
@@ -393,8 +508,12 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
393
508
  const table = this.getTable(slug);
394
509
  const filters = this.buildWhereClause(where, config, table, tenantID);
395
510
  try {
396
- const result = await this.client.select({ count: `count(*)` }).from(table).where(filters || void 0);
397
- return parseInt(result[0]?.count || "0");
511
+ let query = this.client.select({ count: drizzleOrm.sql`count(*)` }).from(table);
512
+ if (filters.length > 0) {
513
+ query = query.where(drizzleOrm.and(...filters));
514
+ }
515
+ const result = await query;
516
+ return Number(result[0]?.count || 0);
398
517
  } catch {
399
518
  return 0;
400
519
  }
@@ -600,32 +719,38 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
600
719
  }
601
720
  buildWhereClause(where, config, table, tenantID) {
602
721
  const conditions = [];
603
- if (tenantID && config.tenantScoped) {
604
- conditions.push({ tenantId: tenantID });
722
+ if (tenantID && config.tenantScoped && table.tenantId) {
723
+ conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
605
724
  }
606
725
  for (const [key, value] of Object.entries(where)) {
607
726
  if (key === "AND" && Array.isArray(value)) {
608
- for (const subCondition of value) {
609
- conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));
727
+ const andConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
728
+ if (andConditions.length > 0) {
729
+ conditions.push(drizzleOrm.and(...andConditions));
610
730
  }
611
731
  } else if (key === "OR" && Array.isArray(value)) {
612
- conditions.push(...value.flatMap(
613
- (v) => Object.entries(v).map(([k, val]) => ({ [k]: val }))
614
- ));
615
- } else if (typeof value === "object" && value !== null) {
616
- if (value.equals !== void 0) conditions.push(drizzleOrm.eq(table[key], value.equals));
617
- if (value.not_equals !== void 0) conditions.push({ [key]: { not: value.not_equals } });
618
- if (value.in) conditions.push({ [key]: { in: value.in } });
619
- if (value.like) conditions.push({ [key]: { like: value.like } });
620
- if (value.greater_than !== void 0) conditions.push({ [key]: { gt: value.greater_than } });
621
- if (value.greater_than_equal !== void 0) conditions.push({ [key]: { gte: value.greater_than_equal } });
622
- if (value.less_than !== void 0) conditions.push({ [key]: { lt: value.less_than } });
623
- if (value.less_than_equal !== void 0) conditions.push({ [key]: { lte: value.less_than_equal } });
732
+ const orConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
733
+ if (orConditions.length > 0) {
734
+ conditions.push(drizzleOrm.or(...orConditions));
735
+ }
736
+ } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
737
+ const col = table[key];
738
+ if (!col) continue;
739
+ if (value.equals !== void 0) conditions.push(drizzleOrm.eq(col, value.equals));
740
+ if (value.not_equals !== void 0) conditions.push(drizzleOrm.ne(col, value.not_equals));
741
+ if (value.in && Array.isArray(value.in)) conditions.push(drizzleOrm.inArray(col, value.in));
742
+ if (value.like !== void 0) conditions.push(drizzleOrm.like(col, value.like));
743
+ if (value.contains !== void 0) conditions.push(drizzleOrm.like(col, `%${value.contains}%`));
744
+ if (value.greater_than !== void 0) conditions.push(drizzleOrm.gt(col, value.greater_than));
745
+ if (value.greater_than_equal !== void 0) conditions.push(drizzleOrm.gte(col, value.greater_than_equal));
746
+ if (value.less_than !== void 0) conditions.push(drizzleOrm.lt(col, value.less_than));
747
+ if (value.less_than_equal !== void 0) conditions.push(drizzleOrm.lte(col, value.less_than_equal));
624
748
  } else {
625
- conditions.push({ [key]: value });
749
+ const col = table[key];
750
+ if (col) conditions.push(drizzleOrm.eq(col, value));
626
751
  }
627
752
  }
628
- return conditions.length > 0 ? conditions : void 0;
753
+ return conditions;
629
754
  }
630
755
  processResult(data, config) {
631
756
  if (!data) return null;
@@ -697,39 +822,74 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
697
822
  }
698
823
  async ensureDraftsTable() {
699
824
  if (_schemaEnsured || this.draftsTableReady) return;
700
- const createTableSQL = drizzleOrm.sql.raw(`
701
- CREATE TABLE IF NOT EXISTS kyro_drafts (
702
- id text PRIMARY KEY,
703
- collection_slug text NOT NULL,
704
- document_id text NOT NULL,
705
- tenant_id text,
706
- data text NOT NULL,
707
- base_updated_at text,
708
- draft_updated_at text NOT NULL,
709
- created_at text NOT NULL,
710
- updated_at text NOT NULL
711
- )
712
- `);
713
- await this.executeRaw(createTableSQL);
825
+ let createTableSQL;
826
+ if (this.dialect === "sqlite") {
827
+ createTableSQL = `
828
+ CREATE TABLE IF NOT EXISTS kyro_drafts (
829
+ id text PRIMARY KEY,
830
+ collection_slug text NOT NULL,
831
+ document_id text NOT NULL,
832
+ tenant_id text,
833
+ data text NOT NULL,
834
+ base_updated_at text,
835
+ draft_updated_at text NOT NULL,
836
+ created_at text DEFAULT (datetime('now')),
837
+ updated_at text DEFAULT (datetime('now'))
838
+ )
839
+ `;
840
+ } else {
841
+ createTableSQL = `
842
+ CREATE TABLE IF NOT EXISTS kyro_drafts (
843
+ id text PRIMARY KEY,
844
+ collection_slug text NOT NULL,
845
+ document_id text NOT NULL,
846
+ tenant_id text,
847
+ data text NOT NULL,
848
+ base_updated_at text,
849
+ draft_updated_at text NOT NULL,
850
+ created_at text NOT NULL,
851
+ updated_at text NOT NULL
852
+ )
853
+ `;
854
+ }
855
+ await this.executeRaw(drizzleOrm.sql.raw(createTableSQL));
714
856
  this.draftsTableReady = true;
715
857
  }
716
858
  async ensureVersionsTable() {
717
859
  if (_schemaEnsured || this.versionsTableReady) return;
718
- const createTableSQL = drizzleOrm.sql.raw(`
719
- CREATE TABLE IF NOT EXISTS kyro_versions (
720
- id text PRIMARY KEY,
721
- collection_slug text NOT NULL,
722
- document_id text NOT NULL,
723
- tenant_id text,
724
- data text NOT NULL,
725
- status text NOT NULL,
726
- created_by text,
727
- change_description text,
728
- created_at text NOT NULL,
729
- updated_at text NOT NULL
730
- )
731
- `);
732
- await this.executeRaw(createTableSQL);
860
+ let createTableSQL;
861
+ if (this.dialect === "sqlite") {
862
+ createTableSQL = `
863
+ CREATE TABLE IF NOT EXISTS kyro_versions (
864
+ id text PRIMARY KEY,
865
+ collection_slug text NOT NULL,
866
+ document_id text NOT NULL,
867
+ tenant_id text,
868
+ data text NOT NULL,
869
+ status text NOT NULL DEFAULT 'draft',
870
+ created_by text,
871
+ change_description text,
872
+ created_at text DEFAULT (datetime('now')),
873
+ updated_at text DEFAULT (datetime('now'))
874
+ )
875
+ `;
876
+ } else {
877
+ createTableSQL = `
878
+ CREATE TABLE IF NOT EXISTS kyro_versions (
879
+ id text PRIMARY KEY,
880
+ collection_slug text NOT NULL,
881
+ document_id text NOT NULL,
882
+ tenant_id text,
883
+ data text NOT NULL,
884
+ status text NOT NULL,
885
+ created_by text,
886
+ change_description text,
887
+ created_at text NOT NULL,
888
+ updated_at text NOT NULL
889
+ )
890
+ `;
891
+ }
892
+ await this.executeRaw(drizzleOrm.sql.raw(createTableSQL));
733
893
  this.versionsTableReady = true;
734
894
  }
735
895
  getDraftId(collection, documentId, tenantID) {
@@ -765,7 +925,7 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
765
925
  function createDrizzleAdapter(options) {
766
926
  return new DrizzleAdapter(options);
767
927
  }
768
- var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-WVPOPOEQ.cjs', document.baseURI).href)));
928
+ var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-2KVHZE6O.cjs', document.baseURI).href)));
769
929
  var modPath = "node:sqlite";
770
930
  var { DatabaseSync } = _require(modPath);
771
931
  function getDialect() {
@@ -821,5 +981,5 @@ exports.fieldToDrizzleType = fieldToDrizzleType;
821
981
  exports.genId = genId;
822
982
  exports.runMigrations = runMigrations;
823
983
  exports.seedDefaultRoles = seedDefaultRoles;
824
- //# sourceMappingURL=chunk-WVPOPOEQ.cjs.map
825
- //# sourceMappingURL=chunk-WVPOPOEQ.cjs.map
984
+ //# sourceMappingURL=chunk-2KVHZE6O.cjs.map
985
+ //# sourceMappingURL=chunk-2KVHZE6O.cjs.map