@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.
- package/dist/api-handler.cjs +75 -35
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +2 -5
- package/dist/api-handler.d.ts +2 -5
- package/dist/api-handler.js +75 -36
- package/dist/api-handler.js.map +1 -1
- package/dist/bootstrap-AKAUP6F6.cjs +32 -0
- package/dist/{bootstrap-EE6BJZWL.cjs.map → bootstrap-AKAUP6F6.cjs.map} +1 -1
- package/dist/bootstrap-JCML6NFO.js +7 -0
- package/dist/{bootstrap-4MH44YKG.js.map → bootstrap-JCML6NFO.js.map} +1 -1
- package/dist/{chunk-WVPOPOEQ.cjs → chunk-2KVHZE6O.cjs} +286 -126
- package/dist/chunk-2KVHZE6O.cjs.map +1 -0
- package/dist/{chunk-RALQO47U.cjs → chunk-2OL4O2TH.cjs} +55 -2
- package/dist/chunk-2OL4O2TH.cjs.map +1 -0
- package/dist/{chunk-XU7AFF6V.js → chunk-35U3FROB.js} +982 -4
- package/dist/chunk-35U3FROB.js.map +1 -0
- package/dist/{chunk-WSCJQI2B.js → chunk-3J4MFTI3.js} +27 -11
- package/dist/chunk-3J4MFTI3.js.map +1 -0
- package/dist/chunk-3ZFYL34R.js +391 -0
- package/dist/chunk-3ZFYL34R.js.map +1 -0
- package/dist/chunk-4DA7QPLA.cjs +356 -0
- package/dist/chunk-4DA7QPLA.cjs.map +1 -0
- package/dist/{chunk-TP5YQFIX.js → chunk-57P6MJKC.js} +3 -715
- package/dist/chunk-57P6MJKC.js.map +1 -0
- package/dist/{chunk-R2YHJN6W.cjs → chunk-5KVM3WEY.cjs} +34 -208
- package/dist/chunk-5KVM3WEY.cjs.map +1 -0
- package/dist/{chunk-Z2OVHWHB.cjs → chunk-6IMPH6WV.cjs} +28 -11
- package/dist/chunk-6IMPH6WV.cjs.map +1 -0
- package/dist/{chunk-QKVA2SOG.js → chunk-DXHRBMGB.js} +27 -284
- package/dist/chunk-DXHRBMGB.js.map +1 -0
- package/dist/{chunk-E3BZLMX6.js → chunk-ES5HNFFT.js} +43 -2
- package/dist/chunk-ES5HNFFT.js.map +1 -0
- package/dist/{chunk-QYZKIPSD.js → chunk-FXYP2HA6.js} +34 -3
- package/dist/chunk-FXYP2HA6.js.map +1 -0
- package/dist/chunk-H727JIG7.js +809 -0
- package/dist/chunk-H727JIG7.js.map +1 -0
- package/dist/{chunk-AM4JKIPP.js → chunk-HXRD4B37.js} +9 -183
- package/dist/chunk-HXRD4B37.js.map +1 -0
- package/dist/chunk-I7HHI6QV.cjs +816 -0
- package/dist/chunk-I7HHI6QV.cjs.map +1 -0
- package/dist/{chunk-RDRJVCL5.cjs → chunk-IA6AU5PI.cjs} +2 -720
- package/dist/chunk-IA6AU5PI.cjs.map +1 -0
- package/dist/{chunk-55BNRTLW.cjs → chunk-LINKCEG4.cjs} +985 -4
- package/dist/chunk-LINKCEG4.cjs.map +1 -0
- package/dist/{chunk-TVVYZ2TH.js → chunk-OHVB4AJ7.js} +56 -3
- package/dist/chunk-OHVB4AJ7.js.map +1 -0
- package/dist/{chunk-XAEBVZTI.cjs → chunk-PDYFVNUX.cjs} +26 -289
- package/dist/chunk-PDYFVNUX.cjs.map +1 -0
- package/dist/{chunk-6WXQRYTW.js → chunk-QPPDLRNR.js} +286 -126
- package/dist/chunk-QPPDLRNR.js.map +1 -0
- package/dist/{chunk-WBCIEYHC.cjs → chunk-QUW2RZTM.cjs} +35 -4
- package/dist/chunk-QUW2RZTM.cjs.map +1 -0
- package/dist/chunk-SA7NSSIQ.cjs +397 -0
- package/dist/chunk-SA7NSSIQ.cjs.map +1 -0
- package/dist/{chunk-H4XCAPA6.cjs → chunk-V3LKPM3O.cjs} +43 -2
- package/dist/chunk-V3LKPM3O.cjs.map +1 -0
- package/dist/chunk-Y3N7UUDO.js +349 -0
- package/dist/chunk-Y3N7UUDO.js.map +1 -0
- package/dist/{chunk-S3FG2NY7.js → chunk-Y3QQN7PN.js} +4 -3
- package/dist/chunk-Y3QQN7PN.js.map +1 -0
- package/dist/{chunk-5HA5OMFH.cjs → chunk-YVUJBEXE.cjs} +7 -6
- package/dist/chunk-YVUJBEXE.cjs.map +1 -0
- package/dist/cli/index.cjs +103 -20
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +103 -20
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.cts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/drizzle/index.cjs +12 -12
- package/dist/drizzle/index.d.cts +23 -2
- package/dist/drizzle/index.d.ts +23 -2
- package/dist/drizzle/index.js +3 -3
- package/dist/index.cjs +174 -1054
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +85 -7
- package/dist/index.d.ts +85 -7
- package/dist/index.js +91 -980
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.d.cts +3 -16
- package/dist/integration.d.ts +3 -16
- package/dist/integration.js +1 -1
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs +17 -0
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs.map +1 -0
- package/dist/mongo-auth-adapter-NJQUUCTP.js +4 -0
- package/dist/mongo-auth-adapter-NJQUUCTP.js.map +1 -0
- package/dist/mongodb/index.cjs +9 -8
- package/dist/mongodb/index.d.cts +86 -5
- package/dist/mongodb/index.d.ts +86 -5
- package/dist/mongodb/index.js +3 -2
- package/dist/postgres-auth-adapter-3T2NKTSE.js +5 -0
- package/dist/{postgres-auth-adapter-B65BULNS.js.map → postgres-auth-adapter-3T2NKTSE.js.map} +1 -1
- package/dist/postgres-auth-adapter-7IEENCKQ.cjs +14 -0
- package/dist/{postgres-auth-adapter-6742WDCF.cjs.map → postgres-auth-adapter-7IEENCKQ.cjs.map} +1 -1
- package/dist/redis-adapter-D2E2S3GB.cjs +13 -0
- package/dist/{redis-adapter-LPUWLE4Y.cjs.map → redis-adapter-D2E2S3GB.cjs.map} +1 -1
- package/dist/redis-adapter-VQXD7ESY.js +4 -0
- package/dist/{redis-adapter-THYDCGQR.js.map → redis-adapter-VQXD7ESY.js.map} +1 -1
- package/dist/rest/index.cjs +10 -8
- package/dist/rest/index.js +8 -6
- package/dist/sqlite-adapter-LVK5PS4T.cjs +13 -0
- package/dist/sqlite-adapter-LVK5PS4T.cjs.map +1 -0
- package/dist/sqlite-adapter-TR3U3W6Q.js +4 -0
- package/dist/sqlite-adapter-TR3U3W6Q.js.map +1 -0
- package/dist/templates/index.cjs +31 -27
- package/dist/templates/index.d.cts +8 -5
- package/dist/templates/index.d.ts +8 -5
- package/dist/templates/index.js +1 -1
- package/dist/{base-eVegJ_Pr.d.ts → tenant-B1YB0Jy8.d.ts} +10 -1
- package/dist/{base-DvvNqnM-.d.cts → tenant-Cpeveji6.d.cts} +10 -1
- package/dist/{types-DqN4ckOC.d.cts → types-D6ZLRGbH.d.cts} +19 -1
- package/dist/{types-DqN4ckOC.d.ts → types-D6ZLRGbH.d.ts} +19 -1
- package/package.json +56 -9
- package/dist/adapter-BSvBudTG.d.cts +0 -65
- package/dist/adapter-CXGB2Elb.d.ts +0 -65
- package/dist/bootstrap-4MH44YKG.js +0 -6
- package/dist/bootstrap-EE6BJZWL.cjs +0 -31
- package/dist/chunk-55BNRTLW.cjs.map +0 -1
- package/dist/chunk-5HA5OMFH.cjs.map +0 -1
- package/dist/chunk-6WXQRYTW.js.map +0 -1
- package/dist/chunk-A4USRVTQ.js +0 -115
- package/dist/chunk-A4USRVTQ.js.map +0 -1
- package/dist/chunk-AM4JKIPP.js.map +0 -1
- package/dist/chunk-E3BZLMX6.js.map +0 -1
- package/dist/chunk-H4XCAPA6.cjs.map +0 -1
- package/dist/chunk-KOCTZKPV.cjs +0 -117
- package/dist/chunk-KOCTZKPV.cjs.map +0 -1
- package/dist/chunk-QKVA2SOG.js.map +0 -1
- package/dist/chunk-QYZKIPSD.js.map +0 -1
- package/dist/chunk-R2YHJN6W.cjs.map +0 -1
- package/dist/chunk-RALQO47U.cjs.map +0 -1
- package/dist/chunk-RDRJVCL5.cjs.map +0 -1
- package/dist/chunk-S3FG2NY7.js.map +0 -1
- package/dist/chunk-TP5YQFIX.js.map +0 -1
- package/dist/chunk-TVVYZ2TH.js.map +0 -1
- package/dist/chunk-WBCIEYHC.cjs.map +0 -1
- package/dist/chunk-WSCJQI2B.js.map +0 -1
- package/dist/chunk-WVPOPOEQ.cjs.map +0 -1
- package/dist/chunk-XAEBVZTI.cjs.map +0 -1
- package/dist/chunk-XU7AFF6V.js.map +0 -1
- package/dist/chunk-Z2OVHWHB.cjs.map +0 -1
- package/dist/postgres-auth-adapter-6742WDCF.cjs +0 -14
- package/dist/postgres-auth-adapter-B65BULNS.js +0 -5
- package/dist/redis-adapter-LPUWLE4Y.cjs +0 -13
- package/dist/redis-adapter-THYDCGQR.js +0 -4
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
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,
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
${
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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,
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
397
|
-
|
|
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(
|
|
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
|
-
|
|
609
|
-
|
|
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
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
if (
|
|
619
|
-
if (value.
|
|
620
|
-
if (value.
|
|
621
|
-
if (value.
|
|
622
|
-
if (value.
|
|
623
|
-
if (value.
|
|
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
|
-
|
|
749
|
+
const col = table[key];
|
|
750
|
+
if (col) conditions.push(drizzleOrm.eq(col, value));
|
|
626
751
|
}
|
|
627
752
|
}
|
|
628
|
-
return conditions
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
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
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
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-
|
|
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-
|
|
825
|
-
//# sourceMappingURL=chunk-
|
|
984
|
+
//# sourceMappingURL=chunk-2KVHZE6O.cjs.map
|
|
985
|
+
//# sourceMappingURL=chunk-2KVHZE6O.cjs.map
|