@kyro-cms/core 0.9.0 → 0.9.2
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/README.md +55 -593
- package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-BKszZlG0.d.cts} +1 -1
- package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-Ccf1j-IN.d.ts} +1 -1
- package/dist/api-handler-graphql.cjs +44 -0
- package/dist/api-handler-graphql.cjs.map +1 -0
- package/dist/api-handler-graphql.d.cts +6 -0
- package/dist/api-handler-graphql.d.ts +6 -0
- package/dist/api-handler-graphql.js +41 -0
- package/dist/api-handler-graphql.js.map +1 -0
- package/dist/api-handler-trpc.cjs +38 -0
- package/dist/api-handler-trpc.cjs.map +1 -0
- package/dist/api-handler-trpc.d.cts +5 -0
- package/dist/api-handler-trpc.d.ts +5 -0
- package/dist/api-handler-trpc.js +36 -0
- package/dist/api-handler-trpc.js.map +1 -0
- package/dist/api-handler.cjs +33 -99
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +2 -1
- package/dist/api-handler.d.ts +2 -1
- package/dist/api-handler.js +21 -97
- package/dist/api-handler.js.map +1 -1
- package/dist/{tenant-B1YB0Jy8.d.ts → base-CIuXkrH4.d.cts} +7 -15
- package/dist/{tenant-Cpeveji6.d.cts → base-fFo4lqER.d.ts} +7 -15
- package/dist/bootstrap-3PV3GJ3S.js +7 -0
- package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-3PV3GJ3S.js.map} +1 -1
- package/dist/bootstrap-4CELFLJO.cjs +32 -0
- package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-4CELFLJO.cjs.map} +1 -1
- package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
- package/dist/chunk-3HR772HI.cjs.map +1 -0
- package/dist/chunk-3KTWGODI.cjs +178 -0
- package/dist/chunk-3KTWGODI.cjs.map +1 -0
- package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
- package/dist/chunk-3UK5XBVJ.js.map +1 -0
- package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
- package/dist/chunk-4AO3A3JM.js.map +1 -0
- package/dist/{chunk-Z6ZWNWWR.js → chunk-4CV4JOE5.js} +3 -9
- package/dist/{chunk-Z6ZWNWWR.js.map → chunk-4CV4JOE5.js.map} +1 -1
- package/dist/chunk-4M7X5HAB.cjs +173 -0
- package/dist/chunk-4M7X5HAB.cjs.map +1 -0
- package/dist/chunk-53NYVYVX.js +3243 -0
- package/dist/chunk-53NYVYVX.js.map +1 -0
- package/dist/{chunk-35U3FROB.js → chunk-5H3MWQJS.js} +714 -184
- package/dist/chunk-5H3MWQJS.js.map +1 -0
- package/dist/{chunk-YVUJBEXE.cjs → chunk-5PMQQFRE.cjs} +16 -7
- package/dist/chunk-5PMQQFRE.cjs.map +1 -0
- package/dist/{chunk-57P6MJKC.js → chunk-6UNONDW7.js} +94 -10
- package/dist/chunk-6UNONDW7.js.map +1 -0
- package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
- package/dist/chunk-7OGPN7MP.js.map +1 -0
- package/dist/{chunk-2OL4O2TH.cjs → chunk-7OS7TX2Q.cjs} +68 -62
- package/dist/chunk-7OS7TX2Q.cjs.map +1 -0
- package/dist/{chunk-3TPQ2BU6.js → chunk-BYBMTIMT.js} +2 -6
- package/dist/chunk-BYBMTIMT.js.map +1 -0
- package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
- package/dist/chunk-CF7OL6HR.js.map +1 -0
- package/dist/chunk-CJONKRHJ.js +162 -0
- package/dist/chunk-CJONKRHJ.js.map +1 -0
- package/dist/{chunk-OHVB4AJ7.js → chunk-CJX74IYK.js} +24 -18
- package/dist/chunk-CJX74IYK.js.map +1 -0
- package/dist/{chunk-5KVM3WEY.cjs → chunk-CNKT4PME.cjs} +1592 -868
- package/dist/chunk-CNKT4PME.cjs.map +1 -0
- package/dist/{chunk-G7VZBCD6.cjs → chunk-CZLDE2OZ.cjs} +2 -9
- package/dist/{chunk-G7VZBCD6.cjs.map → chunk-CZLDE2OZ.cjs.map} +1 -1
- package/dist/{chunk-WQBRWOQT.cjs → chunk-DPA3KWPY.cjs} +4 -3
- package/dist/chunk-DPA3KWPY.cjs.map +1 -0
- package/dist/{chunk-LINKCEG4.cjs → chunk-E2763JUP.cjs} +726 -196
- package/dist/chunk-E2763JUP.cjs.map +1 -0
- package/dist/chunk-E5UJBLQ7.js +220 -0
- package/dist/chunk-E5UJBLQ7.js.map +1 -0
- package/dist/{chunk-DVD5P72E.cjs → chunk-EEJUFDMF.cjs} +2 -6
- package/dist/chunk-EEJUFDMF.cjs.map +1 -0
- package/dist/chunk-FSKONGCX.cjs +253 -0
- package/dist/chunk-FSKONGCX.cjs.map +1 -0
- package/dist/{chunk-Y3QQN7PN.js → chunk-GAAHG2Z4.js} +13 -4
- package/dist/chunk-GAAHG2Z4.js.map +1 -0
- package/dist/chunk-GAOXD3XT.js +175 -0
- package/dist/chunk-GAOXD3XT.js.map +1 -0
- package/dist/{chunk-SA7NSSIQ.cjs → chunk-GUUB5EAG.cjs} +13 -187
- package/dist/chunk-GUUB5EAG.cjs.map +1 -0
- package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
- package/dist/chunk-GXFOGU7N.cjs.map +1 -0
- package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
- package/dist/chunk-IDVRRRAK.cjs.map +1 -0
- package/dist/{chunk-HXRD4B37.js → chunk-IPTZM3VE.js} +1423 -704
- package/dist/chunk-IPTZM3VE.js.map +1 -0
- package/dist/chunk-KC2GDBLS.cjs +84 -0
- package/dist/chunk-KC2GDBLS.cjs.map +1 -0
- package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
- package/dist/chunk-L46ROHUS.cjs.map +1 -0
- package/dist/chunk-L4EZKIEX.js +185 -0
- package/dist/chunk-L4EZKIEX.js.map +1 -0
- package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
- package/dist/chunk-L5UKKZQN.js.map +1 -0
- package/dist/chunk-NKPKR5BW.cjs +188 -0
- package/dist/chunk-NKPKR5BW.cjs.map +1 -0
- package/dist/chunk-NWUEVLQT.cjs +99 -0
- package/dist/chunk-NWUEVLQT.cjs.map +1 -0
- package/dist/{chunk-3AJE4SEG.js → chunk-OHC6UHFY.js} +208 -76
- package/dist/chunk-OHC6UHFY.js.map +1 -0
- package/dist/chunk-PHJRNPHY.cjs +3291 -0
- package/dist/chunk-PHJRNPHY.cjs.map +1 -0
- package/dist/{chunk-DXHRBMGB.js → chunk-PQ72Z6WC.js} +67 -112
- package/dist/chunk-PQ72Z6WC.js.map +1 -0
- package/dist/{chunk-K7JPTH3G.cjs → chunk-PV2I2KMI.cjs} +214 -82
- package/dist/chunk-PV2I2KMI.cjs.map +1 -0
- package/dist/{chunk-PDYFVNUX.cjs → chunk-Q23GAMLE.cjs} +71 -116
- package/dist/chunk-Q23GAMLE.cjs.map +1 -0
- package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
- package/dist/chunk-Q72BOAPK.js.map +1 -0
- package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
- package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
- package/dist/{chunk-2KVHZE6O.cjs → chunk-RFFSZSCL.cjs} +282 -190
- package/dist/chunk-RFFSZSCL.cjs.map +1 -0
- package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
- package/dist/chunk-SHTTJMLT.cjs.map +1 -0
- package/dist/{chunk-WOWUL7ZY.js → chunk-UUDTPZX6.js} +5 -4
- package/dist/chunk-UUDTPZX6.js.map +1 -0
- package/dist/{chunk-QPPDLRNR.js → chunk-V7KZQIZ6.js} +277 -185
- package/dist/chunk-V7KZQIZ6.js.map +1 -0
- package/dist/{chunk-3ZFYL34R.js → chunk-WXVB364T.js} +12 -185
- package/dist/chunk-WXVB364T.js.map +1 -0
- package/dist/chunk-XEB7PH2E.js +81 -0
- package/dist/chunk-XEB7PH2E.js.map +1 -0
- package/dist/{chunk-IA6AU5PI.cjs → chunk-Y7AQK4R4.cjs} +94 -10
- package/dist/chunk-Y7AQK4R4.cjs.map +1 -0
- package/dist/chunk-YFAVQQTU.js +92 -0
- package/dist/chunk-YFAVQQTU.js.map +1 -0
- package/dist/cli/index.cjs +6 -6
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +6 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/client.cjs +4 -4
- package/dist/client.d.cts +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +2 -2
- package/dist/drizzle/index.cjs +15 -14
- package/dist/drizzle/index.d.cts +10 -14
- package/dist/drizzle/index.d.ts +10 -14
- package/dist/drizzle/index.js +6 -5
- package/dist/fields/index.cjs +22 -38
- package/dist/fields/index.d.cts +2 -22
- package/dist/fields/index.d.ts +2 -22
- package/dist/fields/index.js +2 -2
- package/dist/graphql/index.cjs +6 -5
- package/dist/graphql/index.d.cts +5 -3
- package/dist/graphql/index.d.ts +5 -3
- package/dist/graphql/index.js +4 -3
- package/dist/index-BKta3cBH.d.cts +277 -0
- package/dist/index-ClOqnkTO.d.ts +277 -0
- package/dist/index.cjs +310 -168
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +130 -211
- package/dist/index.d.ts +130 -211
- package/dist/index.js +174 -35
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +3 -3
- package/dist/integration.js +2 -2
- package/dist/media-7WDX4BDJ.js +4 -0
- package/dist/{media-GPPTZ43E.js.map → media-7WDX4BDJ.js.map} +1 -1
- package/dist/{media-XNTUFJZR.cjs → media-TUSLVRQ6.cjs} +3 -3
- package/dist/{media-XNTUFJZR.cjs.map → media-TUSLVRQ6.cjs.map} +1 -1
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs +17 -0
- package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-GT4S7SCU.cjs.map} +1 -1
- package/dist/mongo-auth-adapter-M7VV4LNB.js +4 -0
- package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-M7VV4LNB.js.map} +1 -1
- package/dist/mongodb/index.cjs +9 -8
- package/dist/mongodb/index.d.cts +6 -13
- package/dist/mongodb/index.d.ts +6 -13
- package/dist/mongodb/index.js +5 -4
- package/dist/postgres-auth-adapter-AFAPISH7.js +5 -0
- package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-AFAPISH7.js.map} +1 -1
- package/dist/postgres-auth-adapter-SFDTLONT.cjs +14 -0
- package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-SFDTLONT.cjs.map} +1 -1
- package/dist/redis-adapter-UQX4EE3B.cjs +13 -0
- package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-UQX4EE3B.cjs.map} +1 -1
- package/dist/redis-adapter-XALOGWY3.js +4 -0
- package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-XALOGWY3.js.map} +1 -1
- package/dist/rest/index.cjs +16 -15
- package/dist/rest/index.d.cts +4 -4
- package/dist/rest/index.d.ts +4 -4
- package/dist/rest/index.js +14 -13
- package/dist/{schema-37SE2F4B.cjs → schema-6QL3USNB.cjs} +15 -15
- package/dist/{schema-37SE2F4B.cjs.map → schema-6QL3USNB.cjs.map} +1 -1
- package/dist/{schema-5PHL5IVB.js → schema-FNNWEAAW.js} +4 -4
- package/dist/{schema-5PHL5IVB.js.map → schema-FNNWEAAW.js.map} +1 -1
- package/dist/sqlite-adapter-AQB5TCGV.cjs +13 -0
- package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-AQB5TCGV.cjs.map} +1 -1
- package/dist/sqlite-adapter-N5H6IM2X.js +4 -0
- package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-N5H6IM2X.js.map} +1 -1
- package/dist/templates/index.cjs +134 -32
- package/dist/templates/index.d.cts +52 -9
- package/dist/templates/index.d.ts +52 -9
- package/dist/templates/index.js +4 -2
- package/dist/trpc/index.cjs +14 -13
- package/dist/trpc/index.d.cts +55 -49
- package/dist/trpc/index.d.ts +55 -49
- package/dist/trpc/index.js +5 -4
- package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
- package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
- package/dist/{types-VtjUxIMp.d.cts → types-DeSApf9T.d.cts} +36 -14
- package/dist/{types-VtjUxIMp.d.ts → types-DeSApf9T.d.ts} +36 -14
- package/dist/{types-J3R9nVsZ.d.cts → types-Dgzlftb7.d.ts} +32 -28
- package/dist/{types-Bs1up4yP.d.ts → types-Ds0tCA3L.d.cts} +32 -28
- package/dist/ws/index.cjs +6 -6
- package/dist/ws/index.js +2 -2
- package/package.json +22 -4
- package/dist/bootstrap-AKAUP6F6.cjs +0 -32
- package/dist/bootstrap-JCML6NFO.js +0 -7
- package/dist/chunk-2KVHZE6O.cjs.map +0 -1
- package/dist/chunk-2OL4O2TH.cjs.map +0 -1
- package/dist/chunk-35U3FROB.js.map +0 -1
- package/dist/chunk-3AJE4SEG.js.map +0 -1
- package/dist/chunk-3J4MFTI3.js +0 -3872
- package/dist/chunk-3J4MFTI3.js.map +0 -1
- package/dist/chunk-3TPQ2BU6.js.map +0 -1
- package/dist/chunk-3ZFYL34R.js.map +0 -1
- package/dist/chunk-4DA7QPLA.cjs.map +0 -1
- package/dist/chunk-57P6MJKC.js.map +0 -1
- package/dist/chunk-5KVM3WEY.cjs.map +0 -1
- package/dist/chunk-6IMPH6WV.cjs +0 -3897
- package/dist/chunk-6IMPH6WV.cjs.map +0 -1
- package/dist/chunk-ATBOUGQP.cjs +0 -513
- package/dist/chunk-ATBOUGQP.cjs.map +0 -1
- package/dist/chunk-DVD5P72E.cjs.map +0 -1
- package/dist/chunk-DXHRBMGB.js.map +0 -1
- package/dist/chunk-ES5HNFFT.js.map +0 -1
- package/dist/chunk-FXYP2HA6.js.map +0 -1
- package/dist/chunk-H727JIG7.js.map +0 -1
- package/dist/chunk-HXRD4B37.js.map +0 -1
- package/dist/chunk-I7HHI6QV.cjs.map +0 -1
- package/dist/chunk-IA6AU5PI.cjs.map +0 -1
- package/dist/chunk-IBG6V56E.cjs.map +0 -1
- package/dist/chunk-K7JPTH3G.cjs.map +0 -1
- package/dist/chunk-LINKCEG4.cjs.map +0 -1
- package/dist/chunk-OHVB4AJ7.js.map +0 -1
- package/dist/chunk-PDYFVNUX.cjs.map +0 -1
- package/dist/chunk-Q23JB3KL.js +0 -488
- package/dist/chunk-Q23JB3KL.js.map +0 -1
- package/dist/chunk-QPPDLRNR.js.map +0 -1
- package/dist/chunk-QUW2RZTM.cjs.map +0 -1
- package/dist/chunk-QXIQWPAP.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-REK7AYOC.js.map +0 -1
- package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-V3LKPM3O.cjs.map +0 -1
- package/dist/chunk-VJT6P4N6.cjs.map +0 -1
- package/dist/chunk-WOWUL7ZY.js.map +0 -1
- package/dist/chunk-WQBRWOQT.cjs.map +0 -1
- package/dist/chunk-Y3N7UUDO.js.map +0 -1
- package/dist/chunk-Y3QQN7PN.js.map +0 -1
- package/dist/chunk-YVUJBEXE.cjs.map +0 -1
- package/dist/index-CLp-DRKA.d.ts +0 -64
- package/dist/index-DfO7G4kN.d.cts +0 -64
- package/dist/media-GPPTZ43E.js +0 -4
- package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
- package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
- package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
- package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
- package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
- package/dist/redis-adapter-VQXD7ESY.js +0 -4
- package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
- package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkGUUB5EAG_cjs = require('./chunk-GUUB5EAG.cjs');
|
|
4
4
|
var drizzleOrm = require('drizzle-orm');
|
|
5
5
|
var pgCore = require('drizzle-orm/pg-core');
|
|
6
6
|
var sqliteCore = require('drizzle-orm/sqlite-core');
|
|
@@ -22,11 +22,13 @@ function fieldToDrizzleType(field, dialect = "postgres") {
|
|
|
22
22
|
case "text":
|
|
23
23
|
case "email":
|
|
24
24
|
case "password":
|
|
25
|
-
case "textarea":
|
|
26
25
|
case "color":
|
|
26
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
27
|
+
case "textarea":
|
|
27
28
|
case "code":
|
|
28
29
|
case "markdown":
|
|
29
|
-
|
|
30
|
+
case "secret":
|
|
31
|
+
return "text";
|
|
30
32
|
case "number":
|
|
31
33
|
return field.integer ? "integer" : "decimal";
|
|
32
34
|
case "checkbox":
|
|
@@ -48,7 +50,7 @@ function fieldToDrizzleType(field, dialect = "postgres") {
|
|
|
48
50
|
case "relationship":
|
|
49
51
|
return dialect === "sqlite" ? "text" : "varchar";
|
|
50
52
|
case "upload":
|
|
51
|
-
return
|
|
53
|
+
return "jsonb";
|
|
52
54
|
default:
|
|
53
55
|
return "jsonb";
|
|
54
56
|
}
|
|
@@ -81,25 +83,17 @@ function collectionToDrizzleSchema(collection, dialect = "postgres") {
|
|
|
81
83
|
lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);
|
|
82
84
|
lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);
|
|
83
85
|
}
|
|
84
|
-
lines.push(`
|
|
85
|
-
lines.push(`
|
|
86
|
+
lines.push(` status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('status').default('draft'),`);
|
|
87
|
+
lines.push(` hasDraft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('hasDraft').default(false),`);
|
|
86
88
|
lines.push("});");
|
|
87
89
|
return lines.join("\n");
|
|
88
90
|
}
|
|
89
|
-
var DrizzleAdapter = class extends
|
|
91
|
+
var DrizzleAdapter = class extends chunkGUUB5EAG_cjs.AbstractBaseAdapter {
|
|
90
92
|
client;
|
|
91
93
|
schema;
|
|
92
94
|
dialect;
|
|
93
95
|
connectionString;
|
|
94
|
-
draftsTableReady = false;
|
|
95
96
|
versionsTableReady = false;
|
|
96
|
-
tenantContext;
|
|
97
|
-
setTenantContext(context) {
|
|
98
|
-
this.tenantContext = context;
|
|
99
|
-
}
|
|
100
|
-
getTenantContext() {
|
|
101
|
-
return this.tenantContext;
|
|
102
|
-
}
|
|
103
97
|
constructor(options) {
|
|
104
98
|
super();
|
|
105
99
|
this.schema = options.schema || {};
|
|
@@ -126,6 +120,14 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
126
120
|
if (result.updatedAt && typeof result.updatedAt === "string") {
|
|
127
121
|
result.updatedAt = new Date(result.updatedAt);
|
|
128
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
|
+
}
|
|
129
131
|
for (const field of config.fields) {
|
|
130
132
|
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
131
133
|
const isJsonb = dbType === "jsonb";
|
|
@@ -154,6 +156,14 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
154
156
|
}
|
|
155
157
|
}
|
|
156
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
|
+
}
|
|
157
167
|
return result;
|
|
158
168
|
}
|
|
159
169
|
async connect() {
|
|
@@ -270,8 +280,8 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
270
280
|
}
|
|
271
281
|
if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? sqliteCore.text("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("created_at").defaultNow();
|
|
272
282
|
if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? sqliteCore.text("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : pgCore.timestamp("updated_at").defaultNow();
|
|
273
|
-
columns.
|
|
274
|
-
columns.
|
|
283
|
+
columns.status = this.dialect === "sqlite" ? sqliteCore.text("status").default("draft") : pgCore.varchar("status", { length: 20 }).default("draft");
|
|
284
|
+
columns.hasDraft = this.dialect === "sqlite" ? sqliteCore.integer("hasDraft", { mode: "boolean" }).default(false) : pgCore.boolean("hasDraft").default(false);
|
|
275
285
|
return this.dialect === "sqlite" ? sqliteCore.sqliteTable(tableName, columns) : pgCore.pgTable(tableName, columns);
|
|
276
286
|
}
|
|
277
287
|
async ensureCollectionTables(collections) {
|
|
@@ -290,8 +300,8 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
290
300
|
${colDefs}
|
|
291
301
|
${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
292
302
|
${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
293
|
-
"
|
|
294
|
-
"
|
|
303
|
+
"status" VARCHAR(20) DEFAULT 'draft',
|
|
304
|
+
"hasDraft" BOOLEAN DEFAULT false
|
|
295
305
|
)
|
|
296
306
|
`);
|
|
297
307
|
} else {
|
|
@@ -302,8 +312,8 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
302
312
|
${colDefs}
|
|
303
313
|
${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
304
314
|
${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
305
|
-
"
|
|
306
|
-
"
|
|
315
|
+
"status" TEXT DEFAULT 'draft',
|
|
316
|
+
"hasDraft" INTEGER DEFAULT 0
|
|
307
317
|
)
|
|
308
318
|
`);
|
|
309
319
|
}
|
|
@@ -317,6 +327,126 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
317
327
|
}
|
|
318
328
|
}
|
|
319
329
|
}
|
|
330
|
+
for (const config of collections) {
|
|
331
|
+
const tableName = this.getTableName(config.slug);
|
|
332
|
+
if (tableName === "users" || tableName === "audit_logs") continue;
|
|
333
|
+
await this.syncTableColumns(config, tableName);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
getColumnSqlDefinition(field, dialect) {
|
|
337
|
+
const dbType = fieldToDrizzleType(field, dialect);
|
|
338
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
339
|
+
const sqlType = this.columnSqlType(dbType, dialect);
|
|
340
|
+
return `"${sqlName}" ${sqlType} DEFAULT NULL`;
|
|
341
|
+
}
|
|
342
|
+
columnSqlType(dbType, dialect) {
|
|
343
|
+
if (dialect === "sqlite") {
|
|
344
|
+
switch (dbType) {
|
|
345
|
+
case "varchar":
|
|
346
|
+
return "TEXT";
|
|
347
|
+
case "text":
|
|
348
|
+
return "TEXT";
|
|
349
|
+
case "integer":
|
|
350
|
+
return "INTEGER";
|
|
351
|
+
case "decimal":
|
|
352
|
+
case "numeric":
|
|
353
|
+
return "NUMERIC";
|
|
354
|
+
case "boolean":
|
|
355
|
+
return "INTEGER";
|
|
356
|
+
case "timestamp":
|
|
357
|
+
return "TEXT";
|
|
358
|
+
case "jsonb":
|
|
359
|
+
return "TEXT";
|
|
360
|
+
default:
|
|
361
|
+
return "TEXT";
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
switch (dbType) {
|
|
365
|
+
case "varchar":
|
|
366
|
+
return "VARCHAR(255)";
|
|
367
|
+
case "text":
|
|
368
|
+
return "TEXT";
|
|
369
|
+
case "integer":
|
|
370
|
+
return "INTEGER";
|
|
371
|
+
case "decimal":
|
|
372
|
+
case "numeric":
|
|
373
|
+
return "DECIMAL";
|
|
374
|
+
case "boolean":
|
|
375
|
+
return "BOOLEAN";
|
|
376
|
+
case "timestamp":
|
|
377
|
+
return "TIMESTAMP";
|
|
378
|
+
case "jsonb":
|
|
379
|
+
return "JSONB";
|
|
380
|
+
default:
|
|
381
|
+
return "TEXT";
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
getExpectedColumnDefs(config, tableName) {
|
|
385
|
+
const defs = {};
|
|
386
|
+
const isGlobal = config.slug.startsWith("_globals_");
|
|
387
|
+
const hasCreated = config.fields.some((f) => f.name === "createdAt");
|
|
388
|
+
const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
|
|
389
|
+
if (this.dialect === "postgres") {
|
|
390
|
+
defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
|
|
391
|
+
if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
|
|
392
|
+
if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
|
|
393
|
+
defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
|
|
394
|
+
defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
|
|
395
|
+
} else {
|
|
396
|
+
defs["id"] = '"id" TEXT PRIMARY KEY';
|
|
397
|
+
if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
|
|
398
|
+
if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
|
|
399
|
+
defs["status"] = '"status" TEXT DEFAULT NULL';
|
|
400
|
+
defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
|
|
401
|
+
}
|
|
402
|
+
for (const field of config.fields) {
|
|
403
|
+
if (!field.name || field.name === "id") continue;
|
|
404
|
+
const def = this.getColumnSqlDefinition(field, this.dialect);
|
|
405
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
406
|
+
defs[sqlName] = def;
|
|
407
|
+
}
|
|
408
|
+
return defs;
|
|
409
|
+
}
|
|
410
|
+
async syncTableColumns(config, tableName) {
|
|
411
|
+
let existingCols;
|
|
412
|
+
try {
|
|
413
|
+
if (this.dialect === "postgres") {
|
|
414
|
+
const result = await this.client.execute(
|
|
415
|
+
drizzleOrm.sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`
|
|
416
|
+
);
|
|
417
|
+
existingCols = new Map(result.map((r) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));
|
|
418
|
+
} else {
|
|
419
|
+
const result = await this.client.execute(
|
|
420
|
+
drizzleOrm.sql`PRAGMA table_info("${drizzleOrm.sql.raw(tableName)}")`
|
|
421
|
+
);
|
|
422
|
+
existingCols = new Map(result.map((r) => [r.name, { type: r.type, maxLen: null }]));
|
|
423
|
+
}
|
|
424
|
+
} catch {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const expected = this.getExpectedColumnDefs(config, tableName);
|
|
428
|
+
const missing = Object.keys(expected).filter((k) => !existingCols.has(k));
|
|
429
|
+
if (missing.length > 0) {
|
|
430
|
+
const alterStmts = missing.map((k) => `ALTER TABLE "${tableName}" ADD COLUMN ${expected[k]}`);
|
|
431
|
+
await this.executeRaw(drizzleOrm.sql.raw(alterStmts.join(";\n")));
|
|
432
|
+
}
|
|
433
|
+
if (this.dialect === "postgres") {
|
|
434
|
+
for (const field of config.fields) {
|
|
435
|
+
if (!field.name || field.name === "id") continue;
|
|
436
|
+
const expectedDbType = fieldToDrizzleType(field, this.dialect);
|
|
437
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
438
|
+
const info = existingCols.get(sqlName);
|
|
439
|
+
if (!info || info.type !== "character varying") continue;
|
|
440
|
+
if (expectedDbType === "text") {
|
|
441
|
+
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE TEXT`));
|
|
442
|
+
console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 TEXT`);
|
|
443
|
+
} else if (expectedDbType === "jsonb") {
|
|
444
|
+
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" DROP DEFAULT`));
|
|
445
|
+
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)`));
|
|
446
|
+
console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 JSONB`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
320
450
|
}
|
|
321
451
|
generateCreateColumns(config) {
|
|
322
452
|
const cols = [];
|
|
@@ -389,15 +519,16 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
389
519
|
const table = this.getTable(slug);
|
|
390
520
|
let effectiveWhere = { ...where };
|
|
391
521
|
if (this.tenantContext && config.tenantScoped) {
|
|
392
|
-
const rlsQuery =
|
|
522
|
+
const rlsQuery = chunkGUUB5EAG_cjs.applyRLS({ where: effectiveWhere }, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG);
|
|
393
523
|
effectiveWhere = rlsQuery.where || {};
|
|
394
524
|
}
|
|
395
525
|
const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
|
|
396
|
-
if (!draft && table.
|
|
397
|
-
filters.push(drizzleOrm.eq(table.
|
|
526
|
+
if (!draft && table.status) {
|
|
527
|
+
filters.push(drizzleOrm.eq(table.status, "published"));
|
|
398
528
|
}
|
|
399
529
|
const sortOption = this.parseSort(sort);
|
|
400
|
-
const
|
|
530
|
+
const countWhere = !draft && table.status ? { ...effectiveWhere, status: "published" } : effectiveWhere;
|
|
531
|
+
const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });
|
|
401
532
|
const offset = (page - 1) * limit;
|
|
402
533
|
let results = [];
|
|
403
534
|
try {
|
|
@@ -413,20 +544,21 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
413
544
|
}
|
|
414
545
|
let docs = results.map((doc) => this.processResult(doc, config));
|
|
415
546
|
if (this.tenantContext && !this.tenantContext.isSuperAdmin) {
|
|
416
|
-
docs = docs.filter((doc) =>
|
|
547
|
+
docs = docs.filter((doc) => chunkGUUB5EAG_cjs.canAccessDocument(doc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG));
|
|
417
548
|
}
|
|
418
549
|
if (draft) {
|
|
419
550
|
docs = await Promise.all(docs.map(async (doc) => {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
551
|
+
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
552
|
+
SELECT * FROM kyro_versions
|
|
553
|
+
WHERE collection_slug = ${slug}
|
|
554
|
+
AND document_id = ${doc.id}
|
|
555
|
+
ORDER BY created_at DESC
|
|
556
|
+
LIMIT 1
|
|
557
|
+
`);
|
|
558
|
+
if (versions.length > 0) {
|
|
559
|
+
const ver = versions[0];
|
|
560
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
561
|
+
return { ...doc, ...versionData, status: doc.status };
|
|
430
562
|
}
|
|
431
563
|
return doc;
|
|
432
564
|
}));
|
|
@@ -442,26 +574,29 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
442
574
|
const table = this.getTable(slug);
|
|
443
575
|
if (this.tenantContext && config.tenantScoped) {
|
|
444
576
|
const tempDoc = { id, tenantId: this.tenantContext.tenantId };
|
|
445
|
-
if (!
|
|
577
|
+
if (!chunkGUUB5EAG_cjs.canAccessDocument(tempDoc, slug, this.tenantContext, chunkGUUB5EAG_cjs.DEFAULT_RLS_CONFIG)) {
|
|
446
578
|
return null;
|
|
447
579
|
}
|
|
448
580
|
}
|
|
449
581
|
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
450
582
|
if (tenantID && table.tenantId) conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
451
|
-
if (!draft && table.
|
|
583
|
+
if (!draft && table.status) conditions.push(drizzleOrm.eq(table.status, "published"));
|
|
452
584
|
const whereClause = conditions.length > 1 ? drizzleOrm.and(...conditions) : conditions[0];
|
|
453
585
|
let allRows = await this.client.select().from(table).where(whereClause);
|
|
454
586
|
if (allRows.length === 0) return null;
|
|
455
587
|
let doc = this.processResult(allRows[0], config);
|
|
456
|
-
if (draft
|
|
457
|
-
const versions = await this.
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
588
|
+
if (draft) {
|
|
589
|
+
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
590
|
+
SELECT * FROM kyro_versions
|
|
591
|
+
WHERE collection_slug = ${slug}
|
|
592
|
+
AND document_id = ${doc.id}
|
|
593
|
+
ORDER BY created_at DESC
|
|
594
|
+
LIMIT 1
|
|
595
|
+
`);
|
|
596
|
+
if (versions.length > 0) {
|
|
597
|
+
const ver = versions[0];
|
|
598
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
599
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
465
600
|
}
|
|
466
601
|
}
|
|
467
602
|
return doc;
|
|
@@ -482,21 +617,27 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
482
617
|
const config = this.getCollection(slug);
|
|
483
618
|
const table = this.getTable(slug);
|
|
484
619
|
const updateData = this.prepareData(data, config);
|
|
485
|
-
|
|
486
|
-
|
|
620
|
+
delete updateData.id;
|
|
621
|
+
console.log(`[DrizzleAdapter.update] CALLED for ${slug}/${id}`);
|
|
622
|
+
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
623
|
+
if (tenantID && table.tenantId) {
|
|
624
|
+
conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
625
|
+
}
|
|
626
|
+
const result = await this.client.update(table).set(updateData).where(drizzleOrm.and(...conditions)).returning();
|
|
627
|
+
if (result.length === 0) {
|
|
628
|
+
throw new Error(`Document not found: ${slug}/${id}`);
|
|
487
629
|
}
|
|
488
|
-
const result = await this.client.update(table).set(updateData).where(drizzleOrm.eq(table.id, id)).returning();
|
|
489
630
|
return this.processResult(result[0], config);
|
|
490
631
|
}
|
|
491
632
|
async delete(args) {
|
|
492
633
|
const { collection: slug, id, tenantID } = args;
|
|
493
634
|
const config = this.getCollection(slug);
|
|
494
635
|
const table = this.getTable(slug);
|
|
495
|
-
|
|
636
|
+
const conditions = [drizzleOrm.eq(table.id, id)];
|
|
496
637
|
if (tenantID && table.tenantId) {
|
|
497
|
-
|
|
638
|
+
conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
|
|
498
639
|
}
|
|
499
|
-
const result = await
|
|
640
|
+
const result = await this.client.delete(table).where(drizzleOrm.and(...conditions)).returning();
|
|
500
641
|
if (result.length === 0) {
|
|
501
642
|
throw new Error(`Document not found: ${slug}/${id}`);
|
|
502
643
|
}
|
|
@@ -526,21 +667,24 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
526
667
|
if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
|
|
527
668
|
const table = this.getTable(slug);
|
|
528
669
|
let query = this.client.select().from(table);
|
|
529
|
-
if (!draft && table.
|
|
530
|
-
query = query.where(drizzleOrm.eq(table.
|
|
670
|
+
if (!draft && table.status) {
|
|
671
|
+
query = query.where(drizzleOrm.eq(table.status, "published"));
|
|
531
672
|
}
|
|
532
673
|
const results = await query.limit(1);
|
|
533
674
|
if (results.length === 0) return null;
|
|
534
675
|
let doc = this.processResult(results[0], globalConfig);
|
|
535
|
-
if (draft
|
|
536
|
-
const versions = await this.
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
676
|
+
if (draft) {
|
|
677
|
+
const versions = await this.executeRaw(drizzleOrm.sql`
|
|
678
|
+
SELECT * FROM kyro_versions
|
|
679
|
+
WHERE collection_slug = ${slug}
|
|
680
|
+
AND document_id = ${globalSlug}
|
|
681
|
+
ORDER BY created_at DESC
|
|
682
|
+
LIMIT 1
|
|
683
|
+
`);
|
|
684
|
+
if (versions.length > 0) {
|
|
685
|
+
const ver = versions[0];
|
|
686
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
687
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
544
688
|
}
|
|
545
689
|
}
|
|
546
690
|
return doc;
|
|
@@ -557,6 +701,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
557
701
|
FROM kyro_versions
|
|
558
702
|
WHERE collection_slug = ${slug}
|
|
559
703
|
AND document_id = ${documentId}
|
|
704
|
+
AND autosave = 0
|
|
560
705
|
${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
|
|
561
706
|
`);
|
|
562
707
|
const totalDocs = parseInt(countResult[0]?.count || "0");
|
|
@@ -565,6 +710,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
565
710
|
FROM kyro_versions
|
|
566
711
|
WHERE collection_slug = ${slug}
|
|
567
712
|
AND document_id = ${documentId}
|
|
713
|
+
AND autosave = 0
|
|
568
714
|
${tenantID ? drizzleOrm.sql`AND tenant_id = ${tenantID}` : drizzleOrm.sql``}
|
|
569
715
|
ORDER BY created_at DESC
|
|
570
716
|
LIMIT ${limit}
|
|
@@ -596,28 +742,53 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
596
742
|
}
|
|
597
743
|
async createVersion(args) {
|
|
598
744
|
await this.ensureVersionsTable();
|
|
599
|
-
const id = Math.random().toString(36).substring(2, 15);
|
|
600
745
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
746
|
+
if (args.autosave) {
|
|
747
|
+
const existing = await this.executeRaw(drizzleOrm.sql`
|
|
748
|
+
SELECT * FROM kyro_versions
|
|
749
|
+
WHERE collection_slug = ${args.collection}
|
|
750
|
+
AND document_id = ${args.documentId}
|
|
751
|
+
AND autosave = 1
|
|
752
|
+
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
753
|
+
LIMIT 1
|
|
754
|
+
`);
|
|
755
|
+
if (existing.length > 0) {
|
|
756
|
+
await this.executeRaw(drizzleOrm.sql`
|
|
757
|
+
UPDATE kyro_versions
|
|
758
|
+
SET data = ${JSON.stringify(args.data)},
|
|
759
|
+
status = ${args.status},
|
|
760
|
+
updated_at = ${now}
|
|
761
|
+
WHERE id = ${existing[0].id}
|
|
762
|
+
`);
|
|
763
|
+
return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
const id = Math.random().toString(36).substring(2, 15);
|
|
601
767
|
await this.executeRaw(drizzleOrm.sql`
|
|
602
768
|
INSERT INTO kyro_versions (
|
|
603
|
-
id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at
|
|
769
|
+
id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
|
|
604
770
|
) VALUES (
|
|
605
771
|
${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
|
|
606
|
-
${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null},
|
|
772
|
+
${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null},
|
|
607
773
|
${args.changeDescription || null}, ${now}, ${now}
|
|
608
774
|
)
|
|
609
775
|
`);
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
776
|
+
if (!args.autosave) {
|
|
777
|
+
const config = this.getCollection(args.collection);
|
|
778
|
+
if (config.versions?.maxPerDoc) {
|
|
779
|
+
await this.deleteVersions({
|
|
780
|
+
collection: args.collection,
|
|
781
|
+
documentId: args.documentId,
|
|
782
|
+
keepLatest: config.versions.maxPerDoc,
|
|
783
|
+
tenantID: args.tenantID
|
|
784
|
+
});
|
|
785
|
+
}
|
|
618
786
|
}
|
|
619
787
|
return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
|
|
620
788
|
}
|
|
789
|
+
async updateLatestVersion(args) {
|
|
790
|
+
return this.createVersion({ ...args, autosave: true });
|
|
791
|
+
}
|
|
621
792
|
async deleteVersions(args) {
|
|
622
793
|
await this.ensureVersionsTable();
|
|
623
794
|
if (args.keepLatest) {
|
|
@@ -625,6 +796,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
625
796
|
SELECT id FROM kyro_versions
|
|
626
797
|
WHERE collection_slug = ${args.collection}
|
|
627
798
|
AND document_id = ${args.documentId}
|
|
799
|
+
AND autosave = 0
|
|
628
800
|
${args.tenantID ? drizzleOrm.sql`AND tenant_id = ${args.tenantID}` : drizzleOrm.sql``}
|
|
629
801
|
ORDER BY created_at DESC
|
|
630
802
|
LIMIT ${args.keepLatest}
|
|
@@ -635,6 +807,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
635
807
|
DELETE FROM kyro_versions
|
|
636
808
|
WHERE collection_slug = ${args.collection}
|
|
637
809
|
AND document_id = ${args.documentId}
|
|
810
|
+
AND autosave = 0
|
|
638
811
|
AND id NOT IN (${drizzleOrm.sql.join(keepIds.map((id) => drizzleOrm.sql`${id}`), drizzleOrm.sql`, `)})
|
|
639
812
|
`);
|
|
640
813
|
}
|
|
@@ -647,65 +820,6 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
647
820
|
`);
|
|
648
821
|
}
|
|
649
822
|
}
|
|
650
|
-
async findDraft(args) {
|
|
651
|
-
await this.ensureDraftsTable();
|
|
652
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
653
|
-
const rows = await this.executeRaw(drizzleOrm.sql`
|
|
654
|
-
SELECT *
|
|
655
|
-
FROM kyro_drafts
|
|
656
|
-
WHERE id = ${draftId}
|
|
657
|
-
LIMIT 1
|
|
658
|
-
`);
|
|
659
|
-
const row = rows[0];
|
|
660
|
-
return row ? this.rowToDraft(row) : null;
|
|
661
|
-
}
|
|
662
|
-
async upsertDraft(args) {
|
|
663
|
-
await this.ensureDraftsTable();
|
|
664
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
665
|
-
const draftUpdatedAt = args.draftUpdatedAt || now;
|
|
666
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
667
|
-
const existing = await this.findDraft(args);
|
|
668
|
-
if (existing) {
|
|
669
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
670
|
-
UPDATE kyro_drafts
|
|
671
|
-
SET
|
|
672
|
-
data = ${JSON.stringify(args.data)},
|
|
673
|
-
base_updated_at = ${args.baseUpdatedAt ?? null},
|
|
674
|
-
draft_updated_at = ${draftUpdatedAt},
|
|
675
|
-
updated_at = ${now}
|
|
676
|
-
WHERE id = ${draftId}
|
|
677
|
-
`);
|
|
678
|
-
} else {
|
|
679
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
680
|
-
INSERT INTO kyro_drafts (
|
|
681
|
-
id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
|
|
682
|
-
) VALUES (
|
|
683
|
-
${draftId},
|
|
684
|
-
${args.collection},
|
|
685
|
-
${args.documentId},
|
|
686
|
-
${args.tenantID ?? null},
|
|
687
|
-
${JSON.stringify(args.data)},
|
|
688
|
-
${args.baseUpdatedAt ?? null},
|
|
689
|
-
${draftUpdatedAt},
|
|
690
|
-
${now},
|
|
691
|
-
${now}
|
|
692
|
-
)
|
|
693
|
-
`);
|
|
694
|
-
}
|
|
695
|
-
const saved = await this.findDraft(args);
|
|
696
|
-
if (!saved) {
|
|
697
|
-
throw new Error("Failed to persist draft snapshot");
|
|
698
|
-
}
|
|
699
|
-
return saved;
|
|
700
|
-
}
|
|
701
|
-
async deleteDraft(args) {
|
|
702
|
-
await this.ensureDraftsTable();
|
|
703
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
704
|
-
await this.executeRaw(drizzleOrm.sql`
|
|
705
|
-
DELETE FROM kyro_drafts
|
|
706
|
-
WHERE id = ${draftId}
|
|
707
|
-
`);
|
|
708
|
-
}
|
|
709
823
|
// ========================================================================
|
|
710
824
|
// Helper Methods
|
|
711
825
|
// ========================================================================
|
|
@@ -779,6 +893,22 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
779
893
|
}
|
|
780
894
|
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
781
895
|
if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
|
|
896
|
+
for (const tab of field.tabs) {
|
|
897
|
+
for (const tabField of tab.fields) {
|
|
898
|
+
if ((tabField.type === "upload" || tabField.type === "image") && tabField.name) {
|
|
899
|
+
const val = result[field.name][tabField.name];
|
|
900
|
+
if (typeof val === "string") {
|
|
901
|
+
try {
|
|
902
|
+
const parsed = JSON.parse(val);
|
|
903
|
+
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 || "");
|
|
904
|
+
} catch {
|
|
905
|
+
}
|
|
906
|
+
} else if (val && typeof val === "object") {
|
|
907
|
+
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 || "");
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
}
|
|
782
912
|
continue;
|
|
783
913
|
}
|
|
784
914
|
if (typeof result[field.name] === "string") {
|
|
@@ -803,6 +933,9 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
803
933
|
} catch {
|
|
804
934
|
}
|
|
805
935
|
}
|
|
936
|
+
if ((tabField.type === "upload" || tabField.type === "image") && value && typeof value === "object") {
|
|
937
|
+
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 || "");
|
|
938
|
+
}
|
|
806
939
|
}
|
|
807
940
|
tabData[tabField.name] = value;
|
|
808
941
|
delete result[tabField.name];
|
|
@@ -820,43 +953,8 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
820
953
|
}
|
|
821
954
|
return result;
|
|
822
955
|
}
|
|
823
|
-
async ensureDraftsTable() {
|
|
824
|
-
if (_schemaEnsured || this.draftsTableReady) return;
|
|
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));
|
|
856
|
-
this.draftsTableReady = true;
|
|
857
|
-
}
|
|
858
956
|
async ensureVersionsTable() {
|
|
859
|
-
if (
|
|
957
|
+
if (this.versionsTableReady) return;
|
|
860
958
|
let createTableSQL;
|
|
861
959
|
if (this.dialect === "sqlite") {
|
|
862
960
|
createTableSQL = `
|
|
@@ -867,6 +965,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
867
965
|
tenant_id text,
|
|
868
966
|
data text NOT NULL,
|
|
869
967
|
status text NOT NULL DEFAULT 'draft',
|
|
968
|
+
autosave integer NOT NULL DEFAULT 0,
|
|
870
969
|
created_by text,
|
|
871
970
|
change_description text,
|
|
872
971
|
created_at text DEFAULT (datetime('now')),
|
|
@@ -882,6 +981,7 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
882
981
|
tenant_id text,
|
|
883
982
|
data text NOT NULL,
|
|
884
983
|
status text NOT NULL,
|
|
984
|
+
autosave integer NOT NULL DEFAULT 0,
|
|
885
985
|
created_by text,
|
|
886
986
|
change_description text,
|
|
887
987
|
created_at text NOT NULL,
|
|
@@ -890,11 +990,16 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
890
990
|
`;
|
|
891
991
|
}
|
|
892
992
|
await this.executeRaw(drizzleOrm.sql.raw(createTableSQL));
|
|
993
|
+
try {
|
|
994
|
+
if (this.dialect === "postgres") {
|
|
995
|
+
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));
|
|
996
|
+
} else {
|
|
997
|
+
await this.executeRaw(drizzleOrm.sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));
|
|
998
|
+
}
|
|
999
|
+
} catch {
|
|
1000
|
+
}
|
|
893
1001
|
this.versionsTableReady = true;
|
|
894
1002
|
}
|
|
895
|
-
getDraftId(collection, documentId, tenantID) {
|
|
896
|
-
return `${collection}::${documentId}::${tenantID || "global"}`;
|
|
897
|
-
}
|
|
898
1003
|
async executeRaw(query) {
|
|
899
1004
|
const result = await this.client.execute(query);
|
|
900
1005
|
if (Array.isArray(result)) {
|
|
@@ -908,24 +1013,11 @@ var DrizzleAdapter = class extends chunkSA7NSSIQ_cjs.AbstractBaseAdapter {
|
|
|
908
1013
|
}
|
|
909
1014
|
return [];
|
|
910
1015
|
}
|
|
911
|
-
rowToDraft(row) {
|
|
912
|
-
return {
|
|
913
|
-
id: String(row.id),
|
|
914
|
-
collection: row.collection_slug,
|
|
915
|
-
documentId: row.document_id,
|
|
916
|
-
tenantID: row.tenant_id ?? void 0,
|
|
917
|
-
data: row.data ? JSON.parse(row.data) : {},
|
|
918
|
-
baseUpdatedAt: row.base_updated_at ?? null,
|
|
919
|
-
draftUpdatedAt: row.draft_updated_at,
|
|
920
|
-
createdAt: row.created_at,
|
|
921
|
-
updatedAt: row.updated_at
|
|
922
|
-
};
|
|
923
|
-
}
|
|
924
1016
|
};
|
|
925
1017
|
function createDrizzleAdapter(options) {
|
|
926
1018
|
return new DrizzleAdapter(options);
|
|
927
1019
|
}
|
|
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-
|
|
1020
|
+
var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-RFFSZSCL.cjs', document.baseURI).href)));
|
|
929
1021
|
var modPath = "node:sqlite";
|
|
930
1022
|
var { DatabaseSync } = _require(modPath);
|
|
931
1023
|
function getDialect() {
|
|
@@ -963,7 +1055,7 @@ async function runMigrations(_db, _dialect) {
|
|
|
963
1055
|
);
|
|
964
1056
|
}
|
|
965
1057
|
async function seedDefaultRoles(db) {
|
|
966
|
-
const { roles } = await import('./schema-
|
|
1058
|
+
const { roles } = await import('./schema-6QL3USNB.cjs');
|
|
967
1059
|
await db.insert(roles).values({
|
|
968
1060
|
name: "super_admin",
|
|
969
1061
|
level: 100,
|
|
@@ -981,5 +1073,5 @@ exports.fieldToDrizzleType = fieldToDrizzleType;
|
|
|
981
1073
|
exports.genId = genId;
|
|
982
1074
|
exports.runMigrations = runMigrations;
|
|
983
1075
|
exports.seedDefaultRoles = seedDefaultRoles;
|
|
984
|
-
//# sourceMappingURL=chunk-
|
|
985
|
-
//# sourceMappingURL=chunk-
|
|
1076
|
+
//# sourceMappingURL=chunk-RFFSZSCL.cjs.map
|
|
1077
|
+
//# sourceMappingURL=chunk-RFFSZSCL.cjs.map
|