opacacms 0.3.18 → 0.3.19
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/{chunk-1bd7fz7n.js → chunk-8mqs2q7j.js} +1 -1
- package/dist/{chunk-2abqb0h6.js → chunk-9dsw6x4x.js} +23 -16
- package/dist/{chunk-b1g8jmth.js → chunk-mvz5hmdb.js} +263 -8
- package/dist/cli/index.js +3 -2
- package/dist/db/better-sqlite.js +1632 -42
- package/dist/db/bun-sqlite.js +1627 -37
- package/dist/db/d1.js +2326 -31
- package/dist/db/index.js +29 -4
- package/dist/db/postgres.js +1623 -32
- package/dist/db/sqlite.js +1631 -41
- package/dist/index.js +7 -9
- package/dist/runtimes/bun.js +3 -7
- package/dist/runtimes/cloudflare-workers.js +3068 -13
- package/dist/runtimes/next.js +3 -7
- package/dist/runtimes/node.js +3 -7
- package/dist/server.js +18 -13
- package/dist/storage/index.js +6 -3
- package/package.json +1 -1
- package/dist/chunk-40tky6qh.js +0 -10
- package/dist/chunk-5xpf5jxd.js +0 -114
- package/dist/chunk-gzbz5jwy.js +0 -700
- package/dist/chunk-h8v093av.js +0 -185
- package/dist/chunk-jq1drsen.js +0 -82
- package/dist/chunk-q5sb5dcr.js +0 -15
- package/dist/chunk-re459gm9.js +0 -429
- package/dist/chunk-s8mqwnm1.js +0 -14
- package/dist/chunk-z9ek88xr.js +0 -15
package/dist/chunk-re459gm9.js
DELETED
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
flattenFields,
|
|
3
|
-
getRelationalFields,
|
|
4
|
-
mapFieldToPostgresType,
|
|
5
|
-
mapFieldToSQLiteType,
|
|
6
|
-
toSnakeCase
|
|
7
|
-
} from "./chunk-5xpf5jxd.js";
|
|
8
|
-
import {
|
|
9
|
-
logger
|
|
10
|
-
} from "./chunk-jq1drsen.js";
|
|
11
|
-
import {
|
|
12
|
-
getSystemCollections,
|
|
13
|
-
init_system_schema
|
|
14
|
-
} from "./chunk-h8v093av.js";
|
|
15
|
-
|
|
16
|
-
// src/db/kysely/data-mapper.ts
|
|
17
|
-
function toCamelCase(str) {
|
|
18
|
-
if (str.startsWith("_"))
|
|
19
|
-
return str;
|
|
20
|
-
return str.replace(/_+([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
21
|
-
}
|
|
22
|
-
function flattenPayload(payload, prefix = "", excludeKeys = []) {
|
|
23
|
-
if (typeof payload !== "object" || payload === null || Array.isArray(payload))
|
|
24
|
-
return payload;
|
|
25
|
-
const result = {};
|
|
26
|
-
for (const key in payload) {
|
|
27
|
-
if (Object.hasOwn(payload, key)) {
|
|
28
|
-
const value = payload[key];
|
|
29
|
-
if (value === undefined)
|
|
30
|
-
continue;
|
|
31
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date) && !excludeKeys.includes(key)) {
|
|
32
|
-
if (key.startsWith("_") && prefix === "") {
|
|
33
|
-
result[key] = value;
|
|
34
|
-
} else {
|
|
35
|
-
const flatNested = flattenPayload(value, `${prefix}${key}__`);
|
|
36
|
-
Object.assign(result, flatNested);
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
if (value === undefined)
|
|
40
|
-
continue;
|
|
41
|
-
const colName = `${prefix}${toSnakeCase(key)}`;
|
|
42
|
-
if (typeof value === "object" && value !== null && !(value instanceof Date)) {
|
|
43
|
-
result[colName] = JSON.stringify(value);
|
|
44
|
-
} else {
|
|
45
|
-
result[colName] = value;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
function unflattenRow(row) {
|
|
53
|
-
if (typeof row !== "object" || row === null || Array.isArray(row))
|
|
54
|
-
return row;
|
|
55
|
-
const result = {};
|
|
56
|
-
for (const key in row) {
|
|
57
|
-
if (Object.hasOwn(row, key)) {
|
|
58
|
-
let value = row[key];
|
|
59
|
-
if (typeof value === "string") {
|
|
60
|
-
const trimmed = value.trim();
|
|
61
|
-
if (trimmed.startsWith("[") && trimmed.endsWith("]") || trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
62
|
-
try {
|
|
63
|
-
value = JSON.parse(value);
|
|
64
|
-
} catch (e) {}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
if (key === "created_at" || key === "updated_at" || key === "createdAt" || key === "updatedAt") {
|
|
68
|
-
if (typeof value === "string" && !value.includes("T") && value.includes(" ")) {
|
|
69
|
-
value = `${value.replace(" ", "T")}Z`;
|
|
70
|
-
}
|
|
71
|
-
result[toCamelCase(key)] = value;
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (key.startsWith("_")) {
|
|
75
|
-
result[key] = value;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
const parts = key.split("__");
|
|
79
|
-
if (parts.length === 1) {
|
|
80
|
-
result[toCamelCase(key)] = value;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
let current = result;
|
|
84
|
-
let collision = false;
|
|
85
|
-
const path = [];
|
|
86
|
-
for (let i = 0;i < parts.length - 1; i++) {
|
|
87
|
-
const part = toCamelCase(parts[i]);
|
|
88
|
-
if (current[part] !== undefined && (typeof current[part] !== "object" || current[part] === null)) {
|
|
89
|
-
collision = true;
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
path.push({ obj: current, key: part });
|
|
93
|
-
if (!current[part]) {
|
|
94
|
-
current[part] = {};
|
|
95
|
-
}
|
|
96
|
-
current = current[part];
|
|
97
|
-
}
|
|
98
|
-
if (!collision) {
|
|
99
|
-
const lastPart = toCamelCase(parts[parts.length - 1]);
|
|
100
|
-
if (current[lastPart] !== undefined && typeof current[lastPart] === "object") {
|
|
101
|
-
collision = true;
|
|
102
|
-
} else {
|
|
103
|
-
current[lastPart] = value;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (collision) {
|
|
107
|
-
result[toCamelCase(key)] = value;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return result;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// src/db/kysely/query-builder.ts
|
|
115
|
-
function buildKyselyWhere(eb, query) {
|
|
116
|
-
if (!query || Object.keys(query).length === 0)
|
|
117
|
-
return;
|
|
118
|
-
const conditions = [];
|
|
119
|
-
for (const [key, value] of Object.entries(query)) {
|
|
120
|
-
if (value === undefined)
|
|
121
|
-
continue;
|
|
122
|
-
if (key === "or" && Array.isArray(value)) {
|
|
123
|
-
const orConditions = value.map((v) => buildKyselyWhere(eb, v)).filter((c) => c !== undefined);
|
|
124
|
-
if (orConditions.length > 0) {
|
|
125
|
-
conditions.push(eb.or(orConditions));
|
|
126
|
-
}
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (key === "and" && Array.isArray(value)) {
|
|
130
|
-
const andConditions = value.map((v) => buildKyselyWhere(eb, v)).filter((c) => c !== undefined);
|
|
131
|
-
if (andConditions.length > 0) {
|
|
132
|
-
conditions.push(eb.and(andConditions));
|
|
133
|
-
}
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof Date)) {
|
|
137
|
-
for (const [op, val] of Object.entries(value)) {
|
|
138
|
-
if (val === undefined)
|
|
139
|
-
continue;
|
|
140
|
-
switch (op) {
|
|
141
|
-
case "gt":
|
|
142
|
-
conditions.push(eb(key, ">", val));
|
|
143
|
-
break;
|
|
144
|
-
case "gte":
|
|
145
|
-
conditions.push(eb(key, ">=", val));
|
|
146
|
-
break;
|
|
147
|
-
case "lt":
|
|
148
|
-
conditions.push(eb(key, "<", val));
|
|
149
|
-
break;
|
|
150
|
-
case "lte":
|
|
151
|
-
conditions.push(eb(key, "<=", val));
|
|
152
|
-
break;
|
|
153
|
-
case "like":
|
|
154
|
-
conditions.push(eb(key, "like", String(val)));
|
|
155
|
-
break;
|
|
156
|
-
case "ne":
|
|
157
|
-
if (val === null)
|
|
158
|
-
conditions.push(eb(key, "is not", null));
|
|
159
|
-
else
|
|
160
|
-
conditions.push(eb(key, "!=", val));
|
|
161
|
-
break;
|
|
162
|
-
case "in":
|
|
163
|
-
if (Array.isArray(val))
|
|
164
|
-
conditions.push(eb(key, "in", val));
|
|
165
|
-
break;
|
|
166
|
-
case "is":
|
|
167
|
-
if (val === null)
|
|
168
|
-
conditions.push(eb(key, "is", null));
|
|
169
|
-
break;
|
|
170
|
-
default:
|
|
171
|
-
if (val === null)
|
|
172
|
-
conditions.push(eb(key, "is", null));
|
|
173
|
-
else
|
|
174
|
-
conditions.push(eb(key, "=", val));
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
} else {
|
|
179
|
-
if (value === null) {
|
|
180
|
-
conditions.push(eb(key, "is", null));
|
|
181
|
-
} else {
|
|
182
|
-
conditions.push(eb(key, "=", value));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (conditions.length === 0)
|
|
187
|
-
return;
|
|
188
|
-
if (conditions.length === 1)
|
|
189
|
-
return conditions[0];
|
|
190
|
-
return eb.and(conditions);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// src/db/kysely/schema-builder.ts
|
|
194
|
-
import { sql } from "kysely";
|
|
195
|
-
|
|
196
|
-
// src/db/kysely/sql-utils.ts
|
|
197
|
-
function assertSafeIdentifier(identifier) {
|
|
198
|
-
if (typeof identifier !== "string" || !identifier) {
|
|
199
|
-
throw new Error(`Invalid identifier: must be a non-empty string. Got: ${identifier}`);
|
|
200
|
-
}
|
|
201
|
-
const isValid = /^[a-zA-Z0-9_-]+$/.test(identifier);
|
|
202
|
-
if (!isValid) {
|
|
203
|
-
throw new Error(`API Error: Unsafe SQL identifier detected: "${identifier}". Identifiers can only contain alphanumeric characters, underscores, and hyphens.`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// src/db/kysely/schema-builder.ts
|
|
208
|
-
init_system_schema();
|
|
209
|
-
async function pushSchema(db, dialect, collections, globals = [], options = {}) {
|
|
210
|
-
const rawSchemas = [...getSystemCollections(), ...collections, ...globals];
|
|
211
|
-
const allSchemas = [];
|
|
212
|
-
const seenSlugs = new Set;
|
|
213
|
-
for (const schema of rawSchemas) {
|
|
214
|
-
if (!seenSlugs.has(schema.slug)) {
|
|
215
|
-
seenSlugs.add(schema.slug);
|
|
216
|
-
allSchemas.push(schema);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
const { pushDestructive } = options;
|
|
220
|
-
logger.debug(`Starting schema push via Kysely (${dialect})...`);
|
|
221
|
-
const mapType = dialect === "postgres" ? mapFieldToPostgresType : mapFieldToSQLiteType;
|
|
222
|
-
let tablesMetadata = [];
|
|
223
|
-
try {
|
|
224
|
-
tablesMetadata = await db.introspection.getTables();
|
|
225
|
-
} catch (e) {
|
|
226
|
-
logger.warn("Failed to fetch database introspection. Falling back to empty state.", e);
|
|
227
|
-
}
|
|
228
|
-
const existingTableMap = new Map(tablesMetadata.map((t) => [t.name, t]));
|
|
229
|
-
const existingTables = Array.from(existingTableMap.keys());
|
|
230
|
-
logger.debug(`Existing tables found: ${existingTables.join(", ")}`);
|
|
231
|
-
const expectedTableNames = new Set;
|
|
232
|
-
for (const collection of allSchemas) {
|
|
233
|
-
const slug = collection.slug;
|
|
234
|
-
const tableName = toSnakeCase(slug);
|
|
235
|
-
assertSafeIdentifier(tableName);
|
|
236
|
-
expectedTableNames.add(tableName);
|
|
237
|
-
const flattenedFields = flattenFields(collection.fields);
|
|
238
|
-
const hasTimestamps = true;
|
|
239
|
-
const versions = collection.versions;
|
|
240
|
-
const existingTable = existingTableMap.get(tableName);
|
|
241
|
-
if (!existingTable) {
|
|
242
|
-
logger.info(` ${logger.format("green", "✔")} Creating table: ${logger.bold(`"${tableName}"`)}`);
|
|
243
|
-
let builder = db.schema.createTable(tableName).ifNotExists();
|
|
244
|
-
builder = builder.addColumn("id", "text", (col) => col.primaryKey());
|
|
245
|
-
for (const field of flattenedFields) {
|
|
246
|
-
if (field.type === "relationship" && "hasMany" in field && field.hasMany)
|
|
247
|
-
continue;
|
|
248
|
-
const colName = toSnakeCase(field.name);
|
|
249
|
-
if (colName === "id")
|
|
250
|
-
continue;
|
|
251
|
-
assertSafeIdentifier(colName);
|
|
252
|
-
const colType = mapType(field);
|
|
253
|
-
builder = builder.addColumn(colName, colType, (col) => {
|
|
254
|
-
let c = col;
|
|
255
|
-
if (field.unique)
|
|
256
|
-
c = c.unique();
|
|
257
|
-
if (field.required)
|
|
258
|
-
c = c.notNull();
|
|
259
|
-
if (field.defaultValue !== undefined)
|
|
260
|
-
c = c.defaultTo(field.defaultValue);
|
|
261
|
-
return c;
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
if (versions?.drafts) {
|
|
265
|
-
builder = builder.addColumn("_status", "text", (col) => col.defaultTo("draft"));
|
|
266
|
-
}
|
|
267
|
-
if (hasTimestamps) {
|
|
268
|
-
const ts = collection.timestamps ?? {};
|
|
269
|
-
const config = typeof ts === "object" ? ts : {};
|
|
270
|
-
const createdField = toSnakeCase(config.createdAt ?? "createdAt");
|
|
271
|
-
const updatedField = toSnakeCase(config.updatedAt ?? "updatedAt");
|
|
272
|
-
const tsType = dialect === "postgres" ? "timestamptz" : "text";
|
|
273
|
-
builder = builder.addColumn(createdField, tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`));
|
|
274
|
-
builder = builder.addColumn(updatedField, tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`));
|
|
275
|
-
}
|
|
276
|
-
await builder.execute();
|
|
277
|
-
} else {
|
|
278
|
-
const existingColSet = new Set(existingTable.columns.map((c) => c.name));
|
|
279
|
-
for (const field of flattenedFields) {
|
|
280
|
-
if (field.type === "relationship" && "hasMany" in field && field.hasMany)
|
|
281
|
-
continue;
|
|
282
|
-
const colName = toSnakeCase(field.name);
|
|
283
|
-
if (colName === "id")
|
|
284
|
-
continue;
|
|
285
|
-
assertSafeIdentifier(colName);
|
|
286
|
-
if (!existingColSet.has(colName)) {
|
|
287
|
-
logger.info(` ${logger.format("green", "✔")} Adding column: ${logger.bold(`${tableName}.${colName}`)}`);
|
|
288
|
-
const colType = mapType(field);
|
|
289
|
-
await db.schema.alterTable(tableName).addColumn(colName, colType).execute();
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
if (versions?.drafts && !existingColSet.has("_status")) {
|
|
293
|
-
logger.info(` ${logger.format("green", "✔")} Adding status column to: ${tableName}`);
|
|
294
|
-
await db.schema.alterTable(tableName).addColumn("_status", "text", (col) => col.defaultTo("draft")).execute();
|
|
295
|
-
}
|
|
296
|
-
if (hasTimestamps) {
|
|
297
|
-
const ts = collection.timestamps ?? {};
|
|
298
|
-
const config = typeof ts === "object" ? ts : {};
|
|
299
|
-
const createdField = toSnakeCase(config.createdAt ?? "createdAt");
|
|
300
|
-
const updatedField = toSnakeCase(config.updatedAt ?? "updatedAt");
|
|
301
|
-
const tsType = dialect === "postgres" ? "timestamptz" : "text";
|
|
302
|
-
if (!existingColSet.has(createdField)) {
|
|
303
|
-
logger.info(` -> Adding missing timestamp column: ${tableName}.${createdField}`);
|
|
304
|
-
await db.schema.alterTable(tableName).addColumn(createdField, tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
305
|
-
}
|
|
306
|
-
if (!existingColSet.has(updatedField)) {
|
|
307
|
-
logger.info(` -> Adding missing timestamp column: ${tableName}.${updatedField}`);
|
|
308
|
-
await db.schema.alterTable(tableName).addColumn(updatedField, tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`)).execute();
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
if (pushDestructive) {
|
|
312
|
-
const expectedCols = new Set(flattenedFields.filter((f) => !(f.type === "relationship" && f.hasMany)).map((f) => toSnakeCase(f.name)));
|
|
313
|
-
if (hasTimestamps) {
|
|
314
|
-
const ts = collection.timestamps ?? {};
|
|
315
|
-
const config = typeof ts === "object" ? ts : {};
|
|
316
|
-
expectedCols.add(toSnakeCase(config.createdAt ?? "createdAt"));
|
|
317
|
-
expectedCols.add(toSnakeCase(config.updatedAt ?? "updatedAt"));
|
|
318
|
-
}
|
|
319
|
-
if (versions?.drafts)
|
|
320
|
-
expectedCols.add("_status");
|
|
321
|
-
expectedCols.add("id");
|
|
322
|
-
for (const existingCol of existingColSet) {
|
|
323
|
-
const colName = existingCol;
|
|
324
|
-
if (!expectedCols.has(colName)) {
|
|
325
|
-
logger.info(` -> Dropping stale column: ${logger.format("red", `${tableName}.${colName}`)}`);
|
|
326
|
-
try {
|
|
327
|
-
await db.schema.alterTable(tableName).dropColumn(colName).execute();
|
|
328
|
-
} catch (_) {
|
|
329
|
-
logger.warn(`Failed to drop column ${colName}.`);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
const relationalFields = getRelationalFields(collection.fields);
|
|
336
|
-
for (const field of relationalFields) {
|
|
337
|
-
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
338
|
-
const colName = toSnakeCase(field.name);
|
|
339
|
-
const joinTableName = `${tableName}_${colName}_relations`.toLowerCase();
|
|
340
|
-
assertSafeIdentifier(joinTableName);
|
|
341
|
-
expectedTableNames.add(joinTableName);
|
|
342
|
-
if (!existingTableMap.has(joinTableName)) {
|
|
343
|
-
logger.info(` -> Creating relation table: ${logger.format("green", `"${joinTableName}"`)}`);
|
|
344
|
-
await db.schema.createTable(joinTableName).ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("source_id", "text", (col) => col.notNull()).addColumn("target_id", "text", (col) => col.notNull()).addColumn("order", "integer", (col) => col.defaultTo(0)).execute();
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
for (const field of relationalFields) {
|
|
349
|
-
if (field.type === "blocks" && field.blocks && Array.isArray(field.blocks)) {
|
|
350
|
-
for (const block of field.blocks) {
|
|
351
|
-
const blockName = toSnakeCase(field.name);
|
|
352
|
-
const blockSlug = toSnakeCase(block.slug);
|
|
353
|
-
assertSafeIdentifier(blockName);
|
|
354
|
-
assertSafeIdentifier(blockSlug);
|
|
355
|
-
const blockTableName = `${tableName}_${blockName}_${blockSlug}`.toLowerCase();
|
|
356
|
-
assertSafeIdentifier(blockTableName);
|
|
357
|
-
expectedTableNames.add(blockTableName);
|
|
358
|
-
const existingBlockTable = existingTableMap.get(blockTableName);
|
|
359
|
-
if (!existingBlockTable) {
|
|
360
|
-
logger.info(` -> Creating block table: ${logger.format("green", `"${blockTableName}"`)}`);
|
|
361
|
-
let bBuilder = db.schema.createTable(blockTableName).ifNotExists().addColumn("id", "text", (col) => col.primaryKey()).addColumn("_parent_id", "text", (col) => col.notNull()).addColumn("_order", "integer", (col) => col.defaultTo(0)).addColumn("block_type", "text", (col) => col.notNull().defaultTo(block.slug));
|
|
362
|
-
const blockFlattened = flattenFields(block.fields);
|
|
363
|
-
for (const bField of blockFlattened) {
|
|
364
|
-
const bColName = toSnakeCase(bField.name);
|
|
365
|
-
if (bColName === "id")
|
|
366
|
-
continue;
|
|
367
|
-
assertSafeIdentifier(bColName);
|
|
368
|
-
const bColType = mapType(bField);
|
|
369
|
-
bBuilder = bBuilder.addColumn(bColName, bColType, (col) => {
|
|
370
|
-
let c = col;
|
|
371
|
-
if (bField.unique)
|
|
372
|
-
c = c.unique();
|
|
373
|
-
if (bField.required)
|
|
374
|
-
c = c.notNull();
|
|
375
|
-
if (bField.defaultValue !== undefined)
|
|
376
|
-
c = c.defaultTo(bField.defaultValue);
|
|
377
|
-
return c;
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
const tsType = dialect === "postgres" ? "timestamptz" : "text";
|
|
381
|
-
bBuilder = bBuilder.addColumn("created_at", tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`));
|
|
382
|
-
bBuilder = bBuilder.addColumn("updated_at", tsType, (col) => col.defaultTo(sql`CURRENT_TIMESTAMP`));
|
|
383
|
-
await bBuilder.execute();
|
|
384
|
-
} else {
|
|
385
|
-
const existingBColSet = new Set(existingBlockTable.columns.map((c) => c.name));
|
|
386
|
-
const blockFlattened = flattenFields(block.fields);
|
|
387
|
-
for (const bField of blockFlattened) {
|
|
388
|
-
const bColName = toSnakeCase(bField.name);
|
|
389
|
-
if (bColName === "id")
|
|
390
|
-
continue;
|
|
391
|
-
if (!existingBColSet.has(bColName)) {
|
|
392
|
-
const bColType = mapType(bField);
|
|
393
|
-
await db.schema.alterTable(blockTableName).addColumn(bColName, bColType).execute();
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
if (!existingBColSet.has("_parent_id")) {
|
|
397
|
-
await db.schema.alterTable(blockTableName).addColumn("_parent_id", "text", (col) => col.notNull().defaultTo("")).execute();
|
|
398
|
-
}
|
|
399
|
-
if (!existingBColSet.has("_order")) {
|
|
400
|
-
await db.schema.alterTable(blockTableName).addColumn("_order", "integer", (col) => col.defaultTo(0)).execute();
|
|
401
|
-
}
|
|
402
|
-
if (!existingBColSet.has("block_type")) {
|
|
403
|
-
await db.schema.alterTable(blockTableName).addColumn("block_type", "text", (col) => col.notNull().defaultTo(block.slug)).execute();
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
if (pushDestructive) {
|
|
411
|
-
for (const tableName of existingTables) {
|
|
412
|
-
if (!expectedTableNames.has(tableName) && !tableName.startsWith("better_auth") && !tableName.startsWith("__kysely")) {
|
|
413
|
-
logger.info(` -> Dropping stale table: ${logger.format("red", `"${tableName}"`)}`);
|
|
414
|
-
try {
|
|
415
|
-
await db.schema.dropTable(tableName).ifExists().cascade().execute();
|
|
416
|
-
} catch (_) {
|
|
417
|
-
try {
|
|
418
|
-
await db.schema.dropTable(tableName).ifExists().execute();
|
|
419
|
-
} catch (_2) {
|
|
420
|
-
logger.warn(`Failed to drop table ${tableName}`);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
logger.info(`${logger.format("green", "✔")} Schema synchronization complete.`);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
export { flattenPayload, unflattenRow, buildKyselyWhere, pushSchema };
|
package/dist/chunk-s8mqwnm1.js
DELETED
package/dist/chunk-z9ek88xr.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
flattenFields,
|
|
3
|
-
getRelationalFields,
|
|
4
|
-
mapFieldToPostgresType,
|
|
5
|
-
mapFieldToSQLiteType,
|
|
6
|
-
toSnakeCase
|
|
7
|
-
} from "./chunk-5xpf5jxd.js";
|
|
8
|
-
import"./chunk-8sqjbsgt.js";
|
|
9
|
-
export {
|
|
10
|
-
toSnakeCase,
|
|
11
|
-
mapFieldToSQLiteType,
|
|
12
|
-
mapFieldToPostgresType,
|
|
13
|
-
getRelationalFields,
|
|
14
|
-
flattenFields
|
|
15
|
-
};
|