@kyro-cms/core 0.3.2 → 0.3.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-BznDc2AT.d.ts → WebhookService-118ZTFis.d.ts} +2 -2
- package/dist/{WebhookService-mZZ75syh.d.cts → WebhookService-AefJfqX0.d.cts} +2 -2
- package/dist/api-handler.cjs +52 -0
- package/dist/api-handler.cjs.map +1 -0
- package/dist/api-handler.d.cts +9 -0
- package/dist/api-handler.d.ts +9 -0
- package/dist/api-handler.js +46 -0
- package/dist/api-handler.js.map +1 -0
- package/dist/{base-Hu6ij8sZ.d.ts → base-DvvNqnM-.d.cts} +16 -5
- package/dist/{base-Db9LkB1N.d.cts → base-eVegJ_Pr.d.ts} +16 -5
- package/dist/bootstrap-DGJ3N7SO.js +6 -0
- package/dist/{bootstrap-LL6O7PWO.js.map → bootstrap-DGJ3N7SO.js.map} +1 -1
- package/dist/bootstrap-O5UGUTYU.cjs +31 -0
- package/dist/{bootstrap-BMWVB2T6.cjs.map → bootstrap-O5UGUTYU.cjs.map} +1 -1
- package/dist/{chunk-QKOFKITP.js → chunk-2HFJUUFZ.js} +3 -11
- package/dist/chunk-2HFJUUFZ.js.map +1 -0
- package/dist/chunk-2UOI5MUC.cjs +1276 -0
- package/dist/chunk-2UOI5MUC.cjs.map +1 -0
- package/dist/{chunk-DIC236EW.js → chunk-342BJNBI.js} +167 -24
- package/dist/chunk-342BJNBI.js.map +1 -0
- package/dist/{chunk-OUGKLCYF.js → chunk-3AJE4SEG.js} +4 -3
- package/dist/chunk-3AJE4SEG.js.map +1 -0
- package/dist/chunk-4UD44U4Z.js +5818 -0
- package/dist/chunk-4UD44U4Z.js.map +1 -0
- package/dist/chunk-5FTY2DLG.js +1258 -0
- package/dist/chunk-5FTY2DLG.js.map +1 -0
- package/dist/{chunk-BXMWDUED.js → chunk-A4USRVTQ.js} +2 -2
- package/dist/chunk-A4USRVTQ.js.map +1 -0
- package/dist/chunk-ADLJSJSN.cjs +13 -0
- package/dist/chunk-ADLJSJSN.cjs.map +1 -0
- package/dist/chunk-ATBOUGQP.cjs +513 -0
- package/dist/chunk-ATBOUGQP.cjs.map +1 -0
- package/dist/chunk-BQ2T4WRS.js +140 -0
- package/dist/chunk-BQ2T4WRS.js.map +1 -0
- package/dist/{chunk-U74F3YZU.js → chunk-DBUYB32X.js} +15 -3
- package/dist/chunk-DBUYB32X.js.map +1 -0
- package/dist/chunk-DE7OQOMD.cjs +5842 -0
- package/dist/chunk-DE7OQOMD.cjs.map +1 -0
- package/dist/chunk-DLHUQO25.cjs +1746 -0
- package/dist/chunk-DLHUQO25.cjs.map +1 -0
- package/dist/{chunk-GE5DMB44.js → chunk-E3BZLMX6.js} +55 -49
- package/dist/chunk-E3BZLMX6.js.map +1 -0
- package/dist/{chunk-44BF6ALS.cjs → chunk-H4XCAPA6.cjs} +55 -49
- package/dist/chunk-H4XCAPA6.cjs.map +1 -0
- package/dist/{chunk-VIONYQ2K.cjs → chunk-IBG6V56E.cjs} +16 -32
- package/dist/chunk-IBG6V56E.cjs.map +1 -0
- package/dist/{chunk-LIJVWQKU.cjs → chunk-IX3ABYKZ.cjs} +43 -31
- package/dist/chunk-IX3ABYKZ.cjs.map +1 -0
- package/dist/chunk-JYGIFBBS.cjs +146 -0
- package/dist/chunk-JYGIFBBS.cjs.map +1 -0
- package/dist/{chunk-42JPONZU.cjs → chunk-K7JPTH3G.cjs} +17 -16
- package/dist/chunk-K7JPTH3G.cjs.map +1 -0
- package/dist/{chunk-RLTG4YZM.cjs → chunk-KOCTZKPV.cjs} +2 -2
- package/dist/chunk-KOCTZKPV.cjs.map +1 -0
- package/dist/{chunk-EWP5AT6A.cjs → chunk-N4H37VN4.cjs} +2 -11
- package/dist/chunk-N4H37VN4.cjs.map +1 -0
- package/dist/chunk-P2YW545G.js +11 -0
- package/dist/chunk-P2YW545G.js.map +1 -0
- package/dist/chunk-Q23JB3KL.js +488 -0
- package/dist/chunk-Q23JB3KL.js.map +1 -0
- package/dist/{chunk-E5X75WNB.js → chunk-QXIQWPAP.js} +14 -30
- package/dist/chunk-QXIQWPAP.js.map +1 -0
- package/dist/chunk-R3XIBBAW.cjs +34 -0
- package/dist/chunk-R3XIBBAW.cjs.map +1 -0
- package/dist/chunk-R4C4O4SE.cjs +622 -0
- package/dist/chunk-R4C4O4SE.cjs.map +1 -0
- package/dist/{chunk-KWGNR4HM.js → chunk-REK7AYOC.js} +82 -9
- package/dist/chunk-REK7AYOC.js.map +1 -0
- package/dist/chunk-RGIQKTZ7.js +68 -0
- package/dist/chunk-RGIQKTZ7.js.map +1 -0
- package/dist/chunk-RYDGMBIG.js +1737 -0
- package/dist/chunk-RYDGMBIG.js.map +1 -0
- package/dist/chunk-SDMNUYVU.js +30 -0
- package/dist/chunk-SDMNUYVU.js.map +1 -0
- package/dist/{chunk-FTSSDDZQ.cjs → chunk-VJT6P4N6.cjs} +82 -9
- package/dist/chunk-VJT6P4N6.cjs.map +1 -0
- package/dist/{chunk-HT6VE4NW.cjs → chunk-W3KPQX7V.cjs} +168 -25
- package/dist/chunk-W3KPQX7V.cjs.map +1 -0
- package/dist/{chunk-LTRCYJAG.js → chunk-WOWUL7ZY.js} +3 -2
- package/dist/chunk-WOWUL7ZY.js.map +1 -0
- package/dist/{chunk-7YITG2US.cjs → chunk-WQBRWOQT.cjs} +3 -2
- package/dist/chunk-WQBRWOQT.cjs.map +1 -0
- package/dist/{chunk-KB6QF4HO.js → chunk-WSCJQI2B.js} +305 -152
- package/dist/chunk-WSCJQI2B.js.map +1 -0
- package/dist/chunk-X3CU27OO.cjs +78 -0
- package/dist/chunk-X3CU27OO.cjs.map +1 -0
- package/dist/chunk-Y3TM7WH7.js +617 -0
- package/dist/chunk-Y3TM7WH7.js.map +1 -0
- package/dist/{chunk-PNBZZ76A.cjs → chunk-Z2OVHWHB.cjs} +305 -151
- package/dist/chunk-Z2OVHWHB.cjs.map +1 -0
- package/dist/cli/index.cjs +2 -2
- package/dist/cli/index.js +2 -2
- package/dist/client.cjs +23 -13
- package/dist/client.d.cts +4 -2
- package/dist/client.d.ts +4 -2
- package/dist/client.js +3 -1
- package/dist/drizzle/index.cjs +20 -19
- package/dist/drizzle/index.d.cts +28 -7
- package/dist/drizzle/index.d.ts +28 -7
- package/dist/drizzle/index.js +5 -4
- package/dist/fields/index.cjs +105 -0
- package/dist/fields/index.cjs.map +1 -0
- package/dist/fields/index.d.cts +27 -0
- package/dist/fields/index.d.ts +27 -0
- package/dist/fields/index.js +4 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/graphql/index.cjs +4 -3
- package/dist/graphql/index.d.cts +3 -2
- package/dist/graphql/index.d.ts +3 -2
- package/dist/graphql/index.js +2 -1
- package/dist/{index-Ci6r4xnN.d.ts → index-CLp-DRKA.d.ts} +2 -1
- package/dist/{index-11MDNKce.d.cts → index-DfO7G4kN.d.cts} +2 -1
- package/dist/index.cjs +2659 -6670
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +138 -47
- package/dist/index.d.ts +138 -47
- package/dist/index.js +2356 -6529
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +68 -0
- package/dist/integration.cjs.map +1 -0
- package/dist/integration.d.cts +27 -0
- package/dist/integration.d.ts +27 -0
- package/dist/integration.js +61 -0
- package/dist/integration.js.map +1 -0
- package/dist/mongodb/index.cjs +4 -4
- package/dist/mongodb/index.d.cts +20 -6
- package/dist/mongodb/index.d.ts +20 -6
- package/dist/mongodb/index.js +2 -2
- package/dist/postgres-auth-adapter-7F3ECO7I.js +5 -0
- package/dist/{postgres-auth-adapter-OTRWSTT5.js.map → postgres-auth-adapter-7F3ECO7I.js.map} +1 -1
- package/dist/postgres-auth-adapter-Z463NYJZ.cjs +14 -0
- package/dist/{postgres-auth-adapter-EVRPO7BQ.cjs.map → postgres-auth-adapter-Z463NYJZ.cjs.map} +1 -1
- package/dist/redis-adapter-LPUWLE4Y.cjs +13 -0
- package/dist/{redis-adapter-E7PMN5HW.cjs.map → redis-adapter-LPUWLE4Y.cjs.map} +1 -1
- package/dist/redis-adapter-THYDCGQR.js +4 -0
- package/dist/{redis-adapter-HOO67RBQ.js.map → redis-adapter-THYDCGQR.js.map} +1 -1
- package/dist/rest/index.cjs +9 -5
- package/dist/rest/index.d.cts +6 -3
- package/dist/rest/index.d.ts +6 -3
- package/dist/rest/index.js +7 -3
- package/dist/{schema-CNB2DDTX.js → schema-6Q4W6AE6.js} +3 -3
- package/dist/{schema-CNB2DDTX.js.map → schema-6Q4W6AE6.js.map} +1 -1
- package/dist/{schema-Y777CQQS.cjs → schema-TIYTCIKX.cjs} +14 -14
- package/dist/{schema-Y777CQQS.cjs.map → schema-TIYTCIKX.cjs.map} +1 -1
- package/dist/templates/index.cjs +27 -23
- package/dist/templates/index.d.cts +8 -2
- package/dist/templates/index.d.ts +8 -2
- package/dist/templates/index.js +1 -1
- package/dist/trpc/index.cjs +12 -11
- package/dist/trpc/index.d.cts +3 -2
- package/dist/trpc/index.d.ts +3 -2
- package/dist/trpc/index.js +3 -2
- package/dist/{types-1u353OHN.d.ts → types-BnTm7oJG.d.cts} +7 -3
- package/dist/{types-1u353OHN.d.cts → types-BnTm7oJG.d.ts} +7 -3
- package/dist/{types-kGfsGdos.d.cts → types-Bs1up4yP.d.ts} +76 -244
- package/dist/{types-kGfsGdos.d.ts → types-J3R9nVsZ.d.cts} +76 -244
- package/dist/types-VtjUxIMp.d.cts +246 -0
- package/dist/types-VtjUxIMp.d.ts +246 -0
- package/package.json +16 -9
- package/dist/bootstrap-BMWVB2T6.cjs +0 -31
- package/dist/bootstrap-LL6O7PWO.js +0 -6
- package/dist/chunk-42JPONZU.cjs.map +0 -1
- package/dist/chunk-44BF6ALS.cjs.map +0 -1
- package/dist/chunk-4M5PHMUE.cjs +0 -947
- package/dist/chunk-4M5PHMUE.cjs.map +0 -1
- package/dist/chunk-6MSSF46R.js +0 -941
- package/dist/chunk-6MSSF46R.js.map +0 -1
- package/dist/chunk-7YITG2US.cjs.map +0 -1
- package/dist/chunk-BTOE3VUK.js +0 -330
- package/dist/chunk-BTOE3VUK.js.map +0 -1
- package/dist/chunk-BXMWDUED.js.map +0 -1
- package/dist/chunk-DIC236EW.js.map +0 -1
- package/dist/chunk-E5X75WNB.js.map +0 -1
- package/dist/chunk-E63IF3MD.cjs +0 -951
- package/dist/chunk-E63IF3MD.cjs.map +0 -1
- package/dist/chunk-EWP5AT6A.cjs.map +0 -1
- package/dist/chunk-FTSSDDZQ.cjs.map +0 -1
- package/dist/chunk-GE5DMB44.js.map +0 -1
- package/dist/chunk-GVFB5C6O.cjs +0 -345
- package/dist/chunk-GVFB5C6O.cjs.map +0 -1
- package/dist/chunk-HT6VE4NW.cjs.map +0 -1
- package/dist/chunk-HVSQDZZJ.cjs +0 -765
- package/dist/chunk-HVSQDZZJ.cjs.map +0 -1
- package/dist/chunk-HYC4GNHX.js +0 -758
- package/dist/chunk-HYC4GNHX.js.map +0 -1
- package/dist/chunk-KB6QF4HO.js.map +0 -1
- package/dist/chunk-KWGNR4HM.js.map +0 -1
- package/dist/chunk-LIJVWQKU.cjs.map +0 -1
- package/dist/chunk-LTRCYJAG.js.map +0 -1
- package/dist/chunk-OUGKLCYF.js.map +0 -1
- package/dist/chunk-PNBZZ76A.cjs.map +0 -1
- package/dist/chunk-QKOFKITP.js.map +0 -1
- package/dist/chunk-RLTG4YZM.cjs.map +0 -1
- package/dist/chunk-RRYXQMZG.js +0 -935
- package/dist/chunk-RRYXQMZG.js.map +0 -1
- package/dist/chunk-U74F3YZU.js.map +0 -1
- package/dist/chunk-VIONYQ2K.cjs.map +0 -1
- package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +0 -14
- package/dist/postgres-auth-adapter-OTRWSTT5.js +0 -5
- package/dist/redis-adapter-E7PMN5HW.cjs +0 -13
- package/dist/redis-adapter-HOO67RBQ.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/database.ts"],"names":["randomBytes","resolve","mkdir","dirname","db","DatabaseSync","mysql","drizzleMysql","postgres","drizzle"],"mappings":"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","file":"chunk-X3CU27OO.cjs","sourcesContent":["import { drizzle } from \"drizzle-orm/postgres-js\";\nimport { drizzle as drizzleMysql } from \"drizzle-orm/mysql2\";\nimport postgres from \"postgres\";\nimport mysql from \"mysql2/promise\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { randomBytes } from \"crypto\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\n\nexport type Dialect = \"sqlite\" | \"postgres\" | \"mysql\";\n\nfunction getDialect(): Dialect {\n const val = process.env.DB_TYPE as Dialect | undefined;\n if (val === \"mysql\") return \"mysql\";\n if (val === \"postgres\") return \"postgres\";\n return \"sqlite\";\n}\n\nexport function genId(): string {\n return randomBytes(16).toString(\"hex\");\n}\n\nexport interface DatabaseResult {\n db: any;\n dialect: Dialect;\n genId: () => string;\n}\n\nexport async function createDatabase(): Promise<DatabaseResult> {\n const dialect = getDialect();\n\n if (dialect === \"sqlite\") {\n const dbPath = resolve(process.cwd(), \"data\", \"kyro.db\");\n await mkdir(dirname(dbPath), { recursive: true });\n const db = new DatabaseSync(dbPath);\n db.exec(\"PRAGMA journal_mode = WAL\");\n return { db, dialect, genId };\n }\n\n if (dialect === \"mysql\") {\n const connectionString =\n process.env.DATABASE_URL ||\n `mysql://${process.env.DB_USER || \"root\"}:${process.env.DB_PASSWORD || \"\"}@${process.env.DB_HOST || \"localhost\"}:${process.env.DB_PORT || 3306}/${process.env.DB_NAME || \"kyro\"}?timezone=+00:00`;\n const pool = mysql.createPool({\n uri: connectionString,\n waitForConnections: true,\n connectionLimit: parseInt(process.env.DB_POOL_MAX || \"10\", 10),\n enableKeepAlive: true,\n });\n const db = drizzleMysql(pool);\n return { db, dialect, genId };\n }\n\n // postgres default\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const maxConnections = parseInt(process.env.DB_POOL_MAX || \"10\", 10);\n const ssl = process.env.DB_SSL === \"true\";\n const client = postgres(databaseUrl, {\n max: maxConnections,\n ssl: ssl ? \"require\" : false,\n });\n const db = drizzle(client);\n return { db, dialect, genId };\n}\n\nexport async function runMigrations(\n _db: any,\n _dialect?: Dialect,\n): Promise<void> {\n console.log(\n `[createDatabase] runMigrations called — use drizzle-kit CLI for migrations (drizzle-kit migrate)`,\n );\n}\n\nexport async function seedDefaultRoles(db: any): Promise<void> {\n const { roles } = await import(\"./schema/index.js\");\n await db\n .insert(roles)\n .values({\n name: \"super_admin\",\n level: 100,\n inherits: [],\n description: \"Full system access across all tenants\",\n isSystem: true,\n })\n .onConflictDoNothing();\n}\n"]}
|
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
import { AbstractBaseAdapter } from './chunk-A4USRVTQ.js';
|
|
2
|
+
import { eq, sql } from 'drizzle-orm';
|
|
3
|
+
|
|
4
|
+
function fieldToDrizzleType(field, dialect = "postgres") {
|
|
5
|
+
switch (field.type) {
|
|
6
|
+
case "text":
|
|
7
|
+
case "email":
|
|
8
|
+
case "password":
|
|
9
|
+
case "textarea":
|
|
10
|
+
case "color":
|
|
11
|
+
case "code":
|
|
12
|
+
case "markdown":
|
|
13
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
14
|
+
case "number":
|
|
15
|
+
return field.integer ? "integer" : "decimal";
|
|
16
|
+
case "checkbox":
|
|
17
|
+
return "boolean";
|
|
18
|
+
case "date":
|
|
19
|
+
return "timestamp";
|
|
20
|
+
case "select":
|
|
21
|
+
case "radio":
|
|
22
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
23
|
+
case "richtext":
|
|
24
|
+
case "json":
|
|
25
|
+
case "array":
|
|
26
|
+
case "group":
|
|
27
|
+
case "blocks":
|
|
28
|
+
case "row":
|
|
29
|
+
case "collapsible":
|
|
30
|
+
case "tabs":
|
|
31
|
+
return "jsonb";
|
|
32
|
+
case "relationship":
|
|
33
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
34
|
+
case "upload":
|
|
35
|
+
return dialect === "sqlite" ? "text" : "varchar";
|
|
36
|
+
default:
|
|
37
|
+
return "jsonb";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function collectionToDrizzleSchema(collection, dialect = "postgres") {
|
|
41
|
+
const tableName = collection.slug.replace(/-/g, "_");
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push(`export const ${tableName} = ${dialect === "mysql" ? "mysqlTable" : "pgTable"}('${tableName}', {`);
|
|
44
|
+
lines.push(` id: ${dialect === "mysql" ? "varchar" : "uuid"}('${dialect === "mysql" ? "id" : "id"}').${dialect === "mysql" ? "primaryKey().default(sql`UUID()`)" : "primaryKey().defaultRandom()"},`);
|
|
45
|
+
for (const field of collection.fields) {
|
|
46
|
+
if (field.name === "id") continue;
|
|
47
|
+
const dbType = fieldToDrizzleType(field, dialect);
|
|
48
|
+
const isRequired = field.required;
|
|
49
|
+
let fieldDef = ` ${field.name}: ${dialect === "mysql" ? "mysql" : "pg"}.${dbType}('${field.name}')`;
|
|
50
|
+
if (field.unique) fieldDef += ".unique()";
|
|
51
|
+
if (!isRequired) fieldDef += ".nullable()";
|
|
52
|
+
if (field.defaultValue !== void 0) {
|
|
53
|
+
if (typeof field.defaultValue === "string") {
|
|
54
|
+
fieldDef += `.default('${field.defaultValue}')`;
|
|
55
|
+
} else if (typeof field.defaultValue === "boolean") {
|
|
56
|
+
fieldDef += `.default(${field.defaultValue})`;
|
|
57
|
+
} else {
|
|
58
|
+
fieldDef += `.default(sql\`${JSON.stringify(field.defaultValue)}\`)`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
fieldDef += ",";
|
|
62
|
+
lines.push(fieldDef);
|
|
63
|
+
}
|
|
64
|
+
if (collection.timestamps) {
|
|
65
|
+
lines.push(` createdAt: ${dialect === "mysql" ? "mysql" : "pg"}.timestamp('created_at').defaultNow(),`);
|
|
66
|
+
lines.push(` updatedAt: ${dialect === "mysql" ? "mysql" : "pg"}.timestamp('updated_at').defaultNow(),`);
|
|
67
|
+
}
|
|
68
|
+
lines.push(` _status: ${dialect === "sqlite" ? "mysql" : "pg"}.varchar('_status').default('published'),`);
|
|
69
|
+
lines.push(` _has_draft: ${dialect === "sqlite" ? "mysql" : "pg"}.boolean('_has_draft').default(false),`);
|
|
70
|
+
lines.push("});");
|
|
71
|
+
return lines.join("\n");
|
|
72
|
+
}
|
|
73
|
+
var DrizzleAdapter = class extends AbstractBaseAdapter {
|
|
74
|
+
client;
|
|
75
|
+
schema;
|
|
76
|
+
dialect;
|
|
77
|
+
draftsTableReady = false;
|
|
78
|
+
versionsTableReady = false;
|
|
79
|
+
constructor(options) {
|
|
80
|
+
super();
|
|
81
|
+
this.client = options.client;
|
|
82
|
+
this.schema = options.schema || {};
|
|
83
|
+
this.dialect = options.type;
|
|
84
|
+
}
|
|
85
|
+
prepareData(data, config) {
|
|
86
|
+
const result = super.prepareData(data, config);
|
|
87
|
+
for (const field of config.fields) {
|
|
88
|
+
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
89
|
+
const tabData = data[field.name];
|
|
90
|
+
if (tabData && typeof tabData === "object") {
|
|
91
|
+
const processedTabData = {};
|
|
92
|
+
for (const [key, value] of Object.entries(tabData)) {
|
|
93
|
+
const tabField = field.tabs.flatMap((t) => t.fields).find((f) => f.name === key);
|
|
94
|
+
if ((tabField?.type === "upload" || tabField?.type === "image" || tabField?.type === "list" || tabField?.type === "relationship-block") && value) {
|
|
95
|
+
if (Array.isArray(value)) {
|
|
96
|
+
processedTabData[key] = JSON.stringify(value);
|
|
97
|
+
} else if (typeof value === "object") {
|
|
98
|
+
processedTabData[key] = JSON.stringify(value);
|
|
99
|
+
} else {
|
|
100
|
+
processedTabData[key] = value;
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
processedTabData[key] = value;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
result[field.name] = JSON.stringify(processedTabData);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (["upload", "image", "list", "relationship-block"].includes(field.type) && field.name) {
|
|
110
|
+
const value = data[field.name];
|
|
111
|
+
if (value) {
|
|
112
|
+
if (Array.isArray(value)) {
|
|
113
|
+
result[field.name] = JSON.stringify(value);
|
|
114
|
+
} else if (typeof value === "object") {
|
|
115
|
+
result[field.name] = JSON.stringify(value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
async connect() {
|
|
123
|
+
this.connected = true;
|
|
124
|
+
console.log(`[DrizzleAdapter] Connected to ${this.dialect}`);
|
|
125
|
+
}
|
|
126
|
+
async disconnect() {
|
|
127
|
+
this.connected = false;
|
|
128
|
+
console.log(`[DrizzleAdapter] Disconnected from ${this.dialect}`);
|
|
129
|
+
}
|
|
130
|
+
async find(args) {
|
|
131
|
+
const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
|
|
132
|
+
const config = this.getCollection(slug);
|
|
133
|
+
const table = this.getTable(slug);
|
|
134
|
+
const filters = this.buildWhereClause(where, config, table, tenantID);
|
|
135
|
+
if (!draft) {
|
|
136
|
+
filters.push(table._status.equals("published"));
|
|
137
|
+
}
|
|
138
|
+
const sortOption = this.parseSort(sort);
|
|
139
|
+
const totalDocs = await this.count({ collection: slug, where: { ...where, _status: draft ? void 0 : "published" }, tenantID });
|
|
140
|
+
const offset = (page - 1) * limit;
|
|
141
|
+
let results = [];
|
|
142
|
+
try {
|
|
143
|
+
results = await this.client.select().from(table).where(filters).orderBy(sortOption.direction === "asc" ? table[sortOption.field] : void 0).limit(limit).offset(offset);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error(`[DrizzleAdapter] Query error:`, error);
|
|
146
|
+
}
|
|
147
|
+
let docs = results.map((doc) => this.processResult(doc, config));
|
|
148
|
+
if (draft) {
|
|
149
|
+
docs = await Promise.all(docs.map(async (doc) => {
|
|
150
|
+
if (doc._has_draft) {
|
|
151
|
+
const versions = await this.findVersions({
|
|
152
|
+
collection: slug,
|
|
153
|
+
documentId: doc.id,
|
|
154
|
+
limit: 1,
|
|
155
|
+
sort: "-createdAt"
|
|
156
|
+
});
|
|
157
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
158
|
+
return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return doc;
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
docs,
|
|
166
|
+
...this.calculatePagination(page, limit, totalDocs)
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
async findByID(args) {
|
|
170
|
+
const { collection: slug, id, tenantID, draft } = args;
|
|
171
|
+
const config = this.getCollection(slug);
|
|
172
|
+
const table = this.getTable(slug);
|
|
173
|
+
let query = this.client.select().from(table).where(table.id.equals(id));
|
|
174
|
+
if (tenantID) {
|
|
175
|
+
query = query.where(table.tenantId.equals(tenantID));
|
|
176
|
+
}
|
|
177
|
+
if (!draft) {
|
|
178
|
+
query = query.where(table._status.equals("published"));
|
|
179
|
+
}
|
|
180
|
+
const results = await query.limit(1);
|
|
181
|
+
if (results.length === 0) return null;
|
|
182
|
+
let doc = this.processResult(results[0], config);
|
|
183
|
+
if (draft && doc._has_draft) {
|
|
184
|
+
const versions = await this.findVersions({
|
|
185
|
+
collection: slug,
|
|
186
|
+
documentId: doc.id,
|
|
187
|
+
limit: 1,
|
|
188
|
+
sort: "-createdAt"
|
|
189
|
+
});
|
|
190
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
191
|
+
doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return doc;
|
|
195
|
+
}
|
|
196
|
+
async create(args) {
|
|
197
|
+
const { collection: slug, data, tenantID } = args;
|
|
198
|
+
const config = this.getCollection(slug);
|
|
199
|
+
const table = this.getTable(slug);
|
|
200
|
+
const insertData = this.prepareData(data, config);
|
|
201
|
+
if (tenantID) {
|
|
202
|
+
insertData.tenantId = tenantID;
|
|
203
|
+
}
|
|
204
|
+
const result = await this.client.insert(table).values(insertData).returning();
|
|
205
|
+
return this.processResult(result[0], config);
|
|
206
|
+
}
|
|
207
|
+
async update(args) {
|
|
208
|
+
const { collection: slug, id, data, tenantID } = args;
|
|
209
|
+
const config = this.getCollection(slug);
|
|
210
|
+
const table = this.getTable(slug);
|
|
211
|
+
const updateData = this.prepareData(data, config);
|
|
212
|
+
if (tenantID) {
|
|
213
|
+
updateData.tenantId = tenantID;
|
|
214
|
+
}
|
|
215
|
+
const result = await this.client.update(table).set(updateData).where(eq(table.id, id)).returning();
|
|
216
|
+
return this.processResult(result[0], config);
|
|
217
|
+
}
|
|
218
|
+
async delete(args) {
|
|
219
|
+
const { collection: slug, id, tenantID } = args;
|
|
220
|
+
const config = this.getCollection(slug);
|
|
221
|
+
const table = this.getTable(slug);
|
|
222
|
+
let query = this.client.delete(table).where(eq(table.id, id)).returning();
|
|
223
|
+
if (tenantID) {
|
|
224
|
+
query = query.where(table.tenantId.equals(tenantID));
|
|
225
|
+
}
|
|
226
|
+
const result = await query;
|
|
227
|
+
if (result.length === 0) {
|
|
228
|
+
throw new Error(`Document not found: ${slug}/${id}`);
|
|
229
|
+
}
|
|
230
|
+
return this.processResult(result[0], config);
|
|
231
|
+
}
|
|
232
|
+
async count(args) {
|
|
233
|
+
const { collection: slug, where = {}, tenantID } = args;
|
|
234
|
+
const config = this.getCollection(slug);
|
|
235
|
+
const table = this.getTable(slug);
|
|
236
|
+
const filters = this.buildWhereClause(where, config, table, tenantID);
|
|
237
|
+
try {
|
|
238
|
+
const result = await this.client.select({ count: `count(*)` }).from(table).where(filters);
|
|
239
|
+
return parseInt(result[0]?.count || "0");
|
|
240
|
+
} catch {
|
|
241
|
+
return 0;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async findOne(args) {
|
|
245
|
+
const { collection: slug, where = {}, tenantID, draft } = args;
|
|
246
|
+
if (slug.startsWith("_globals_")) {
|
|
247
|
+
const globalSlug = slug.replace("_globals_", "");
|
|
248
|
+
const globalConfig = this.globals.get(globalSlug);
|
|
249
|
+
if (!globalConfig) throw new Error(`Global "${globalSlug}" not found`);
|
|
250
|
+
const table = this.getTable(slug);
|
|
251
|
+
let query = this.client.select().from(table);
|
|
252
|
+
if (!draft) {
|
|
253
|
+
query = query.where(table._status.equals("published"));
|
|
254
|
+
}
|
|
255
|
+
const results = await query.limit(1);
|
|
256
|
+
if (results.length === 0) return null;
|
|
257
|
+
let doc = this.processResult(results[0], globalConfig);
|
|
258
|
+
if (draft && doc._has_draft) {
|
|
259
|
+
const versions = await this.findVersions({
|
|
260
|
+
collection: slug,
|
|
261
|
+
documentId: globalSlug,
|
|
262
|
+
limit: 1,
|
|
263
|
+
sort: "-createdAt"
|
|
264
|
+
});
|
|
265
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
266
|
+
doc = { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return doc;
|
|
270
|
+
}
|
|
271
|
+
const result = await this.find({ ...args, limit: 1 });
|
|
272
|
+
return result.docs[0] || null;
|
|
273
|
+
}
|
|
274
|
+
async findVersions(args) {
|
|
275
|
+
await this.ensureVersionsTable();
|
|
276
|
+
const { collection: slug, documentId, limit = 10, page = 1, tenantID } = args;
|
|
277
|
+
const offset = (page - 1) * limit;
|
|
278
|
+
const countResult = await this.executeRaw(sql`
|
|
279
|
+
SELECT count(*) as count
|
|
280
|
+
FROM kyro_versions
|
|
281
|
+
WHERE collection_slug = ${slug}
|
|
282
|
+
AND document_id = ${documentId}
|
|
283
|
+
${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
|
|
284
|
+
`);
|
|
285
|
+
const totalDocs = parseInt(countResult[0]?.count || "0");
|
|
286
|
+
const results = await this.executeRaw(sql`
|
|
287
|
+
SELECT *
|
|
288
|
+
FROM kyro_versions
|
|
289
|
+
WHERE collection_slug = ${slug}
|
|
290
|
+
AND document_id = ${documentId}
|
|
291
|
+
${tenantID ? sql`AND tenant_id = ${tenantID}` : sql``}
|
|
292
|
+
ORDER BY created_at DESC
|
|
293
|
+
LIMIT ${limit}
|
|
294
|
+
OFFSET ${offset}
|
|
295
|
+
`);
|
|
296
|
+
return {
|
|
297
|
+
docs: results.map((row) => ({
|
|
298
|
+
...row,
|
|
299
|
+
data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
|
|
300
|
+
})),
|
|
301
|
+
...this.calculatePagination(page, limit, totalDocs)
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
async findVersionByID(args) {
|
|
305
|
+
await this.ensureVersionsTable();
|
|
306
|
+
const results = await this.executeRaw(sql`
|
|
307
|
+
SELECT * FROM kyro_versions
|
|
308
|
+
WHERE id = ${args.versionId}
|
|
309
|
+
AND collection_slug = ${args.collection}
|
|
310
|
+
${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
|
|
311
|
+
LIMIT 1
|
|
312
|
+
`);
|
|
313
|
+
if (results.length === 0) return null;
|
|
314
|
+
const row = results[0];
|
|
315
|
+
return {
|
|
316
|
+
...row,
|
|
317
|
+
data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
async createVersion(args) {
|
|
321
|
+
await this.ensureVersionsTable();
|
|
322
|
+
const id = Math.random().toString(36).substring(2, 15);
|
|
323
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
324
|
+
await this.executeRaw(sql`
|
|
325
|
+
INSERT INTO kyro_versions (
|
|
326
|
+
id, collection_slug, document_id, tenant_id, data, status, created_by, change_description, created_at, updated_at
|
|
327
|
+
) VALUES (
|
|
328
|
+
${id}, ${args.collection}, ${args.documentId}, ${args.tenantID || null},
|
|
329
|
+
${JSON.stringify(args.data)}, ${args.status}, ${args.createdBy || null},
|
|
330
|
+
${args.changeDescription || null}, ${now}, ${now}
|
|
331
|
+
)
|
|
332
|
+
`);
|
|
333
|
+
const config = this.getCollection(args.collection);
|
|
334
|
+
if (config.versions?.maxPerDoc) {
|
|
335
|
+
await this.deleteVersions({
|
|
336
|
+
collection: args.collection,
|
|
337
|
+
documentId: args.documentId,
|
|
338
|
+
keepLatest: config.versions.maxPerDoc,
|
|
339
|
+
tenantID: args.tenantID
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return this.findVersionByID({ collection: args.collection, versionId: id, tenantID: args.tenantID });
|
|
343
|
+
}
|
|
344
|
+
async deleteVersions(args) {
|
|
345
|
+
await this.ensureVersionsTable();
|
|
346
|
+
if (args.keepLatest) {
|
|
347
|
+
const toKeep = await this.executeRaw(sql`
|
|
348
|
+
SELECT id FROM kyro_versions
|
|
349
|
+
WHERE collection_slug = ${args.collection}
|
|
350
|
+
AND document_id = ${args.documentId}
|
|
351
|
+
${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
|
|
352
|
+
ORDER BY created_at DESC
|
|
353
|
+
LIMIT ${args.keepLatest}
|
|
354
|
+
`);
|
|
355
|
+
const keepIds = toKeep.map((r) => r.id);
|
|
356
|
+
if (keepIds.length > 0) {
|
|
357
|
+
await this.executeRaw(sql`
|
|
358
|
+
DELETE FROM kyro_versions
|
|
359
|
+
WHERE collection_slug = ${args.collection}
|
|
360
|
+
AND document_id = ${args.documentId}
|
|
361
|
+
AND id NOT IN (${sql.join(keepIds.map((id) => sql`${id}`), sql`, `)})
|
|
362
|
+
`);
|
|
363
|
+
}
|
|
364
|
+
} else {
|
|
365
|
+
await this.executeRaw(sql`
|
|
366
|
+
DELETE FROM kyro_versions
|
|
367
|
+
WHERE collection_slug = ${args.collection}
|
|
368
|
+
AND document_id = ${args.documentId}
|
|
369
|
+
${args.tenantID ? sql`AND tenant_id = ${args.tenantID}` : sql``}
|
|
370
|
+
`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async findDraft(args) {
|
|
374
|
+
await this.ensureDraftsTable();
|
|
375
|
+
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
376
|
+
const rows = await this.executeRaw(sql`
|
|
377
|
+
SELECT *
|
|
378
|
+
FROM kyro_drafts
|
|
379
|
+
WHERE id = ${draftId}
|
|
380
|
+
LIMIT 1
|
|
381
|
+
`);
|
|
382
|
+
const row = rows[0];
|
|
383
|
+
return row ? this.rowToDraft(row) : null;
|
|
384
|
+
}
|
|
385
|
+
async upsertDraft(args) {
|
|
386
|
+
await this.ensureDraftsTable();
|
|
387
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
388
|
+
const draftUpdatedAt = args.draftUpdatedAt || now;
|
|
389
|
+
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
390
|
+
const existing = await this.findDraft(args);
|
|
391
|
+
if (existing) {
|
|
392
|
+
await this.executeRaw(sql`
|
|
393
|
+
UPDATE kyro_drafts
|
|
394
|
+
SET
|
|
395
|
+
data = ${JSON.stringify(args.data)},
|
|
396
|
+
base_updated_at = ${args.baseUpdatedAt ?? null},
|
|
397
|
+
draft_updated_at = ${draftUpdatedAt},
|
|
398
|
+
updated_at = ${now}
|
|
399
|
+
WHERE id = ${draftId}
|
|
400
|
+
`);
|
|
401
|
+
} else {
|
|
402
|
+
await this.executeRaw(sql`
|
|
403
|
+
INSERT INTO kyro_drafts (
|
|
404
|
+
id, collection_slug, document_id, tenant_id, data, base_updated_at, draft_updated_at, created_at, updated_at
|
|
405
|
+
) VALUES (
|
|
406
|
+
${draftId},
|
|
407
|
+
${args.collection},
|
|
408
|
+
${args.documentId},
|
|
409
|
+
${args.tenantID ?? null},
|
|
410
|
+
${JSON.stringify(args.data)},
|
|
411
|
+
${args.baseUpdatedAt ?? null},
|
|
412
|
+
${draftUpdatedAt},
|
|
413
|
+
${now},
|
|
414
|
+
${now}
|
|
415
|
+
)
|
|
416
|
+
`);
|
|
417
|
+
}
|
|
418
|
+
const saved = await this.findDraft(args);
|
|
419
|
+
if (!saved) {
|
|
420
|
+
throw new Error("Failed to persist draft snapshot");
|
|
421
|
+
}
|
|
422
|
+
return saved;
|
|
423
|
+
}
|
|
424
|
+
async deleteDraft(args) {
|
|
425
|
+
await this.ensureDraftsTable();
|
|
426
|
+
const draftId = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
427
|
+
await this.executeRaw(sql`
|
|
428
|
+
DELETE FROM kyro_drafts
|
|
429
|
+
WHERE id = ${draftId}
|
|
430
|
+
`);
|
|
431
|
+
}
|
|
432
|
+
// ========================================================================
|
|
433
|
+
// Helper Methods
|
|
434
|
+
// ========================================================================
|
|
435
|
+
getTable(slug) {
|
|
436
|
+
const tableName = this.getTableName(slug);
|
|
437
|
+
const table = this.schema[tableName];
|
|
438
|
+
if (!table) {
|
|
439
|
+
throw new Error(`Table "${tableName}" not found in schema`);
|
|
440
|
+
}
|
|
441
|
+
return table;
|
|
442
|
+
}
|
|
443
|
+
buildWhereClause(where, config, table, tenantID) {
|
|
444
|
+
const conditions = [];
|
|
445
|
+
if (tenantID && config.tenantScoped) {
|
|
446
|
+
conditions.push({ tenantId: tenantID });
|
|
447
|
+
}
|
|
448
|
+
for (const [key, value] of Object.entries(where)) {
|
|
449
|
+
if (key === "AND" && Array.isArray(value)) {
|
|
450
|
+
for (const subCondition of value) {
|
|
451
|
+
conditions.push(...Object.entries(subCondition).map(([k, v]) => ({ [k]: v })));
|
|
452
|
+
}
|
|
453
|
+
} else if (key === "OR" && Array.isArray(value)) {
|
|
454
|
+
conditions.push(...value.flatMap(
|
|
455
|
+
(v) => Object.entries(v).map(([k, val]) => ({ [k]: val }))
|
|
456
|
+
));
|
|
457
|
+
} else if (typeof value === "object" && value !== null) {
|
|
458
|
+
if (value.equals !== void 0) conditions.push(eq(table[key], value.equals));
|
|
459
|
+
if (value.not_equals !== void 0) conditions.push({ [key]: { not: value.not_equals } });
|
|
460
|
+
if (value.in) conditions.push({ [key]: { in: value.in } });
|
|
461
|
+
if (value.like) conditions.push({ [key]: { like: value.like } });
|
|
462
|
+
if (value.greater_than !== void 0) conditions.push({ [key]: { gt: value.greater_than } });
|
|
463
|
+
if (value.greater_than_equal !== void 0) conditions.push({ [key]: { gte: value.greater_than_equal } });
|
|
464
|
+
if (value.less_than !== void 0) conditions.push({ [key]: { lt: value.less_than } });
|
|
465
|
+
if (value.less_than_equal !== void 0) conditions.push({ [key]: { lte: value.less_than_equal } });
|
|
466
|
+
} else {
|
|
467
|
+
conditions.push({ [key]: value });
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return conditions.length > 0 ? conditions : void 0;
|
|
471
|
+
}
|
|
472
|
+
processResult(data, config) {
|
|
473
|
+
if (!data) return null;
|
|
474
|
+
const result = { ...data };
|
|
475
|
+
if (data.id) {
|
|
476
|
+
result.id = String(data.id);
|
|
477
|
+
}
|
|
478
|
+
for (const field of config.fields) {
|
|
479
|
+
if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(field.type)) {
|
|
480
|
+
const f = field;
|
|
481
|
+
if (result[f.name] && typeof result[f.name] === "string") {
|
|
482
|
+
try {
|
|
483
|
+
const parsed = JSON.parse(result[f.name]);
|
|
484
|
+
result[f.name] = parsed;
|
|
485
|
+
} catch {
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (field.type === "tabs" && "tabs" in field && field.name) {
|
|
490
|
+
const tabData = {};
|
|
491
|
+
for (const tab of field.tabs) {
|
|
492
|
+
for (const tabField of tab.fields) {
|
|
493
|
+
if (tabField.name && result[tabField.name] !== void 0) {
|
|
494
|
+
let value = result[tabField.name];
|
|
495
|
+
if (["json", "richtext", "array", "group", "blocks", "upload", "image", "list", "relationship-block"].includes(tabField.type)) {
|
|
496
|
+
if (value && typeof value === "string") {
|
|
497
|
+
try {
|
|
498
|
+
value = JSON.parse(value);
|
|
499
|
+
} catch {
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
tabData[tabField.name] = value;
|
|
504
|
+
delete result[tabField.name];
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
result[field.name] = tabData;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
if (result.createdAt) {
|
|
512
|
+
result.createdAt = new Date(result.createdAt).toISOString();
|
|
513
|
+
}
|
|
514
|
+
if (result.updatedAt) {
|
|
515
|
+
result.updatedAt = new Date(result.updatedAt).toISOString();
|
|
516
|
+
}
|
|
517
|
+
return result;
|
|
518
|
+
}
|
|
519
|
+
async ensureDraftsTable() {
|
|
520
|
+
if (this.draftsTableReady) return;
|
|
521
|
+
const createTableSQL = this.dialect === "mysql" ? sql.raw(`
|
|
522
|
+
CREATE TABLE IF NOT EXISTS kyro_drafts (
|
|
523
|
+
id varchar(255) PRIMARY KEY,
|
|
524
|
+
collection_slug varchar(255) NOT NULL,
|
|
525
|
+
document_id varchar(255) NOT NULL,
|
|
526
|
+
tenant_id varchar(255),
|
|
527
|
+
data longtext NOT NULL,
|
|
528
|
+
base_updated_at varchar(255),
|
|
529
|
+
draft_updated_at varchar(255) NOT NULL,
|
|
530
|
+
created_at varchar(255) NOT NULL,
|
|
531
|
+
updated_at varchar(255) NOT NULL
|
|
532
|
+
)
|
|
533
|
+
`) : sql.raw(`
|
|
534
|
+
CREATE TABLE IF NOT EXISTS kyro_drafts (
|
|
535
|
+
id text PRIMARY KEY,
|
|
536
|
+
collection_slug text NOT NULL,
|
|
537
|
+
document_id text NOT NULL,
|
|
538
|
+
tenant_id text,
|
|
539
|
+
data text NOT NULL,
|
|
540
|
+
base_updated_at text,
|
|
541
|
+
draft_updated_at text NOT NULL,
|
|
542
|
+
created_at text NOT NULL,
|
|
543
|
+
updated_at text NOT NULL
|
|
544
|
+
)
|
|
545
|
+
`);
|
|
546
|
+
await this.executeRaw(createTableSQL);
|
|
547
|
+
this.draftsTableReady = true;
|
|
548
|
+
}
|
|
549
|
+
async ensureVersionsTable() {
|
|
550
|
+
if (this.versionsTableReady) return;
|
|
551
|
+
const createTableSQL = this.dialect === "mysql" ? sql.raw(`
|
|
552
|
+
CREATE TABLE IF NOT EXISTS kyro_versions (
|
|
553
|
+
id varchar(255) PRIMARY KEY,
|
|
554
|
+
collection_slug varchar(255) NOT NULL,
|
|
555
|
+
document_id varchar(255) NOT NULL,
|
|
556
|
+
tenant_id varchar(255),
|
|
557
|
+
data longtext NOT NULL,
|
|
558
|
+
status varchar(50) NOT NULL,
|
|
559
|
+
created_by varchar(255),
|
|
560
|
+
change_description text,
|
|
561
|
+
created_at varchar(255) NOT NULL,
|
|
562
|
+
updated_at varchar(255) NOT NULL
|
|
563
|
+
)
|
|
564
|
+
`) : sql.raw(`
|
|
565
|
+
CREATE TABLE IF NOT EXISTS kyro_versions (
|
|
566
|
+
id text PRIMARY KEY,
|
|
567
|
+
collection_slug text NOT NULL,
|
|
568
|
+
document_id text NOT NULL,
|
|
569
|
+
tenant_id text,
|
|
570
|
+
data text NOT NULL,
|
|
571
|
+
status text NOT NULL,
|
|
572
|
+
created_by text,
|
|
573
|
+
change_description text,
|
|
574
|
+
created_at text NOT NULL,
|
|
575
|
+
updated_at text NOT NULL
|
|
576
|
+
)
|
|
577
|
+
`);
|
|
578
|
+
await this.executeRaw(createTableSQL);
|
|
579
|
+
this.versionsTableReady = true;
|
|
580
|
+
}
|
|
581
|
+
getDraftId(collection, documentId, tenantID) {
|
|
582
|
+
return `${collection}::${documentId}::${tenantID || "global"}`;
|
|
583
|
+
}
|
|
584
|
+
async executeRaw(query) {
|
|
585
|
+
const result = await this.client.execute(query);
|
|
586
|
+
if (Array.isArray(result)) {
|
|
587
|
+
return result;
|
|
588
|
+
}
|
|
589
|
+
if (Array.isArray(result?.rows)) {
|
|
590
|
+
return result.rows;
|
|
591
|
+
}
|
|
592
|
+
if (Array.isArray(result?.[0])) {
|
|
593
|
+
return result[0];
|
|
594
|
+
}
|
|
595
|
+
return [];
|
|
596
|
+
}
|
|
597
|
+
rowToDraft(row) {
|
|
598
|
+
return {
|
|
599
|
+
id: String(row.id),
|
|
600
|
+
collection: row.collection_slug,
|
|
601
|
+
documentId: row.document_id,
|
|
602
|
+
tenantID: row.tenant_id ?? void 0,
|
|
603
|
+
data: row.data ? JSON.parse(row.data) : {},
|
|
604
|
+
baseUpdatedAt: row.base_updated_at ?? null,
|
|
605
|
+
draftUpdatedAt: row.draft_updated_at,
|
|
606
|
+
createdAt: row.created_at,
|
|
607
|
+
updatedAt: row.updated_at
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
function createDrizzleAdapter(options) {
|
|
612
|
+
return new DrizzleAdapter(options);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
export { DrizzleAdapter, collectionToDrizzleSchema, createDrizzleAdapter, fieldToDrizzleType };
|
|
616
|
+
//# sourceMappingURL=chunk-Y3TM7WH7.js.map
|
|
617
|
+
//# sourceMappingURL=chunk-Y3TM7WH7.js.map
|