@kyro-cms/core 0.9.1 → 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 +0 -6
- package/dist/{WebhookService-Yg2UEOB4.d.cts → WebhookService-BKszZlG0.d.cts} +1 -1
- package/dist/{WebhookService-CUTb9XOy.d.ts → WebhookService-Ccf1j-IN.d.ts} +1 -1
- package/dist/api-handler-graphql.cjs +17 -17
- package/dist/api-handler-graphql.js +13 -13
- package/dist/api-handler-trpc.cjs +15 -15
- package/dist/api-handler-trpc.js +13 -13
- package/dist/api-handler.cjs +16 -16
- package/dist/api-handler.js +13 -13
- package/dist/{base-DaqY2GhA.d.ts → base-CIuXkrH4.d.cts} +3 -5
- package/dist/{base-B71y_EAF.d.cts → base-fFo4lqER.d.ts} +3 -5
- package/dist/bootstrap-3PV3GJ3S.js +7 -0
- package/dist/{bootstrap-T5BK77LD.js.map → bootstrap-3PV3GJ3S.js.map} +1 -1
- package/dist/bootstrap-4CELFLJO.cjs +32 -0
- package/dist/{bootstrap-5NLASFOG.cjs.map → bootstrap-4CELFLJO.cjs.map} +1 -1
- 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-5EPFQUQD.js → chunk-53NYVYVX.js} +6 -6
- package/dist/chunk-53NYVYVX.js.map +1 -0
- package/dist/{chunk-22M4O4ZJ.js → chunk-5H3MWQJS.js} +129 -143
- package/dist/chunk-5H3MWQJS.js.map +1 -0
- package/dist/{chunk-RAMGUDJN.cjs → chunk-5PMQQFRE.cjs} +5 -5
- package/dist/{chunk-RAMGUDJN.cjs.map → chunk-5PMQQFRE.cjs.map} +1 -1
- package/dist/{chunk-TXSZFA4G.js → chunk-6UNONDW7.js} +93 -9
- package/dist/chunk-6UNONDW7.js.map +1 -0
- package/dist/{chunk-C36TMDTY.cjs → chunk-7OS7TX2Q.cjs} +49 -48
- 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-FOPGUM27.js → chunk-CJX74IYK.js} +5 -4
- package/dist/chunk-CJX74IYK.js.map +1 -0
- package/dist/{chunk-RSF3UU7H.cjs → chunk-CNKT4PME.cjs} +196 -200
- 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-JOPVMWTM.cjs → chunk-DPA3KWPY.cjs} +3 -3
- package/dist/chunk-DPA3KWPY.cjs.map +1 -0
- package/dist/{chunk-ROJHKAQ4.cjs → chunk-E2763JUP.cjs} +143 -157
- package/dist/chunk-E2763JUP.cjs.map +1 -0
- package/dist/{chunk-FAXU7BMP.js → chunk-E5UJBLQ7.js} +2 -2
- 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-2HZRBATX.cjs → chunk-FSKONGCX.cjs} +2 -2
- package/dist/chunk-FSKONGCX.cjs.map +1 -0
- package/dist/{chunk-P2HKJ7P5.js → chunk-GAAHG2Z4.js} +3 -3
- package/dist/{chunk-P2HKJ7P5.js.map → chunk-GAAHG2Z4.js.map} +1 -1
- package/dist/{chunk-PI73NNOK.cjs → chunk-GUUB5EAG.cjs} +2 -2
- package/dist/chunk-GUUB5EAG.cjs.map +1 -0
- package/dist/{chunk-PU2Z5VWF.js → chunk-IPTZM3VE.js} +183 -187
- package/dist/chunk-IPTZM3VE.js.map +1 -0
- package/dist/{chunk-UERVXYVK.cjs → chunk-NWUEVLQT.cjs} +13 -13
- package/dist/{chunk-UERVXYVK.cjs.map → chunk-NWUEVLQT.cjs.map} +1 -1
- package/dist/{chunk-KPA4AN4R.js → chunk-OHC6UHFY.js} +86 -12
- package/dist/chunk-OHC6UHFY.js.map +1 -0
- package/dist/{chunk-DEVFAKCQ.cjs → chunk-PHJRNPHY.cjs} +6 -6
- package/dist/chunk-PHJRNPHY.cjs.map +1 -0
- package/dist/{chunk-VO35MNPH.js → chunk-PQ72Z6WC.js} +67 -105
- package/dist/chunk-PQ72Z6WC.js.map +1 -0
- package/dist/{chunk-KNRSROWB.cjs → chunk-PV2I2KMI.cjs} +86 -12
- package/dist/chunk-PV2I2KMI.cjs.map +1 -0
- package/dist/{chunk-V2TVSCV5.cjs → chunk-Q23GAMLE.cjs} +71 -109
- package/dist/chunk-Q23GAMLE.cjs.map +1 -0
- package/dist/{chunk-COIASRDK.cjs → chunk-RFFSZSCL.cjs} +107 -171
- package/dist/chunk-RFFSZSCL.cjs.map +1 -0
- package/dist/{chunk-AL5KX63J.js → chunk-UUDTPZX6.js} +3 -3
- package/dist/chunk-UUDTPZX6.js.map +1 -0
- package/dist/{chunk-EJN2PAOE.js → chunk-V7KZQIZ6.js} +102 -166
- package/dist/chunk-V7KZQIZ6.js.map +1 -0
- package/dist/{chunk-DYTZ6FQ7.js → chunk-WXVB364T.js} +2 -2
- package/dist/chunk-WXVB364T.js.map +1 -0
- package/dist/{chunk-WNCYAKF3.cjs → chunk-Y7AQK4R4.cjs} +93 -9
- package/dist/chunk-Y7AQK4R4.cjs.map +1 -0
- package/dist/{chunk-SPBTLUN6.js → chunk-YFAVQQTU.js} +7 -7
- package/dist/{chunk-SPBTLUN6.js.map → chunk-YFAVQQTU.js.map} +1 -1
- package/dist/cli/index.cjs +5 -5
- package/dist/cli/index.js +5 -5
- package/dist/client.cjs +4 -4
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +2 -2
- package/dist/drizzle/index.cjs +14 -14
- package/dist/drizzle/index.d.cts +4 -10
- package/dist/drizzle/index.d.ts +4 -10
- package/dist/drizzle/index.js +5 -5
- package/dist/fields/index.cjs +22 -22
- package/dist/fields/index.d.cts +1 -1
- package/dist/fields/index.d.ts +1 -1
- package/dist/fields/index.js +2 -2
- package/dist/graphql/index.cjs +1 -1
- package/dist/graphql/index.d.cts +3 -3
- package/dist/graphql/index.d.ts +3 -3
- package/dist/graphql/index.js +1 -1
- package/dist/{index-CaTNnLGd.d.cts → index-BKta3cBH.d.cts} +3 -2
- package/dist/{index-CJXPB_ot.d.ts → index-ClOqnkTO.d.ts} +3 -2
- package/dist/index.cjs +117 -117
- package/dist/index.d.cts +10 -15
- package/dist/index.d.ts +10 -15
- package/dist/index.js +18 -18
- package/dist/integration.cjs +1 -1
- package/dist/integration.js +1 -1
- 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-ISOM7FSS.cjs → mongo-auth-adapter-GT4S7SCU.cjs} +3 -3
- package/dist/{mongo-auth-adapter-ISOM7FSS.cjs.map → mongo-auth-adapter-GT4S7SCU.cjs.map} +1 -1
- package/dist/mongo-auth-adapter-M7VV4LNB.js +4 -0
- package/dist/{mongo-auth-adapter-MO6STCV3.js.map → mongo-auth-adapter-M7VV4LNB.js.map} +1 -1
- package/dist/mongodb/index.cjs +5 -5
- package/dist/mongodb/index.d.cts +4 -9
- package/dist/mongodb/index.d.ts +4 -9
- package/dist/mongodb/index.js +3 -3
- package/dist/postgres-auth-adapter-AFAPISH7.js +5 -0
- package/dist/{postgres-auth-adapter-DWDR7P5G.js.map → postgres-auth-adapter-AFAPISH7.js.map} +1 -1
- package/dist/postgres-auth-adapter-SFDTLONT.cjs +14 -0
- package/dist/{postgres-auth-adapter-WRWSJD4E.cjs.map → postgres-auth-adapter-SFDTLONT.cjs.map} +1 -1
- package/dist/{redis-adapter-KJ3YOOT6.cjs → redis-adapter-UQX4EE3B.cjs} +3 -3
- package/dist/{redis-adapter-KJ3YOOT6.cjs.map → redis-adapter-UQX4EE3B.cjs.map} +1 -1
- package/dist/redis-adapter-XALOGWY3.js +4 -0
- package/dist/{redis-adapter-HGTPWIGV.js.map → redis-adapter-XALOGWY3.js.map} +1 -1
- package/dist/rest/index.cjs +10 -10
- package/dist/rest/index.d.cts +4 -4
- package/dist/rest/index.d.ts +4 -4
- package/dist/rest/index.js +8 -8
- package/dist/{schema-TTFE4467.cjs → schema-6QL3USNB.cjs} +15 -15
- package/dist/{schema-TTFE4467.cjs.map → schema-6QL3USNB.cjs.map} +1 -1
- package/dist/{schema-6I5OFR4Z.js → schema-FNNWEAAW.js} +4 -4
- package/dist/{schema-6I5OFR4Z.js.map → schema-FNNWEAAW.js.map} +1 -1
- package/dist/{sqlite-adapter-CSIZE5SX.cjs → sqlite-adapter-AQB5TCGV.cjs} +3 -3
- package/dist/{sqlite-adapter-CSIZE5SX.cjs.map → sqlite-adapter-AQB5TCGV.cjs.map} +1 -1
- package/dist/sqlite-adapter-N5H6IM2X.js +4 -0
- package/dist/{sqlite-adapter-6GEUSVXQ.js.map → sqlite-adapter-N5H6IM2X.js.map} +1 -1
- package/dist/templates/index.cjs +49 -49
- package/dist/templates/index.d.cts +2 -2
- package/dist/templates/index.d.ts +2 -2
- package/dist/templates/index.js +2 -2
- package/dist/trpc/index.cjs +11 -11
- package/dist/trpc/index.d.cts +3 -3
- package/dist/trpc/index.d.ts +3 -3
- package/dist/trpc/index.js +2 -2
- package/dist/{types-Z6FBiqa2.d.cts → types-DeSApf9T.d.cts} +1 -0
- package/dist/{types-Z6FBiqa2.d.ts → types-DeSApf9T.d.ts} +1 -0
- package/dist/{types-CyCQ6SAI.d.ts → types-Dgzlftb7.d.ts} +6 -28
- package/dist/{types-DJxD9394.d.cts → types-Ds0tCA3L.d.cts} +6 -28
- package/dist/ws/index.cjs +6 -6
- package/dist/ws/index.js +2 -2
- package/package.json +1 -1
- package/dist/bootstrap-5NLASFOG.cjs +0 -32
- package/dist/bootstrap-T5BK77LD.js +0 -7
- package/dist/chunk-22M4O4ZJ.js.map +0 -1
- package/dist/chunk-2HZRBATX.cjs.map +0 -1
- package/dist/chunk-3TPQ2BU6.js.map +0 -1
- package/dist/chunk-5EPFQUQD.js.map +0 -1
- package/dist/chunk-AL5KX63J.js.map +0 -1
- package/dist/chunk-C36TMDTY.cjs.map +0 -1
- package/dist/chunk-COIASRDK.cjs.map +0 -1
- package/dist/chunk-DEVFAKCQ.cjs.map +0 -1
- package/dist/chunk-DVD5P72E.cjs.map +0 -1
- package/dist/chunk-DYTZ6FQ7.js.map +0 -1
- package/dist/chunk-EJN2PAOE.js.map +0 -1
- package/dist/chunk-FAXU7BMP.js.map +0 -1
- package/dist/chunk-FOPGUM27.js.map +0 -1
- package/dist/chunk-JOPVMWTM.cjs.map +0 -1
- package/dist/chunk-KNRSROWB.cjs.map +0 -1
- package/dist/chunk-KPA4AN4R.js.map +0 -1
- package/dist/chunk-PI73NNOK.cjs.map +0 -1
- package/dist/chunk-PU2Z5VWF.js.map +0 -1
- package/dist/chunk-ROJHKAQ4.cjs.map +0 -1
- package/dist/chunk-RSF3UU7H.cjs.map +0 -1
- package/dist/chunk-TXSZFA4G.js.map +0 -1
- package/dist/chunk-V2TVSCV5.cjs.map +0 -1
- package/dist/chunk-VO35MNPH.js.map +0 -1
- package/dist/chunk-WNCYAKF3.cjs.map +0 -1
- package/dist/media-GPPTZ43E.js +0 -4
- package/dist/mongo-auth-adapter-MO6STCV3.js +0 -4
- package/dist/postgres-auth-adapter-DWDR7P5G.js +0 -5
- package/dist/postgres-auth-adapter-WRWSJD4E.cjs +0 -14
- package/dist/redis-adapter-HGTPWIGV.js +0 -4
- package/dist/sqlite-adapter-6GEUSVXQ.js +0 -4
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createStorageSettingsGlobal } from './chunk-GAOXD3XT.js';
|
|
2
|
-
import { createContext, createKyroServer } from './chunk-
|
|
2
|
+
import { createContext, createKyroServer } from './chunk-OHC6UHFY.js';
|
|
3
3
|
import { buildGraphQLSchema } from './chunk-L5UKKZQN.js';
|
|
4
|
-
import { getDefaultRegistry, createHonoApp, createS3Storage, createCloudinaryStorage, createFtpStorage } from './chunk-
|
|
4
|
+
import { getDefaultRegistry, createHonoApp, createS3Storage, createCloudinaryStorage, createFtpStorage } from './chunk-IPTZM3VE.js';
|
|
5
5
|
import { createWebhookService, WEBHOOK_COLLECTION, WEBHOOK_DELIVERY_COLLECTION } from './chunk-3UK5XBVJ.js';
|
|
6
6
|
import { API_KEY_COLLECTION, extractApiKeyFromRequest, validateApiKey, createApiKeyContext } from './chunk-CJONKRHJ.js';
|
|
7
|
-
import { KyroPubSub, createWSServer } from './chunk-
|
|
8
|
-
import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-
|
|
7
|
+
import { KyroPubSub, createWSServer } from './chunk-BYBMTIMT.js';
|
|
8
|
+
import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-WXVB364T.js';
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { parse, execute } from 'graphql';
|
|
11
11
|
import { createRequire } from 'module';
|
|
@@ -647,6 +647,30 @@ function buildNestedShape(fields) {
|
|
|
647
647
|
}
|
|
648
648
|
return shape;
|
|
649
649
|
}
|
|
650
|
+
function buildUpdateNestedShape(fields) {
|
|
651
|
+
const shape = {};
|
|
652
|
+
for (const field of fields) {
|
|
653
|
+
if (!field.name) continue;
|
|
654
|
+
if (field.type === "tabs" && "tabs" in field) {
|
|
655
|
+
const tabShape = {};
|
|
656
|
+
for (const tab of field.tabs) {
|
|
657
|
+
const nestedShape = buildUpdateNestedShape(tab.fields);
|
|
658
|
+
Object.assign(tabShape, nestedShape);
|
|
659
|
+
}
|
|
660
|
+
shape[field.name] = z.object(tabShape).passthrough().optional().nullable();
|
|
661
|
+
} else if (field.type === "row" && "fields" in field) {
|
|
662
|
+
const rowShape = buildUpdateNestedShape(field.fields);
|
|
663
|
+
Object.assign(shape, rowShape);
|
|
664
|
+
} else if (field.type === "collapsible" && "fields" in field) {
|
|
665
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).passthrough().optional().nullable();
|
|
666
|
+
} else if (field.type === "group" && "fields" in field) {
|
|
667
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).passthrough().optional().nullable();
|
|
668
|
+
} else {
|
|
669
|
+
shape[field.name] = fieldToZod(field).optional().nullable();
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
return shape;
|
|
673
|
+
}
|
|
650
674
|
function collectionToZod(collection) {
|
|
651
675
|
const shape = buildNestedShape(collection.fields);
|
|
652
676
|
if (collection.timestamps) {
|
|
@@ -686,7 +710,9 @@ function collectionToUpdateZod(collection) {
|
|
|
686
710
|
}
|
|
687
711
|
Object.assign(shape, rowShape);
|
|
688
712
|
} else if (field.type === "collapsible" && "fields" in field) {
|
|
689
|
-
shape[field.name] = z.object(
|
|
713
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).optional().nullable();
|
|
714
|
+
} else if (field.type === "group" && "fields" in field) {
|
|
715
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).optional().nullable();
|
|
690
716
|
} else {
|
|
691
717
|
shape[field.name] = fieldToZod(field).optional().nullable();
|
|
692
718
|
}
|
|
@@ -722,6 +748,30 @@ function globalToZod(global) {
|
|
|
722
748
|
shape["id"] = z.string().optional();
|
|
723
749
|
return z.object(shape).passthrough();
|
|
724
750
|
}
|
|
751
|
+
function globalToUpdateZod(global) {
|
|
752
|
+
const shape = {};
|
|
753
|
+
for (const field of global.fields) {
|
|
754
|
+
if (!field.name) continue;
|
|
755
|
+
if (field.type === "tabs" && "tabs" in field) {
|
|
756
|
+
const tabShape = {};
|
|
757
|
+
for (const tab of field.tabs) {
|
|
758
|
+
for (const tabField of tab.fields) {
|
|
759
|
+
if (tabField.name) {
|
|
760
|
+
tabShape[tabField.name] = fieldToZod(tabField).optional().nullable();
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
shape[field.name] = z.object(tabShape).optional().nullable();
|
|
765
|
+
} else if (field.type === "collapsible" && "fields" in field) {
|
|
766
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).optional().nullable();
|
|
767
|
+
} else if (field.type === "group" && "fields" in field) {
|
|
768
|
+
shape[field.name] = z.object(buildUpdateNestedShape(field.fields)).optional().nullable();
|
|
769
|
+
} else {
|
|
770
|
+
shape[field.name] = fieldToZod(field).optional().nullable();
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
return z.object(shape).passthrough();
|
|
774
|
+
}
|
|
725
775
|
|
|
726
776
|
// src/registry/index.ts
|
|
727
777
|
var Registry = class {
|
|
@@ -905,7 +955,13 @@ var Registry = class {
|
|
|
905
955
|
this.schemaCache.set(cacheKey, schema);
|
|
906
956
|
return schema;
|
|
907
957
|
}
|
|
908
|
-
|
|
958
|
+
const global = this.globals.get(slug);
|
|
959
|
+
if (global) {
|
|
960
|
+
const schema = globalToUpdateZod(global);
|
|
961
|
+
this.schemaCache.set(`global:${slug}:update`, schema);
|
|
962
|
+
return schema;
|
|
963
|
+
}
|
|
964
|
+
throw new Error(`No collection or global found with slug "${slug}"`);
|
|
909
965
|
}
|
|
910
966
|
getWhereZodSchema(slug) {
|
|
911
967
|
const cacheKey = `${slug}:where`;
|
|
@@ -960,9 +1016,9 @@ var Registry = class {
|
|
|
960
1016
|
admin: { readOnly: true, hidden: true }
|
|
961
1017
|
});
|
|
962
1018
|
}
|
|
963
|
-
if (config.versions?.drafts && !fields.some((f) => f.name === "
|
|
1019
|
+
if (config.versions?.drafts && !fields.some((f) => f.name === "status")) {
|
|
964
1020
|
fields.push({
|
|
965
|
-
name: "
|
|
1021
|
+
name: "status",
|
|
966
1022
|
type: "select",
|
|
967
1023
|
options: [
|
|
968
1024
|
{ value: "draft", label: "Draft" },
|
|
@@ -1880,7 +1936,6 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
1880
1936
|
db;
|
|
1881
1937
|
path;
|
|
1882
1938
|
migrations = /* @__PURE__ */ new Map();
|
|
1883
|
-
draftsTableName = "kyro_drafts";
|
|
1884
1939
|
versionsTableName = "kyro_versions";
|
|
1885
1940
|
constructor(options) {
|
|
1886
1941
|
super();
|
|
@@ -1950,7 +2005,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
1950
2005
|
}
|
|
1951
2006
|
columns.push(`${this.col("createdAt")} TEXT DEFAULT (datetime('now'))`);
|
|
1952
2007
|
columns.push(`${this.col("updatedAt")} TEXT DEFAULT (datetime('now'))`);
|
|
1953
|
-
columns.push(`
|
|
2008
|
+
columns.push(`status TEXT DEFAULT 'draft'`);
|
|
1954
2009
|
columns.push(`hasDraft INTEGER DEFAULT 0`);
|
|
1955
2010
|
if (config.tenantScoped) {
|
|
1956
2011
|
columns.push(`tenant_id TEXT NOT NULL`);
|
|
@@ -1959,7 +2014,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
1959
2014
|
if (existingColumns.length === 0) {
|
|
1960
2015
|
const createSQL = `CREATE TABLE IF NOT EXISTS ${name} (${columns.join(", ")})`;
|
|
1961
2016
|
this.db.exec(createSQL);
|
|
1962
|
-
this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${name}
|
|
2017
|
+
this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${name}_status ON ${name}(status)`);
|
|
1963
2018
|
for (const field of flattenFields(config.fields)) {
|
|
1964
2019
|
if (field.name && field.indexed) {
|
|
1965
2020
|
this.db.exec(
|
|
@@ -1978,7 +2033,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
1978
2033
|
const colName = colDef.split(" ")[0].replace(/^"/, "").replace(/"$/, "");
|
|
1979
2034
|
if (!existingSet.has(colName) && colName !== "id") {
|
|
1980
2035
|
try {
|
|
1981
|
-
if (colName === "
|
|
2036
|
+
if (colName === "status") {
|
|
1982
2037
|
this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} TEXT DEFAULT 'published'`);
|
|
1983
2038
|
} else if (colName === "hasDraft") {
|
|
1984
2039
|
this.db.exec(`ALTER TABLE ${name} ADD COLUMN ${this.col(colName)} INTEGER DEFAULT 0`);
|
|
@@ -2001,6 +2056,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2001
2056
|
tenant_id TEXT,
|
|
2002
2057
|
version INTEGER NOT NULL,
|
|
2003
2058
|
status TEXT NOT NULL DEFAULT 'draft',
|
|
2059
|
+
autosave INTEGER NOT NULL DEFAULT 0,
|
|
2004
2060
|
data TEXT NOT NULL,
|
|
2005
2061
|
created_by TEXT,
|
|
2006
2062
|
change_description TEXT,
|
|
@@ -2013,26 +2069,15 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2013
2069
|
`CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_doc ON ${this.versionsTableName}(collection_slug, document_id)`
|
|
2014
2070
|
);
|
|
2015
2071
|
this.db.exec(
|
|
2016
|
-
`CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}
|
|
2072
|
+
`CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_status ON ${this.versionsTableName}(status)`
|
|
2017
2073
|
);
|
|
2018
|
-
}
|
|
2019
|
-
ensureDraftsTable() {
|
|
2020
|
-
this.db.exec(`
|
|
2021
|
-
CREATE TABLE IF NOT EXISTS ${this.draftsTableName} (
|
|
2022
|
-
id TEXT PRIMARY KEY,
|
|
2023
|
-
collection_slug TEXT NOT NULL,
|
|
2024
|
-
document_id TEXT NOT NULL,
|
|
2025
|
-
tenant_id TEXT,
|
|
2026
|
-
data TEXT NOT NULL,
|
|
2027
|
-
base_updated_at TEXT,
|
|
2028
|
-
draft_updated_at TEXT NOT NULL,
|
|
2029
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
2030
|
-
updated_at TEXT DEFAULT (datetime('now'))
|
|
2031
|
-
)
|
|
2032
|
-
`);
|
|
2033
2074
|
this.db.exec(
|
|
2034
|
-
`CREATE
|
|
2075
|
+
`CREATE INDEX IF NOT EXISTS idx_${this.versionsTableName}_autosave ON ${this.versionsTableName}(autosave)`
|
|
2035
2076
|
);
|
|
2077
|
+
try {
|
|
2078
|
+
this.db.exec(`ALTER TABLE ${this.versionsTableName} ADD COLUMN autosave INTEGER NOT NULL DEFAULT 0`);
|
|
2079
|
+
} catch {
|
|
2080
|
+
}
|
|
2036
2081
|
}
|
|
2037
2082
|
// ========================================================================
|
|
2038
2083
|
// SQL Quoting
|
|
@@ -2113,8 +2158,8 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2113
2158
|
const rlsQuery = applyRLS({ where: effectiveWhere }, slug, this.tenantContext, DEFAULT_RLS_CONFIG);
|
|
2114
2159
|
effectiveWhere = rlsQuery.where || {};
|
|
2115
2160
|
}
|
|
2116
|
-
if (!draft
|
|
2117
|
-
conditions.push(`
|
|
2161
|
+
if (!draft) {
|
|
2162
|
+
conditions.push(`status = ?`);
|
|
2118
2163
|
params.push("published");
|
|
2119
2164
|
}
|
|
2120
2165
|
if (tenantID && config.tenantScoped) {
|
|
@@ -2159,16 +2204,10 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2159
2204
|
}
|
|
2160
2205
|
if (draft) {
|
|
2161
2206
|
docs = await Promise.all(docs.map(async (doc) => {
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
limit: 1,
|
|
2167
|
-
sort: "-createdAt"
|
|
2168
|
-
});
|
|
2169
|
-
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
2170
|
-
return { ...doc, ...versions.docs[0].data, hasDraft: true, publishStatus: doc.publishStatus };
|
|
2171
|
-
}
|
|
2207
|
+
const version = this.db.prepare(`SELECT * FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? AND tenant_id IS NULL ORDER BY version DESC LIMIT 1`).get(slug, doc.id);
|
|
2208
|
+
if (version) {
|
|
2209
|
+
const versionData = version.data ? JSON.parse(version.data) : {};
|
|
2210
|
+
return { ...doc, ...versionData, status: doc.status };
|
|
2172
2211
|
}
|
|
2173
2212
|
return doc;
|
|
2174
2213
|
}));
|
|
@@ -2200,8 +2239,8 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2200
2239
|
return null;
|
|
2201
2240
|
}
|
|
2202
2241
|
}
|
|
2203
|
-
if (!draft
|
|
2204
|
-
sql += ` AND
|
|
2242
|
+
if (!draft) {
|
|
2243
|
+
sql += ` AND status = ?`;
|
|
2205
2244
|
params.push("published");
|
|
2206
2245
|
}
|
|
2207
2246
|
if (tenantID && config.tenantScoped) {
|
|
@@ -2211,15 +2250,11 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2211
2250
|
const row = this.db.prepare(sql).get(...params);
|
|
2212
2251
|
if (!row) return null;
|
|
2213
2252
|
let doc = this.rowToDoc(row, config);
|
|
2214
|
-
if (draft
|
|
2215
|
-
const
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
sort: "-createdAt"
|
|
2220
|
-
});
|
|
2221
|
-
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
2222
|
-
doc = { ...doc, ...versions.docs[0].data, hasDraft: true, publishStatus: doc.publishStatus };
|
|
2253
|
+
if (draft) {
|
|
2254
|
+
const version = this.db.prepare(`SELECT * FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? AND tenant_id IS NULL ORDER BY version DESC LIMIT 1`).get(slug, doc.id);
|
|
2255
|
+
if (version) {
|
|
2256
|
+
const versionData = version.data ? JSON.parse(version.data) : {};
|
|
2257
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
2223
2258
|
}
|
|
2224
2259
|
}
|
|
2225
2260
|
return doc;
|
|
@@ -2330,7 +2365,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2330
2365
|
const conditions = [];
|
|
2331
2366
|
const params = [];
|
|
2332
2367
|
if (!args.draft && globalConfig.versions) {
|
|
2333
|
-
conditions.push("
|
|
2368
|
+
conditions.push("status = 'published'");
|
|
2334
2369
|
}
|
|
2335
2370
|
if (conditions.length > 0) {
|
|
2336
2371
|
sql += ` WHERE ${conditions.join(" AND ")}`;
|
|
@@ -2339,15 +2374,11 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2339
2374
|
const result2 = this.db.prepare(sql).get(...params);
|
|
2340
2375
|
if (result2) {
|
|
2341
2376
|
let doc = this.rowToDoc(result2, globalConfig);
|
|
2342
|
-
if (args.draft
|
|
2343
|
-
const
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
sort: "-createdAt"
|
|
2348
|
-
});
|
|
2349
|
-
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
2350
|
-
doc = { ...doc, ...versions.docs[0].data, hasDraft: true, publishStatus: doc.publishStatus };
|
|
2377
|
+
if (args.draft) {
|
|
2378
|
+
const version = this.db.prepare(`SELECT * FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? AND tenant_id IS NULL ORDER BY version DESC LIMIT 1`).get(args.collection, parsed.globalSlug);
|
|
2379
|
+
if (version) {
|
|
2380
|
+
const versionData = version.data ? JSON.parse(version.data) : {};
|
|
2381
|
+
doc = { ...doc, ...versionData, status: doc.status };
|
|
2351
2382
|
}
|
|
2352
2383
|
}
|
|
2353
2384
|
return doc;
|
|
@@ -2363,7 +2394,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2363
2394
|
async findVersions(args) {
|
|
2364
2395
|
this.ensureVersionsTable();
|
|
2365
2396
|
const { collection, documentId, tenantID, limit = 20, page = 1 } = args;
|
|
2366
|
-
const conditions = [`collection_slug = ?`, `document_id =
|
|
2397
|
+
const conditions = [`collection_slug = ?`, `document_id = ?`, `autosave = 0`];
|
|
2367
2398
|
const params = [collection, documentId];
|
|
2368
2399
|
if (tenantID) {
|
|
2369
2400
|
conditions.push(`tenant_id = ?`);
|
|
@@ -2398,13 +2429,30 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2398
2429
|
async createVersion(args) {
|
|
2399
2430
|
this.ensureVersionsTable();
|
|
2400
2431
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2432
|
+
if (args.autosave) {
|
|
2433
|
+
let sql = `SELECT * FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? AND autosave = 1`;
|
|
2434
|
+
const params = [args.collection, args.documentId];
|
|
2435
|
+
if (args.tenantID) {
|
|
2436
|
+
sql += ` AND tenant_id = ?`;
|
|
2437
|
+
params.push(args.tenantID);
|
|
2438
|
+
} else {
|
|
2439
|
+
sql += ` AND tenant_id IS NULL`;
|
|
2440
|
+
}
|
|
2441
|
+
sql += ` LIMIT 1`;
|
|
2442
|
+
const existing = this.db.prepare(sql).get(...params);
|
|
2443
|
+
if (existing) {
|
|
2444
|
+
this.db.prepare(`UPDATE ${this.versionsTableName} SET data = ?, status = ?, updated_at = ? WHERE id = ?`).run(JSON.stringify(args.data), args.status, now, existing.id);
|
|
2445
|
+
const result = await this.findVersionByID({ collection: args.collection, versionId: existing.id });
|
|
2446
|
+
if (result) return result;
|
|
2447
|
+
}
|
|
2448
|
+
}
|
|
2401
2449
|
const id = this.generateId();
|
|
2402
|
-
const latestRow = this.db.prepare(`SELECT version FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC LIMIT 1`).get(args.collection, args.documentId);
|
|
2450
|
+
const latestRow = this.db.prepare(`SELECT version FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? AND autosave = 0 ORDER BY version DESC LIMIT 1`).get(args.collection, args.documentId);
|
|
2403
2451
|
const nextVersion = (latestRow?.version ?? 0) + 1;
|
|
2404
2452
|
this.db.prepare(
|
|
2405
2453
|
`INSERT INTO ${this.versionsTableName} (
|
|
2406
|
-
id, collection_slug, document_id, tenant_id, version, status, data, created_by, change_description, published_at, created_at, updated_at
|
|
2407
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
2454
|
+
id, collection_slug, document_id, tenant_id, version, status, autosave, data, created_by, change_description, published_at, created_at, updated_at
|
|
2455
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
2408
2456
|
).run(
|
|
2409
2457
|
id,
|
|
2410
2458
|
args.collection,
|
|
@@ -2412,6 +2460,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2412
2460
|
args.tenantID ?? null,
|
|
2413
2461
|
nextVersion,
|
|
2414
2462
|
args.status,
|
|
2463
|
+
args.autosave ? 1 : 0,
|
|
2415
2464
|
JSON.stringify(args.data),
|
|
2416
2465
|
args.createdBy ?? null,
|
|
2417
2466
|
args.changeDescription ?? null,
|
|
@@ -2419,23 +2468,28 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2419
2468
|
now,
|
|
2420
2469
|
now
|
|
2421
2470
|
);
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2471
|
+
if (!args.autosave) {
|
|
2472
|
+
const collectionConfig = this.collections.get(args.collection);
|
|
2473
|
+
const maxPerDoc = collectionConfig?.versions?.maxPerDoc;
|
|
2474
|
+
if (maxPerDoc && maxPerDoc > 0) {
|
|
2475
|
+
await this.deleteVersions({ collection: args.collection, documentId: args.documentId, keepLatest: maxPerDoc, tenantID: args.tenantID });
|
|
2476
|
+
}
|
|
2426
2477
|
}
|
|
2427
2478
|
const saved = await this.findVersionByID({ collection: args.collection, versionId: id });
|
|
2428
2479
|
return saved;
|
|
2429
2480
|
}
|
|
2481
|
+
async updateLatestVersion(args) {
|
|
2482
|
+
return this.createVersion({ ...args, autosave: true });
|
|
2483
|
+
}
|
|
2430
2484
|
async deleteVersions(args) {
|
|
2431
2485
|
this.ensureVersionsTable();
|
|
2432
2486
|
const { collection, documentId, keepLatest, tenantID } = args;
|
|
2433
2487
|
if (keepLatest && keepLatest > 0) {
|
|
2434
|
-
const rows = this.db.prepare(`SELECT id, status FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC`).all(collection, documentId);
|
|
2488
|
+
const rows = this.db.prepare(`SELECT id, status, autosave FROM ${this.versionsTableName} WHERE collection_slug = ? AND document_id = ? ORDER BY version DESC`).all(collection, documentId);
|
|
2435
2489
|
let draftCount = 0;
|
|
2436
2490
|
const toDelete = [];
|
|
2437
2491
|
for (const row of rows) {
|
|
2438
|
-
if (row.status === "published") continue;
|
|
2492
|
+
if (row.status === "published" || row.autosave === 1) continue;
|
|
2439
2493
|
draftCount++;
|
|
2440
2494
|
if (draftCount > keepLatest) toDelete.push(row.id);
|
|
2441
2495
|
}
|
|
@@ -2467,60 +2521,6 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2467
2521
|
updatedAt: row.updated_at
|
|
2468
2522
|
};
|
|
2469
2523
|
}
|
|
2470
|
-
async findDraft(args) {
|
|
2471
|
-
this.ensureDraftsTable();
|
|
2472
|
-
let sql = `SELECT * FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;
|
|
2473
|
-
const params = [args.collection, args.documentId];
|
|
2474
|
-
if (args.tenantID) {
|
|
2475
|
-
sql += ` AND tenant_id = ?`;
|
|
2476
|
-
params.push(args.tenantID);
|
|
2477
|
-
} else {
|
|
2478
|
-
sql += ` AND tenant_id IS NULL`;
|
|
2479
|
-
}
|
|
2480
|
-
sql += ` LIMIT 1`;
|
|
2481
|
-
const row = this.db.prepare(sql).get(...params);
|
|
2482
|
-
if (!row) return null;
|
|
2483
|
-
return this.rowToDraft(row);
|
|
2484
|
-
}
|
|
2485
|
-
async upsertDraft(args) {
|
|
2486
|
-
this.ensureDraftsTable();
|
|
2487
|
-
const existing = await this.findDraft(args);
|
|
2488
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2489
|
-
const draftUpdatedAt = args.draftUpdatedAt || now;
|
|
2490
|
-
const id = existing?.id || this.generateId();
|
|
2491
|
-
this.db.prepare(
|
|
2492
|
-
`INSERT OR REPLACE INTO ${this.draftsTableName} (
|
|
2493
|
-
id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
|
|
2494
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
2495
|
-
).run(
|
|
2496
|
-
id,
|
|
2497
|
-
args.collection,
|
|
2498
|
-
args.documentId,
|
|
2499
|
-
args.tenantID ?? null,
|
|
2500
|
-
JSON.stringify(args.data),
|
|
2501
|
-
args.baseUpdatedAt ?? null,
|
|
2502
|
-
draftUpdatedAt,
|
|
2503
|
-
existing?.createdAt || now,
|
|
2504
|
-
now
|
|
2505
|
-
);
|
|
2506
|
-
const saved = await this.findDraft(args);
|
|
2507
|
-
if (!saved) {
|
|
2508
|
-
throw new Error("Failed to persist draft snapshot");
|
|
2509
|
-
}
|
|
2510
|
-
return saved;
|
|
2511
|
-
}
|
|
2512
|
-
async deleteDraft(args) {
|
|
2513
|
-
this.ensureDraftsTable();
|
|
2514
|
-
let sql = `DELETE FROM ${this.draftsTableName} WHERE collection_slug = ? AND document_id = ?`;
|
|
2515
|
-
const params = [args.collection, args.documentId];
|
|
2516
|
-
if (args.tenantID) {
|
|
2517
|
-
sql += ` AND tenant_id = ?`;
|
|
2518
|
-
params.push(args.tenantID);
|
|
2519
|
-
} else {
|
|
2520
|
-
sql += ` AND tenant_id IS NULL`;
|
|
2521
|
-
}
|
|
2522
|
-
this.db.prepare(sql).run(...params);
|
|
2523
|
-
}
|
|
2524
2524
|
// ========================================================================
|
|
2525
2525
|
// Helpers
|
|
2526
2526
|
// ========================================================================
|
|
@@ -2689,7 +2689,7 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2689
2689
|
if (config.tenantScoped) {
|
|
2690
2690
|
doc.tenantID = row.tenant_id;
|
|
2691
2691
|
}
|
|
2692
|
-
doc.
|
|
2692
|
+
doc.status = row.status ?? "published";
|
|
2693
2693
|
doc.hasDraft = row.hasDraft ? Boolean(row.hasDraft) : false;
|
|
2694
2694
|
return doc;
|
|
2695
2695
|
}
|
|
@@ -2716,19 +2716,6 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2716
2716
|
getTableNameFor(slug) {
|
|
2717
2717
|
return slug.replace(/-/g, "_");
|
|
2718
2718
|
}
|
|
2719
|
-
rowToDraft(row) {
|
|
2720
|
-
return {
|
|
2721
|
-
id: row.id,
|
|
2722
|
-
collection: row.collection_slug,
|
|
2723
|
-
documentId: row.document_id,
|
|
2724
|
-
tenantID: row.tenant_id ?? void 0,
|
|
2725
|
-
data: row.data ? JSON.parse(row.data) : {},
|
|
2726
|
-
baseUpdatedAt: row.base_updated_at ?? null,
|
|
2727
|
-
draftUpdatedAt: row.draft_updated_at,
|
|
2728
|
-
createdAt: row.created_at,
|
|
2729
|
-
updatedAt: row.updated_at
|
|
2730
|
-
};
|
|
2731
|
-
}
|
|
2732
2719
|
// ========================================================================
|
|
2733
2720
|
// Migrations
|
|
2734
2721
|
// ========================================================================
|
|
@@ -2736,7 +2723,6 @@ var LocalAdapter = class extends AbstractBaseAdapter {
|
|
|
2736
2723
|
for (const config of this.collections.values()) {
|
|
2737
2724
|
this.ensureTable(config);
|
|
2738
2725
|
}
|
|
2739
|
-
this.ensureDraftsTable();
|
|
2740
2726
|
console.log("[LocalAdapter] Migrations complete");
|
|
2741
2727
|
}
|
|
2742
2728
|
async rollback() {
|
|
@@ -2776,5 +2762,5 @@ function createLocalAdapter(options) {
|
|
|
2776
2762
|
}
|
|
2777
2763
|
|
|
2778
2764
|
export { ConfigValidationError, Kyro, LocalAdapter, Registry, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, collectionToZod, createKyro, createLocalAdapter, createRegistry, fieldToZod, getRegistry, globalToZod, resetRegistry, validateCollection, validateConfig, validateFields, validateGlobal };
|
|
2779
|
-
//# sourceMappingURL=chunk-
|
|
2780
|
-
//# sourceMappingURL=chunk-
|
|
2765
|
+
//# sourceMappingURL=chunk-5H3MWQJS.js.map
|
|
2766
|
+
//# sourceMappingURL=chunk-5H3MWQJS.js.map
|