opacacms 0.1.11 → 0.1.13
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/admin/index.js +9464 -21
- package/dist/admin/webcomponent.d.ts +1 -1
- package/dist/admin/webcomponent.js +9620 -6
- package/dist/admin.css +1 -0
- package/dist/{chunk-6dhs73zq.js → chunk-0am1m47g.js} +1 -1
- package/dist/{chunk-0nf7fe26.js → chunk-0d9aqz6z.js} +1 -1
- package/dist/{chunk-cvdd4eqh.js → chunk-2kyhqvhc.js} +5 -1
- package/dist/{chunk-gjjcc4hm.js → chunk-2z8wxx9g.js} +21 -6
- package/dist/{chunk-xg35h5a3.js → chunk-7fyepksb.js} +1 -1
- package/dist/{chunk-njytmdb4.js → chunk-pxh5encs.js} +34 -24
- package/dist/{chunk-n8aekdnr.js → chunk-qkn1ykrj.js} +33 -23
- package/dist/{chunk-kwp83w8b.js → chunk-wmvjvn7b.js} +4 -4
- package/dist/{chunk-qrt22f6e.js → chunk-wq314kkx.js} +35 -25
- package/dist/{chunk-eqtsfyjf.js → chunk-x2ejaftz.js} +52 -28
- package/dist/{chunk-6ew02s0c.js → chunk-xtwc125q.js} +18 -18
- package/dist/cli/index.js +5 -5
- package/dist/db/better-sqlite.d.ts +1 -0
- package/dist/db/better-sqlite.js +3 -3
- package/dist/db/bun-sqlite.d.ts +1 -0
- package/dist/db/bun-sqlite.js +3 -3
- package/dist/db/d1.js +3 -3
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.js +17 -13
- package/dist/db/postgres.js +3 -3
- package/dist/db/sqlite.js +3 -3
- package/dist/runtimes/bun.js +2 -2
- package/dist/runtimes/cloudflare-workers.js +2 -2
- package/dist/runtimes/next.js +2 -2
- package/dist/runtimes/node.js +2 -2
- package/dist/server.js +2 -2
- package/package.json +8 -2
- package/bun.lock +0 -34
- package/dist/admin/index.css +0 -47
- package/dist/api.d.ts +0 -6
- package/dist/api.js +0 -27
- package/dist/chunk-2zm8cy1w.js +0 -9482
- package/global.d.ts +0 -11
- package/src/admin/api-client.ts +0 -63
- package/src/admin/auth-client.ts +0 -40
- package/src/admin/custom-field.ts +0 -179
- package/src/admin/index.ts +0 -15
- package/src/admin/react.tsx +0 -72
- package/src/admin/router.ts +0 -9
- package/src/admin/stores/admin-queries.ts +0 -121
- package/src/admin/stores/auth.ts +0 -61
- package/src/admin/stores/column-visibility.ts +0 -67
- package/src/admin/stores/config.ts +0 -15
- package/src/admin/stores/media.ts +0 -95
- package/src/admin/stores/query.ts +0 -13
- package/src/admin/stores/ui.ts +0 -29
- package/src/admin/ui/admin-client.tsx +0 -283
- package/src/admin/ui/admin-layout.tsx +0 -276
- package/src/admin/ui/components/ColumnVisibilityToggle.tsx +0 -141
- package/src/admin/ui/components/DataDetailSheet.tsx +0 -141
- package/src/admin/ui/components/DataDetailView.tsx +0 -175
- package/src/admin/ui/components/Table.tsx +0 -67
- package/src/admin/ui/components/fields/ArrayField.tsx +0 -166
- package/src/admin/ui/components/fields/BlocksField.tsx +0 -202
- package/src/admin/ui/components/fields/BooleanField.tsx +0 -50
- package/src/admin/ui/components/fields/CollapsibleField.tsx +0 -75
- package/src/admin/ui/components/fields/DateField.tsx +0 -45
- package/src/admin/ui/components/fields/FileField.tsx +0 -322
- package/src/admin/ui/components/fields/GroupField.tsx +0 -50
- package/src/admin/ui/components/fields/JoinField.tsx +0 -23
- package/src/admin/ui/components/fields/NumberField.tsx +0 -46
- package/src/admin/ui/components/fields/RadioField.tsx +0 -62
- package/src/admin/ui/components/fields/RelationshipField.tsx +0 -278
- package/src/admin/ui/components/fields/RowField.tsx +0 -40
- package/src/admin/ui/components/fields/SelectField.tsx +0 -59
- package/src/admin/ui/components/fields/TabsField.tsx +0 -101
- package/src/admin/ui/components/fields/TextAreaField.tsx +0 -54
- package/src/admin/ui/components/fields/TextField.tsx +0 -49
- package/src/admin/ui/components/fields/VirtualField.tsx +0 -53
- package/src/admin/ui/components/fields/index.tsx +0 -371
- package/src/admin/ui/components/fields/richtext-editor/index.tsx +0 -211
- package/src/admin/ui/components/fields/richtext-editor/nodes/ImageComponent.tsx +0 -142
- package/src/admin/ui/components/fields/richtext-editor/nodes/ImageNode.tsx +0 -95
- package/src/admin/ui/components/fields/richtext-editor/plugins/ComponentPickerPlugin.tsx +0 -226
- package/src/admin/ui/components/fields/richtext-editor/plugins/EditableSyncPlugin.tsx +0 -16
- package/src/admin/ui/components/fields/richtext-editor/plugins/NotionToolbarPlugin.tsx +0 -184
- package/src/admin/ui/components/fields/richtext-editor/plugins/SimpleToolbarPlugin.tsx +0 -240
- package/src/admin/ui/components/fields/richtext-editor/plugins/ValueSyncPlugin.tsx +0 -40
- package/src/admin/ui/components/fields/utils.ts +0 -1
- package/src/admin/ui/components/link.tsx +0 -41
- package/src/admin/ui/components/media/AssetManagerModal.tsx +0 -334
- package/src/admin/ui/components/toast.tsx +0 -72
- package/src/admin/ui/components/ui/accordion.tsx +0 -51
- package/src/admin/ui/components/ui/alert-dialog.tsx +0 -98
- package/src/admin/ui/components/ui/blocks.tsx +0 -32
- package/src/admin/ui/components/ui/breadcrumbs.tsx +0 -59
- package/src/admin/ui/components/ui/button.tsx +0 -26
- package/src/admin/ui/components/ui/collapsible.tsx +0 -124
- package/src/admin/ui/components/ui/dialog.tsx +0 -79
- package/src/admin/ui/components/ui/group.tsx +0 -20
- package/src/admin/ui/components/ui/index.ts +0 -17
- package/src/admin/ui/components/ui/input.tsx +0 -12
- package/src/admin/ui/components/ui/join.tsx +0 -53
- package/src/admin/ui/components/ui/label.tsx +0 -11
- package/src/admin/ui/components/ui/radio-group.tsx +0 -75
- package/src/admin/ui/components/ui/relationship-detail-sheet.tsx +0 -122
- package/src/admin/ui/components/ui/relationship.tsx +0 -58
- package/src/admin/ui/components/ui/scroll-area.tsx +0 -19
- package/src/admin/ui/components/ui/select.tsx +0 -187
- package/src/admin/ui/components/ui/separator.tsx +0 -21
- package/src/admin/ui/components/ui/sheet.tsx +0 -106
- package/src/admin/ui/components/ui/tabs.tsx +0 -116
- package/src/admin/ui/components/ui/utils.ts +0 -3
- package/src/admin/ui/hooks/use-debounce.ts +0 -15
- package/src/admin/ui/styles/_locale-switcher.scss +0 -33
- package/src/admin/ui/styles/accordion.scss +0 -60
- package/src/admin/ui/styles/animations.scss +0 -41
- package/src/admin/ui/styles/asset-manager.scss +0 -547
- package/src/admin/ui/styles/badge.scss +0 -13
- package/src/admin/ui/styles/base.scss +0 -22
- package/src/admin/ui/styles/button.scss +0 -161
- package/src/admin/ui/styles/card.scss +0 -13
- package/src/admin/ui/styles/collapsible.scss +0 -75
- package/src/admin/ui/styles/data-detail.scss +0 -92
- package/src/admin/ui/styles/dialog.scss +0 -102
- package/src/admin/ui/styles/empty-state.scss +0 -22
- package/src/admin/ui/styles/group.scss +0 -19
- package/src/admin/ui/styles/index.scss +0 -33
- package/src/admin/ui/styles/input.scss +0 -80
- package/src/admin/ui/styles/label.scss +0 -12
- package/src/admin/ui/styles/layout.scss +0 -56
- package/src/admin/ui/styles/lexical.scss +0 -469
- package/src/admin/ui/styles/loading.scss +0 -102
- package/src/admin/ui/styles/media-registry.scss +0 -597
- package/src/admin/ui/styles/pagination.scss +0 -20
- package/src/admin/ui/styles/radio-group.scss +0 -66
- package/src/admin/ui/styles/row.scss +0 -17
- package/src/admin/ui/styles/scrollbar.scss +0 -36
- package/src/admin/ui/styles/select.scss +0 -121
- package/src/admin/ui/styles/separator.scss +0 -14
- package/src/admin/ui/styles/sheet.scss +0 -152
- package/src/admin/ui/styles/sidebar.scss +0 -148
- package/src/admin/ui/styles/switch.scss +0 -59
- package/src/admin/ui/styles/table.scss +0 -207
- package/src/admin/ui/styles/tabs.scss +0 -62
- package/src/admin/ui/styles/toast.scss +0 -45
- package/src/admin/ui/styles/variables.scss +0 -24
- package/src/admin/ui/views/collection-list-view.tsx +0 -720
- package/src/admin/ui/views/dashboard-view.tsx +0 -263
- package/src/admin/ui/views/document-edit-view.tsx +0 -384
- package/src/admin/ui/views/global-edit-view.tsx +0 -226
- package/src/admin/ui/views/init-view.tsx +0 -182
- package/src/admin/ui/views/login-view.tsx +0 -123
- package/src/admin/ui/views/media-registry-view.tsx +0 -1104
- package/src/admin/ui/views/settings-view.tsx +0 -729
- package/src/admin/webcomponent.tsx +0 -15
- package/src/api.ts +0 -9
- package/src/auth/index.ts +0 -194
- package/src/auth/migrations.ts +0 -87
- package/src/auth/premissions.ts +0 -46
- package/src/cli/commands/generate-types.ts +0 -116
- package/src/cli/commands/init.ts +0 -95
- package/src/cli/commands/migrate-commands.ts +0 -160
- package/src/cli/commands/seed-command.ts +0 -11
- package/src/cli/d1-mock.ts +0 -101
- package/src/cli/index.test.ts +0 -84
- package/src/cli/index.ts +0 -183
- package/src/cli/r2-mock.ts +0 -217
- package/src/cli/seeding.ts +0 -409
- package/src/client.ts +0 -181
- package/src/config-utils.ts +0 -102
- package/src/config.ts +0 -49
- package/src/db/adapter.ts +0 -53
- package/src/db/better-sqlite.ts +0 -632
- package/src/db/bun-sqlite.ts +0 -646
- package/src/db/d1.ts +0 -711
- package/src/db/index.ts +0 -6
- package/src/db/kysely/data-mapper.ts +0 -142
- package/src/db/kysely/field-mapper.ts +0 -148
- package/src/db/kysely/migration-generator.ts +0 -223
- package/src/db/kysely/query-builder.ts +0 -92
- package/src/db/kysely/schema-builder.ts +0 -439
- package/src/db/kysely/sql-utils.ts +0 -13
- package/src/db/postgres.ts +0 -621
- package/src/db/sqlite.ts +0 -660
- package/src/db/system-schema.ts +0 -121
- package/src/index.ts +0 -13
- package/src/runtimes/README.md +0 -59
- package/src/runtimes/bun.ts +0 -49
- package/src/runtimes/cloudflare-workers.ts +0 -38
- package/src/runtimes/next.ts +0 -26
- package/src/runtimes/node.ts +0 -52
- package/src/schema/collection.ts +0 -184
- package/src/schema/fields/base.ts +0 -164
- package/src/schema/fields/index.ts +0 -427
- package/src/schema/global.ts +0 -145
- package/src/schema/index.ts +0 -4
- package/src/schema/infer.ts +0 -72
- package/src/server/admin-router.ts +0 -20
- package/src/server/admin.ts +0 -142
- package/src/server/assets.ts +0 -306
- package/src/server/collection-router.ts +0 -55
- package/src/server/handlers.ts +0 -722
- package/src/server/middlewares/admin.ts +0 -27
- package/src/server/middlewares/auth.ts +0 -89
- package/src/server/middlewares/context.ts +0 -17
- package/src/server/middlewares/cors.ts +0 -24
- package/src/server/middlewares/database-init.ts +0 -74
- package/src/server/middlewares/rate-limit.ts +0 -77
- package/src/server/router.ts +0 -47
- package/src/server/setup-middlewares.ts +0 -58
- package/src/server/system-router.ts +0 -35
- package/src/server.ts +0 -9
- package/src/storage/adapters/cloudflare-r2.ts +0 -136
- package/src/storage/adapters/local.ts +0 -146
- package/src/storage/adapters/s3.ts +0 -186
- package/src/storage/errors.ts +0 -46
- package/src/storage/index.ts +0 -5
- package/src/storage/types.ts +0 -39
- package/src/types.ts +0 -577
- package/src/utils/lexical.ts +0 -37
- package/src/utils/logger.ts +0 -73
- package/src/validation.ts +0 -429
- package/src/validator.ts +0 -179
- package/test/admin-custom-field.test.ts +0 -162
- package/test/admin-react-field.test.tsx +0 -134
- package/test/api-features.test.ts +0 -78
- package/test/api.test.ts +0 -178
- package/test/auth.test.ts +0 -62
- package/test/cli-integration.test.ts +0 -148
- package/test/cli.test.ts +0 -25
- package/test/db/postgres.test.ts +0 -95
- package/test/db/sqlite-filter.test.ts +0 -53
- package/test/db/sqlite.test.ts +0 -82
- package/test/engine-features.test.ts +0 -79
- package/test/globals.test.ts +0 -74
- package/test/integration-tmp/db-app/opacacms.config.ts +0 -15
- package/test/integration-tmp/my-sqlite-app/opacacms.config.ts +0 -25
- package/test/integration-tmp/my-test-app/index.ts +0 -8
- package/test/integration-tmp/my-test-app/opacacms.config.ts +0 -16
- package/test/integration-tmp/my-test-app/package.json +0 -12
- package/test/populate.test.ts +0 -79
- package/test/runtimes.test.ts +0 -43
- package/test/schema-builder.test.ts +0 -107
- package/test/schema-features.test.ts +0 -63
- package/test/seeding.test.ts +0 -68
- package/test/storage/local.test.ts +0 -72
- package/test/storage/s3.test.ts +0 -60
- package/test/structural-data.test.ts +0 -100
- package/test/test-setup.ts +0 -11
- package/test/validation.test.ts +0 -162
- package/tsconfig.json +0 -42
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
flattenPayload,
|
|
4
4
|
pushSchema,
|
|
5
5
|
unflattenRow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-xtwc125q.js";
|
|
7
7
|
import {
|
|
8
8
|
BaseDatabaseAdapter
|
|
9
9
|
} from "./chunk-s8mqwnm1.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
flattenFields,
|
|
15
15
|
getRelationalFields,
|
|
16
16
|
toSnakeCase
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-2kyhqvhc.js";
|
|
18
18
|
|
|
19
19
|
// src/db/sqlite.ts
|
|
20
20
|
import fs from "node:fs/promises";
|
|
@@ -99,7 +99,8 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
99
99
|
return result;
|
|
100
100
|
}
|
|
101
101
|
async count(collection, query) {
|
|
102
|
-
|
|
102
|
+
const tableName = toSnakeCase(collection);
|
|
103
|
+
let qb = this._db.selectFrom(tableName).select((eb) => eb.fn.count("id").as("count"));
|
|
103
104
|
if (query && Object.keys(query).length > 0) {
|
|
104
105
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
105
106
|
}
|
|
@@ -107,6 +108,7 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
107
108
|
return Number(result?.count || 0);
|
|
108
109
|
}
|
|
109
110
|
async create(collection, data) {
|
|
111
|
+
const tableName = toSnakeCase(collection);
|
|
110
112
|
return this._db.transaction().execute(async (tx) => {
|
|
111
113
|
const colDef = this._collections.find((c) => c.slug === collection);
|
|
112
114
|
const jsonFields = colDef?.fields.filter((f) => f.name && (["richtext", "json", "file"].includes(f.type) || f.localized)).map((f) => f.name) || [];
|
|
@@ -149,9 +151,9 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
149
151
|
}
|
|
150
152
|
}
|
|
151
153
|
const coercedData = await this.coerceData(collection, filteredData);
|
|
152
|
-
await tx.insertInto(
|
|
154
|
+
await tx.insertInto(tableName).values(coercedData).execute();
|
|
153
155
|
for (const [key, values] of Object.entries(hasManyData)) {
|
|
154
|
-
const joinTableName = `${
|
|
156
|
+
const joinTableName = `${tableName}_${toSnakeCase(key)}_relations`.toLowerCase();
|
|
155
157
|
if (values.length > 0) {
|
|
156
158
|
const joinData = values.map((val, idx) => {
|
|
157
159
|
const tId = typeof val === "object" ? val.id : val;
|
|
@@ -165,7 +167,7 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
165
167
|
const block = blocks[i];
|
|
166
168
|
if (!block.blockType)
|
|
167
169
|
continue;
|
|
168
|
-
const blockTableName = `${
|
|
170
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
|
|
169
171
|
const bId = block.id || crypto.randomUUID();
|
|
170
172
|
const blockDef = relationalFields.find((f) => f.name === key && f.type === "blocks");
|
|
171
173
|
const blockConfig = blockDef?.blocks?.find((b) => b.slug === block.blockType);
|
|
@@ -190,8 +192,9 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
190
192
|
});
|
|
191
193
|
}
|
|
192
194
|
async findOne(collection, query, tx) {
|
|
195
|
+
const tableName = toSnakeCase(collection);
|
|
193
196
|
const executor = tx || this._db;
|
|
194
|
-
let qb = executor.selectFrom(
|
|
197
|
+
let qb = executor.selectFrom(tableName).selectAll();
|
|
195
198
|
if (query && Object.keys(query).length > 0) {
|
|
196
199
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
197
200
|
}
|
|
@@ -255,7 +258,8 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
255
258
|
const limit = options?.limit || 10;
|
|
256
259
|
const offset = (page - 1) * limit;
|
|
257
260
|
const total = await this.count(collection, query);
|
|
258
|
-
|
|
261
|
+
const tableName = toSnakeCase(collection);
|
|
262
|
+
let qb = this._db.selectFrom(tableName).selectAll().limit(limit).offset(offset);
|
|
259
263
|
if (query && Object.keys(query).length > 0) {
|
|
260
264
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
261
265
|
}
|
|
@@ -315,12 +319,13 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
315
319
|
const updatedField = toSnakeCase(config.updatedAt || "updatedAt");
|
|
316
320
|
flatData[updatedField] = new Date().toISOString();
|
|
317
321
|
}
|
|
322
|
+
const tableName = toSnakeCase(collection);
|
|
318
323
|
if (Object.keys(flatData).length > 0) {
|
|
319
324
|
const coercedData = await this.coerceData(collection, flatData);
|
|
320
|
-
await tx.updateTable(
|
|
325
|
+
await tx.updateTable(tableName).set(coercedData).where("id", "=", current.id).execute();
|
|
321
326
|
}
|
|
322
327
|
for (const [key, values] of Object.entries(hasManyData)) {
|
|
323
|
-
const joinTableName = `${
|
|
328
|
+
const joinTableName = `${tableName}_${toSnakeCase(key)}_relations`.toLowerCase();
|
|
324
329
|
await tx.deleteFrom(joinTableName).where("source_id", "=", current.id).execute();
|
|
325
330
|
if (values.length > 0) {
|
|
326
331
|
const joinData = values.map((val, idx) => {
|
|
@@ -334,7 +339,7 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
334
339
|
const fieldDef = relationalFields.find((f) => f.name === key && f.type === "blocks");
|
|
335
340
|
if (fieldDef?.type === "blocks" && fieldDef.blocks) {
|
|
336
341
|
for (const b of fieldDef.blocks) {
|
|
337
|
-
const blockTableName = `${
|
|
342
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
338
343
|
try {
|
|
339
344
|
await tx.deleteFrom(blockTableName).where("_parent_id", "=", current.id).execute();
|
|
340
345
|
} catch (e) {}
|
|
@@ -344,7 +349,7 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
344
349
|
const block = blocks[i];
|
|
345
350
|
if (!block.blockType)
|
|
346
351
|
continue;
|
|
347
|
-
const blockTableName = `${
|
|
352
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
|
|
348
353
|
const bId = block.id || crypto.randomUUID();
|
|
349
354
|
const blockConfig = fieldDef?.blocks?.find((b) => b.slug === block.blockType);
|
|
350
355
|
const blockJsonFields = blockConfig?.fields.filter((f) => ["richtext", "json", "file"].includes(f.type)).map((f) => f.name) || [];
|
|
@@ -375,6 +380,7 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
375
380
|
const current = await this.findOne(collection, normalizedQuery);
|
|
376
381
|
if (!current)
|
|
377
382
|
return false;
|
|
383
|
+
const tableName = toSnakeCase(collection);
|
|
378
384
|
await this._db.transaction().execute(async (tx) => {
|
|
379
385
|
const colDef = this._collections.find((c) => c.slug === collection);
|
|
380
386
|
if (colDef) {
|
|
@@ -384,13 +390,13 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
384
390
|
continue;
|
|
385
391
|
const snakeName = toSnakeCase(field.name);
|
|
386
392
|
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
387
|
-
const joinTableName = `${
|
|
393
|
+
const joinTableName = `${tableName}_${snakeName}_relations`.toLowerCase();
|
|
388
394
|
try {
|
|
389
395
|
await tx.deleteFrom(joinTableName).where("source_id", "=", current.id).execute();
|
|
390
396
|
} catch (e) {}
|
|
391
397
|
} else if (field.type === "blocks" && field.blocks) {
|
|
392
398
|
for (const b of field.blocks) {
|
|
393
|
-
const blockTableName = `${
|
|
399
|
+
const blockTableName = `${tableName}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
394
400
|
try {
|
|
395
401
|
await tx.deleteFrom(blockTableName).where("_parent_id", "=", current.id).execute();
|
|
396
402
|
} catch (e) {}
|
|
@@ -398,13 +404,14 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
398
404
|
}
|
|
399
405
|
}
|
|
400
406
|
}
|
|
401
|
-
await tx.deleteFrom(
|
|
407
|
+
await tx.deleteFrom(tableName).where("id", "=", current.id).execute();
|
|
402
408
|
});
|
|
403
409
|
return true;
|
|
404
410
|
}
|
|
405
411
|
async updateMany(collection, query, data) {
|
|
412
|
+
const tableName = toSnakeCase(collection);
|
|
406
413
|
return this._db.transaction().execute(async (tx) => {
|
|
407
|
-
let qb = tx.updateTable(
|
|
414
|
+
let qb = tx.updateTable(tableName);
|
|
408
415
|
if (query && Object.keys(query).length > 0) {
|
|
409
416
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
410
417
|
}
|
|
@@ -431,8 +438,9 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
431
438
|
});
|
|
432
439
|
}
|
|
433
440
|
async deleteMany(collection, query) {
|
|
441
|
+
const tableName = toSnakeCase(collection);
|
|
434
442
|
return this._db.transaction().execute(async (tx) => {
|
|
435
|
-
let selectQb = tx.selectFrom(
|
|
443
|
+
let selectQb = tx.selectFrom(tableName).select("id");
|
|
436
444
|
if (query && Object.keys(query).length > 0) {
|
|
437
445
|
selectQb = selectQb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
438
446
|
}
|
|
@@ -448,13 +456,13 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
448
456
|
continue;
|
|
449
457
|
const snakeName = toSnakeCase(field.name);
|
|
450
458
|
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
451
|
-
const joinTableName = `${
|
|
459
|
+
const joinTableName = `${tableName}_${snakeName}_relations`.toLowerCase();
|
|
452
460
|
try {
|
|
453
461
|
await tx.deleteFrom(joinTableName).where("source_id", "in", ids).execute();
|
|
454
462
|
} catch (e) {}
|
|
455
463
|
} else if (field.type === "blocks" && field.blocks) {
|
|
456
464
|
for (const b of field.blocks) {
|
|
457
|
-
const blockTableName = `${
|
|
465
|
+
const blockTableName = `${tableName}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
458
466
|
try {
|
|
459
467
|
await tx.deleteFrom(blockTableName).where("_parent_id", "in", ids).execute();
|
|
460
468
|
} catch (e) {}
|
|
@@ -462,15 +470,17 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
462
470
|
}
|
|
463
471
|
}
|
|
464
472
|
}
|
|
465
|
-
const result = await tx.deleteFrom(
|
|
473
|
+
const result = await tx.deleteFrom(tableName).where("id", "in", ids).executeTakeFirst();
|
|
466
474
|
return Number(result.numDeletedRows || 0);
|
|
467
475
|
});
|
|
468
476
|
}
|
|
469
477
|
async findGlobal(slug) {
|
|
470
|
-
const
|
|
478
|
+
const tableName = toSnakeCase(slug);
|
|
479
|
+
const row = await this._db.selectFrom(tableName).selectAll().limit(1).executeTakeFirst();
|
|
471
480
|
return row ? unflattenRow(row) : null;
|
|
472
481
|
}
|
|
473
482
|
async updateGlobal(slug, data) {
|
|
483
|
+
const tableName = toSnakeCase(slug);
|
|
474
484
|
const existing = await this.findGlobal(slug);
|
|
475
485
|
const flatData = flattenPayload(data);
|
|
476
486
|
const globalDef = this._globals.find((g) => g.slug === slug);
|
|
@@ -489,9 +499,9 @@ class SQLiteAdapter extends BaseDatabaseAdapter {
|
|
|
489
499
|
if (!flatData[createdField])
|
|
490
500
|
flatData[createdField] = flatData[toSnakeCase(config.updatedAt || "updatedAt")];
|
|
491
501
|
}
|
|
492
|
-
await this._db.insertInto(
|
|
502
|
+
await this._db.insertInto(tableName).values(flatData).execute();
|
|
493
503
|
} else {
|
|
494
|
-
await this._db.updateTable(
|
|
504
|
+
await this._db.updateTable(tableName).set(flatData).where("id", "=", existing.id).execute();
|
|
495
505
|
}
|
|
496
506
|
return this.findGlobal(slug);
|
|
497
507
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
mapFieldToPostgresType,
|
|
4
4
|
mapFieldToSQLiteType,
|
|
5
5
|
toSnakeCase
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2kyhqvhc.js";
|
|
7
7
|
import"./chunk-8sqjbsgt.js";
|
|
8
8
|
|
|
9
9
|
// src/db/kysely/migration-generator.ts
|
|
@@ -132,12 +132,12 @@ function generateMigrationCode(collections, globals = [], dialect) {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
-
return `import {
|
|
135
|
+
return `import { type OpacaMigrationDb, sql } from 'opacacms/db';
|
|
136
136
|
|
|
137
|
-
export async function up(db:
|
|
137
|
+
export async function up(db: OpacaMigrationDb): Promise<void> {
|
|
138
138
|
${upCode}}
|
|
139
139
|
|
|
140
|
-
export async function down(db:
|
|
140
|
+
export async function down(db: OpacaMigrationDb): Promise<void> {
|
|
141
141
|
${downCode}}
|
|
142
142
|
`;
|
|
143
143
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
flattenPayload,
|
|
4
4
|
pushSchema,
|
|
5
5
|
unflattenRow
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-xtwc125q.js";
|
|
7
7
|
import {
|
|
8
8
|
BaseDatabaseAdapter
|
|
9
9
|
} from "./chunk-s8mqwnm1.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
flattenFields,
|
|
15
15
|
getRelationalFields,
|
|
16
16
|
toSnakeCase
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-2kyhqvhc.js";
|
|
18
18
|
|
|
19
19
|
// src/db/d1.ts
|
|
20
20
|
import fs from "node:fs/promises";
|
|
@@ -95,7 +95,8 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
95
95
|
return result;
|
|
96
96
|
}
|
|
97
97
|
async count(collection, query) {
|
|
98
|
-
|
|
98
|
+
const tableName = toSnakeCase(collection);
|
|
99
|
+
let qb = this._db.selectFrom(tableName).select((eb) => eb.fn.count("id").as("count"));
|
|
99
100
|
if (query && Object.keys(query).length > 0) {
|
|
100
101
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
101
102
|
}
|
|
@@ -103,6 +104,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
103
104
|
return Number(result?.count || 0);
|
|
104
105
|
}
|
|
105
106
|
async create(collection, data) {
|
|
107
|
+
const tableName = toSnakeCase(collection);
|
|
106
108
|
const colDef = this._collections.find((c) => c.slug === collection);
|
|
107
109
|
const jsonFields = colDef?.fields.filter((f) => f.name && (["richtext", "json", "file"].includes(f.type) || f.localized)).map((f) => f.name) || [];
|
|
108
110
|
const flatData = flattenPayload(data, "", jsonFields);
|
|
@@ -146,13 +148,13 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
146
148
|
}
|
|
147
149
|
const coercedData = await this.coerceData(collection, filteredData);
|
|
148
150
|
try {
|
|
149
|
-
await this._db.insertInto(
|
|
151
|
+
await this._db.insertInto(tableName).values(coercedData).execute();
|
|
150
152
|
} catch (e) {
|
|
151
153
|
logger.error(`[D1] Create failed in ${collection}: ${e.message}`);
|
|
152
154
|
throw e;
|
|
153
155
|
}
|
|
154
156
|
for (const [key, values] of Object.entries(hasManyData)) {
|
|
155
|
-
const joinTableName = `${
|
|
157
|
+
const joinTableName = `${tableName}_${toSnakeCase(key)}_relations`.toLowerCase();
|
|
156
158
|
if (values.length > 0) {
|
|
157
159
|
const joinData = values.map((val, idx) => {
|
|
158
160
|
const tId = typeof val === "object" ? val.id : val;
|
|
@@ -166,7 +168,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
166
168
|
const block = blocks[i];
|
|
167
169
|
if (!block.blockType)
|
|
168
170
|
continue;
|
|
169
|
-
const blockTableName = `${
|
|
171
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
|
|
170
172
|
const bId = block.id || crypto.randomUUID();
|
|
171
173
|
const blockDef = relationalFields.find((f) => f.name === key && f.type === "blocks");
|
|
172
174
|
const blockConfig = blockDef?.blocks?.find((b) => b.slug === block.blockType);
|
|
@@ -190,8 +192,9 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
190
192
|
return this.findOne(collection, { id: flatData.id }, this._db);
|
|
191
193
|
}
|
|
192
194
|
async findOne(collection, query, tx) {
|
|
195
|
+
const tableName = toSnakeCase(collection);
|
|
193
196
|
const executor = tx || this._db;
|
|
194
|
-
let qb = executor.selectFrom(
|
|
197
|
+
let qb = executor.selectFrom(tableName).selectAll();
|
|
195
198
|
if (query && Object.keys(query).length > 0) {
|
|
196
199
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
197
200
|
}
|
|
@@ -207,7 +210,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
207
210
|
continue;
|
|
208
211
|
const snakeName = toSnakeCase(field.name);
|
|
209
212
|
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
210
|
-
const joinTableName = `${
|
|
213
|
+
const joinTableName = `${tableName}_${snakeName}_relations`.toLowerCase();
|
|
211
214
|
try {
|
|
212
215
|
const relations = await executor.selectFrom(joinTableName).selectAll().where("source_id", "=", row.id).orderBy("order", "asc").execute();
|
|
213
216
|
const parts = field.name.split("__");
|
|
@@ -222,7 +225,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
222
225
|
} else if (field.type === "blocks" && "blocks" in field && field.blocks) {
|
|
223
226
|
const blockData = [];
|
|
224
227
|
for (const b of field.blocks) {
|
|
225
|
-
const blockTableName = `${
|
|
228
|
+
const blockTableName = `${tableName}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
226
229
|
try {
|
|
227
230
|
const blocks = await executor.selectFrom(blockTableName).selectAll().where("_parent_id", "=", row.id).execute();
|
|
228
231
|
for (const blk of blocks) {
|
|
@@ -255,7 +258,8 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
255
258
|
const limit = options?.limit || 10;
|
|
256
259
|
const offset = (page - 1) * limit;
|
|
257
260
|
const total = await this.count(collection, query);
|
|
258
|
-
|
|
261
|
+
const tableName = toSnakeCase(collection);
|
|
262
|
+
let qb = this._db.selectFrom(tableName).selectAll().limit(limit).offset(offset);
|
|
259
263
|
if (query && Object.keys(query).length > 0) {
|
|
260
264
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
261
265
|
}
|
|
@@ -284,6 +288,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
284
288
|
};
|
|
285
289
|
}
|
|
286
290
|
async update(collection, query, data) {
|
|
291
|
+
const tableName = toSnakeCase(collection);
|
|
287
292
|
let normalizedQuery = query;
|
|
288
293
|
if (typeof query !== "object" || query === null) {
|
|
289
294
|
normalizedQuery = { id: query };
|
|
@@ -331,14 +336,14 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
331
336
|
}
|
|
332
337
|
const coercedData = await this.coerceData(collection, filteredData);
|
|
333
338
|
try {
|
|
334
|
-
await this._db.updateTable(
|
|
339
|
+
await this._db.updateTable(tableName).set(coercedData).where("id", "=", current.id).execute();
|
|
335
340
|
} catch (e) {
|
|
336
341
|
logger.error(`[D1] Update failed in ${collection}: ${e.message}`);
|
|
337
342
|
throw e;
|
|
338
343
|
}
|
|
339
344
|
}
|
|
340
345
|
for (const [key, values] of Object.entries(hasManyData)) {
|
|
341
|
-
const joinTableName = `${
|
|
346
|
+
const joinTableName = `${tableName}_${toSnakeCase(key)}_relations`.toLowerCase();
|
|
342
347
|
await this._db.deleteFrom(joinTableName).where("source_id", "=", current.id).execute();
|
|
343
348
|
if (values.length > 0) {
|
|
344
349
|
const joinData = values.map((val, idx) => {
|
|
@@ -352,7 +357,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
352
357
|
const blockDef = relationalFields.find((f) => f.name === key && f.type === "blocks");
|
|
353
358
|
if (blockDef && "blocks" in blockDef && blockDef.blocks) {
|
|
354
359
|
for (const b of blockDef.blocks) {
|
|
355
|
-
const blockTableName = `${
|
|
360
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
356
361
|
try {
|
|
357
362
|
await this._db.deleteFrom(blockTableName).where("_parent_id", "=", current.id).execute();
|
|
358
363
|
} catch (e) {}
|
|
@@ -362,7 +367,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
362
367
|
const block = blocks[i];
|
|
363
368
|
if (!block.blockType)
|
|
364
369
|
continue;
|
|
365
|
-
const blockTableName = `${
|
|
370
|
+
const blockTableName = `${tableName}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
|
|
366
371
|
const bId = block.id || crypto.randomUUID();
|
|
367
372
|
const blockConfig = blockDef?.blocks?.find((b) => b.slug === block.blockType);
|
|
368
373
|
const blockJsonFields = blockConfig?.fields.filter((f) => ["richtext", "json", "file"].includes(f.type)).map((f) => toSnakeCase(f.name)) || [];
|
|
@@ -385,7 +390,8 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
385
390
|
return this.findOne(collection, { id: current.id }, this._db);
|
|
386
391
|
}
|
|
387
392
|
async updateMany(collection, query, data) {
|
|
388
|
-
|
|
393
|
+
const tableName = toSnakeCase(collection);
|
|
394
|
+
let qb = this._db.updateTable(tableName);
|
|
389
395
|
if (query && Object.keys(query).length > 0) {
|
|
390
396
|
qb = qb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
391
397
|
}
|
|
@@ -431,6 +437,7 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
431
437
|
return 0;
|
|
432
438
|
}
|
|
433
439
|
async delete(collection, query) {
|
|
440
|
+
const tableName = toSnakeCase(collection);
|
|
434
441
|
let normalizedQuery = query;
|
|
435
442
|
if (typeof query !== "object" || query === null) {
|
|
436
443
|
normalizedQuery = { id: query };
|
|
@@ -446,13 +453,13 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
446
453
|
continue;
|
|
447
454
|
const snakeName = toSnakeCase(field.name);
|
|
448
455
|
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
449
|
-
const joinTableName = `${
|
|
456
|
+
const joinTableName = `${tableName}_${snakeName}_relations`.toLowerCase();
|
|
450
457
|
try {
|
|
451
458
|
await this._db.deleteFrom(joinTableName).where("source_id", "=", current.id).execute();
|
|
452
459
|
} catch (e) {}
|
|
453
460
|
} else if (field.type === "blocks" && "blocks" in field && field.blocks) {
|
|
454
461
|
for (const b of field.blocks) {
|
|
455
|
-
const blockTableName = `${
|
|
462
|
+
const blockTableName = `${tableName}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
456
463
|
try {
|
|
457
464
|
await this._db.deleteFrom(blockTableName).where("_parent_id", "=", current.id).execute();
|
|
458
465
|
} catch (e) {}
|
|
@@ -460,11 +467,12 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
460
467
|
}
|
|
461
468
|
}
|
|
462
469
|
}
|
|
463
|
-
await this._db.deleteFrom(
|
|
470
|
+
await this._db.deleteFrom(tableName).where("id", "=", current.id).execute();
|
|
464
471
|
return true;
|
|
465
472
|
}
|
|
466
473
|
async deleteMany(collection, query) {
|
|
467
|
-
|
|
474
|
+
const tableName = toSnakeCase(collection);
|
|
475
|
+
let selectQb = this._db.selectFrom(tableName).select("id");
|
|
468
476
|
if (query && Object.keys(query).length > 0) {
|
|
469
477
|
selectQb = selectQb.where((eb) => buildKyselyWhere(eb, query) || eb.val(true));
|
|
470
478
|
}
|
|
@@ -480,13 +488,13 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
480
488
|
continue;
|
|
481
489
|
const snakeName = toSnakeCase(field.name);
|
|
482
490
|
if (field.type === "relationship" && "hasMany" in field && field.hasMany) {
|
|
483
|
-
const joinTableName = `${
|
|
491
|
+
const joinTableName = `${tableName}_${snakeName}_relations`.toLowerCase();
|
|
484
492
|
try {
|
|
485
493
|
await this._db.deleteFrom(joinTableName).where("source_id", "in", ids).execute();
|
|
486
494
|
} catch (e) {}
|
|
487
495
|
} else if (field.type === "blocks" && "blocks" in field && field.blocks) {
|
|
488
496
|
for (const b of field.blocks) {
|
|
489
|
-
const blockTableName = `${
|
|
497
|
+
const blockTableName = `${tableName}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
|
|
490
498
|
try {
|
|
491
499
|
await this._db.deleteFrom(blockTableName).where("_parent_id", "in", ids).execute();
|
|
492
500
|
} catch (e) {}
|
|
@@ -494,14 +502,16 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
494
502
|
}
|
|
495
503
|
}
|
|
496
504
|
}
|
|
497
|
-
const result = await this._db.deleteFrom(
|
|
505
|
+
const result = await this._db.deleteFrom(tableName).where("id", "in", ids).executeTakeFirst();
|
|
498
506
|
return Number(result.numDeletedRows || 0);
|
|
499
507
|
}
|
|
500
508
|
async findGlobal(slug) {
|
|
501
|
-
const
|
|
509
|
+
const tableName = toSnakeCase(slug);
|
|
510
|
+
const row = await this._db.selectFrom(tableName).selectAll().limit(1).executeTakeFirst();
|
|
502
511
|
return row ? unflattenRow(row) : null;
|
|
503
512
|
}
|
|
504
513
|
async updateGlobal(slug, data) {
|
|
514
|
+
const tableName = toSnakeCase(slug);
|
|
505
515
|
const existing = await this.findGlobal(slug);
|
|
506
516
|
const flatData = flattenPayload(data);
|
|
507
517
|
const globalDef = this._globals.find((g) => g.slug === slug);
|
|
@@ -520,9 +530,9 @@ class D1Adapter extends BaseDatabaseAdapter {
|
|
|
520
530
|
if (!flatData[createdField])
|
|
521
531
|
flatData[createdField] = flatData[toSnakeCase(config.updatedAt || "updatedAt")];
|
|
522
532
|
}
|
|
523
|
-
await this._db.insertInto(
|
|
533
|
+
await this._db.insertInto(tableName).values(flatData).execute();
|
|
524
534
|
} else {
|
|
525
|
-
await this._db.updateTable(
|
|
535
|
+
await this._db.updateTable(tableName).set(flatData).where("id", "=", existing.id).execute();
|
|
526
536
|
}
|
|
527
537
|
return this.findGlobal(slug);
|
|
528
538
|
}
|