@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,4 +1,4 @@
|
|
|
1
|
-
import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-
|
|
1
|
+
import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-WXVB364T.js';
|
|
2
2
|
import { sql, eq, desc, and, or, ne, inArray, like, gt, gte, lt, lte } from 'drizzle-orm';
|
|
3
3
|
import { text, uuid, jsonb, timestamp, boolean, decimal, integer as integer$1, varchar, pgTable } from 'drizzle-orm/pg-core';
|
|
4
4
|
import { text as text$1, integer, numeric, sqliteTable } from 'drizzle-orm/sqlite-core';
|
|
@@ -15,11 +15,13 @@ function fieldToDrizzleType(field, dialect = "postgres") {
|
|
|
15
15
|
case "text":
|
|
16
16
|
case "email":
|
|
17
17
|
case "password":
|
|
18
|
-
case "textarea":
|
|
19
18
|
case "color":
|
|
19
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
20
|
+
case "textarea":
|
|
20
21
|
case "code":
|
|
21
22
|
case "markdown":
|
|
22
|
-
|
|
23
|
+
case "secret":
|
|
24
|
+
return "text";
|
|
23
25
|
case "number":
|
|
24
26
|
return field.integer ? "integer" : "decimal";
|
|
25
27
|
case "checkbox":
|
|
@@ -41,7 +43,7 @@ function fieldToDrizzleType(field, dialect = "postgres") {
|
|
|
41
43
|
case "relationship":
|
|
42
44
|
return dialect === "sqlite" ? "text" : "varchar";
|
|
43
45
|
case "upload":
|
|
44
|
-
return
|
|
46
|
+
return "jsonb";
|
|
45
47
|
default:
|
|
46
48
|
return "jsonb";
|
|
47
49
|
}
|
|
@@ -74,8 +76,8 @@ function collectionToDrizzleSchema(collection, dialect = "postgres") {
|
|
|
74
76
|
lines.push(` createdAt: pg.timestamp('created_at').defaultNow(),`);
|
|
75
77
|
lines.push(` updatedAt: pg.timestamp('updated_at').defaultNow(),`);
|
|
76
78
|
}
|
|
77
|
-
lines.push(`
|
|
78
|
-
lines.push(`
|
|
79
|
+
lines.push(` status: ${dialect === "sqlite" ? "sqlite" : "pg"}.varchar('status').default('draft'),`);
|
|
80
|
+
lines.push(` hasDraft: ${dialect === "sqlite" ? "sqlite" : "pg"}.boolean('hasDraft').default(false),`);
|
|
79
81
|
lines.push("});");
|
|
80
82
|
return lines.join("\n");
|
|
81
83
|
}
|
|
@@ -84,15 +86,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
84
86
|
schema;
|
|
85
87
|
dialect;
|
|
86
88
|
connectionString;
|
|
87
|
-
draftsTableReady = false;
|
|
88
89
|
versionsTableReady = false;
|
|
89
|
-
tenantContext;
|
|
90
|
-
setTenantContext(context) {
|
|
91
|
-
this.tenantContext = context;
|
|
92
|
-
}
|
|
93
|
-
getTenantContext() {
|
|
94
|
-
return this.tenantContext;
|
|
95
|
-
}
|
|
96
90
|
constructor(options) {
|
|
97
91
|
super();
|
|
98
92
|
this.schema = options.schema || {};
|
|
@@ -119,6 +113,14 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
119
113
|
if (result.updatedAt && typeof result.updatedAt === "string") {
|
|
120
114
|
result.updatedAt = new Date(result.updatedAt);
|
|
121
115
|
}
|
|
116
|
+
for (const field of config.fields) {
|
|
117
|
+
if (field.type === "date" && field.name) {
|
|
118
|
+
const value = result[field.name];
|
|
119
|
+
if (value && typeof value === "string") {
|
|
120
|
+
result[field.name] = new Date(value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
122
124
|
for (const field of config.fields) {
|
|
123
125
|
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
124
126
|
const isJsonb = dbType === "jsonb";
|
|
@@ -147,6 +149,14 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
147
149
|
}
|
|
148
150
|
}
|
|
149
151
|
}
|
|
152
|
+
for (const field of config.fields) {
|
|
153
|
+
if (field.name && result[field.name] === "") {
|
|
154
|
+
const dbType = fieldToDrizzleType(field, this.dialect);
|
|
155
|
+
if (dbType === "timestamp" || dbType === "jsonb" || dbType === "decimal" || dbType === "integer" || dbType === "numeric" || dbType === "boolean") {
|
|
156
|
+
result[field.name] = null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
150
160
|
return result;
|
|
151
161
|
}
|
|
152
162
|
async connect() {
|
|
@@ -263,8 +273,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
263
273
|
}
|
|
264
274
|
if (!columns.createdAt) columns.createdAt = this.dialect === "sqlite" ? text$1("created_at").default((/* @__PURE__ */ new Date()).toISOString()) : timestamp("created_at").defaultNow();
|
|
265
275
|
if (!columns.updatedAt) columns.updatedAt = this.dialect === "sqlite" ? text$1("updated_at").default((/* @__PURE__ */ new Date()).toISOString()) : timestamp("updated_at").defaultNow();
|
|
266
|
-
columns.
|
|
267
|
-
columns.
|
|
276
|
+
columns.status = this.dialect === "sqlite" ? text$1("status").default("draft") : varchar("status", { length: 20 }).default("draft");
|
|
277
|
+
columns.hasDraft = this.dialect === "sqlite" ? integer("hasDraft", { mode: "boolean" }).default(false) : boolean("hasDraft").default(false);
|
|
268
278
|
return this.dialect === "sqlite" ? sqliteTable(tableName, columns) : pgTable(tableName, columns);
|
|
269
279
|
}
|
|
270
280
|
async ensureCollectionTables(collections) {
|
|
@@ -283,8 +293,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
283
293
|
${colDefs}
|
|
284
294
|
${hasCreated ? "" : '"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
285
295
|
${hasUpdated ? "" : '"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),'}
|
|
286
|
-
"
|
|
287
|
-
"
|
|
296
|
+
"status" VARCHAR(20) DEFAULT 'draft',
|
|
297
|
+
"hasDraft" BOOLEAN DEFAULT false
|
|
288
298
|
)
|
|
289
299
|
`);
|
|
290
300
|
} else {
|
|
@@ -295,8 +305,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
295
305
|
${colDefs}
|
|
296
306
|
${hasCreated ? "" : `"created_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
297
307
|
${hasUpdated ? "" : `"updated_at" TEXT NOT NULL DEFAULT (datetime('now')),`}
|
|
298
|
-
"
|
|
299
|
-
"
|
|
308
|
+
"status" TEXT DEFAULT 'draft',
|
|
309
|
+
"hasDraft" INTEGER DEFAULT 0
|
|
300
310
|
)
|
|
301
311
|
`);
|
|
302
312
|
}
|
|
@@ -310,6 +320,126 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
310
320
|
}
|
|
311
321
|
}
|
|
312
322
|
}
|
|
323
|
+
for (const config of collections) {
|
|
324
|
+
const tableName = this.getTableName(config.slug);
|
|
325
|
+
if (tableName === "users" || tableName === "audit_logs") continue;
|
|
326
|
+
await this.syncTableColumns(config, tableName);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
getColumnSqlDefinition(field, dialect) {
|
|
330
|
+
const dbType = fieldToDrizzleType(field, dialect);
|
|
331
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
332
|
+
const sqlType = this.columnSqlType(dbType, dialect);
|
|
333
|
+
return `"${sqlName}" ${sqlType} DEFAULT NULL`;
|
|
334
|
+
}
|
|
335
|
+
columnSqlType(dbType, dialect) {
|
|
336
|
+
if (dialect === "sqlite") {
|
|
337
|
+
switch (dbType) {
|
|
338
|
+
case "varchar":
|
|
339
|
+
return "TEXT";
|
|
340
|
+
case "text":
|
|
341
|
+
return "TEXT";
|
|
342
|
+
case "integer":
|
|
343
|
+
return "INTEGER";
|
|
344
|
+
case "decimal":
|
|
345
|
+
case "numeric":
|
|
346
|
+
return "NUMERIC";
|
|
347
|
+
case "boolean":
|
|
348
|
+
return "INTEGER";
|
|
349
|
+
case "timestamp":
|
|
350
|
+
return "TEXT";
|
|
351
|
+
case "jsonb":
|
|
352
|
+
return "TEXT";
|
|
353
|
+
default:
|
|
354
|
+
return "TEXT";
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
switch (dbType) {
|
|
358
|
+
case "varchar":
|
|
359
|
+
return "VARCHAR(255)";
|
|
360
|
+
case "text":
|
|
361
|
+
return "TEXT";
|
|
362
|
+
case "integer":
|
|
363
|
+
return "INTEGER";
|
|
364
|
+
case "decimal":
|
|
365
|
+
case "numeric":
|
|
366
|
+
return "DECIMAL";
|
|
367
|
+
case "boolean":
|
|
368
|
+
return "BOOLEAN";
|
|
369
|
+
case "timestamp":
|
|
370
|
+
return "TIMESTAMP";
|
|
371
|
+
case "jsonb":
|
|
372
|
+
return "JSONB";
|
|
373
|
+
default:
|
|
374
|
+
return "TEXT";
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
getExpectedColumnDefs(config, tableName) {
|
|
378
|
+
const defs = {};
|
|
379
|
+
const isGlobal = config.slug.startsWith("_globals_");
|
|
380
|
+
const hasCreated = config.fields.some((f) => f.name === "createdAt");
|
|
381
|
+
const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
|
|
382
|
+
if (this.dialect === "postgres") {
|
|
383
|
+
defs["id"] = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
|
|
384
|
+
if (!hasCreated) defs["created_at"] = '"created_at" TIMESTAMP DEFAULT NULL';
|
|
385
|
+
if (!hasUpdated) defs["updated_at"] = '"updated_at" TIMESTAMP DEFAULT NULL';
|
|
386
|
+
defs["status"] = '"status" VARCHAR(20) DEFAULT NULL';
|
|
387
|
+
defs["hasDraft"] = '"hasDraft" BOOLEAN DEFAULT NULL';
|
|
388
|
+
} else {
|
|
389
|
+
defs["id"] = '"id" TEXT PRIMARY KEY';
|
|
390
|
+
if (!hasCreated) defs["created_at"] = '"created_at" TEXT DEFAULT NULL';
|
|
391
|
+
if (!hasUpdated) defs["updated_at"] = '"updated_at" TEXT DEFAULT NULL';
|
|
392
|
+
defs["status"] = '"status" TEXT DEFAULT NULL';
|
|
393
|
+
defs["hasDraft"] = '"hasDraft" INTEGER DEFAULT NULL';
|
|
394
|
+
}
|
|
395
|
+
for (const field of config.fields) {
|
|
396
|
+
if (!field.name || field.name === "id") continue;
|
|
397
|
+
const def = this.getColumnSqlDefinition(field, this.dialect);
|
|
398
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
399
|
+
defs[sqlName] = def;
|
|
400
|
+
}
|
|
401
|
+
return defs;
|
|
402
|
+
}
|
|
403
|
+
async syncTableColumns(config, tableName) {
|
|
404
|
+
let existingCols;
|
|
405
|
+
try {
|
|
406
|
+
if (this.dialect === "postgres") {
|
|
407
|
+
const result = await this.client.execute(
|
|
408
|
+
sql`SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = ${tableName}`
|
|
409
|
+
);
|
|
410
|
+
existingCols = new Map(result.map((r) => [r.column_name, { type: r.data_type, maxLen: r.character_maximum_length }]));
|
|
411
|
+
} else {
|
|
412
|
+
const result = await this.client.execute(
|
|
413
|
+
sql`PRAGMA table_info("${sql.raw(tableName)}")`
|
|
414
|
+
);
|
|
415
|
+
existingCols = new Map(result.map((r) => [r.name, { type: r.type, maxLen: null }]));
|
|
416
|
+
}
|
|
417
|
+
} catch {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const expected = this.getExpectedColumnDefs(config, tableName);
|
|
421
|
+
const missing = Object.keys(expected).filter((k) => !existingCols.has(k));
|
|
422
|
+
if (missing.length > 0) {
|
|
423
|
+
const alterStmts = missing.map((k) => `ALTER TABLE "${tableName}" ADD COLUMN ${expected[k]}`);
|
|
424
|
+
await this.executeRaw(sql.raw(alterStmts.join(";\n")));
|
|
425
|
+
}
|
|
426
|
+
if (this.dialect === "postgres") {
|
|
427
|
+
for (const field of config.fields) {
|
|
428
|
+
if (!field.name || field.name === "id") continue;
|
|
429
|
+
const expectedDbType = fieldToDrizzleType(field, this.dialect);
|
|
430
|
+
const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
|
|
431
|
+
const info = existingCols.get(sqlName);
|
|
432
|
+
if (!info || info.type !== "character varying") continue;
|
|
433
|
+
if (expectedDbType === "text") {
|
|
434
|
+
await this.executeRaw(sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" TYPE TEXT`));
|
|
435
|
+
console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 TEXT`);
|
|
436
|
+
} else if (expectedDbType === "jsonb") {
|
|
437
|
+
await this.executeRaw(sql.raw(`ALTER TABLE "${tableName}" ALTER COLUMN "${sqlName}" DROP DEFAULT`));
|
|
438
|
+
await this.executeRaw(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)`));
|
|
439
|
+
console.log(`[DrizzleAdapter] Fixed column type: "${tableName}"."${sqlName}" VARCHAR \u2192 JSONB`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
313
443
|
}
|
|
314
444
|
generateCreateColumns(config) {
|
|
315
445
|
const cols = [];
|
|
@@ -386,11 +516,12 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
386
516
|
effectiveWhere = rlsQuery.where || {};
|
|
387
517
|
}
|
|
388
518
|
const filters = this.buildWhereClause(effectiveWhere, config, table, tenantID);
|
|
389
|
-
if (!draft && table.
|
|
390
|
-
filters.push(eq(table.
|
|
519
|
+
if (!draft && table.status) {
|
|
520
|
+
filters.push(eq(table.status, "published"));
|
|
391
521
|
}
|
|
392
522
|
const sortOption = this.parseSort(sort);
|
|
393
|
-
const
|
|
523
|
+
const countWhere = !draft && table.status ? { ...effectiveWhere, status: "published" } : effectiveWhere;
|
|
524
|
+
const totalDocs = await this.count({ collection: slug, where: countWhere, tenantID });
|
|
394
525
|
const offset = (page - 1) * limit;
|
|
395
526
|
let results = [];
|
|
396
527
|
try {
|
|
@@ -410,16 +541,17 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
410
541
|
}
|
|
411
542
|
if (draft) {
|
|
412
543
|
docs = await Promise.all(docs.map(async (doc) => {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
544
|
+
const versions = await this.executeRaw(sql`
|
|
545
|
+
SELECT * FROM kyro_versions
|
|
546
|
+
WHERE collection_slug = ${slug}
|
|
547
|
+
AND document_id = ${doc.id}
|
|
548
|
+
ORDER BY created_at DESC
|
|
549
|
+
LIMIT 1
|
|
550
|
+
`);
|
|
551
|
+
if (versions.length > 0) {
|
|
552
|
+
const ver = versions[0];
|
|
553
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
554
|
+
return { ...doc, ...versionData, status: doc.status };
|
|
423
555
|
}
|
|
424
556
|
return doc;
|
|
425
557
|
}));
|
|
@@ -441,20 +573,23 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
441
573
|
}
|
|
442
574
|
const conditions = [eq(table.id, id)];
|
|
443
575
|
if (tenantID && table.tenantId) conditions.push(eq(table.tenantId, tenantID));
|
|
444
|
-
if (!draft && table.
|
|
576
|
+
if (!draft && table.status) conditions.push(eq(table.status, "published"));
|
|
445
577
|
const whereClause = conditions.length > 1 ? and(...conditions) : conditions[0];
|
|
446
578
|
let allRows = await this.client.select().from(table).where(whereClause);
|
|
447
579
|
if (allRows.length === 0) return null;
|
|
448
580
|
let doc = this.processResult(allRows[0], config);
|
|
449
|
-
if (draft
|
|
450
|
-
const versions = await this.
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
581
|
+
if (draft) {
|
|
582
|
+
const versions = await this.executeRaw(sql`
|
|
583
|
+
SELECT * FROM kyro_versions
|
|
584
|
+
WHERE collection_slug = ${slug}
|
|
585
|
+
AND document_id = ${doc.id}
|
|
586
|
+
ORDER BY created_at DESC
|
|
587
|
+
LIMIT 1
|
|
588
|
+
`);
|
|
589
|
+
if (versions.length > 0) {
|
|
590
|
+
const ver = versions[0];
|
|
591
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
592
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
458
593
|
}
|
|
459
594
|
}
|
|
460
595
|
return doc;
|
|
@@ -475,21 +610,27 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
475
610
|
const config = this.getCollection(slug);
|
|
476
611
|
const table = this.getTable(slug);
|
|
477
612
|
const updateData = this.prepareData(data, config);
|
|
478
|
-
|
|
479
|
-
|
|
613
|
+
delete updateData.id;
|
|
614
|
+
console.log(`[DrizzleAdapter.update] CALLED for ${slug}/${id}`);
|
|
615
|
+
const conditions = [eq(table.id, id)];
|
|
616
|
+
if (tenantID && table.tenantId) {
|
|
617
|
+
conditions.push(eq(table.tenantId, tenantID));
|
|
618
|
+
}
|
|
619
|
+
const result = await this.client.update(table).set(updateData).where(and(...conditions)).returning();
|
|
620
|
+
if (result.length === 0) {
|
|
621
|
+
throw new Error(`Document not found: ${slug}/${id}`);
|
|
480
622
|
}
|
|
481
|
-
const result = await this.client.update(table).set(updateData).where(eq(table.id, id)).returning();
|
|
482
623
|
return this.processResult(result[0], config);
|
|
483
624
|
}
|
|
484
625
|
async delete(args) {
|
|
485
626
|
const { collection: slug, id, tenantID } = args;
|
|
486
627
|
const config = this.getCollection(slug);
|
|
487
628
|
const table = this.getTable(slug);
|
|
488
|
-
|
|
629
|
+
const conditions = [eq(table.id, id)];
|
|
489
630
|
if (tenantID && table.tenantId) {
|
|
490
|
-
|
|
631
|
+
conditions.push(eq(table.tenantId, tenantID));
|
|
491
632
|
}
|
|
492
|
-
const result = await
|
|
633
|
+
const result = await this.client.delete(table).where(and(...conditions)).returning();
|
|
493
634
|
if (result.length === 0) {
|
|
494
635
|
throw new Error(`Document not found: ${slug}/${id}`);
|
|
495
636
|
}
|
|
@@ -519,21 +660,24 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
519
660
|
if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
|
|
520
661
|
const table = this.getTable(slug);
|
|
521
662
|
let query = this.client.select().from(table);
|
|
522
|
-
if (!draft && table.
|
|
523
|
-
query = query.where(eq(table.
|
|
663
|
+
if (!draft && table.status) {
|
|
664
|
+
query = query.where(eq(table.status, "published"));
|
|
524
665
|
}
|
|
525
666
|
const results = await query.limit(1);
|
|
526
667
|
if (results.length === 0) return null;
|
|
527
668
|
let doc = this.processResult(results[0], globalConfig);
|
|
528
|
-
if (draft
|
|
529
|
-
const versions = await this.
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
669
|
+
if (draft) {
|
|
670
|
+
const versions = await this.executeRaw(sql`
|
|
671
|
+
SELECT * FROM kyro_versions
|
|
672
|
+
WHERE collection_slug = ${slug}
|
|
673
|
+
AND document_id = ${globalSlug}
|
|
674
|
+
ORDER BY created_at DESC
|
|
675
|
+
LIMIT 1
|
|
676
|
+
`);
|
|
677
|
+
if (versions.length > 0) {
|
|
678
|
+
const ver = versions[0];
|
|
679
|
+
const versionData = typeof ver.data === "string" ? JSON.parse(ver.data) : ver.data;
|
|
680
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
537
681
|
}
|
|
538
682
|
}
|
|
539
683
|
return doc;
|
|
@@ -550,6 +694,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
550
694
|
FROM kyro_versions
|
|
551
695
|
WHERE collection_slug = ${slug}
|
|
552
696
|
AND document_id = ${documentId}
|
|
697
|
+
AND autosave = 0
|
|
553
698
|
${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
|
|
554
699
|
`);
|
|
555
700
|
const totalDocs = parseInt(countResult[0]?.count || "0");
|
|
@@ -558,6 +703,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
558
703
|
FROM kyro_versions
|
|
559
704
|
WHERE collection_slug = ${slug}
|
|
560
705
|
AND document_id = ${documentId}
|
|
706
|
+
AND autosave = 0
|
|
561
707
|
${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
|
|
562
708
|
ORDER BY created_at DESC
|
|
563
709
|
LIMIT ${limit}
|
|
@@ -589,28 +735,53 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
589
735
|
}
|
|
590
736
|
async createVersion(args) {
|
|
591
737
|
await this.ensureVersionsTable();
|
|
592
|
-
const id = Math.random().toString(36).substring(2, 15);
|
|
593
738
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
739
|
+
if (args.autosave) {
|
|
740
|
+
const existing = await this.executeRaw(sql`
|
|
741
|
+
SELECT * FROM kyro_versions
|
|
742
|
+
WHERE collection_slug = ${args.collection}
|
|
743
|
+
AND document_id = ${args.documentId}
|
|
744
|
+
AND autosave = 1
|
|
745
|
+
${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
|
|
746
|
+
LIMIT 1
|
|
747
|
+
`);
|
|
748
|
+
if (existing.length > 0) {
|
|
749
|
+
await this.executeRaw(sql`
|
|
750
|
+
UPDATE kyro_versions
|
|
751
|
+
SET data = ${JSON.stringify(args.data)},
|
|
752
|
+
status = ${args.status},
|
|
753
|
+
updated_at = ${now}
|
|
754
|
+
WHERE id = ${existing[0].id}
|
|
755
|
+
`);
|
|
756
|
+
return this.findVersionByID({ collection: args.collection, versionId: existing[0].id, tenantID: args.tenantID });
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
const id = Math.random().toString(36).substring(2, 15);
|
|
594
760
|
await this.executeRaw(sql`
|
|
595
761
|
INSERT INTO kyro_versions (
|
|
596
|
-
id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at
|
|
762
|
+
id, collection_slug, document_id, tenant_id, data, status, autosave, created_by, change_description, created_at, updated_at
|
|
597
763
|
) VALUES (
|
|
598
764
|
${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
|
|
599
|
-
${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null},
|
|
765
|
+
${JSON.stringify(args.data)}, ${args.status}, ${args.autosave ? 1 : 0}, ${args.createdBy || null},
|
|
600
766
|
${args.changeDescription || null}, ${now}, ${now}
|
|
601
767
|
)
|
|
602
768
|
`);
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
769
|
+
if (!args.autosave) {
|
|
770
|
+
const config = this.getCollection(args.collection);
|
|
771
|
+
if (config.versions?.maxPerDoc) {
|
|
772
|
+
await this.deleteVersions({
|
|
773
|
+
collection: args.collection,
|
|
774
|
+
documentId: args.documentId,
|
|
775
|
+
keepLatest: config.versions.maxPerDoc,
|
|
776
|
+
tenantID: args.tenantID
|
|
777
|
+
});
|
|
778
|
+
}
|
|
611
779
|
}
|
|
612
780
|
return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
|
|
613
781
|
}
|
|
782
|
+
async updateLatestVersion(args) {
|
|
783
|
+
return this.createVersion({ ...args, autosave: true });
|
|
784
|
+
}
|
|
614
785
|
async deleteVersions(args) {
|
|
615
786
|
await this.ensureVersionsTable();
|
|
616
787
|
if (args.keepLatest) {
|
|
@@ -618,6 +789,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
618
789
|
SELECT id FROM kyro_versions
|
|
619
790
|
WHERE collection_slug = ${args.collection}
|
|
620
791
|
AND document_id = ${args.documentId}
|
|
792
|
+
AND autosave = 0
|
|
621
793
|
${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
|
|
622
794
|
ORDER BY created_at DESC
|
|
623
795
|
LIMIT ${args.keepLatest}
|
|
@@ -628,6 +800,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
628
800
|
DELETE FROM kyro_versions
|
|
629
801
|
WHERE collection_slug = ${args.collection}
|
|
630
802
|
AND document_id = ${args.documentId}
|
|
803
|
+
AND autosave = 0
|
|
631
804
|
AND id NOT IN (${sql.join(keepIds.map((id) => sql`${id}`), sql`, `)})
|
|
632
805
|
`);
|
|
633
806
|
}
|
|
@@ -640,65 +813,6 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
640
813
|
`);
|
|
641
814
|
}
|
|
642
815
|
}
|
|
643
|
-
async findDraft(args) {
|
|
644
|
-
await this.ensureDraftsTable();
|
|
645
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
646
|
-
const rows = await this.executeRaw(sql`
|
|
647
|
-
SELECT *
|
|
648
|
-
FROM kyro_drafts
|
|
649
|
-
WHERE id = ${draftId}
|
|
650
|
-
LIMIT 1
|
|
651
|
-
`);
|
|
652
|
-
const row = rows[0];
|
|
653
|
-
return row ? this.rowToDraft(row) : null;
|
|
654
|
-
}
|
|
655
|
-
async upsertDraft(args) {
|
|
656
|
-
await this.ensureDraftsTable();
|
|
657
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
658
|
-
const draftUpdatedAt = args.draftUpdatedAt || now;
|
|
659
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
660
|
-
const existing = await this.findDraft(args);
|
|
661
|
-
if (existing) {
|
|
662
|
-
await this.executeRaw(sql`
|
|
663
|
-
UPDATE kyro_drafts
|
|
664
|
-
SET
|
|
665
|
-
data = ${JSON.stringify(args.data)},
|
|
666
|
-
base_updated_at = ${args.baseUpdatedAt ?? null},
|
|
667
|
-
draft_updated_at = ${draftUpdatedAt},
|
|
668
|
-
updated_at = ${now}
|
|
669
|
-
WHERE id = ${draftId}
|
|
670
|
-
`);
|
|
671
|
-
} else {
|
|
672
|
-
await this.executeRaw(sql`
|
|
673
|
-
INSERT INTO kyro_drafts (
|
|
674
|
-
id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
|
|
675
|
-
) VALUES (
|
|
676
|
-
${draftId},
|
|
677
|
-
${args.collection},
|
|
678
|
-
${args.documentId},
|
|
679
|
-
${args.tenantID ?? null},
|
|
680
|
-
${JSON.stringify(args.data)},
|
|
681
|
-
${args.baseUpdatedAt ?? null},
|
|
682
|
-
${draftUpdatedAt},
|
|
683
|
-
${now},
|
|
684
|
-
${now}
|
|
685
|
-
)
|
|
686
|
-
`);
|
|
687
|
-
}
|
|
688
|
-
const saved = await this.findDraft(args);
|
|
689
|
-
if (!saved) {
|
|
690
|
-
throw new Error("Failed to persist draft snapshot");
|
|
691
|
-
}
|
|
692
|
-
return saved;
|
|
693
|
-
}
|
|
694
|
-
async deleteDraft(args) {
|
|
695
|
-
await this.ensureDraftsTable();
|
|
696
|
-
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
697
|
-
await this.executeRaw(sql`
|
|
698
|
-
DELETE FROM kyro_drafts
|
|
699
|
-
WHERE id = ${draftId}
|
|
700
|
-
`);
|
|
701
|
-
}
|
|
702
816
|
// ========================================================================
|
|
703
817
|
// Helper Methods
|
|
704
818
|
// ========================================================================
|
|
@@ -772,6 +886,22 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
772
886
|
}
|
|
773
887
|
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
774
888
|
if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
|
|
889
|
+
for (const tab of field.tabs) {
|
|
890
|
+
for (const tabField of tab.fields) {
|
|
891
|
+
if ((tabField.type === "upload" || tabField.type === "image") && tabField.name) {
|
|
892
|
+
const val = result[field.name][tabField.name];
|
|
893
|
+
if (typeof val === "string") {
|
|
894
|
+
try {
|
|
895
|
+
const parsed = JSON.parse(val);
|
|
896
|
+
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 || "");
|
|
897
|
+
} catch {
|
|
898
|
+
}
|
|
899
|
+
} else if (val && typeof val === "object") {
|
|
900
|
+
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 || "");
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
775
905
|
continue;
|
|
776
906
|
}
|
|
777
907
|
if (typeof result[field.name] === "string") {
|
|
@@ -796,6 +926,9 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
796
926
|
} catch {
|
|
797
927
|
}
|
|
798
928
|
}
|
|
929
|
+
if ((tabField.type === "upload" || tabField.type === "image") && value && typeof value === "object") {
|
|
930
|
+
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 || "");
|
|
931
|
+
}
|
|
799
932
|
}
|
|
800
933
|
tabData[tabField.name] = value;
|
|
801
934
|
delete result[tabField.name];
|
|
@@ -813,43 +946,8 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
813
946
|
}
|
|
814
947
|
return result;
|
|
815
948
|
}
|
|
816
|
-
async ensureDraftsTable() {
|
|
817
|
-
if (_schemaEnsured || this.draftsTableReady) return;
|
|
818
|
-
let createTableSQL;
|
|
819
|
-
if (this.dialect === "sqlite") {
|
|
820
|
-
createTableSQL = `
|
|
821
|
-
CREATE TABLE IF NOT EXISTS kyro_drafts (
|
|
822
|
-
id text PRIMARY KEY,
|
|
823
|
-
collection_slug text NOT NULL,
|
|
824
|
-
document_id text NOT NULL,
|
|
825
|
-
tenant_id text,
|
|
826
|
-
data text NOT NULL,
|
|
827
|
-
base_updated_at text,
|
|
828
|
-
draft_updated_at text NOT NULL,
|
|
829
|
-
created_at text DEFAULT (datetime('now')),
|
|
830
|
-
updated_at text DEFAULT (datetime('now'))
|
|
831
|
-
)
|
|
832
|
-
`;
|
|
833
|
-
} else {
|
|
834
|
-
createTableSQL = `
|
|
835
|
-
CREATE TABLE IF NOT EXISTS kyro_drafts (
|
|
836
|
-
id text PRIMARY KEY,
|
|
837
|
-
collection_slug text NOT NULL,
|
|
838
|
-
document_id text NOT NULL,
|
|
839
|
-
tenant_id text,
|
|
840
|
-
data text NOT NULL,
|
|
841
|
-
base_updated_at text,
|
|
842
|
-
draft_updated_at text NOT NULL,
|
|
843
|
-
created_at text NOT NULL,
|
|
844
|
-
updated_at text NOT NULL
|
|
845
|
-
)
|
|
846
|
-
`;
|
|
847
|
-
}
|
|
848
|
-
await this.executeRaw(sql.raw(createTableSQL));
|
|
849
|
-
this.draftsTableReady = true;
|
|
850
|
-
}
|
|
851
949
|
async ensureVersionsTable() {
|
|
852
|
-
if (
|
|
950
|
+
if (this.versionsTableReady) return;
|
|
853
951
|
let createTableSQL;
|
|
854
952
|
if (this.dialect === "sqlite") {
|
|
855
953
|
createTableSQL = `
|
|
@@ -860,6 +958,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
860
958
|
tenant_id text,
|
|
861
959
|
data text NOT NULL,
|
|
862
960
|
status text NOT NULL DEFAULT 'draft',
|
|
961
|
+
autosave integer NOT NULL DEFAULT 0,
|
|
863
962
|
created_by text,
|
|
864
963
|
change_description text,
|
|
865
964
|
created_at text DEFAULT (datetime('now')),
|
|
@@ -875,6 +974,7 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
875
974
|
tenant_id text,
|
|
876
975
|
data text NOT NULL,
|
|
877
976
|
status text NOT NULL,
|
|
977
|
+
autosave integer NOT NULL DEFAULT 0,
|
|
878
978
|
created_by text,
|
|
879
979
|
change_description text,
|
|
880
980
|
created_at text NOT NULL,
|
|
@@ -883,11 +983,16 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
883
983
|
`;
|
|
884
984
|
}
|
|
885
985
|
await this.executeRaw(sql.raw(createTableSQL));
|
|
986
|
+
try {
|
|
987
|
+
if (this.dialect === "postgres") {
|
|
988
|
+
await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN IF NOT EXISTS autosave integer NOT NULL DEFAULT 0`));
|
|
989
|
+
} else {
|
|
990
|
+
await this.executeRaw(sql.raw(`ALTER TABLE kyro_versions ADD COLUMN autosave integer NOT NULL DEFAULT 0`));
|
|
991
|
+
}
|
|
992
|
+
} catch {
|
|
993
|
+
}
|
|
886
994
|
this.versionsTableReady = true;
|
|
887
995
|
}
|
|
888
|
-
getDraftId(collection, documentId, tenantID) {
|
|
889
|
-
return `${collection}::${documentId}::${tenantID || "global"}`;
|
|
890
|
-
}
|
|
891
996
|
async executeRaw(query) {
|
|
892
997
|
const result = await this.client.execute(query);
|
|
893
998
|
if (Array.isArray(result)) {
|
|
@@ -901,19 +1006,6 @@ var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
|
901
1006
|
}
|
|
902
1007
|
return [];
|
|
903
1008
|
}
|
|
904
|
-
rowToDraft(row) {
|
|
905
|
-
return {
|
|
906
|
-
id: String(row.id),
|
|
907
|
-
collection: row.collection_slug,
|
|
908
|
-
documentId: row.document_id,
|
|
909
|
-
tenantID: row.tenant_id ?? void 0,
|
|
910
|
-
data: row.data ? JSON.parse(row.data) : {},
|
|
911
|
-
baseUpdatedAt: row.base_updated_at ?? null,
|
|
912
|
-
draftUpdatedAt: row.draft_updated_at,
|
|
913
|
-
createdAt: row.created_at,
|
|
914
|
-
updatedAt: row.updated_at
|
|
915
|
-
};
|
|
916
|
-
}
|
|
917
1009
|
};
|
|
918
1010
|
function createDrizzleAdapter(options) {
|
|
919
1011
|
return new DrizzleAdapter(options);
|
|
@@ -956,7 +1048,7 @@ async function runMigrations(_db, _dialect) {
|
|
|
956
1048
|
);
|
|
957
1049
|
}
|
|
958
1050
|
async function seedDefaultRoles(db) {
|
|
959
|
-
const { roles } = await import('./schema-
|
|
1051
|
+
const { roles } = await import('./schema-FNNWEAAW.js');
|
|
960
1052
|
await db.insert(roles).values({
|
|
961
1053
|
name: "super_admin",
|
|
962
1054
|
level: 100,
|
|
@@ -967,5 +1059,5 @@ async function seedDefaultRoles(db) {
|
|
|
967
1059
|
}
|
|
968
1060
|
|
|
969
1061
|
export { DrizzleAdapter, collectionToDrizzleSchema, createDatabase, createDrizzleAdapter, fieldToDrizzleType, genId, runMigrations, seedDefaultRoles };
|
|
970
|
-
//# sourceMappingURL=chunk-
|
|
971
|
-
//# sourceMappingURL=chunk-
|
|
1062
|
+
//# sourceMappingURL=chunk-V7KZQIZ6.js.map
|
|
1063
|
+
//# sourceMappingURL=chunk-V7KZQIZ6.js.map
|