@kyro-cms/core 0.5.3 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/WebhookService-118ZTFis.d.ts +112 -0
  2. package/dist/WebhookService-AefJfqX0.d.cts +112 -0
  3. package/dist/adapter-BSvBudTG.d.cts +65 -0
  4. package/dist/adapter-CXGB2Elb.d.ts +65 -0
  5. package/dist/api-handler.cjs +26 -8
  6. package/dist/api-handler.cjs.map +1 -1
  7. package/dist/api-handler.d.cts +9 -0
  8. package/dist/api-handler.d.ts +9 -0
  9. package/dist/api-handler.js +25 -7
  10. package/dist/api-handler.js.map +1 -1
  11. package/dist/base-DvvNqnM-.d.cts +73 -0
  12. package/dist/base-eVegJ_Pr.d.ts +73 -0
  13. package/dist/bootstrap-4MH44YKG.js +6 -0
  14. package/dist/{bootstrap-PBMMLBQC.js.map → bootstrap-4MH44YKG.js.map} +1 -1
  15. package/dist/bootstrap-EE6BJZWL.cjs +31 -0
  16. package/dist/{bootstrap-QN77EVI3.cjs.map → bootstrap-EE6BJZWL.cjs.map} +1 -1
  17. package/dist/chunk-3YELQL7Z.cjs +4 -0
  18. package/dist/chunk-3YELQL7Z.cjs.map +1 -0
  19. package/dist/{chunk-AGAIUDAV.cjs → chunk-55BNRTLW.cjs} +7 -7
  20. package/dist/chunk-55BNRTLW.cjs.map +1 -0
  21. package/dist/{chunk-XJ2VYR47.cjs → chunk-5HA5OMFH.cjs} +10 -7
  22. package/dist/chunk-5HA5OMFH.cjs.map +1 -0
  23. package/dist/{chunk-C4JJEE42.js → chunk-6WXQRYTW.js} +262 -43
  24. package/dist/chunk-6WXQRYTW.js.map +1 -0
  25. package/dist/{chunk-SO25EHOE.js → chunk-AM4JKIPP.js} +180 -77
  26. package/dist/chunk-AM4JKIPP.js.map +1 -0
  27. package/dist/{chunk-VSTRLXMQ.cjs → chunk-CKVOU6MX.cjs} +4 -2
  28. package/dist/chunk-CKVOU6MX.cjs.map +1 -0
  29. package/dist/chunk-GTGRLD4Y.js +3 -0
  30. package/dist/chunk-GTGRLD4Y.js.map +1 -0
  31. package/dist/chunk-MTIRYI7F.cjs +4 -0
  32. package/dist/chunk-MTIRYI7F.cjs.map +1 -0
  33. package/dist/{chunk-342BJNBI.js → chunk-QKVA2SOG.js} +300 -6
  34. package/dist/chunk-QKVA2SOG.js.map +1 -0
  35. package/dist/chunk-QU2RFFH4.js +3 -0
  36. package/dist/chunk-QU2RFFH4.js.map +1 -0
  37. package/dist/{chunk-ATVNYGRQ.js → chunk-QYZKIPSD.js} +7 -18
  38. package/dist/chunk-QYZKIPSD.js.map +1 -0
  39. package/dist/{chunk-SYRDCLH7.cjs → chunk-R2YHJN6W.cjs} +184 -81
  40. package/dist/chunk-R2YHJN6W.cjs.map +1 -0
  41. package/dist/{chunk-IX3ABYKZ.cjs → chunk-RALQO47U.cjs} +170 -2
  42. package/dist/chunk-RALQO47U.cjs.map +1 -0
  43. package/dist/{chunk-EVEJC22G.cjs → chunk-RDRJVCL5.cjs} +37 -5
  44. package/dist/chunk-RDRJVCL5.cjs.map +1 -0
  45. package/dist/{chunk-6COM32WF.js → chunk-RP7VZUEL.js} +5 -3
  46. package/dist/chunk-RP7VZUEL.js.map +1 -0
  47. package/dist/{chunk-XR5EJS3C.js → chunk-S3FG2NY7.js} +7 -4
  48. package/dist/chunk-S3FG2NY7.js.map +1 -0
  49. package/dist/{chunk-WH4Y5MT6.js → chunk-TP5YQFIX.js} +36 -4
  50. package/dist/chunk-TP5YQFIX.js.map +1 -0
  51. package/dist/{chunk-DBUYB32X.js → chunk-TVVYZ2TH.js} +171 -3
  52. package/dist/chunk-TVVYZ2TH.js.map +1 -0
  53. package/dist/{chunk-GBH6DN5C.cjs → chunk-WBCIEYHC.cjs} +8 -18
  54. package/dist/chunk-WBCIEYHC.cjs.map +1 -0
  55. package/dist/{chunk-3ZZPZYCM.cjs → chunk-WVPOPOEQ.cjs} +269 -41
  56. package/dist/chunk-WVPOPOEQ.cjs.map +1 -0
  57. package/dist/{chunk-W3KPQX7V.cjs → chunk-XAEBVZTI.cjs} +304 -4
  58. package/dist/chunk-XAEBVZTI.cjs.map +1 -0
  59. package/dist/{chunk-Q4DNT7FO.js → chunk-XU7AFF6V.js} +6 -6
  60. package/dist/chunk-XU7AFF6V.js.map +1 -0
  61. package/dist/cli/index.cjs +6 -4
  62. package/dist/cli/index.cjs.map +1 -1
  63. package/dist/cli/index.d.cts +1 -0
  64. package/dist/cli/index.d.ts +1 -0
  65. package/dist/cli/index.js +6 -4
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/client.d.cts +12 -0
  68. package/dist/client.d.ts +12 -0
  69. package/dist/drizzle/index.cjs +18 -18
  70. package/dist/drizzle/index.d.cts +152 -0
  71. package/dist/drizzle/index.d.ts +152 -0
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/fields/index.d.cts +27 -0
  74. package/dist/fields/index.d.ts +27 -0
  75. package/dist/graphql/index.d.cts +22 -0
  76. package/dist/graphql/index.d.ts +22 -0
  77. package/dist/index-Bz9JqRGI.d.cts +86 -0
  78. package/dist/index-Bz9JqRGI.d.ts +86 -0
  79. package/dist/index-CLp-DRKA.d.ts +64 -0
  80. package/dist/index-DfO7G4kN.d.cts +64 -0
  81. package/dist/index.cjs +118 -86
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +1368 -0
  84. package/dist/index.d.ts +1368 -0
  85. package/dist/index.js +48 -14
  86. package/dist/index.js.map +1 -1
  87. package/dist/integration.cjs +2 -2
  88. package/dist/integration.d.cts +27 -0
  89. package/dist/integration.d.ts +27 -0
  90. package/dist/integration.js +1 -1
  91. package/dist/media-GPPTZ43E.js +4 -0
  92. package/dist/{media-HOT3O7RW.js.map → media-GPPTZ43E.js.map} +1 -1
  93. package/dist/media-XNTUFJZR.cjs +17 -0
  94. package/dist/{media-WKP5AOX2.cjs.map → media-XNTUFJZR.cjs.map} +1 -1
  95. package/dist/mongodb/index.cjs +12 -3
  96. package/dist/mongodb/index.d.cts +59 -0
  97. package/dist/mongodb/index.d.ts +59 -0
  98. package/dist/mongodb/index.js +2 -1
  99. package/dist/postgres-auth-adapter-6742WDCF.cjs +14 -0
  100. package/dist/{postgres-auth-adapter-Z463NYJZ.cjs.map → postgres-auth-adapter-6742WDCF.cjs.map} +1 -1
  101. package/dist/postgres-auth-adapter-B65BULNS.js +5 -0
  102. package/dist/{postgres-auth-adapter-7F3ECO7I.js.map → postgres-auth-adapter-B65BULNS.js.map} +1 -1
  103. package/dist/rest/index.cjs +9 -5
  104. package/dist/rest/index.d.cts +57 -0
  105. package/dist/rest/index.d.ts +57 -0
  106. package/dist/rest/index.js +7 -3
  107. package/dist/{schema-TIYTCIKX.cjs → schema-37SE2F4B.cjs} +5 -5
  108. package/dist/{schema-TIYTCIKX.cjs.map → schema-37SE2F4B.cjs.map} +1 -1
  109. package/dist/{schema-6Q4W6AE6.js → schema-5PHL5IVB.js} +3 -3
  110. package/dist/{schema-6Q4W6AE6.js.map → schema-5PHL5IVB.js.map} +1 -1
  111. package/dist/templates/index.d.cts +59 -0
  112. package/dist/templates/index.d.ts +59 -0
  113. package/dist/trpc/index.d.cts +136 -0
  114. package/dist/trpc/index.d.ts +136 -0
  115. package/dist/types-Bs1up4yP.d.ts +461 -0
  116. package/dist/types-DqN4ckOC.d.cts +130 -0
  117. package/dist/types-DqN4ckOC.d.ts +130 -0
  118. package/dist/types-J3R9nVsZ.d.cts +461 -0
  119. package/dist/types-VtjUxIMp.d.cts +246 -0
  120. package/dist/types-VtjUxIMp.d.ts +246 -0
  121. package/dist/ws/index.d.cts +88 -0
  122. package/dist/ws/index.d.ts +88 -0
  123. package/package.json +3 -2
  124. package/dist/bootstrap-PBMMLBQC.js +0 -6
  125. package/dist/bootstrap-QN77EVI3.cjs +0 -31
  126. package/dist/chunk-342BJNBI.js.map +0 -1
  127. package/dist/chunk-3ZZPZYCM.cjs.map +0 -1
  128. package/dist/chunk-6COM32WF.js.map +0 -1
  129. package/dist/chunk-7SXPHG3M.cjs +0 -67
  130. package/dist/chunk-7SXPHG3M.cjs.map +0 -1
  131. package/dist/chunk-AGAIUDAV.cjs.map +0 -1
  132. package/dist/chunk-ATVNYGRQ.js.map +0 -1
  133. package/dist/chunk-C4JJEE42.js.map +0 -1
  134. package/dist/chunk-DBUYB32X.js.map +0 -1
  135. package/dist/chunk-EVEJC22G.cjs.map +0 -1
  136. package/dist/chunk-GBH6DN5C.cjs.map +0 -1
  137. package/dist/chunk-IX3ABYKZ.cjs.map +0 -1
  138. package/dist/chunk-L4E76X2K.js +0 -57
  139. package/dist/chunk-L4E76X2K.js.map +0 -1
  140. package/dist/chunk-Q4DNT7FO.js.map +0 -1
  141. package/dist/chunk-SO25EHOE.js.map +0 -1
  142. package/dist/chunk-SYRDCLH7.cjs.map +0 -1
  143. package/dist/chunk-VSTRLXMQ.cjs.map +0 -1
  144. package/dist/chunk-W3KPQX7V.cjs.map +0 -1
  145. package/dist/chunk-WH4Y5MT6.js.map +0 -1
  146. package/dist/chunk-XJ2VYR47.cjs.map +0 -1
  147. package/dist/chunk-XR5EJS3C.js.map +0 -1
  148. package/dist/media-HOT3O7RW.js +0 -4
  149. package/dist/media-WKP5AOX2.cjs +0 -17
  150. package/dist/postgres-auth-adapter-7F3ECO7I.js +0 -5
  151. package/dist/postgres-auth-adapter-Z463NYJZ.cjs +0 -14
@@ -3,12 +3,17 @@
3
3
  var path = require('path');
4
4
  var fs = require('fs');
5
5
 
6
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
6
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
8
 
8
9
  var path__default = /*#__PURE__*/_interopDefault(path);
9
10
  var fs__default = /*#__PURE__*/_interopDefault(fs);
10
11
 
11
12
  // src/integration.ts
13
+ var API_HANDLER_ENTRYPOINT = path__default.default.resolve(
14
+ new URL(".", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-WBCIEYHC.cjs', document.baseURI).href))).pathname,
15
+ "api-handler.js"
16
+ );
12
17
  function kyro(options = {}) {
13
18
  const {
14
19
  configPath = "./kyro.config.ts",
@@ -41,28 +46,13 @@ function kyro(options = {}) {
41
46
  });
42
47
  injectRoute({
43
48
  pattern: `${apiPath}/[...path]`,
44
- entrypoint: "@kyro-cms/core/api-handler"
49
+ entrypoint: API_HANDLER_ENTRYPOINT
45
50
  });
46
- if (admin) {
47
- try {
48
- const { ADMIN_ROUTES } = await import('@kyro-cms/admin/routes');
49
- for (const route of ADMIN_ROUTES) {
50
- const pattern = adminPath + route.pattern;
51
- injectRoute({
52
- pattern,
53
- entrypoint: route.entrypoint
54
- });
55
- }
56
- logger.info(`Mounted ${ADMIN_ROUTES.length} admin routes at ${adminPath}`);
57
- } catch (e) {
58
- logger.warn("Could not find @kyro-cms/admin/routes. Admin UI will not be available.");
59
- }
60
- }
61
51
  }
62
52
  }
63
53
  };
64
54
  }
65
55
 
66
56
  exports.kyro = kyro;
67
- //# sourceMappingURL=chunk-GBH6DN5C.cjs.map
68
- //# sourceMappingURL=chunk-GBH6DN5C.cjs.map
57
+ //# sourceMappingURL=chunk-WBCIEYHC.cjs.map
58
+ //# sourceMappingURL=chunk-WBCIEYHC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integration.ts"],"names":["path","fs"],"mappings":";;;;;;;;;;;;AAGA,IAAM,yBAAyBA,qBAAA,CAAK,OAAA;AAAA,EAClC,IAAI,GAAA,CAAI,GAAA,EAAK,oQAAe,CAAA,CAAE,QAAA;AAAA,EAC9B;AACF,CAAA;AAyBe,SAAR,IAAA,CAAsB,OAAA,GAAkC,EAAC,EAAqB;AACnF,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,kBAAA;AAAA,IACb,OAAA,GAAU,MAAA;AAAA,IACV,SAAA,GAAY,QAAA;AAAA,IACZ,KAAA,GAAQ;AAAA,GACV,GAAI,OAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,sBAAsB,OAAO,EAAE,QAAQ,YAAA,EAAc,WAAA,EAAa,QAAO,KAAM;AAC7E,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,CAAG,CAAA;AAGxE,QAAA,MAAM,qBAAqBA,qBAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,UAAU,CAAA;AAExE,QAAA,IAAI,eAAA,GAAkB,kBAAA;AACtB,QAAA,IAAI,CAACC,mBAAA,CAAG,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiC,UAAU,CAAA,sDAAA,CAAwD,CAAA;AAAA,QAEjH;AAGA,QAAA,YAAA,CAAa;AAAA,UACX,IAAA,EAAM;AAAA,YACJ,OAAA,EAAS;AAAA,cACP,KAAA,EAAO;AAAA,gBACL,aAAA,EAAe;AAAA;AACjB,aACF;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,iBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,cACzC,mBAAA,EAAqB,IAAA,CAAK,SAAA,CAAU,SAAS;AAAA;AAC/C;AACF,SACD,CAAA;AAID,QAAA,WAAA,CAAY;AAAA,UACV,OAAA,EAAS,GAAG,OAAO,CAAA,UAAA,CAAA;AAAA,UACnB,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MAIH;AAAA;AACF,GACF;AACF","file":"chunk-WBCIEYHC.cjs","sourcesContent":["import type { AstroIntegration } from \"astro\";\nimport path from \"path\";\nimport fs from \"fs\";\nconst API_HANDLER_ENTRYPOINT = path.resolve(\n new URL(\".\", import.meta.url).pathname,\n \"api-handler.js\",\n);\n\nexport interface KyroIntegrationOptions {\n /**\n * Path to the kyro configuration file relative to the project root.\n * Default: './kyro.config.ts'\n */\n configPath?: string;\n /**\n * Base path where the API should be mounted.\n * Default: '/api/kyro'\n */\n apiPath?: string;\n /**\n * Base path where the admin UI should be mounted.\n * Default: '/admin'\n */\n adminPath?: string;\n /**\n * Whether to mount the admin UI.\n * Default: true\n */\n admin?: boolean;\n}\n\nexport default function kyro(options: KyroIntegrationOptions = {}): AstroIntegration {\n const {\n configPath = \"./kyro.config.ts\",\n apiPath = \"/api\",\n adminPath = \"/admin\",\n admin = true,\n } = options;\n\n return {\n name: \"@kyro-cms/core\",\n hooks: {\n \"astro:config:setup\": async ({ config, updateConfig, injectRoute, logger }) => {\n logger.info(`Setting up Kyro CMS (API: ${apiPath}, Admin: ${adminPath})`);\n \n // Resolve config path\n const resolvedConfigPath = path.resolve(config.root.pathname, configPath);\n \n let finalConfigPath = resolvedConfigPath;\n if (!fs.existsSync(resolvedConfigPath)) {\n logger.warn(`Kyro config file not found at ${configPath}. The API will fail to boot if collections are needed.`);\n // If we had a default fallback, we could set it here\n }\n \n // Add Vite configuration so the API handler can import the config\n updateConfig({\n vite: {\n resolve: {\n alias: {\n \"kyro:config\": finalConfigPath,\n },\n },\n define: {\n __KYRO_API_PATH__: JSON.stringify(apiPath),\n __KYRO_ADMIN_PATH__: JSON.stringify(adminPath),\n },\n },\n });\n \n // Inject the core API routes\n // This mounts our Hono app or Astro endpoints to handle backend requests\n injectRoute({\n pattern: `${apiPath}/[...path]`,\n entrypoint: API_HANDLER_ENTRYPOINT,\n });\n \n // Admin UI routes are injected by the @kyro-cms/admin integration\n // No need to import them here - the kyroAdmin() integration handles it\n },\n },\n };\n}\n"]}
@@ -2,7 +2,20 @@
2
2
 
3
3
  var chunkKOCTZKPV_cjs = require('./chunk-KOCTZKPV.cjs');
4
4
  var drizzleOrm = require('drizzle-orm');
5
+ var pgCore = require('drizzle-orm/pg-core');
6
+ var postgresJs = require('drizzle-orm/postgres-js');
7
+ var postgres = require('postgres');
8
+ var crypto = require('crypto');
9
+ var promises = require('fs/promises');
10
+ var path = require('path');
11
+ var module$1 = require('module');
5
12
 
13
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
+
16
+ var postgres__default = /*#__PURE__*/_interopDefault(postgres);
17
+
18
+ var _schemaEnsured = false;
6
19
  function fieldToDrizzleType(field, dialect = "postgres") {
7
20
  switch (field.type) {
8
21
  case "text":
@@ -76,45 +89,57 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
76
89
  client;
77
90
  schema;
78
91
  dialect;
92
+ connectionString;
79
93
  draftsTableReady = false;
80
94
  versionsTableReady = false;
81
95
  constructor(options) {
82
96
  super();
83
- this.client = options.client;
84
97
  this.schema = options.schema || {};
85
- this.dialect = options.type;
98
+ if (options.connectionString) {
99
+ this.connectionString = options.connectionString;
100
+ const connStr = options.connectionString.toLowerCase();
101
+ if (connStr.startsWith("postgres://") || connStr.startsWith("postgresql://")) {
102
+ this.dialect = "postgres";
103
+ } else {
104
+ this.dialect = "sqlite";
105
+ }
106
+ } else {
107
+ this.client = options.client;
108
+ this.dialect = options.type || "sqlite";
109
+ }
86
110
  }
87
111
  prepareData(data, config) {
88
112
  const result = super.prepareData(data, config);
113
+ if (result.createdAt && typeof result.createdAt === "string") {
114
+ result.createdAt = new Date(result.createdAt);
115
+ }
116
+ if (result.updatedAt && typeof result.updatedAt === "string") {
117
+ result.updatedAt = new Date(result.updatedAt);
118
+ }
89
119
  for (const field of config.fields) {
120
+ const dbType = fieldToDrizzleType(field, "postgres");
121
+ const isJsonb = dbType === "jsonb";
90
122
  if (field.type === "tabs" && "tabs" in field && field.name) {
91
123
  const tabData = data[field.name];
92
124
  if (tabData && typeof tabData === "object") {
93
125
  const processedTabData = {};
94
126
  for (const [key, value] of Object.entries(tabData)) {
95
127
  const tabField = field.tabs.flatMap((t) => t.fields).find((f) => f.name === key);
96
- if ((tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value) {
97
- if (Array.isArray(value)) {
98
- processedTabData[key] = JSON.stringify(value);
99
- } else if (typeof value === "object") {
100
- processedTabData[key] = JSON.stringify(value);
101
- } else {
102
- processedTabData[key] = value;
103
- }
128
+ const needsStringify = (tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value;
129
+ if (needsStringify) {
130
+ processedTabData[key] = Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
104
131
  } else {
105
132
  processedTabData[key] = value;
106
133
  }
107
134
  }
108
- result[field.name] = JSON.stringify(processedTabData);
135
+ result[field.name] = isJsonb ? processedTabData : JSON.stringify(processedTabData);
109
136
  }
110
137
  }
111
- if (["upload", "image", "list", "relationship-block"].includes(field.type) && field.name) {
112
- const value = data[field.name];
113
- if (value) {
114
- if (Array.isArray(value)) {
115
- result[field.name] = JSON.stringify(value);
116
- } else if (typeof value === "object") {
117
- result[field.name] = JSON.stringify(value);
138
+ if (field.type === "upload" || field.type === "image" || field.type === "list" || field.type === "relationship-block") {
139
+ if (field.name) {
140
+ const value = data[field.name];
141
+ if (value) {
142
+ result[field.name] = isJsonb ? value : Array.isArray(value) ? JSON.stringify(value) : typeof value === "object" ? JSON.stringify(value) : value;
118
143
  }
119
144
  }
120
145
  }
@@ -122,9 +147,141 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
122
147
  return result;
123
148
  }
124
149
  async connect() {
150
+ if (this.connectionString && !this.client) {
151
+ const { default: postgres2 } = await import('postgres');
152
+ const { drizzle: drizzle2 } = await import('drizzle-orm/postgres-js');
153
+ const sql2 = postgres2(this.connectionString, { onnotice: () => {
154
+ } });
155
+ this.client = drizzle2(sql2, { schema: this.schema });
156
+ }
125
157
  this.connected = true;
126
158
  console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);
127
159
  }
160
+ async init(collections, globals = []) {
161
+ await super.init(collections, globals);
162
+ if (this.dialect === "postgres" && this.client && !_schemaEnsured) {
163
+ for (const config of collections) {
164
+ const tableName = this.getTableName(config.slug);
165
+ if (!this.schema[tableName]) {
166
+ this.schema[tableName] = this.createTableFromConfig(config);
167
+ }
168
+ }
169
+ await this.ensureCollectionTables(collections);
170
+ const globalCollections = globals.map((g) => ({
171
+ slug: `_globals_${g.slug}`,
172
+ fields: g.fields,
173
+ label: g.label
174
+ }));
175
+ for (const gc of globalCollections) {
176
+ const tableName = this.getTableName(gc.slug);
177
+ if (!this.schema[tableName]) {
178
+ this.schema[tableName] = this.createTableFromConfig(gc, true);
179
+ }
180
+ if (!this.collections.has(gc.slug)) {
181
+ this.collections.set(gc.slug, gc);
182
+ }
183
+ }
184
+ await this.ensureCollectionTables(globalCollections);
185
+ _schemaEnsured = true;
186
+ }
187
+ }
188
+ createTableFromConfig(config, useTextId = false) {
189
+ const tableName = this.getTableName(config.slug);
190
+ const columns = {
191
+ id: useTextId ? pgCore.text("id").primaryKey() : pgCore.uuid("id").primaryKey().defaultRandom()
192
+ };
193
+ for (const field of config.fields) {
194
+ if (!field.name || field.name === "id") continue;
195
+ const dbType = fieldToDrizzleType(field, "postgres");
196
+ const propName = field.name.replace(/-/g, "_");
197
+ const sqlName = propName.replace(/([A-Z])/g, "_$1").toLowerCase();
198
+ let col;
199
+ switch (dbType) {
200
+ case "varchar":
201
+ col = pgCore.varchar(sqlName, { length: 255 });
202
+ break;
203
+ case "integer":
204
+ col = pgCore.integer(sqlName);
205
+ break;
206
+ case "decimal":
207
+ col = pgCore.decimal(sqlName);
208
+ break;
209
+ case "boolean":
210
+ col = pgCore.boolean(sqlName);
211
+ break;
212
+ case "timestamp":
213
+ col = pgCore.timestamp(sqlName);
214
+ break;
215
+ case "jsonb":
216
+ col = pgCore.jsonb(sqlName);
217
+ break;
218
+ default:
219
+ col = pgCore.text(sqlName);
220
+ }
221
+ if (!field.required) col = col.default(null);
222
+ columns[propName] = col;
223
+ }
224
+ if (!columns.createdAt) columns.createdAt = pgCore.timestamp("created_at").defaultNow();
225
+ if (!columns.updatedAt) columns.updatedAt = pgCore.timestamp("updated_at").defaultNow();
226
+ columns._status = pgCore.varchar("_status", { length: 20 }).default("published");
227
+ columns._has_draft = pgCore.boolean("_has_draft").default(false);
228
+ return pgCore.pgTable(tableName, columns);
229
+ }
230
+ async ensureCollectionTables(collections) {
231
+ for (const config of collections) {
232
+ const isGlobal = config.slug.startsWith("_globals_");
233
+ const tableName = this.getTableName(config.slug);
234
+ const tableIdent = drizzleOrm.sql.identifier(tableName);
235
+ const colDefs = this.generateCreateColumns(config);
236
+ const hasCreated = config.fields.some((f) => f.name === "createdAt");
237
+ const hasUpdated = config.fields.some((f) => f.name === "updatedAt");
238
+ const idCol = isGlobal ? '"id" TEXT PRIMARY KEY' : '"id" UUID PRIMARY KEY DEFAULT gen_random_uuid()';
239
+ await this.client.execute(drizzleOrm.sql`
240
+ CREATE TABLE IF NOT EXISTS ${tableIdent} (
241
+ ${drizzleOrm.sql.raw(idCol)},
242
+ ${drizzleOrm.sql.raw(colDefs)}
243
+ ${hasCreated ? drizzleOrm.sql.raw("") : drizzleOrm.sql.raw('"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),')}
244
+ ${hasUpdated ? drizzleOrm.sql.raw("") : drizzleOrm.sql.raw('"updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),')}
245
+ "_status" VARCHAR(20) DEFAULT 'published',
246
+ "_has_draft" BOOLEAN DEFAULT false
247
+ )
248
+ `);
249
+ }
250
+ }
251
+ generateCreateColumns(config) {
252
+ const cols = [];
253
+ for (const field of config.fields) {
254
+ if (!field.name || field.name === "id") continue;
255
+ const dbType = fieldToDrizzleType(field, "postgres");
256
+ const sqlName = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
257
+ const nullable = field.required ? "NOT NULL" : "DEFAULT NULL";
258
+ let sqlType;
259
+ switch (dbType) {
260
+ case "varchar":
261
+ sqlType = `VARCHAR(255) ${nullable}`;
262
+ break;
263
+ case "integer":
264
+ sqlType = `INTEGER ${nullable}`;
265
+ break;
266
+ case "decimal":
267
+ sqlType = `DECIMAL ${nullable}`;
268
+ break;
269
+ case "boolean":
270
+ sqlType = `BOOLEAN ${nullable}`;
271
+ break;
272
+ case "timestamp":
273
+ sqlType = `TIMESTAMP ${nullable}`;
274
+ break;
275
+ case "jsonb":
276
+ sqlType = `JSONB ${nullable}`;
277
+ break;
278
+ default:
279
+ sqlType = `TEXT ${nullable}`;
280
+ }
281
+ cols.push(`"${sqlName}" ${sqlType}`);
282
+ }
283
+ return cols.join(",\n ") + (cols.length > 0 ? "," : "");
284
+ }
128
285
  async disconnect() {
129
286
  this.connected = false;
130
287
  console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);
@@ -133,16 +290,18 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
133
290
  const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
134
291
  const config = this.getCollection(slug);
135
292
  const table = this.getTable(slug);
136
- const filters = this.buildWhereClause(where, config, table, tenantID);
137
- if (!draft) {
138
- filters.push(table._status.equals("published"));
293
+ const filters = this.buildWhereClause(where, config, table, tenantID) || [];
294
+ if (!draft && table._status) {
295
+ filters.push(drizzleOrm.eq(table._status, "published"));
139
296
  }
140
297
  const sortOption = this.parseSort(sort);
141
298
  const totalDocs = await this.count({ collection: slug, where: { ...where, _status: draft ? void 0 : "published" }, tenantID });
142
299
  const offset = (page - 1) * limit;
143
300
  let results = [];
144
301
  try {
145
- results = await this.client.select().from(table).where(filters).orderBy(sortOption.direction === "asc" ? table[sortOption.field] : void 0).limit(limit).offset(offset);
302
+ const sortCol = table[sortOption.field] || table.createdAt || table.id;
303
+ const sorted = sortOption.direction === "asc" ? sortCol : drizzleOrm.desc(sortCol);
304
+ results = await this.client.select().from(table).where(filters).orderBy(sorted).limit(limit).offset(offset);
146
305
  } catch (error) {
147
306
  console.error(`[DrizzleAdapter] Query error:`, error);
148
307
  }
@@ -172,16 +331,13 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
172
331
  const { collection: slug, id, tenantID, draft } = args;
173
332
  const config = this.getCollection(slug);
174
333
  const table = this.getTable(slug);
175
- let query = this.client.select().from(table).where(table.id.equals(id));
176
- if (tenantID) {
177
- query = query.where(table.tenantId.equals(tenantID));
178
- }
179
- if (!draft) {
180
- query = query.where(table._status.equals("published"));
181
- }
182
- const results = await query.limit(1);
183
- if (results.length === 0) return null;
184
- let doc = this.processResult(results[0], config);
334
+ const conditions = [drizzleOrm.eq(table.id, id)];
335
+ if (tenantID && table.tenantId) conditions.push(drizzleOrm.eq(table.tenantId, tenantID));
336
+ if (!draft && table._status) conditions.push(drizzleOrm.eq(table._status, "published"));
337
+ const whereClause = conditions.length > 1 ? drizzleOrm.and(...conditions) : conditions[0];
338
+ let allRows = await this.client.select().from(table).where(whereClause);
339
+ if (allRows.length === 0) return null;
340
+ let doc = this.processResult(allRows[0], config);
185
341
  if (draft && doc._has_draft) {
186
342
  const versions = await this.findVersions({
187
343
  collection: slug,
@@ -222,8 +378,8 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
222
378
  const config = this.getCollection(slug);
223
379
  const table = this.getTable(slug);
224
380
  let query = this.client.delete(table).where(drizzleOrm.eq(table.id, id)).returning();
225
- if (tenantID) {
226
- query = query.where(table.tenantId.equals(tenantID));
381
+ if (tenantID && table.tenantId) {
382
+ query = query.where(drizzleOrm.eq(table.tenantId, tenantID));
227
383
  }
228
384
  const result = await query;
229
385
  if (result.length === 0) {
@@ -237,7 +393,7 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
237
393
  const table = this.getTable(slug);
238
394
  const filters = this.buildWhereClause(where, config, table, tenantID);
239
395
  try {
240
- const result = await this.client.select({ count: `count(*)` }).from(table).where(filters);
396
+ const result = await this.client.select({ count: `count(*)` }).from(table).where(filters || void 0);
241
397
  return parseInt(result[0]?.count || "0");
242
398
  } catch {
243
399
  return 0;
@@ -251,8 +407,8 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
251
407
  if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
252
408
  const table = this.getTable(slug);
253
409
  let query = this.client.select().from(table);
254
- if (!draft) {
255
- query = query.where(table._status.equals("published"));
410
+ if (!draft && table._status) {
411
+ query = query.where(drizzleOrm.eq(table._status, "published"));
256
412
  }
257
413
  const results = await query.limit(1);
258
414
  if (results.length === 0) return null;
@@ -477,6 +633,14 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
477
633
  if (data.id) {
478
634
  result.id = String(data.id);
479
635
  }
636
+ for (const field of config.fields) {
637
+ if (!field.name) continue;
638
+ const sqlKey = field.name.replace(/-/g, "_").replace(/([A-Z])/g, "_$1").toLowerCase();
639
+ if (sqlKey !== field.name && result[sqlKey] !== void 0 && result[field.name] === void 0) {
640
+ result[field.name] = result[sqlKey];
641
+ delete result[sqlKey];
642
+ }
643
+ }
480
644
  for (const field of config.fields) {
481
645
  if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(field.type)) {
482
646
  const f = field;
@@ -489,6 +653,19 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
489
653
  }
490
654
  }
491
655
  if (field.type === "tabs" && "tabs" in field && field.name) {
656
+ if (typeof result[field.name] === "object" && result[field.name] !== null && !Array.isArray(result[field.name])) {
657
+ continue;
658
+ }
659
+ if (typeof result[field.name] === "string") {
660
+ try {
661
+ const parsed = JSON.parse(result[field.name]);
662
+ if (typeof parsed === "object" && parsed !== null) {
663
+ result[field.name] = parsed;
664
+ continue;
665
+ }
666
+ } catch {
667
+ }
668
+ }
492
669
  const tabData = {};
493
670
  for (const tab of field.tabs) {
494
671
  for (const tabField of tab.fields) {
@@ -519,7 +696,7 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
519
696
  return result;
520
697
  }
521
698
  async ensureDraftsTable() {
522
- if (this.draftsTableReady) return;
699
+ if (_schemaEnsured || this.draftsTableReady) return;
523
700
  const createTableSQL = drizzleOrm.sql.raw(`
524
701
  CREATE TABLE IF NOT EXISTS kyro_drafts (
525
702
  id text PRIMARY KEY,
@@ -537,7 +714,7 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
537
714
  this.draftsTableReady = true;
538
715
  }
539
716
  async ensureVersionsTable() {
540
- if (this.versionsTableReady) return;
717
+ if (_schemaEnsured || this.versionsTableReady) return;
541
718
  const createTableSQL = drizzleOrm.sql.raw(`
542
719
  CREATE TABLE IF NOT EXISTS kyro_versions (
543
720
  id text PRIMARY KEY,
@@ -588,10 +765,61 @@ var DrizzleAdapter = class extends chunkKOCTZKPV_cjs.AbstractBaseAdapter {
588
765
  function createDrizzleAdapter(options) {
589
766
  return new DrizzleAdapter(options);
590
767
  }
768
+ var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-WVPOPOEQ.cjs', document.baseURI).href)));
769
+ var modPath = "node:sqlite";
770
+ var { DatabaseSync } = _require(modPath);
771
+ function getDialect() {
772
+ const val = process.env.DB_TYPE;
773
+ if (val === "postgres") return "postgres";
774
+ return "sqlite";
775
+ }
776
+ function genId() {
777
+ return crypto.randomBytes(16).toString("hex");
778
+ }
779
+ async function createDatabase() {
780
+ const dialect = getDialect();
781
+ if (dialect === "sqlite") {
782
+ const dbPath = path.resolve(process.cwd(), "data", "kyro.db");
783
+ await promises.mkdir(path.dirname(dbPath), { recursive: true });
784
+ const db2 = new DatabaseSync(dbPath);
785
+ db2.exec("PRAGMA journal_mode = WAL");
786
+ return { db: db2, dialect, genId };
787
+ }
788
+ const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
789
+ const maxConnections = parseInt(process.env.DB_POOL_MAX || "10", 10);
790
+ const ssl = process.env.DB_SSL === "true";
791
+ const client = postgres__default.default(databaseUrl, {
792
+ max: maxConnections,
793
+ ssl: ssl ? "require" : false,
794
+ onnotice: () => {
795
+ }
796
+ });
797
+ const db = postgresJs.drizzle(client);
798
+ return { db, dialect, genId };
799
+ }
800
+ async function runMigrations(_db, _dialect) {
801
+ console.log(
802
+ `[createDatabase] runMigrations called \u2014 use drizzle-kit CLI for migrations (drizzle-kit migrate)`
803
+ );
804
+ }
805
+ async function seedDefaultRoles(db) {
806
+ const { roles } = await import('./schema-37SE2F4B.cjs');
807
+ await db.insert(roles).values({
808
+ name: "super_admin",
809
+ level: 100,
810
+ inherits: [],
811
+ description: "Full system access across all tenants",
812
+ isSystem: true
813
+ }).onConflictDoNothing();
814
+ }
591
815
 
592
816
  exports.DrizzleAdapter = DrizzleAdapter;
593
817
  exports.collectionToDrizzleSchema = collectionToDrizzleSchema;
818
+ exports.createDatabase = createDatabase;
594
819
  exports.createDrizzleAdapter = createDrizzleAdapter;
595
820
  exports.fieldToDrizzleType = fieldToDrizzleType;
596
- //# sourceMappingURL=chunk-3ZZPZYCM.cjs.map
597
- //# sourceMappingURL=chunk-3ZZPZYCM.cjs.map
821
+ exports.genId = genId;
822
+ exports.runMigrations = runMigrations;
823
+ exports.seedDefaultRoles = seedDefaultRoles;
824
+ //# sourceMappingURL=chunk-WVPOPOEQ.cjs.map
825
+ //# sourceMappingURL=chunk-WVPOPOEQ.cjs.map