@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.
Files changed (180) hide show
  1. package/README.md +0 -6
  2. package/dist/{WebhookService-Yg2UEOB4.d.cts → WebhookService-BKszZlG0.d.cts} +1 -1
  3. package/dist/{WebhookService-CUTb9XOy.d.ts → WebhookService-Ccf1j-IN.d.ts} +1 -1
  4. package/dist/api-handler-graphql.cjs +17 -17
  5. package/dist/api-handler-graphql.js +13 -13
  6. package/dist/api-handler-trpc.cjs +15 -15
  7. package/dist/api-handler-trpc.js +13 -13
  8. package/dist/api-handler.cjs +16 -16
  9. package/dist/api-handler.js +13 -13
  10. package/dist/{base-DaqY2GhA.d.ts → base-CIuXkrH4.d.cts} +3 -5
  11. package/dist/{base-B71y_EAF.d.cts → base-fFo4lqER.d.ts} +3 -5
  12. package/dist/bootstrap-3PV3GJ3S.js +7 -0
  13. package/dist/{bootstrap-T5BK77LD.js.map → bootstrap-3PV3GJ3S.js.map} +1 -1
  14. package/dist/bootstrap-4CELFLJO.cjs +32 -0
  15. package/dist/{bootstrap-5NLASFOG.cjs.map → bootstrap-4CELFLJO.cjs.map} +1 -1
  16. package/dist/{chunk-Z6ZWNWWR.js → chunk-4CV4JOE5.js} +3 -9
  17. package/dist/{chunk-Z6ZWNWWR.js.map → chunk-4CV4JOE5.js.map} +1 -1
  18. package/dist/{chunk-5EPFQUQD.js → chunk-53NYVYVX.js} +6 -6
  19. package/dist/chunk-53NYVYVX.js.map +1 -0
  20. package/dist/{chunk-22M4O4ZJ.js → chunk-5H3MWQJS.js} +129 -143
  21. package/dist/chunk-5H3MWQJS.js.map +1 -0
  22. package/dist/{chunk-RAMGUDJN.cjs → chunk-5PMQQFRE.cjs} +5 -5
  23. package/dist/{chunk-RAMGUDJN.cjs.map → chunk-5PMQQFRE.cjs.map} +1 -1
  24. package/dist/{chunk-TXSZFA4G.js → chunk-6UNONDW7.js} +93 -9
  25. package/dist/chunk-6UNONDW7.js.map +1 -0
  26. package/dist/{chunk-C36TMDTY.cjs → chunk-7OS7TX2Q.cjs} +49 -48
  27. package/dist/chunk-7OS7TX2Q.cjs.map +1 -0
  28. package/dist/{chunk-3TPQ2BU6.js → chunk-BYBMTIMT.js} +2 -6
  29. package/dist/chunk-BYBMTIMT.js.map +1 -0
  30. package/dist/{chunk-FOPGUM27.js → chunk-CJX74IYK.js} +5 -4
  31. package/dist/chunk-CJX74IYK.js.map +1 -0
  32. package/dist/{chunk-RSF3UU7H.cjs → chunk-CNKT4PME.cjs} +196 -200
  33. package/dist/chunk-CNKT4PME.cjs.map +1 -0
  34. package/dist/{chunk-G7VZBCD6.cjs → chunk-CZLDE2OZ.cjs} +2 -9
  35. package/dist/{chunk-G7VZBCD6.cjs.map → chunk-CZLDE2OZ.cjs.map} +1 -1
  36. package/dist/{chunk-JOPVMWTM.cjs → chunk-DPA3KWPY.cjs} +3 -3
  37. package/dist/chunk-DPA3KWPY.cjs.map +1 -0
  38. package/dist/{chunk-ROJHKAQ4.cjs → chunk-E2763JUP.cjs} +143 -157
  39. package/dist/chunk-E2763JUP.cjs.map +1 -0
  40. package/dist/{chunk-FAXU7BMP.js → chunk-E5UJBLQ7.js} +2 -2
  41. package/dist/chunk-E5UJBLQ7.js.map +1 -0
  42. package/dist/{chunk-DVD5P72E.cjs → chunk-EEJUFDMF.cjs} +2 -6
  43. package/dist/chunk-EEJUFDMF.cjs.map +1 -0
  44. package/dist/{chunk-2HZRBATX.cjs → chunk-FSKONGCX.cjs} +2 -2
  45. package/dist/chunk-FSKONGCX.cjs.map +1 -0
  46. package/dist/{chunk-P2HKJ7P5.js → chunk-GAAHG2Z4.js} +3 -3
  47. package/dist/{chunk-P2HKJ7P5.js.map → chunk-GAAHG2Z4.js.map} +1 -1
  48. package/dist/{chunk-PI73NNOK.cjs → chunk-GUUB5EAG.cjs} +2 -2
  49. package/dist/chunk-GUUB5EAG.cjs.map +1 -0
  50. package/dist/{chunk-PU2Z5VWF.js → chunk-IPTZM3VE.js} +183 -187
  51. package/dist/chunk-IPTZM3VE.js.map +1 -0
  52. package/dist/{chunk-UERVXYVK.cjs → chunk-NWUEVLQT.cjs} +13 -13
  53. package/dist/{chunk-UERVXYVK.cjs.map → chunk-NWUEVLQT.cjs.map} +1 -1
  54. package/dist/{chunk-KPA4AN4R.js → chunk-OHC6UHFY.js} +86 -12
  55. package/dist/chunk-OHC6UHFY.js.map +1 -0
  56. package/dist/{chunk-DEVFAKCQ.cjs → chunk-PHJRNPHY.cjs} +6 -6
  57. package/dist/chunk-PHJRNPHY.cjs.map +1 -0
  58. package/dist/{chunk-VO35MNPH.js → chunk-PQ72Z6WC.js} +67 -105
  59. package/dist/chunk-PQ72Z6WC.js.map +1 -0
  60. package/dist/{chunk-KNRSROWB.cjs → chunk-PV2I2KMI.cjs} +86 -12
  61. package/dist/chunk-PV2I2KMI.cjs.map +1 -0
  62. package/dist/{chunk-V2TVSCV5.cjs → chunk-Q23GAMLE.cjs} +71 -109
  63. package/dist/chunk-Q23GAMLE.cjs.map +1 -0
  64. package/dist/{chunk-COIASRDK.cjs → chunk-RFFSZSCL.cjs} +107 -171
  65. package/dist/chunk-RFFSZSCL.cjs.map +1 -0
  66. package/dist/{chunk-AL5KX63J.js → chunk-UUDTPZX6.js} +3 -3
  67. package/dist/chunk-UUDTPZX6.js.map +1 -0
  68. package/dist/{chunk-EJN2PAOE.js → chunk-V7KZQIZ6.js} +102 -166
  69. package/dist/chunk-V7KZQIZ6.js.map +1 -0
  70. package/dist/{chunk-DYTZ6FQ7.js → chunk-WXVB364T.js} +2 -2
  71. package/dist/chunk-WXVB364T.js.map +1 -0
  72. package/dist/{chunk-WNCYAKF3.cjs → chunk-Y7AQK4R4.cjs} +93 -9
  73. package/dist/chunk-Y7AQK4R4.cjs.map +1 -0
  74. package/dist/{chunk-SPBTLUN6.js → chunk-YFAVQQTU.js} +7 -7
  75. package/dist/{chunk-SPBTLUN6.js.map → chunk-YFAVQQTU.js.map} +1 -1
  76. package/dist/cli/index.cjs +5 -5
  77. package/dist/cli/index.js +5 -5
  78. package/dist/client.cjs +4 -4
  79. package/dist/client.d.cts +2 -2
  80. package/dist/client.d.ts +2 -2
  81. package/dist/client.js +2 -2
  82. package/dist/drizzle/index.cjs +14 -14
  83. package/dist/drizzle/index.d.cts +4 -10
  84. package/dist/drizzle/index.d.ts +4 -10
  85. package/dist/drizzle/index.js +5 -5
  86. package/dist/fields/index.cjs +22 -22
  87. package/dist/fields/index.d.cts +1 -1
  88. package/dist/fields/index.d.ts +1 -1
  89. package/dist/fields/index.js +2 -2
  90. package/dist/graphql/index.cjs +1 -1
  91. package/dist/graphql/index.d.cts +3 -3
  92. package/dist/graphql/index.d.ts +3 -3
  93. package/dist/graphql/index.js +1 -1
  94. package/dist/{index-CaTNnLGd.d.cts → index-BKta3cBH.d.cts} +3 -2
  95. package/dist/{index-CJXPB_ot.d.ts → index-ClOqnkTO.d.ts} +3 -2
  96. package/dist/index.cjs +117 -117
  97. package/dist/index.d.cts +10 -15
  98. package/dist/index.d.ts +10 -15
  99. package/dist/index.js +18 -18
  100. package/dist/integration.cjs +1 -1
  101. package/dist/integration.js +1 -1
  102. package/dist/media-7WDX4BDJ.js +4 -0
  103. package/dist/{media-GPPTZ43E.js.map → media-7WDX4BDJ.js.map} +1 -1
  104. package/dist/{media-XNTUFJZR.cjs → media-TUSLVRQ6.cjs} +3 -3
  105. package/dist/{media-XNTUFJZR.cjs.map → media-TUSLVRQ6.cjs.map} +1 -1
  106. package/dist/{mongo-auth-adapter-ISOM7FSS.cjs → mongo-auth-adapter-GT4S7SCU.cjs} +3 -3
  107. package/dist/{mongo-auth-adapter-ISOM7FSS.cjs.map → mongo-auth-adapter-GT4S7SCU.cjs.map} +1 -1
  108. package/dist/mongo-auth-adapter-M7VV4LNB.js +4 -0
  109. package/dist/{mongo-auth-adapter-MO6STCV3.js.map → mongo-auth-adapter-M7VV4LNB.js.map} +1 -1
  110. package/dist/mongodb/index.cjs +5 -5
  111. package/dist/mongodb/index.d.cts +4 -9
  112. package/dist/mongodb/index.d.ts +4 -9
  113. package/dist/mongodb/index.js +3 -3
  114. package/dist/postgres-auth-adapter-AFAPISH7.js +5 -0
  115. package/dist/{postgres-auth-adapter-DWDR7P5G.js.map → postgres-auth-adapter-AFAPISH7.js.map} +1 -1
  116. package/dist/postgres-auth-adapter-SFDTLONT.cjs +14 -0
  117. package/dist/{postgres-auth-adapter-WRWSJD4E.cjs.map → postgres-auth-adapter-SFDTLONT.cjs.map} +1 -1
  118. package/dist/{redis-adapter-KJ3YOOT6.cjs → redis-adapter-UQX4EE3B.cjs} +3 -3
  119. package/dist/{redis-adapter-KJ3YOOT6.cjs.map → redis-adapter-UQX4EE3B.cjs.map} +1 -1
  120. package/dist/redis-adapter-XALOGWY3.js +4 -0
  121. package/dist/{redis-adapter-HGTPWIGV.js.map → redis-adapter-XALOGWY3.js.map} +1 -1
  122. package/dist/rest/index.cjs +10 -10
  123. package/dist/rest/index.d.cts +4 -4
  124. package/dist/rest/index.d.ts +4 -4
  125. package/dist/rest/index.js +8 -8
  126. package/dist/{schema-TTFE4467.cjs → schema-6QL3USNB.cjs} +15 -15
  127. package/dist/{schema-TTFE4467.cjs.map → schema-6QL3USNB.cjs.map} +1 -1
  128. package/dist/{schema-6I5OFR4Z.js → schema-FNNWEAAW.js} +4 -4
  129. package/dist/{schema-6I5OFR4Z.js.map → schema-FNNWEAAW.js.map} +1 -1
  130. package/dist/{sqlite-adapter-CSIZE5SX.cjs → sqlite-adapter-AQB5TCGV.cjs} +3 -3
  131. package/dist/{sqlite-adapter-CSIZE5SX.cjs.map → sqlite-adapter-AQB5TCGV.cjs.map} +1 -1
  132. package/dist/sqlite-adapter-N5H6IM2X.js +4 -0
  133. package/dist/{sqlite-adapter-6GEUSVXQ.js.map → sqlite-adapter-N5H6IM2X.js.map} +1 -1
  134. package/dist/templates/index.cjs +49 -49
  135. package/dist/templates/index.d.cts +2 -2
  136. package/dist/templates/index.d.ts +2 -2
  137. package/dist/templates/index.js +2 -2
  138. package/dist/trpc/index.cjs +11 -11
  139. package/dist/trpc/index.d.cts +3 -3
  140. package/dist/trpc/index.d.ts +3 -3
  141. package/dist/trpc/index.js +2 -2
  142. package/dist/{types-Z6FBiqa2.d.cts → types-DeSApf9T.d.cts} +1 -0
  143. package/dist/{types-Z6FBiqa2.d.ts → types-DeSApf9T.d.ts} +1 -0
  144. package/dist/{types-CyCQ6SAI.d.ts → types-Dgzlftb7.d.ts} +6 -28
  145. package/dist/{types-DJxD9394.d.cts → types-Ds0tCA3L.d.cts} +6 -28
  146. package/dist/ws/index.cjs +6 -6
  147. package/dist/ws/index.js +2 -2
  148. package/package.json +1 -1
  149. package/dist/bootstrap-5NLASFOG.cjs +0 -32
  150. package/dist/bootstrap-T5BK77LD.js +0 -7
  151. package/dist/chunk-22M4O4ZJ.js.map +0 -1
  152. package/dist/chunk-2HZRBATX.cjs.map +0 -1
  153. package/dist/chunk-3TPQ2BU6.js.map +0 -1
  154. package/dist/chunk-5EPFQUQD.js.map +0 -1
  155. package/dist/chunk-AL5KX63J.js.map +0 -1
  156. package/dist/chunk-C36TMDTY.cjs.map +0 -1
  157. package/dist/chunk-COIASRDK.cjs.map +0 -1
  158. package/dist/chunk-DEVFAKCQ.cjs.map +0 -1
  159. package/dist/chunk-DVD5P72E.cjs.map +0 -1
  160. package/dist/chunk-DYTZ6FQ7.js.map +0 -1
  161. package/dist/chunk-EJN2PAOE.js.map +0 -1
  162. package/dist/chunk-FAXU7BMP.js.map +0 -1
  163. package/dist/chunk-FOPGUM27.js.map +0 -1
  164. package/dist/chunk-JOPVMWTM.cjs.map +0 -1
  165. package/dist/chunk-KNRSROWB.cjs.map +0 -1
  166. package/dist/chunk-KPA4AN4R.js.map +0 -1
  167. package/dist/chunk-PI73NNOK.cjs.map +0 -1
  168. package/dist/chunk-PU2Z5VWF.js.map +0 -1
  169. package/dist/chunk-ROJHKAQ4.cjs.map +0 -1
  170. package/dist/chunk-RSF3UU7H.cjs.map +0 -1
  171. package/dist/chunk-TXSZFA4G.js.map +0 -1
  172. package/dist/chunk-V2TVSCV5.cjs.map +0 -1
  173. package/dist/chunk-VO35MNPH.js.map +0 -1
  174. package/dist/chunk-WNCYAKF3.cjs.map +0 -1
  175. package/dist/media-GPPTZ43E.js +0 -4
  176. package/dist/mongo-auth-adapter-MO6STCV3.js +0 -4
  177. package/dist/postgres-auth-adapter-DWDR7P5G.js +0 -5
  178. package/dist/postgres-auth-adapter-WRWSJD4E.cjs +0 -14
  179. package/dist/redis-adapter-HGTPWIGV.js +0 -4
  180. 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-KPA4AN4R.js';
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-PU2Z5VWF.js';
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-3TPQ2BU6.js';
8
- import { AbstractBaseAdapter, applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from './chunk-DYTZ6FQ7.js';
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(buildNestedShape(field.fields)).optional().nullable();
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
- throw new Error(`No collection found with slug "${slug}"`);
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 === "publishStatus")) {
1019
+ if (config.versions?.drafts && !fields.some((f) => f.name === "status")) {
964
1020
  fields.push({
965
- name: "publishStatus",
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(`publishStatus TEXT DEFAULT 'draft'`);
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}_publishStatus ON ${name}(publishStatus)`);
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 === "publishStatus") {
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}publishStatus ON ${this.versionsTableName}(status)`
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 UNIQUE INDEX IF NOT EXISTS idx_${this.draftsTableName}_document ON ${this.draftsTableName}(collection_slug, document_id, tenant_id)`
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 && config.versions?.drafts) {
2117
- conditions.push(`publishStatus = ?`);
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
- if (doc.hasDraft) {
2163
- const versions = await this.findVersions({
2164
- collection: slug,
2165
- documentId: doc.id,
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 && config.versions?.drafts) {
2204
- sql += ` AND publishStatus = ?`;
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 && doc.hasDraft) {
2215
- const versions = await this.findVersions({
2216
- collection: slug,
2217
- documentId: doc.id,
2218
- limit: 1,
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("publishStatus = 'published'");
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 && doc.hasDraft) {
2343
- const versions = await this.findVersions({
2344
- collection: args.collection,
2345
- documentId: parsed.globalSlug,
2346
- limit: 1,
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
- const collectionConfig = this.collections.get(args.collection);
2423
- const maxPerDoc = collectionConfig?.versions?.maxPerDoc;
2424
- if (maxPerDoc && maxPerDoc > 0) {
2425
- await this.deleteVersions({ collection: args.collection, documentId: args.documentId, keepLatest: maxPerDoc, tenantID: args.tenantID });
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.publishStatus = row.publishStatus ?? "published";
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-22M4O4ZJ.js.map
2780
- //# sourceMappingURL=chunk-22M4O4ZJ.js.map
2765
+ //# sourceMappingURL=chunk-5H3MWQJS.js.map
2766
+ //# sourceMappingURL=chunk-5H3MWQJS.js.map