@kyro-cms/core 0.5.4 → 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.
- package/dist/WebhookService-118ZTFis.d.ts +112 -0
- package/dist/WebhookService-AefJfqX0.d.cts +112 -0
- package/dist/adapter-BSvBudTG.d.cts +65 -0
- package/dist/adapter-CXGB2Elb.d.ts +65 -0
- package/dist/api-handler.cjs +26 -8
- package/dist/api-handler.cjs.map +1 -1
- package/dist/api-handler.d.cts +9 -0
- package/dist/api-handler.d.ts +9 -0
- package/dist/api-handler.js +25 -7
- package/dist/api-handler.js.map +1 -1
- package/dist/base-DvvNqnM-.d.cts +73 -0
- package/dist/base-eVegJ_Pr.d.ts +73 -0
- package/dist/bootstrap-4MH44YKG.js +6 -0
- package/dist/{bootstrap-PBMMLBQC.js.map → bootstrap-4MH44YKG.js.map} +1 -1
- package/dist/bootstrap-EE6BJZWL.cjs +31 -0
- package/dist/{bootstrap-QN77EVI3.cjs.map → bootstrap-EE6BJZWL.cjs.map} +1 -1
- package/dist/chunk-3YELQL7Z.cjs +4 -0
- package/dist/chunk-3YELQL7Z.cjs.map +1 -0
- package/dist/{chunk-AGAIUDAV.cjs → chunk-55BNRTLW.cjs} +7 -7
- package/dist/chunk-55BNRTLW.cjs.map +1 -0
- package/dist/{chunk-XJ2VYR47.cjs → chunk-5HA5OMFH.cjs} +10 -7
- package/dist/chunk-5HA5OMFH.cjs.map +1 -0
- package/dist/{chunk-C4JJEE42.js → chunk-6WXQRYTW.js} +262 -43
- package/dist/chunk-6WXQRYTW.js.map +1 -0
- package/dist/{chunk-SO25EHOE.js → chunk-AM4JKIPP.js} +180 -77
- package/dist/chunk-AM4JKIPP.js.map +1 -0
- package/dist/{chunk-VSTRLXMQ.cjs → chunk-CKVOU6MX.cjs} +4 -2
- package/dist/chunk-CKVOU6MX.cjs.map +1 -0
- package/dist/chunk-GTGRLD4Y.js +3 -0
- package/dist/chunk-GTGRLD4Y.js.map +1 -0
- package/dist/chunk-MTIRYI7F.cjs +4 -0
- package/dist/chunk-MTIRYI7F.cjs.map +1 -0
- package/dist/{chunk-342BJNBI.js → chunk-QKVA2SOG.js} +300 -6
- package/dist/chunk-QKVA2SOG.js.map +1 -0
- package/dist/chunk-QU2RFFH4.js +3 -0
- package/dist/chunk-QU2RFFH4.js.map +1 -0
- package/dist/{chunk-ATVNYGRQ.js → chunk-QYZKIPSD.js} +7 -18
- package/dist/chunk-QYZKIPSD.js.map +1 -0
- package/dist/{chunk-SYRDCLH7.cjs → chunk-R2YHJN6W.cjs} +184 -81
- package/dist/chunk-R2YHJN6W.cjs.map +1 -0
- package/dist/{chunk-IX3ABYKZ.cjs → chunk-RALQO47U.cjs} +170 -2
- package/dist/chunk-RALQO47U.cjs.map +1 -0
- package/dist/{chunk-EVEJC22G.cjs → chunk-RDRJVCL5.cjs} +37 -5
- package/dist/chunk-RDRJVCL5.cjs.map +1 -0
- package/dist/{chunk-6COM32WF.js → chunk-RP7VZUEL.js} +5 -3
- package/dist/chunk-RP7VZUEL.js.map +1 -0
- package/dist/{chunk-XR5EJS3C.js → chunk-S3FG2NY7.js} +7 -4
- package/dist/chunk-S3FG2NY7.js.map +1 -0
- package/dist/{chunk-WH4Y5MT6.js → chunk-TP5YQFIX.js} +36 -4
- package/dist/chunk-TP5YQFIX.js.map +1 -0
- package/dist/{chunk-DBUYB32X.js → chunk-TVVYZ2TH.js} +171 -3
- package/dist/chunk-TVVYZ2TH.js.map +1 -0
- package/dist/{chunk-GBH6DN5C.cjs → chunk-WBCIEYHC.cjs} +8 -18
- package/dist/chunk-WBCIEYHC.cjs.map +1 -0
- package/dist/{chunk-3ZZPZYCM.cjs → chunk-WVPOPOEQ.cjs} +269 -41
- package/dist/chunk-WVPOPOEQ.cjs.map +1 -0
- package/dist/{chunk-W3KPQX7V.cjs → chunk-XAEBVZTI.cjs} +304 -4
- package/dist/chunk-XAEBVZTI.cjs.map +1 -0
- package/dist/{chunk-Q4DNT7FO.js → chunk-XU7AFF6V.js} +6 -6
- package/dist/chunk-XU7AFF6V.js.map +1 -0
- package/dist/cli/index.cjs +6 -4
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/client.d.cts +12 -0
- package/dist/client.d.ts +12 -0
- package/dist/drizzle/index.cjs +18 -18
- package/dist/drizzle/index.d.cts +152 -0
- package/dist/drizzle/index.d.ts +152 -0
- package/dist/drizzle/index.js +3 -3
- package/dist/fields/index.d.cts +27 -0
- package/dist/fields/index.d.ts +27 -0
- package/dist/graphql/index.d.cts +22 -0
- package/dist/graphql/index.d.ts +22 -0
- package/dist/index-Bz9JqRGI.d.cts +86 -0
- package/dist/index-Bz9JqRGI.d.ts +86 -0
- package/dist/index-CLp-DRKA.d.ts +64 -0
- package/dist/index-DfO7G4kN.d.cts +64 -0
- package/dist/index.cjs +118 -86
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1368 -0
- package/dist/index.d.ts +1368 -0
- package/dist/index.js +48 -14
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +2 -2
- package/dist/integration.d.cts +27 -0
- package/dist/integration.d.ts +27 -0
- package/dist/integration.js +1 -1
- package/dist/media-GPPTZ43E.js +4 -0
- package/dist/{media-HOT3O7RW.js.map → media-GPPTZ43E.js.map} +1 -1
- package/dist/media-XNTUFJZR.cjs +17 -0
- package/dist/{media-WKP5AOX2.cjs.map → media-XNTUFJZR.cjs.map} +1 -1
- package/dist/mongodb/index.cjs +12 -3
- package/dist/mongodb/index.d.cts +59 -0
- package/dist/mongodb/index.d.ts +59 -0
- package/dist/mongodb/index.js +2 -1
- package/dist/postgres-auth-adapter-6742WDCF.cjs +14 -0
- package/dist/{postgres-auth-adapter-Z463NYJZ.cjs.map → postgres-auth-adapter-6742WDCF.cjs.map} +1 -1
- package/dist/postgres-auth-adapter-B65BULNS.js +5 -0
- package/dist/{postgres-auth-adapter-7F3ECO7I.js.map → postgres-auth-adapter-B65BULNS.js.map} +1 -1
- package/dist/rest/index.cjs +9 -5
- package/dist/rest/index.d.cts +57 -0
- package/dist/rest/index.d.ts +57 -0
- package/dist/rest/index.js +7 -3
- package/dist/{schema-TIYTCIKX.cjs → schema-37SE2F4B.cjs} +5 -5
- package/dist/{schema-TIYTCIKX.cjs.map → schema-37SE2F4B.cjs.map} +1 -1
- package/dist/{schema-6Q4W6AE6.js → schema-5PHL5IVB.js} +3 -3
- package/dist/{schema-6Q4W6AE6.js.map → schema-5PHL5IVB.js.map} +1 -1
- package/dist/templates/index.d.cts +59 -0
- package/dist/templates/index.d.ts +59 -0
- package/dist/trpc/index.d.cts +136 -0
- package/dist/trpc/index.d.ts +136 -0
- package/dist/types-Bs1up4yP.d.ts +461 -0
- package/dist/types-DqN4ckOC.d.cts +130 -0
- package/dist/types-DqN4ckOC.d.ts +130 -0
- package/dist/types-J3R9nVsZ.d.cts +461 -0
- package/dist/types-VtjUxIMp.d.cts +246 -0
- package/dist/types-VtjUxIMp.d.ts +246 -0
- package/dist/ws/index.d.cts +88 -0
- package/dist/ws/index.d.ts +88 -0
- package/package.json +3 -2
- package/dist/bootstrap-PBMMLBQC.js +0 -6
- package/dist/bootstrap-QN77EVI3.cjs +0 -31
- package/dist/chunk-342BJNBI.js.map +0 -1
- package/dist/chunk-3ZZPZYCM.cjs.map +0 -1
- package/dist/chunk-6COM32WF.js.map +0 -1
- package/dist/chunk-7SXPHG3M.cjs +0 -67
- package/dist/chunk-7SXPHG3M.cjs.map +0 -1
- package/dist/chunk-AGAIUDAV.cjs.map +0 -1
- package/dist/chunk-ATVNYGRQ.js.map +0 -1
- package/dist/chunk-C4JJEE42.js.map +0 -1
- package/dist/chunk-DBUYB32X.js.map +0 -1
- package/dist/chunk-EVEJC22G.cjs.map +0 -1
- package/dist/chunk-GBH6DN5C.cjs.map +0 -1
- package/dist/chunk-IX3ABYKZ.cjs.map +0 -1
- package/dist/chunk-L4E76X2K.js +0 -57
- package/dist/chunk-L4E76X2K.js.map +0 -1
- package/dist/chunk-Q4DNT7FO.js.map +0 -1
- package/dist/chunk-SO25EHOE.js.map +0 -1
- package/dist/chunk-SYRDCLH7.cjs.map +0 -1
- package/dist/chunk-VSTRLXMQ.cjs.map +0 -1
- package/dist/chunk-W3KPQX7V.cjs.map +0 -1
- package/dist/chunk-WH4Y5MT6.js.map +0 -1
- package/dist/chunk-XJ2VYR47.cjs.map +0 -1
- package/dist/chunk-XR5EJS3C.js.map +0 -1
- package/dist/media-HOT3O7RW.js +0 -4
- package/dist/media-WKP5AOX2.cjs +0 -17
- package/dist/postgres-auth-adapter-7F3ECO7I.js +0 -5
- 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:
|
|
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-
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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 (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
176
|
-
if (tenantID)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
597
|
-
|
|
821
|
+
exports.genId = genId;
|
|
822
|
+
exports.runMigrations = runMigrations;
|
|
823
|
+
exports.seedDefaultRoles = seedDefaultRoles;
|
|
824
|
+
//# sourceMappingURL=chunk-WVPOPOEQ.cjs.map
|
|
825
|
+
//# sourceMappingURL=chunk-WVPOPOEQ.cjs.map
|