@kyro-cms/core 0.10.3 → 0.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler-graphql.cjs +1 -49
- package/dist/api-handler-graphql.js +1 -46
- package/dist/api-handler-trpc.cjs +1 -38
- package/dist/api-handler-trpc.js +1 -36
- package/dist/api-handler.cjs +1 -44
- package/dist/api-handler.js +1 -27
- package/dist/bootstrap-IVQWSJXZ.js +1 -0
- package/dist/bootstrap-OHGQGMRV.cjs +1 -0
- package/dist/chunk-2BTRHVT3.cjs +20 -0
- package/dist/chunk-2W4FK6CJ.js +122 -0
- package/dist/chunk-4ORJMSJU.cjs +1 -0
- package/dist/chunk-5J6HXUF6.js +1 -0
- package/dist/chunk-65G73T7Z.cjs +2 -0
- package/dist/chunk-6CLRVJPP.cjs +133 -0
- package/dist/chunk-7N6NKCRT.js +1 -0
- package/dist/chunk-7WOX27LK.js +259 -0
- package/dist/chunk-AE6GXUT7.js +1 -0
- package/dist/chunk-AHSFSERC.cjs +1 -0
- package/dist/chunk-AJAZ7D3W.cjs +259 -0
- package/dist/chunk-ATLSIYRH.cjs +1 -0
- package/dist/chunk-AU6IWTBO.js +2 -0
- package/dist/chunk-CIE3XMLH.cjs +2 -0
- package/dist/chunk-CVVW4LXZ.cjs +1 -0
- package/dist/chunk-DV4LFLPL.cjs +1 -0
- package/dist/chunk-ELICKLFM.cjs +3 -0
- package/dist/chunk-EQUQJBPP.cjs +2 -0
- package/dist/chunk-ET6NN2V2.cjs +122 -0
- package/dist/chunk-F3Z67QWS.cjs +86 -0
- package/dist/chunk-F7SR5IDT.cjs +1 -0
- package/dist/chunk-FO3HLBC7.js +1 -0
- package/dist/chunk-G6A7OSIG.js +2 -0
- package/dist/chunk-GFU7AOI3.cjs +1 -0
- package/dist/chunk-GYQMNXXW.cjs +114 -0
- package/dist/chunk-HLSB2MCK.js +1 -0
- package/dist/chunk-HVXO3OFB.cjs +1 -0
- package/dist/chunk-ISWMETHJ.cjs +1 -0
- package/dist/chunk-K6WUOU6P.js +1 -0
- package/dist/chunk-KDNYHLD2.js +1 -0
- package/dist/chunk-L6CZYN3L.cjs +20 -0
- package/dist/chunk-LZ6YFYQM.js +20 -0
- package/dist/chunk-MIOMMB23.cjs +1 -0
- package/dist/chunk-MSSRVZH6.js +1 -0
- package/dist/chunk-NGBJKZMT.js +90 -0
- package/dist/chunk-NRLIGDYF.js +1 -0
- package/dist/chunk-NY47CFVP.cjs +1 -0
- package/dist/chunk-NZ35PV5R.js +2 -0
- package/dist/chunk-OG7CNQGU.js +1 -0
- package/dist/chunk-P7CESLDJ.js +1 -0
- package/dist/chunk-POWTSLKC.js +21 -0
- package/dist/chunk-PP5S2UBV.js +0 -0
- package/dist/chunk-PWGS2GPI.js +86 -0
- package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
- package/dist/chunk-Q4CSLXCO.cjs +90 -0
- package/dist/chunk-QRXDCV6K.js +0 -0
- package/dist/chunk-R6UUTH3T.js +2 -0
- package/dist/chunk-RHCWCG3O.js +114 -0
- package/dist/chunk-SL3LZQCF.js +1 -0
- package/dist/chunk-TD6RULJU.cjs +21 -0
- package/dist/chunk-UBHFUFD4.cjs +1 -0
- package/dist/chunk-UBRYJP2G.js +1 -0
- package/dist/chunk-UDSJGML2.cjs +2 -0
- package/dist/chunk-UHFDH3PG.js +20 -0
- package/dist/chunk-UJNSOOYZ.cjs +1 -0
- package/dist/chunk-UVTS2IWM.js +1 -0
- package/dist/chunk-V65NPSR5.cjs +1 -0
- package/dist/chunk-VKXQUYYV.js +133 -0
- package/dist/chunk-WIZ6C5QZ.cjs +1 -0
- package/dist/chunk-Y7K26TBA.cjs +1 -0
- package/dist/chunk-ZAQOSRP6.js +1 -0
- package/dist/chunk-ZELCS7IC.js +3 -0
- package/dist/cli/index.cjs +35 -405
- package/dist/cli/index.js +35 -402
- package/dist/client.cjs +1 -55
- package/dist/client.js +1 -6
- package/dist/drizzle/index.cjs +1 -50
- package/dist/drizzle/index.d.cts +1 -2
- package/dist/drizzle/index.d.ts +1 -2
- package/dist/drizzle/index.js +1 -9
- package/dist/fields/index.cjs +1 -89
- package/dist/fields/index.js +1 -4
- package/dist/graphql/index.cjs +1 -31
- package/dist/graphql/index.d.cts +1 -1
- package/dist/graphql/index.d.ts +1 -1
- package/dist/graphql/index.js +1 -6
- package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
- package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
- package/dist/index.cjs +29 -2464
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +29 -1929
- package/dist/integration.cjs +1 -10
- package/dist/integration.js +1 -4
- package/dist/media-L5XDD47D.js +1 -0
- package/dist/media-OUBQTIQP.cjs +1 -0
- package/dist/mongo-auth-adapter-LG5O4LIH.js +1 -0
- package/dist/mongo-auth-adapter-YPONSOCY.cjs +1 -0
- package/dist/mongodb/index.cjs +1 -29
- package/dist/mongodb/index.d.cts +1 -2
- package/dist/mongodb/index.d.ts +1 -2
- package/dist/mongodb/index.js +1 -8
- package/dist/postgres-auth-adapter-33QOIRXT.js +1 -0
- package/dist/postgres-auth-adapter-JKDYYULH.cjs +1 -0
- package/dist/redis-adapter-KECGVSVX.cjs +1 -0
- package/dist/redis-adapter-VAXP43GR.js +1 -0
- package/dist/rest/index.cjs +1 -31
- package/dist/rest/index.d.cts +1 -1
- package/dist/rest/index.d.ts +1 -1
- package/dist/rest/index.js +1 -18
- package/dist/schema-HIUSHSUI.cjs +1 -0
- package/dist/schema-KFYUM674.js +1 -0
- package/dist/sqlite-adapter-FP45QCYK.js +1 -0
- package/dist/sqlite-adapter-Z3IBBI4X.cjs +1 -0
- package/dist/templates/index.cjs +1 -207
- package/dist/templates/index.js +1 -6
- package/dist/trpc/index.cjs +1 -48
- package/dist/trpc/index.js +1 -7
- package/dist/ws/index.cjs +1 -25
- package/dist/ws/index.js +1 -4
- package/package.json +49 -12
- package/dist/api-handler-graphql.cjs.map +0 -1
- package/dist/api-handler-graphql.js.map +0 -1
- package/dist/api-handler-trpc.cjs.map +0 -1
- package/dist/api-handler-trpc.js.map +0 -1
- package/dist/api-handler.cjs.map +0 -1
- package/dist/api-handler.js.map +0 -1
- package/dist/bootstrap-FUAPY2OF.cjs +0 -32
- package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
- package/dist/bootstrap-OXNVM7FP.js +0 -7
- package/dist/bootstrap-OXNVM7FP.js.map +0 -1
- package/dist/chunk-2HFJUUFZ.js +0 -250
- package/dist/chunk-2HFJUUFZ.js.map +0 -1
- package/dist/chunk-354ISGA4.js +0 -6457
- package/dist/chunk-354ISGA4.js.map +0 -1
- package/dist/chunk-3AKCVYDB.js +0 -162
- package/dist/chunk-3AKCVYDB.js.map +0 -1
- package/dist/chunk-3KTWGODI.cjs +0 -178
- package/dist/chunk-3KTWGODI.cjs.map +0 -1
- package/dist/chunk-3P5AHK2U.cjs +0 -2749
- package/dist/chunk-3P5AHK2U.cjs.map +0 -1
- package/dist/chunk-3YELQL7Z.cjs +0 -4
- package/dist/chunk-3YELQL7Z.cjs.map +0 -1
- package/dist/chunk-4CV4JOE5.js +0 -24
- package/dist/chunk-4CV4JOE5.js.map +0 -1
- package/dist/chunk-4OCMVGEY.cjs +0 -173
- package/dist/chunk-4OCMVGEY.cjs.map +0 -1
- package/dist/chunk-4PWRCMTQ.cjs +0 -15
- package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
- package/dist/chunk-526M5MOA.js +0 -103
- package/dist/chunk-526M5MOA.js.map +0 -1
- package/dist/chunk-53NYVYVX.js +0 -3243
- package/dist/chunk-53NYVYVX.js.map +0 -1
- package/dist/chunk-5GFQPHGT.cjs +0 -156
- package/dist/chunk-5GFQPHGT.cjs.map +0 -1
- package/dist/chunk-5RPRLTTN.js +0 -861
- package/dist/chunk-5RPRLTTN.js.map +0 -1
- package/dist/chunk-7OGPN7MP.js +0 -352
- package/dist/chunk-7OGPN7MP.js.map +0 -1
- package/dist/chunk-7OS7TX2Q.cjs +0 -495
- package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
- package/dist/chunk-ADLJSJSN.cjs +0 -13
- package/dist/chunk-ADLJSJSN.cjs.map +0 -1
- package/dist/chunk-AN2L2CJZ.js +0 -2728
- package/dist/chunk-AN2L2CJZ.js.map +0 -1
- package/dist/chunk-BYBMTIMT.js +0 -419
- package/dist/chunk-BYBMTIMT.js.map +0 -1
- package/dist/chunk-CF7OL6HR.js +0 -355
- package/dist/chunk-CF7OL6HR.js.map +0 -1
- package/dist/chunk-CJX74IYK.js +0 -489
- package/dist/chunk-CJX74IYK.js.map +0 -1
- package/dist/chunk-CKVOU6MX.cjs +0 -52
- package/dist/chunk-CKVOU6MX.cjs.map +0 -1
- package/dist/chunk-CZLDE2OZ.cjs +0 -28
- package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
- package/dist/chunk-DPA3KWPY.cjs +0 -205
- package/dist/chunk-DPA3KWPY.cjs.map +0 -1
- package/dist/chunk-EEJUFDMF.cjs +0 -424
- package/dist/chunk-EEJUFDMF.cjs.map +0 -1
- package/dist/chunk-FIAMXNTH.js +0 -220
- package/dist/chunk-FIAMXNTH.js.map +0 -1
- package/dist/chunk-GAOXD3XT.js +0 -175
- package/dist/chunk-GAOXD3XT.js.map +0 -1
- package/dist/chunk-GTGRLD4Y.js +0 -3
- package/dist/chunk-GTGRLD4Y.js.map +0 -1
- package/dist/chunk-GUUB5EAG.cjs +0 -223
- package/dist/chunk-GUUB5EAG.cjs.map +0 -1
- package/dist/chunk-GXFOGU7N.cjs +0 -359
- package/dist/chunk-GXFOGU7N.cjs.map +0 -1
- package/dist/chunk-GYIJ3JJM.cjs +0 -1069
- package/dist/chunk-GYIJ3JJM.cjs.map +0 -1
- package/dist/chunk-GZS4LMR7.js +0 -422
- package/dist/chunk-GZS4LMR7.js.map +0 -1
- package/dist/chunk-HY6B7B5A.js +0 -150
- package/dist/chunk-HY6B7B5A.js.map +0 -1
- package/dist/chunk-IDVRRRAK.cjs +0 -824
- package/dist/chunk-IDVRRRAK.cjs.map +0 -1
- package/dist/chunk-ISKYUUP4.cjs +0 -6486
- package/dist/chunk-ISKYUUP4.cjs.map +0 -1
- package/dist/chunk-KC2GDBLS.cjs +0 -84
- package/dist/chunk-KC2GDBLS.cjs.map +0 -1
- package/dist/chunk-L4EZKIEX.js +0 -185
- package/dist/chunk-L4EZKIEX.js.map +0 -1
- package/dist/chunk-LNTFRAHF.cjs +0 -473
- package/dist/chunk-LNTFRAHF.cjs.map +0 -1
- package/dist/chunk-MTIRYI7F.cjs +0 -4
- package/dist/chunk-MTIRYI7F.cjs.map +0 -1
- package/dist/chunk-N4GN6Q3V.cjs +0 -869
- package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
- package/dist/chunk-N4H37VN4.cjs +0 -259
- package/dist/chunk-N4H37VN4.cjs.map +0 -1
- package/dist/chunk-N5QSHUA6.js +0 -1135
- package/dist/chunk-N5QSHUA6.js.map +0 -1
- package/dist/chunk-NKPKR5BW.cjs +0 -188
- package/dist/chunk-NKPKR5BW.cjs.map +0 -1
- package/dist/chunk-NQJJYRLP.cjs +0 -110
- package/dist/chunk-NQJJYRLP.cjs.map +0 -1
- package/dist/chunk-OJ2AM75W.cjs +0 -253
- package/dist/chunk-OJ2AM75W.cjs.map +0 -1
- package/dist/chunk-OX6GOIPH.js +0 -516
- package/dist/chunk-OX6GOIPH.js.map +0 -1
- package/dist/chunk-P2YW545G.js +0 -11
- package/dist/chunk-P2YW545G.js.map +0 -1
- package/dist/chunk-PHJRNPHY.cjs +0 -3291
- package/dist/chunk-PHJRNPHY.cjs.map +0 -1
- package/dist/chunk-Q72BOAPK.js +0 -817
- package/dist/chunk-Q72BOAPK.js.map +0 -1
- package/dist/chunk-QU2RFFH4.js +0 -3
- package/dist/chunk-QU2RFFH4.js.map +0 -1
- package/dist/chunk-RP7VZUEL.js +0 -49
- package/dist/chunk-RP7VZUEL.js.map +0 -1
- package/dist/chunk-SHTTJMLT.cjs +0 -361
- package/dist/chunk-SHTTJMLT.cjs.map +0 -1
- package/dist/chunk-THBQG64D.cjs +0 -425
- package/dist/chunk-THBQG64D.cjs.map +0 -1
- package/dist/chunk-TQG7G7YI.cjs +0 -526
- package/dist/chunk-TQG7G7YI.cjs.map +0 -1
- package/dist/chunk-U3VVLYXG.cjs +0 -189
- package/dist/chunk-U3VVLYXG.cjs.map +0 -1
- package/dist/chunk-UUDTPZX6.js +0 -193
- package/dist/chunk-UUDTPZX6.js.map +0 -1
- package/dist/chunk-VKREAIBA.cjs +0 -1139
- package/dist/chunk-VKREAIBA.cjs.map +0 -1
- package/dist/chunk-WDTTHKDS.js +0 -458
- package/dist/chunk-WDTTHKDS.js.map +0 -1
- package/dist/chunk-WXVB364T.js +0 -218
- package/dist/chunk-WXVB364T.js.map +0 -1
- package/dist/chunk-X4BPPD6K.js +0 -181
- package/dist/chunk-X4BPPD6K.js.map +0 -1
- package/dist/chunk-XEB7PH2E.js +0 -81
- package/dist/chunk-XEB7PH2E.js.map +0 -1
- package/dist/chunk-XHAAAEXX.js +0 -1055
- package/dist/chunk-XHAAAEXX.js.map +0 -1
- package/dist/chunk-YT7HXXVN.js +0 -13
- package/dist/chunk-YT7HXXVN.js.map +0 -1
- package/dist/cli/index.cjs.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/drizzle/index.cjs.map +0 -1
- package/dist/drizzle/index.js.map +0 -1
- package/dist/fields/index.cjs.map +0 -1
- package/dist/fields/index.js.map +0 -1
- package/dist/graphql/index.cjs.map +0 -1
- package/dist/graphql/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integration.cjs.map +0 -1
- package/dist/integration.js.map +0 -1
- package/dist/media-7WDX4BDJ.js +0 -4
- package/dist/media-7WDX4BDJ.js.map +0 -1
- package/dist/media-TUSLVRQ6.cjs +0 -17
- package/dist/media-TUSLVRQ6.cjs.map +0 -1
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
- package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
- package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
- package/dist/mongodb/index.cjs.map +0 -1
- package/dist/mongodb/index.js.map +0 -1
- package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
- package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
- package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
- package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
- package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
- package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
- package/dist/redis-adapter-XALOGWY3.js +0 -4
- package/dist/redis-adapter-XALOGWY3.js.map +0 -1
- package/dist/rest/index.cjs.map +0 -1
- package/dist/rest/index.js.map +0 -1
- package/dist/schema-6QL3USNB.cjs +0 -67
- package/dist/schema-6QL3USNB.cjs.map +0 -1
- package/dist/schema-FNNWEAAW.js +0 -6
- package/dist/schema-FNNWEAAW.js.map +0 -1
- package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
- package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
- package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
- package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
- package/dist/templates/index.cjs.map +0 -1
- package/dist/templates/index.js.map +0 -1
- package/dist/trpc/index.cjs.map +0 -1
- package/dist/trpc/index.js.map +0 -1
- package/dist/ws/index.cjs.map +0 -1
- package/dist/ws/index.js.map +0 -1
package/dist/chunk-GYIJ3JJM.cjs
DELETED
|
@@ -1,1069 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkGUUB5EAG_cjs = require('./chunk-GUUB5EAG.cjs');
|
|
4
|
-
var drizzleOrm = require('drizzle-orm');
|
|
5
|
-
var pgCore = require('drizzle-orm/pg-core');
|
|
6
|
-
var sqliteCore = require('drizzle-orm/sqlite-core');
|
|
7
|
-
var postgresJs = require('drizzle-orm/postgres-js');
|
|
8
|
-
var postgres = require('postgres');
|
|
9
|
-
var crypto = require('crypto');
|
|
10
|
-
var promises = require('fs/promises');
|
|
11
|
-
var path = require('path');
|
|
12
|
-
var module$1 = require('module');
|
|
13
|
-
|
|
14
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
15
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
|
|
17
|
-
var postgres__default = /*#__PURE__*/_interopDefault(postgres);
|
|
18
|
-
|
|
19
|
-
var _schemaEnsured = false;
|
|
20
|
-
function fieldToDrizzleType(field, dialect = "postgres") {
|
|
21
|
-
switch (field.type) {
|
|
22
|
-
case "text":
|
|
23
|
-
case "email":
|
|
24
|
-
case "password":
|
|
25
|
-
case "color":
|
|
26
|
-
return dialect === "sqlite" ? "text" : "varchar";
|
|
27
|
-
case "textarea":
|
|
28
|
-
case "code":
|
|
29
|
-
case "markdown":
|
|
30
|
-
case "secret":
|
|
31
|
-
return "text";
|
|
32
|
-
case "number":
|
|
33
|
-
return field.integer ? "integer" : "decimal";
|
|
34
|
-
case "checkbox":
|
|
35
|
-
return "boolean";
|
|
36
|
-
case "date":
|
|
37
|
-
return "timestamp";
|
|
38
|
-
case "select":
|
|
39
|
-
case "radio":
|
|
40
|
-
return dialect === "sqlite" ? "text" : "varchar";
|
|
41
|
-
case "richtext":
|
|
42
|
-
case "json":
|
|
43
|
-
case "array":
|
|
44
|
-
case "group":
|
|
45
|
-
case "blocks":
|
|
46
|
-
case "row":
|
|
47
|
-
case "collapsible":
|
|
48
|
-
case "tabs":
|
|
49
|
-
return "jsonb";
|
|
50
|
-
case "relationship":
|
|
51
|
-
return dialect === "sqlite" ? "text" : "varchar";
|
|
52
|
-
case "upload":
|
|
53
|
-
return "jsonb";
|
|
54
|
-
default:
|
|
55
|
-
return "jsonb";
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function collectionToDrizzleSchema(collection, dialect = "postgres") {
|
|
59
|
-
const tableName = collection.slug.replace(/-/g, "_");
|
|
60
|
-
const lines = [];
|
|
61
|
-
lines.push(`export const ${tableName} = pgTable('${tableName}', {`);
|
|
62
|
-
lines.push(` id: uuid('id').primaryKey().defaultRandom(),`);
|
|
63
|
-
for (const field of collection.fields) {
|
|
64
|
-
if (field.name === "id") continue;
|
|
65
|
-
const dbType = fieldToDrizzleType(field, dialect);
|
|
66
|
-
const isRequired = field.required;
|
|
67
|
-
let fieldDef = ` ${field.name}: pg.${dbType}('${field.name}')`;
|
|
68
|
-
if (field.unique) fieldDef += ".unique()";
|
|
69
|
-
if (!isRequired) fieldDef += ".nullable()";
|
|
70
|
-
if (field.defaultValue !== void 0) {
|
|
71
|
-
if (typeof field.defaultValue === "string") {
|
|
72
|
-
fieldDef += `.default('${field.defaultValue}')`;
|
|
73
|
-
} else if (typeof field.defaultValue === "boolean") {
|
|
74
|
-
fieldDef += `.default(${field.defaultValue})`;
|
|
75
|
-
} else {
|
|
76
|
-
fieldDef += `.default(sql\`${JSON.stringify(field.defaultValue)}\`)`;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
fieldDef += ",";
|
|
80
|
-
lines.push(fieldDef);
|
|
81
|
-
}
|
|
82
|
-
if (collection.timestamps) {
|
|
83
|
-
lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);
|
|
84
|
-
lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);
|
|
85
|
-
}
|
|
86
|
-
lines.push(` status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('status').default('draft'),`);
|
|
87
|
-
lines.push(` hasDraft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('hasDraft').default(false),`);
|
|
88
|
-
lines.push("});");
|
|
89
|
-
return lines.join("\n");
|
|
90
|
-
}
|
|
91
|
-
var DrizzleAdapter = class extends chunkGUUB5EAG_cjs.AbstractBaseAdapter {
|
|
92
|
-
client;
|
|
93
|
-
schema;
|
|
94
|
-
dialect;
|
|
95
|
-
connectionString;
|
|
96
|
-
versionsTableReady = false;
|
|
97
|
-
constructor(options) {
|
|
98
|
-
super();
|
|
99
|
-
this.schema = options.schema || {};
|
|
100
|
-
if (options.connectionString) {
|
|
101
|
-
this.connectionString = options.connectionString;
|
|
102
|
-
const connStr = options.connectionString.toLowerCase();
|
|
103
|
-
if (connStr.startsWith("postgres://") || connStr.startsWith("postgresql://")) {
|
|
104
|
-
this.dialect = "postgres";
|
|
105
|
-
} else if (connStr.includes(".db") || connStr.includes("sqlite") || connStr.includes("file:")) {
|
|
106
|
-
this.dialect = "sqlite";
|
|
107
|
-
} else {
|
|
108
|
-
this.dialect = options.type || "postgres";
|
|
109
|
-
}
|
|
110
|
-
} else {
|
|
111
|
-
this.client = options.client;
|
|
112
|
-
this.dialect = options.type || "sqlite";
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
prepareData(data, config) {
|
|
116
|
-
const result = super.prepareData(data, config);
|
|
117
|
-
if (result.createdAt && typeof result.createdAt === "string") {
|
|
118
|
-
result.createdAt = new Date(result.createdAt);
|
|
119
|
-
}
|
|
120
|
-
if (result.updatedAt && typeof result.updatedAt === "string") {
|
|
121
|
-
result.updatedAt = new Date(result.updatedAt);
|
|
122
|
-
}
|
|
123
|
-
for (const field of config.fields) {
|
|
124
|
-
if (field.type === "date" && field.name) {
|
|
125
|
-
const value = result[field.name];
|
|
126
|
-
if (value && typeof value === "string") {
|
|
127
|
-
result[field.name] = new Date(value);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
for (const field of config.fields) {
|
|
132
|
-
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
133
|
-
const isJsonb = dbType === "jsonb";
|
|
134
|
-
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
135
|
-
const tabData = data[field.name];
|
|
136
|
-
if (tabData && typeof tabData === "object") {
|
|
137
|
-
const processedTabData = {};
|
|
138
|
-
for (const [key, value] of Object.entries(tabData)) {
|
|
139
|
-
const tabField = field.tabs.flatMap((t) => t.fields).find((f) => f.name === key);
|
|
140
|
-
const needsStringify = (tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value;
|
|
141
|
-
if (needsStringify) {
|
|
142
|
-
processedTabData[key] = Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
|
|
143
|
-
} else {
|
|
144
|
-
processedTabData[key] = value;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
result[field.name] = isJsonb ? processedTabData : JSON.stringify(processedTabData);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (field.type === "upload" || field.type === "image" || field.type === "list" || field.type === "relationship-block") {
|
|
151
|
-
if (field.name) {
|
|
152
|
-
const value = data[field.name];
|
|
153
|
-
if (value) {
|
|
154
|
-
result[field.name] = isJsonb ? value : Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
for (const field of config.fields) {
|
|
160
|
-
if (field.name && result[field.name] === "") {
|
|
161
|
-
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
162
|
-
if (dbType === "timestamp" || dbType === "jsonb" || dbType === "decimal" || dbType === "integer" || dbType === "numeric" || dbType === "boolean") {
|
|
163
|
-
result[field.name] = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return result;
|
|
168
|
-
}
|
|
169
|
-
async connect() {
|
|
170
|
-
if (this.connectionString && !this.client) {
|
|
171
|
-
if (this.dialect === "postgres") {
|
|
172
|
-
const { default: postgres2 } = await import('postgres');
|
|
173
|
-
const { drizzle: drizzle2 } = await import('drizzle-orm/postgres-js');
|
|
174
|
-
const sql2 = postgres2(this.connectionString, { onnotice: () => {
|
|
175
|
-
} });
|
|
176
|
-
this.client = drizzle2(sql2, { schema: this.schema });
|
|
177
|
-
} else if (this.dialect === "sqlite") {
|
|
178
|
-
const { default: betterSqlite3 } = await import('better-sqlite3');
|
|
179
|
-
const { drizzle: drizzle2 } = await import('drizzle-orm/better-sqlite3');
|
|
180
|
-
const db = new betterSqlite3(this.connectionString.replace("file:", ""));
|
|
181
|
-
this.client = drizzle2(db, { schema: this.schema });
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
this.connected = true;
|
|
185
|
-
}
|
|
186
|
-
async init(collections, globals = []) {
|
|
187
|
-
await super.init(collections, globals);
|
|
188
|
-
if (this.connectionString && !this.client) {
|
|
189
|
-
await this.connect();
|
|
190
|
-
}
|
|
191
|
-
if (this.client && !_schemaEnsured) {
|
|
192
|
-
for (const config of collections) {
|
|
193
|
-
const tableName = this.getTableName(config.slug);
|
|
194
|
-
if (!this.schema[tableName]) {
|
|
195
|
-
this.schema[tableName] = this.createTableFromConfig(config);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
await this.ensureCollectionTables(collections);
|
|
199
|
-
const globalCollections = globals.map((g) => ({
|
|
200
|
-
slug: `_globals_${g.slug}`,
|
|
201
|
-
fields: g.fields,
|
|
202
|
-
label: g.label
|
|
203
|
-
}));
|
|
204
|
-
for (const gc of globalCollections) {
|
|
205
|
-
const tableName = this.getTableName(gc.slug);
|
|
206
|
-
if (!this.schema[tableName]) {
|
|
207
|
-
this.schema[tableName] = this.createTableFromConfig(gc, true);
|
|
208
|
-
}
|
|
209
|
-
if (!this.collections.has(gc.slug)) {
|
|
210
|
-
this.collections.set(gc.slug, gc);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
await this.ensureCollectionTables(globalCollections);
|
|
214
|
-
_schemaEnsured = true;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
createTableFromConfig(config, useTextId = false) {
|
|
218
|
-
const tableName = this.getTableName(config.slug);
|
|
219
|
-
const columns = {
|
|
220
|
-
id: useTextId ? pgCore.text("id").primaryKey() : pgCore.uuid("id").primaryKey().defaultRandom()
|
|
221
|
-
};
|
|
222
|
-
for (const field of config.fields) {
|
|
223
|
-
if (!field.name || field.name === "id") continue;
|
|
224
|
-
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
225
|
-
const propName = field.name.replace(/-/g, "_");
|
|
226
|
-
const sqlName = propName.replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
227
|
-
let col;
|
|
228
|
-
if (this.dialect === "sqlite") {
|
|
229
|
-
switch (dbType) {
|
|
230
|
-
case "varchar":
|
|
231
|
-
case "text":
|
|
232
|
-
col = sqliteCore.text(sqlName);
|
|
233
|
-
break;
|
|
234
|
-
case "integer":
|
|
235
|
-
col = sqliteCore.integer(sqlName);
|
|
236
|
-
break;
|
|
237
|
-
case "decimal":
|
|
238
|
-
case "numeric":
|
|
239
|
-
col = sqliteCore.numeric(sqlName);
|
|
240
|
-
break;
|
|
241
|
-
case "boolean":
|
|
242
|
-
col = sqliteCore.integer(sqlName, { mode: "boolean" });
|
|
243
|
-
break;
|
|
244
|
-
case "timestamp":
|
|
245
|
-
col = sqliteCore.text(sqlName);
|
|
246
|
-
break;
|
|
247
|
-
case "jsonb":
|
|
248
|
-
col = sqliteCore.text(sqlName);
|
|
249
|
-
break;
|
|
250
|
-
default:
|
|
251
|
-
col = sqliteCore.text(sqlName);
|
|
252
|
-
}
|
|
253
|
-
} else {
|
|
254
|
-
switch (dbType) {
|
|
255
|
-
case "varchar":
|
|
256
|
-
col = pgCore.varchar(sqlName, { length: 255 });
|
|
257
|
-
break;
|
|
258
|
-
case "integer":
|
|
259
|
-
col = pgCore.integer(sqlName);
|
|
260
|
-
break;
|
|
261
|
-
case "decimal":
|
|
262
|
-
col = pgCore.decimal(sqlName);
|
|
263
|
-
break;
|
|
264
|
-
case "boolean":
|
|
265
|
-
col = pgCore.boolean(sqlName);
|
|
266
|
-
break;
|
|
267
|
-
case "timestamp":
|
|
268
|
-
col = pgCore.timestamp(sqlName);
|
|
269
|
-
break;
|
|
270
|
-
case "jsonb":
|
|
271
|
-
col = pgCore.jsonb(sqlName);
|
|
272
|
-
break;
|
|
273
|
-
default:
|
|
274
|
-
col = pgCore.text(sqlName);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
if (!field.required) col = col.default(null);
|
|
278
|
-
columns[propName] = col;
|
|
279
|
-
}
|
|
280
|
-
if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? sqliteCore.text("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("created_at").defaultNow();
|
|
281
|
-
if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? sqliteCore.text("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("updated_at").defaultNow();
|
|
282
|
-
columns.status = this.dialect === "sqlite" ? sqliteCore.text("status").default("draft") : pgCore.varchar("status", { length: 20 }).default("draft");
|
|
283
|
-
columns.hasDraft = this.dialect === "sqlite" ? sqliteCore.integer("hasDraft", { mode: "boolean" }).default(false) : pgCore.boolean("hasDraft").default(false);
|
|
284
|
-
return this.dialect === "sqlite" ? sqliteCore.sqliteTable(tableName, columns) : pgCore.pgTable(tableName, columns);
|
|
285
|
-
}
|
|
286
|
-
async ensureCollectionTables(collections) {
|
|
287
|
-
const statements = [];
|
|
288
|
-
for (const config of collections) {
|
|
289
|
-
const isGlobal = config.slug.startsWith("_globals_");
|
|
290
|
-
const tableName = this.getTableName(config.slug);
|
|
291
|
-
const colDefs = this.generateCreateColumns(config);
|
|
292
|
-
const hasCreated = config.fields.some((f) => f.name === "createdAt");
|
|
293
|
-
const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
|
|
294
|
-
if (this.dialect === "postgres") {
|
|
295
|
-
const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
|
|
296
|
-
statements.push(`
|
|
297
|
-
CREATE TABLE IF NOT EXISTS "${tableName}" (
|
|
298
|
-
${idCol},
|
|
299
|
-
${colDefs}
|
|
300
|
-
${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
301
|
-
${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
302
|
-
"status" VARCHAR(20) DEFAULT 'draft',
|
|
303
|
-
"hasDraft" BOOLEAN DEFAULT false
|
|
304
|
-
)
|
|
305
|
-
`);
|
|
306
|
-
} else {
|
|
307
|
-
const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" TEXT PRIMARY KEY';
|
|
308
|
-
statements.push(`
|
|
309
|
-
CREATE TABLE IF NOT EXISTS "${tableName}" (
|
|
310
|
-
${idCol},
|
|
311
|
-
${colDefs}
|
|
312
|
-
${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
313
|
-
${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
314
|
-
"status" TEXT DEFAULT 'draft',
|
|
315
|
-
"hasDraft" INTEGER DEFAULT 0
|
|
316
|
-
)
|
|
317
|
-
`);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
if (statements.length > 0) {
|
|
321
|
-
if (this.dialect === "postgres") {
|
|
322
|
-
await this.client.execute(drizzleOrm.sql.raw(statements.join(";\n")));
|
|
323
|
-
} else {
|
|
324
|
-
for (const stmt of statements) {
|
|
325
|
-
await this.client.execute(drizzleOrm.sql.raw(stmt));
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
for (const config of collections) {
|
|
330
|
-
const tableName = this.getTableName(config.slug);
|
|
331
|
-
if (tableName === "users" || tableName === "audit_logs") continue;
|
|
332
|
-
await this.syncTableColumns(config, tableName);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
getColumnSqlDefinition(field, dialect) {
|
|
336
|
-
const dbType = fieldToDrizzleType(field, dialect);
|
|
337
|
-
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
338
|
-
const sqlType = this.columnSqlType(dbType, dialect);
|
|
339
|
-
return `"${sqlName}" ${sqlType} DEFAULT NULL`;
|
|
340
|
-
}
|
|
341
|
-
columnSqlType(dbType, dialect) {
|
|
342
|
-
if (dialect === "sqlite") {
|
|
343
|
-
switch (dbType) {
|
|
344
|
-
case "varchar":
|
|
345
|
-
return "TEXT";
|
|
346
|
-
case "text":
|
|
347
|
-
return "TEXT";
|
|
348
|
-
case "integer":
|
|
349
|
-
return "INTEGER";
|
|
350
|
-
case "decimal":
|
|
351
|
-
case "numeric":
|
|
352
|
-
return "NUMERIC";
|
|
353
|
-
case "boolean":
|
|
354
|
-
return "INTEGER";
|
|
355
|
-
case "timestamp":
|
|
356
|
-
return "TEXT";
|
|
357
|
-
case "jsonb":
|
|
358
|
-
return "TEXT";
|
|
359
|
-
default:
|
|
360
|
-
return "TEXT";
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
switch (dbType) {
|
|
364
|
-
case "varchar":
|
|
365
|
-
return "VARCHAR(255)";
|
|
366
|
-
case "text":
|
|
367
|
-
return "TEXT";
|
|
368
|
-
case "integer":
|
|
369
|
-
return "INTEGER";
|
|
370
|
-
case "decimal":
|
|
371
|
-
case "numeric":
|
|
372
|
-
return "DECIMAL";
|
|
373
|
-
case "boolean":
|
|
374
|
-
return "BOOLEAN";
|
|
375
|
-
case "timestamp":
|
|
376
|
-
return "TIMESTAMP";
|
|
377
|
-
case "jsonb":
|
|
378
|
-
return "JSONB";
|
|
379
|
-
default:
|
|
380
|
-
return "TEXT";
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
getExpectedColumnDefs(config, tableName) {
|
|
384
|
-
const defs = {};
|
|
385
|
-
const isGlobal = config.slug.startsWith("_globals_");
|
|
386
|
-
const hasCreated = config.fields.some((f) => f.name === "createdAt");
|
|
387
|
-
const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
|
|
388
|
-
if (this.dialect === "postgres") {
|
|
389
|
-
defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
|
|
390
|
-
if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
|
|
391
|
-
if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
|
|
392
|
-
defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
|
|
393
|
-
defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
|
|
394
|
-
} else {
|
|
395
|
-
defs["id"] = '"id" TEXT PRIMARY KEY';
|
|
396
|
-
if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
|
|
397
|
-
if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
|
|
398
|
-
defs["status"] = '"status" TEXT DEFAULT NULL';
|
|
399
|
-
defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
|
|
400
|
-
}
|
|
401
|
-
for (const field of config.fields) {
|
|
402
|
-
if (!field.name || field.name === "id") continue;
|
|
403
|
-
const def = this.getColumnSqlDefinition(field, this.dialect);
|
|
404
|
-
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
405
|
-
defs[sqlName] = def;
|
|
406
|
-
}
|
|
407
|
-
return defs;
|
|
408
|
-
}
|
|
409
|
-
async syncTableColumns(config, tableName) {
|
|
410
|
-
let existingCols;
|
|
411
|
-
try {
|
|
412
|
-
if (this.dialect === "postgres") {
|
|
413
|
-
const result = await this.client.execute(
|
|
414
|
-
drizzleOrm.sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`
|
|
415
|
-
);
|
|
416
|
-
existingCols = new Map(result.map((r) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));
|
|
417
|
-
} else {
|
|
418
|
-
const result = await this.client.execute(
|
|
419
|
-
drizzleOrm.sql`PRAGMA table_info("${drizzleOrm.sql.raw(tableName)}")`
|
|
420
|
-
);
|
|
421
|
-
existingCols = new Map(result.map((r) => [r.name, { type: r.type, maxLen: null }]));
|
|
422
|
-
}
|
|
423
|
-
} catch {
|
|
424
|
-
return;
|
|
425
|
-
}
|
|
426
|
-
const expected = this.getExpectedColumnDefs(config, tableName);
|
|
427
|
-
const missing = Object.keys(expected).filter((k) => !existingCols.has(k));
|
|
428
|
-
if (missing.length > 0) {
|
|
429
|
-
const alterStmts = missing.map((k) => `ALTER TABLE "${tableName}" ADD COLUMN ${expected[k]}`);
|
|
430
|
-
await this.executeRaw(drizzleOrm.sql.raw(alterStmts.join(";\n")));
|
|
431
|
-
}
|
|
432
|
-
if (this.dialect === "postgres") {
|
|
433
|
-
for (const field of config.fields) {
|
|
434
|
-
if (!field.name || field.name === "id") continue;
|
|
435
|
-
const expectedDbType = fieldToDrizzleType(field, this.dialect);
|
|
436
|
-
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
437
|
-
const info = existingCols.get(sqlName);
|
|
438
|
-
if (!info || info.type !== "character varying") continue;
|
|
439
|
-
if (expectedDbType === "text") {
|
|
440
|
-
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE TEXT`));
|
|
441
|
-
} else if (expectedDbType === "jsonb") {
|
|
442
|
-
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" DROP DEFAULT`));
|
|
443
|
-
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE JSONB USING (CASE WHEN "${sqlName}" IS NULL THEN NULL WHEN "${sqlName}"::text ~ '^\\s*\\{' THEN "${sqlName}"::jsonb ELSE jsonb_build_object('id', "${sqlName}"::text) END)`));
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
generateCreateColumns(config) {
|
|
449
|
-
const cols = [];
|
|
450
|
-
for (const field of config.fields) {
|
|
451
|
-
if (!field.name || field.name === "id") continue;
|
|
452
|
-
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
453
|
-
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
454
|
-
const nullable = field.required ? "NOT NULL" : "DEFAULT NULL";
|
|
455
|
-
let sqlType;
|
|
456
|
-
if (this.dialect === "sqlite") {
|
|
457
|
-
switch (dbType) {
|
|
458
|
-
case "varchar":
|
|
459
|
-
case "text":
|
|
460
|
-
sqlType = `TEXT ${nullable}`;
|
|
461
|
-
break;
|
|
462
|
-
case "integer":
|
|
463
|
-
sqlType = `INTEGER ${nullable}`;
|
|
464
|
-
break;
|
|
465
|
-
case "decimal":
|
|
466
|
-
case "numeric":
|
|
467
|
-
sqlType = `NUMERIC ${nullable}`;
|
|
468
|
-
break;
|
|
469
|
-
case "boolean":
|
|
470
|
-
sqlType = `INTEGER ${nullable}`;
|
|
471
|
-
break;
|
|
472
|
-
case "timestamp":
|
|
473
|
-
sqlType = `TEXT ${nullable}`;
|
|
474
|
-
break;
|
|
475
|
-
case "jsonb":
|
|
476
|
-
sqlType = `TEXT ${nullable}`;
|
|
477
|
-
break;
|
|
478
|
-
default:
|
|
479
|
-
sqlType = `TEXT ${nullable}`;
|
|
480
|
-
}
|
|
481
|
-
} else {
|
|
482
|
-
switch (dbType) {
|
|
483
|
-
case "varchar":
|
|
484
|
-
sqlType = `VARCHAR(255) ${nullable}`;
|
|
485
|
-
break;
|
|
486
|
-
case "integer":
|
|
487
|
-
sqlType = `INTEGER ${nullable}`;
|
|
488
|
-
break;
|
|
489
|
-
case "decimal":
|
|
490
|
-
sqlType = `DECIMAL ${nullable}`;
|
|
491
|
-
break;
|
|
492
|
-
case "boolean":
|
|
493
|
-
sqlType = `BOOLEAN ${nullable}`;
|
|
494
|
-
break;
|
|
495
|
-
case "timestamp":
|
|
496
|
-
sqlType = `TIMESTAMP ${nullable}`;
|
|
497
|
-
break;
|
|
498
|
-
case "jsonb":
|
|
499
|
-
sqlType = `JSONB ${nullable}`;
|
|
500
|
-
break;
|
|
501
|
-
default:
|
|
502
|
-
sqlType = `TEXT ${nullable}`;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
cols.push(`"${sqlName}" ${sqlType}`);
|
|
506
|
-
}
|
|
507
|
-
return cols.join(",\n ") + (cols.length > 0 ? "," : "");
|
|
508
|
-
}
|
|
509
|
-
async disconnect() {
|
|
510
|
-
this.connected = false;
|
|
511
|
-
}
|
|
512
|
-
async find(args) {
|
|
513
|
-
const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
|
|
514
|
-
const config = this.getCollection(slug);
|
|
515
|
-
const table = this.getTable(slug);
|
|
516
|
-
let effectiveWhere = { ...where };
|
|
517
|
-
if (this.tenantContext && config.tenantScoped) {
|
|
518
|
-
const rlsQuery = chunkGUUB5EAG_cjs.applyRLS({ where: effectiveWhere }, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG);
|
|
519
|
-
effectiveWhere = rlsQuery.where || {};
|
|
520
|
-
}
|
|
521
|
-
const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
|
|
522
|
-
if (!draft && table.status) {
|
|
523
|
-
filters.push(drizzleOrm.eq(table.status, "published"));
|
|
524
|
-
}
|
|
525
|
-
const sortOption = this.parseSort(sort);
|
|
526
|
-
const countWhere = !draft && table.status ? { ...effectiveWhere, status: "published" } : effectiveWhere;
|
|
527
|
-
const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });
|
|
528
|
-
const offset = (page - 1) * limit;
|
|
529
|
-
let results = [];
|
|
530
|
-
try {
|
|
531
|
-
const sortCol = table[sortOption.field] || table.createdAt || table.id;
|
|
532
|
-
const sorted = sortOption.direction === "asc" ? sortCol : drizzleOrm.desc(sortCol);
|
|
533
|
-
let query = this.client.select().from(table);
|
|
534
|
-
if (filters.length > 0) {
|
|
535
|
-
query = query.where(drizzleOrm.and(...filters));
|
|
536
|
-
}
|
|
537
|
-
results = await query.orderBy(sorted).limit(limit).offset(offset);
|
|
538
|
-
} catch (error) {
|
|
539
|
-
console.error(`[DrizzleAdapter] Query error:`, error);
|
|
540
|
-
}
|
|
541
|
-
let docs = results.map((doc) => this.processResult(doc, config));
|
|
542
|
-
if (this.tenantContext && !this.tenantContext.isSuperAdmin) {
|
|
543
|
-
docs = docs.filter((doc) => chunkGUUB5EAG_cjs.canAccessDocument(doc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG));
|
|
544
|
-
}
|
|
545
|
-
if (draft) {
|
|
546
|
-
docs = await Promise.all(docs.map(async (doc) => {
|
|
547
|
-
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
548
|
-
SELECT * FROM kyro_versions
|
|
549
|
-
WHERE collection_slug = ${slug}
|
|
550
|
-
AND document_id = ${doc.id}
|
|
551
|
-
ORDER BY created_at DESC
|
|
552
|
-
LIMIT 1
|
|
553
|
-
`);
|
|
554
|
-
if (versions.length > 0) {
|
|
555
|
-
const ver = versions[0];
|
|
556
|
-
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
557
|
-
return { ...doc, ...versionData, status: doc.status };
|
|
558
|
-
}
|
|
559
|
-
return doc;
|
|
560
|
-
}));
|
|
561
|
-
}
|
|
562
|
-
return {
|
|
563
|
-
docs,
|
|
564
|
-
...this.calculatePagination(page, limit, totalDocs)
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
async findByID(args) {
|
|
568
|
-
const { collection: slug, id, tenantID, draft } = args;
|
|
569
|
-
const config = this.getCollection(slug);
|
|
570
|
-
const table = this.getTable(slug);
|
|
571
|
-
if (this.tenantContext && config.tenantScoped) {
|
|
572
|
-
const tempDoc = { id, tenantId: this.tenantContext.tenantId };
|
|
573
|
-
if (!chunkGUUB5EAG_cjs.canAccessDocument(tempDoc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG)) {
|
|
574
|
-
return null;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
578
|
-
if (tenantID && table.tenantId) conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
579
|
-
if (!draft && table.status) conditions.push(drizzleOrm.eq(table.status, "published"));
|
|
580
|
-
const whereClause = conditions.length > 1 ? drizzleOrm.and(...conditions) : conditions[0];
|
|
581
|
-
let allRows = await this.client.select().from(table).where(whereClause);
|
|
582
|
-
if (allRows.length === 0) return null;
|
|
583
|
-
let doc = this.processResult(allRows[0], config);
|
|
584
|
-
if (draft) {
|
|
585
|
-
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
586
|
-
SELECT * FROM kyro_versions
|
|
587
|
-
WHERE collection_slug = ${slug}
|
|
588
|
-
AND document_id = ${doc.id}
|
|
589
|
-
ORDER BY created_at DESC
|
|
590
|
-
LIMIT 1
|
|
591
|
-
`);
|
|
592
|
-
if (versions.length > 0) {
|
|
593
|
-
const ver = versions[0];
|
|
594
|
-
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
595
|
-
doc = { ...doc, ...versionData, status: doc.status };
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
return doc;
|
|
599
|
-
}
|
|
600
|
-
async create(args) {
|
|
601
|
-
const { collection: slug, data, tenantID } = args;
|
|
602
|
-
const config = this.getCollection(slug);
|
|
603
|
-
const table = this.getTable(slug);
|
|
604
|
-
const insertData = this.prepareData(data, config);
|
|
605
|
-
if (tenantID) {
|
|
606
|
-
insertData.tenantId = tenantID;
|
|
607
|
-
}
|
|
608
|
-
const result = await this.client.insert(table).values(insertData).returning();
|
|
609
|
-
return this.processResult(result[0], config);
|
|
610
|
-
}
|
|
611
|
-
async update(args) {
|
|
612
|
-
const { collection: slug, id, data, tenantID } = args;
|
|
613
|
-
const config = this.getCollection(slug);
|
|
614
|
-
const table = this.getTable(slug);
|
|
615
|
-
const updateData = this.prepareData(data, config);
|
|
616
|
-
delete updateData.id;
|
|
617
|
-
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
618
|
-
if (tenantID && table.tenantId) {
|
|
619
|
-
conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
620
|
-
}
|
|
621
|
-
const result = await this.client.update(table).set(updateData).where(drizzleOrm.and(...conditions)).returning();
|
|
622
|
-
if (result.length === 0) {
|
|
623
|
-
throw new Error(`Document not found: ${slug}/${id}`);
|
|
624
|
-
}
|
|
625
|
-
return this.processResult(result[0], config);
|
|
626
|
-
}
|
|
627
|
-
async delete(args) {
|
|
628
|
-
const { collection: slug, id, tenantID } = args;
|
|
629
|
-
const config = this.getCollection(slug);
|
|
630
|
-
const table = this.getTable(slug);
|
|
631
|
-
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
632
|
-
if (tenantID && table.tenantId) {
|
|
633
|
-
conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
634
|
-
}
|
|
635
|
-
const result = await this.client.delete(table).where(drizzleOrm.and(...conditions)).returning();
|
|
636
|
-
if (result.length === 0) {
|
|
637
|
-
throw new Error(`Document not found: ${slug}/${id}`);
|
|
638
|
-
}
|
|
639
|
-
return this.processResult(result[0], config);
|
|
640
|
-
}
|
|
641
|
-
async count(args) {
|
|
642
|
-
const { collection: slug, where = {}, tenantID } = args;
|
|
643
|
-
const config = this.getCollection(slug);
|
|
644
|
-
const table = this.getTable(slug);
|
|
645
|
-
const filters = this.buildWhereClause(where, config, table, tenantID);
|
|
646
|
-
try {
|
|
647
|
-
let query = this.client.select({ count: drizzleOrm.sql`count(*)` }).from(table);
|
|
648
|
-
if (filters.length > 0) {
|
|
649
|
-
query = query.where(drizzleOrm.and(...filters));
|
|
650
|
-
}
|
|
651
|
-
const result = await query;
|
|
652
|
-
return Number(result[0]?.count || 0);
|
|
653
|
-
} catch {
|
|
654
|
-
return 0;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
async findOne(args) {
|
|
658
|
-
const { collection: slug, where = {}, tenantID, draft } = args;
|
|
659
|
-
if (slug.startsWith("_globals_")) {
|
|
660
|
-
const globalSlug = slug.replace("_globals_", "");
|
|
661
|
-
const globalConfig = this.globals.get(globalSlug);
|
|
662
|
-
if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
|
|
663
|
-
const table = this.getTable(slug);
|
|
664
|
-
let query = this.client.select().from(table);
|
|
665
|
-
if (!draft && table.status) {
|
|
666
|
-
query = query.where(drizzleOrm.eq(table.status, "published"));
|
|
667
|
-
}
|
|
668
|
-
const results = await query.limit(1);
|
|
669
|
-
if (results.length === 0) return null;
|
|
670
|
-
let doc = this.processResult(results[0], globalConfig);
|
|
671
|
-
if (draft) {
|
|
672
|
-
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
673
|
-
SELECT * FROM kyro_versions
|
|
674
|
-
WHERE collection_slug = ${slug}
|
|
675
|
-
AND document_id = ${globalSlug}
|
|
676
|
-
ORDER BY created_at DESC
|
|
677
|
-
LIMIT 1
|
|
678
|
-
`);
|
|
679
|
-
if (versions.length > 0) {
|
|
680
|
-
const ver = versions[0];
|
|
681
|
-
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
682
|
-
doc = { ...doc, ...versionData, status: doc.status };
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
return doc;
|
|
686
|
-
}
|
|
687
|
-
const result = await this.find({ ...args, limit: 1 });
|
|
688
|
-
return result.docs[0] || null;
|
|
689
|
-
}
|
|
690
|
-
async findVersions(args) {
|
|
691
|
-
await this.ensureVersionsTable();
|
|
692
|
-
const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;
|
|
693
|
-
const offset = (page - 1) * limit;
|
|
694
|
-
const countResult = await this.executeRaw(drizzleOrm.sql`
|
|
695
|
-
SELECT count(*) as count
|
|
696
|
-
FROM kyro_versions
|
|
697
|
-
WHERE collection_slug = ${slug}
|
|
698
|
-
AND document_id = ${documentId}
|
|
699
|
-
AND autosave = 0
|
|
700
|
-
${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
|
|
701
|
-
`);
|
|
702
|
-
const totalDocs = parseInt(countResult[0]?.count || "0");
|
|
703
|
-
const results = await this.executeRaw(drizzleOrm.sql`
|
|
704
|
-
SELECT *
|
|
705
|
-
FROM kyro_versions
|
|
706
|
-
WHERE collection_slug = ${slug}
|
|
707
|
-
AND document_id = ${documentId}
|
|
708
|
-
AND autosave = 0
|
|
709
|
-
${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
|
|
710
|
-
ORDER BY created_at DESC
|
|
711
|
-
LIMIT ${limit}
|
|
712
|
-
OFFSET ${offset}
|
|
713
|
-
`);
|
|
714
|
-
return {
|
|
715
|
-
docs: results.map((row) => ({
|
|
716
|
-
...row,
|
|
717
|
-
data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
|
|
718
|
-
})),
|
|
719
|
-
...this.calculatePagination(page, limit, totalDocs)
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
async findVersionByID(args) {
|
|
723
|
-
await this.ensureVersionsTable();
|
|
724
|
-
const results = await this.executeRaw(drizzleOrm.sql`
|
|
725
|
-
SELECT * FROM kyro_versions
|
|
726
|
-
WHERE id = ${args.versionId}
|
|
727
|
-
AND collection_slug = ${args.collection}
|
|
728
|
-
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
729
|
-
LIMIT 1
|
|
730
|
-
`);
|
|
731
|
-
if (results.length === 0) return null;
|
|
732
|
-
const row = results[0];
|
|
733
|
-
return {
|
|
734
|
-
...row,
|
|
735
|
-
data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
async createVersion(args) {
|
|
739
|
-
await this.ensureVersionsTable();
|
|
740
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
741
|
-
if (args.autosave) {
|
|
742
|
-
const existing = await this.executeRaw(drizzleOrm.sql`
|
|
743
|
-
SELECT * FROM kyro_versions
|
|
744
|
-
WHERE collection_slug = ${args.collection}
|
|
745
|
-
AND document_id = ${args.documentId}
|
|
746
|
-
AND autosave = 1
|
|
747
|
-
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
748
|
-
LIMIT 1
|
|
749
|
-
`);
|
|
750
|
-
if (existing.length > 0) {
|
|
751
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
752
|
-
UPDATE kyro_versions
|
|
753
|
-
SET data = ${JSON.stringify(args.data)},
|
|
754
|
-
status = ${args.status},
|
|
755
|
-
updated_at = ${now}
|
|
756
|
-
WHERE id = ${existing[0].id}
|
|
757
|
-
`);
|
|
758
|
-
return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
const id = Math.random().toString(36).substring(2, 15);
|
|
762
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
763
|
-
INSERT INTO kyro_versions (
|
|
764
|
-
id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
|
|
765
|
-
) VALUES (
|
|
766
|
-
${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
|
|
767
|
-
${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null},
|
|
768
|
-
${args.changeDescription || null}, ${now}, ${now}
|
|
769
|
-
)
|
|
770
|
-
`);
|
|
771
|
-
if (!args.autosave) {
|
|
772
|
-
const config = this.getCollection(args.collection);
|
|
773
|
-
if (config.versions?.maxPerDoc) {
|
|
774
|
-
await this.deleteVersions({
|
|
775
|
-
collection: args.collection,
|
|
776
|
-
documentId: args.documentId,
|
|
777
|
-
keepLatest: config.versions.maxPerDoc,
|
|
778
|
-
tenantID: args.tenantID
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
|
|
783
|
-
}
|
|
784
|
-
async updateLatestVersion(args) {
|
|
785
|
-
return this.createVersion({ ...args, autosave: true });
|
|
786
|
-
}
|
|
787
|
-
async deleteVersions(args) {
|
|
788
|
-
await this.ensureVersionsTable();
|
|
789
|
-
if (args.keepLatest) {
|
|
790
|
-
const toKeep = await this.executeRaw(drizzleOrm.sql`
|
|
791
|
-
SELECT id FROM kyro_versions
|
|
792
|
-
WHERE collection_slug = ${args.collection}
|
|
793
|
-
AND document_id = ${args.documentId}
|
|
794
|
-
AND autosave = 0
|
|
795
|
-
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
796
|
-
ORDER BY created_at DESC
|
|
797
|
-
LIMIT ${args.keepLatest}
|
|
798
|
-
`);
|
|
799
|
-
const keepIds = toKeep.map((r) => r.id);
|
|
800
|
-
if (keepIds.length > 0) {
|
|
801
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
802
|
-
DELETE FROM kyro_versions
|
|
803
|
-
WHERE collection_slug = ${args.collection}
|
|
804
|
-
AND document_id = ${args.documentId}
|
|
805
|
-
AND autosave = 0
|
|
806
|
-
AND id NOT IN (${drizzleOrm.sql.join(keepIds.map((id) => drizzleOrm.sql`${id}`), drizzleOrm.sql`, `)})
|
|
807
|
-
`);
|
|
808
|
-
}
|
|
809
|
-
} else {
|
|
810
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
811
|
-
DELETE FROM kyro_versions
|
|
812
|
-
WHERE collection_slug = ${args.collection}
|
|
813
|
-
AND document_id = ${args.documentId}
|
|
814
|
-
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
815
|
-
`);
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
// ========================================================================
|
|
819
|
-
// Helper Methods
|
|
820
|
-
// ========================================================================
|
|
821
|
-
getTable(slug) {
|
|
822
|
-
const tableName = this.getTableName(slug);
|
|
823
|
-
const table = this.schema[tableName];
|
|
824
|
-
if (!table) {
|
|
825
|
-
throw new Error(`Table "${tableName}" not found in schema`);
|
|
826
|
-
}
|
|
827
|
-
return table;
|
|
828
|
-
}
|
|
829
|
-
buildWhereClause(where, config, table, tenantID) {
|
|
830
|
-
const conditions = [];
|
|
831
|
-
if (tenantID && config.tenantScoped && table.tenantId) {
|
|
832
|
-
conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
833
|
-
}
|
|
834
|
-
for (const [key, value] of Object.entries(where)) {
|
|
835
|
-
if (key === "AND" && Array.isArray(value)) {
|
|
836
|
-
const andConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
|
|
837
|
-
if (andConditions.length > 0) {
|
|
838
|
-
conditions.push(drizzleOrm.and(...andConditions));
|
|
839
|
-
}
|
|
840
|
-
} else if (key === "OR" && Array.isArray(value)) {
|
|
841
|
-
const orConditions = value.map((sub) => this.buildWhereClause(sub, config, table)).flat().filter(Boolean);
|
|
842
|
-
if (orConditions.length > 0) {
|
|
843
|
-
conditions.push(drizzleOrm.or(...orConditions));
|
|
844
|
-
}
|
|
845
|
-
} else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
846
|
-
const col = table[key];
|
|
847
|
-
if (!col) continue;
|
|
848
|
-
if (value.equals !== void 0) conditions.push(drizzleOrm.eq(col, value.equals));
|
|
849
|
-
if (value.not_equals !== void 0) conditions.push(drizzleOrm.ne(col, value.not_equals));
|
|
850
|
-
if (value.in && Array.isArray(value.in)) conditions.push(drizzleOrm.inArray(col, value.in));
|
|
851
|
-
if (value.like !== void 0) conditions.push(drizzleOrm.like(col, value.like));
|
|
852
|
-
if (value.contains !== void 0) conditions.push(drizzleOrm.like(col, `%${value.contains}%`));
|
|
853
|
-
if (value.greater_than !== void 0) conditions.push(drizzleOrm.gt(col, value.greater_than));
|
|
854
|
-
if (value.greater_than_equal !== void 0) conditions.push(drizzleOrm.gte(col, value.greater_than_equal));
|
|
855
|
-
if (value.less_than !== void 0) conditions.push(drizzleOrm.lt(col, value.less_than));
|
|
856
|
-
if (value.less_than_equal !== void 0) conditions.push(drizzleOrm.lte(col, value.less_than_equal));
|
|
857
|
-
} else {
|
|
858
|
-
const col = table[key];
|
|
859
|
-
if (col) conditions.push(drizzleOrm.eq(col, value));
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
return conditions;
|
|
863
|
-
}
|
|
864
|
-
processResult(data, config) {
|
|
865
|
-
if (!data) return null;
|
|
866
|
-
const result = { ...data };
|
|
867
|
-
if (data.id) {
|
|
868
|
-
result.id = String(data.id);
|
|
869
|
-
}
|
|
870
|
-
for (const field of config.fields) {
|
|
871
|
-
if (!field.name) continue;
|
|
872
|
-
const sqlKey = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
873
|
-
if (sqlKey !== field.name && result[sqlKey] !== void 0 && result[field.name] === void 0) {
|
|
874
|
-
result[field.name] = result[sqlKey];
|
|
875
|
-
delete result[sqlKey];
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
for (const field of config.fields) {
|
|
879
|
-
if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(field.type)) {
|
|
880
|
-
const f = field;
|
|
881
|
-
if (result[f.name] && typeof result[f.name] === "string") {
|
|
882
|
-
try {
|
|
883
|
-
const parsed = JSON.parse(result[f.name]);
|
|
884
|
-
result[f.name] = parsed;
|
|
885
|
-
} catch {
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
890
|
-
if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
|
|
891
|
-
for (const tab of field.tabs) {
|
|
892
|
-
for (const tabField of tab.fields) {
|
|
893
|
-
if ((tabField.type === "upload" || tabField.type === "image") && tabField.name) {
|
|
894
|
-
const val = result[field.name][tabField.name];
|
|
895
|
-
if (typeof val === "string") {
|
|
896
|
-
try {
|
|
897
|
-
const parsed = JSON.parse(val);
|
|
898
|
-
result[field.name][tabField.name] = Array.isArray(parsed) ? parsed.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof parsed.id === "string" ? parsed.id : String(parsed.id || "");
|
|
899
|
-
} catch {
|
|
900
|
-
}
|
|
901
|
-
} else if (val && typeof val === "object") {
|
|
902
|
-
result[field.name][tabField.name] = Array.isArray(val) ? val.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof val.id === "string" ? val.id : String(val.id || "");
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
continue;
|
|
908
|
-
}
|
|
909
|
-
if (typeof result[field.name] === "string") {
|
|
910
|
-
try {
|
|
911
|
-
const parsed = JSON.parse(result[field.name]);
|
|
912
|
-
if (typeof parsed === "object" && parsed !== null) {
|
|
913
|
-
result[field.name] = parsed;
|
|
914
|
-
continue;
|
|
915
|
-
}
|
|
916
|
-
} catch {
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
const tabData = {};
|
|
920
|
-
for (const tab of field.tabs) {
|
|
921
|
-
for (const tabField of tab.fields) {
|
|
922
|
-
if (tabField.name && result[tabField.name] !== void 0) {
|
|
923
|
-
let value = result[tabField.name];
|
|
924
|
-
if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(tabField.type)) {
|
|
925
|
-
if (value && typeof value === "string") {
|
|
926
|
-
try {
|
|
927
|
-
value = JSON.parse(value);
|
|
928
|
-
} catch {
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
if ((tabField.type === "upload" || tabField.type === "image") && value && typeof value === "object") {
|
|
932
|
-
value = Array.isArray(value) ? value.map((item) => item && typeof item === "object" && typeof item.id === "string" ? item.id : String(item || "")) : typeof value.id === "string" ? value.id : String(value.id || "");
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
tabData[tabField.name] = value;
|
|
936
|
-
delete result[tabField.name];
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
result[field.name] = tabData;
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
if (result.createdAt) {
|
|
944
|
-
result.createdAt = new Date(result.createdAt).toISOString();
|
|
945
|
-
}
|
|
946
|
-
if (result.updatedAt) {
|
|
947
|
-
result.updatedAt = new Date(result.updatedAt).toISOString();
|
|
948
|
-
}
|
|
949
|
-
return result;
|
|
950
|
-
}
|
|
951
|
-
async ensureVersionsTable() {
|
|
952
|
-
if (this.versionsTableReady) return;
|
|
953
|
-
let createTableSQL;
|
|
954
|
-
if (this.dialect === "sqlite") {
|
|
955
|
-
createTableSQL = `
|
|
956
|
-
CREATE TABLE IF NOT EXISTS kyro_versions (
|
|
957
|
-
id text PRIMARY KEY,
|
|
958
|
-
collection_slug text NOT NULL,
|
|
959
|
-
document_id text NOT NULL,
|
|
960
|
-
tenant_id text,
|
|
961
|
-
data text NOT NULL,
|
|
962
|
-
status text NOT NULL DEFAULT 'draft',
|
|
963
|
-
autosave integer NOT NULL DEFAULT 0,
|
|
964
|
-
created_by text,
|
|
965
|
-
change_description text,
|
|
966
|
-
created_at text DEFAULT (datetime('now')),
|
|
967
|
-
updated_at text DEFAULT (datetime('now'))
|
|
968
|
-
)
|
|
969
|
-
`;
|
|
970
|
-
} else {
|
|
971
|
-
createTableSQL = `
|
|
972
|
-
CREATE TABLE IF NOT EXISTS kyro_versions (
|
|
973
|
-
id text PRIMARY KEY,
|
|
974
|
-
collection_slug text NOT NULL,
|
|
975
|
-
document_id text NOT NULL,
|
|
976
|
-
tenant_id text,
|
|
977
|
-
data text NOT NULL,
|
|
978
|
-
status text NOT NULL,
|
|
979
|
-
autosave integer NOT NULL DEFAULT 0,
|
|
980
|
-
created_by text,
|
|
981
|
-
change_description text,
|
|
982
|
-
created_at text NOT NULL,
|
|
983
|
-
updated_at text NOT NULL
|
|
984
|
-
)
|
|
985
|
-
`;
|
|
986
|
-
}
|
|
987
|
-
await this.executeRaw(drizzleOrm.sql.raw(createTableSQL));
|
|
988
|
-
try {
|
|
989
|
-
if (this.dialect === "postgres") {
|
|
990
|
-
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));
|
|
991
|
-
} else {
|
|
992
|
-
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));
|
|
993
|
-
}
|
|
994
|
-
} catch {
|
|
995
|
-
}
|
|
996
|
-
this.versionsTableReady = true;
|
|
997
|
-
}
|
|
998
|
-
async executeRaw(query) {
|
|
999
|
-
const result = await this.client.execute(query);
|
|
1000
|
-
if (Array.isArray(result)) {
|
|
1001
|
-
return result;
|
|
1002
|
-
}
|
|
1003
|
-
if (Array.isArray(result?.rows)) {
|
|
1004
|
-
return result.rows;
|
|
1005
|
-
}
|
|
1006
|
-
if (Array.isArray(result?.[0])) {
|
|
1007
|
-
return result[0];
|
|
1008
|
-
}
|
|
1009
|
-
return [];
|
|
1010
|
-
}
|
|
1011
|
-
};
|
|
1012
|
-
function createDrizzleAdapter(options) {
|
|
1013
|
-
return new DrizzleAdapter(options);
|
|
1014
|
-
}
|
|
1015
|
-
var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-GYIJ3JJM.cjs', document.baseURI).href)));
|
|
1016
|
-
var modPath = "node:sqlite";
|
|
1017
|
-
var { DatabaseSync } = _require(modPath);
|
|
1018
|
-
function getDialect() {
|
|
1019
|
-
const val = process.env.DB_TYPE;
|
|
1020
|
-
if (val === "postgres") return "postgres";
|
|
1021
|
-
return "sqlite";
|
|
1022
|
-
}
|
|
1023
|
-
function genId() {
|
|
1024
|
-
return crypto.randomBytes(16).toString("hex");
|
|
1025
|
-
}
|
|
1026
|
-
async function createDatabase() {
|
|
1027
|
-
const dialect = getDialect();
|
|
1028
|
-
if (dialect === "sqlite") {
|
|
1029
|
-
const dbPath = path.resolve(process.cwd(), "data", "kyro.db");
|
|
1030
|
-
await promises.mkdir(path.dirname(dbPath), { recursive: true });
|
|
1031
|
-
const db2 = new DatabaseSync(dbPath);
|
|
1032
|
-
db2.exec("PRAGMA journal_mode = WAL");
|
|
1033
|
-
return { db: db2, dialect, genId };
|
|
1034
|
-
}
|
|
1035
|
-
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
1036
|
-
const maxConnections = parseInt(process.env.DB_POOL_MAX || "10", 10);
|
|
1037
|
-
const ssl = process.env.DB_SSL === "true";
|
|
1038
|
-
const client = postgres__default.default(databaseUrl, {
|
|
1039
|
-
max: maxConnections,
|
|
1040
|
-
ssl: ssl ? "require" : false,
|
|
1041
|
-
onnotice: () => {
|
|
1042
|
-
}
|
|
1043
|
-
});
|
|
1044
|
-
const db = postgresJs.drizzle(client);
|
|
1045
|
-
return { db, dialect, genId };
|
|
1046
|
-
}
|
|
1047
|
-
async function runMigrations(_db, _dialect) {
|
|
1048
|
-
}
|
|
1049
|
-
async function seedDefaultRoles(db) {
|
|
1050
|
-
const { roles } = await import('./schema-6QL3USNB.cjs');
|
|
1051
|
-
await db.insert(roles).values({
|
|
1052
|
-
name: "super_admin",
|
|
1053
|
-
level: 100,
|
|
1054
|
-
inherits: [],
|
|
1055
|
-
description: "Full system access across all tenants",
|
|
1056
|
-
isSystem: true
|
|
1057
|
-
}).onConflictDoNothing();
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
exports.DrizzleAdapter = DrizzleAdapter;
|
|
1061
|
-
exports.collectionToDrizzleSchema = collectionToDrizzleSchema;
|
|
1062
|
-
exports.createDatabase = createDatabase;
|
|
1063
|
-
exports.createDrizzleAdapter = createDrizzleAdapter;
|
|
1064
|
-
exports.fieldToDrizzleType = fieldToDrizzleType;
|
|
1065
|
-
exports.genId = genId;
|
|
1066
|
-
exports.runMigrations = runMigrations;
|
|
1067
|
-
exports.seedDefaultRoles = seedDefaultRoles;
|
|
1068
|
-
//# sourceMappingURL=chunk-GYIJ3JJM.cjs.map
|
|
1069
|
-
//# sourceMappingURL=chunk-GYIJ3JJM.cjs.map
|