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.
Files changed (246) hide show
  1. package/dist/admin/index.js +9464 -21
  2. package/dist/admin/webcomponent.d.ts +1 -1
  3. package/dist/admin/webcomponent.js +9620 -6
  4. package/dist/admin.css +1 -0
  5. package/dist/{chunk-6dhs73zq.js → chunk-0am1m47g.js} +1 -1
  6. package/dist/{chunk-0nf7fe26.js → chunk-0d9aqz6z.js} +1 -1
  7. package/dist/{chunk-cvdd4eqh.js → chunk-2kyhqvhc.js} +5 -1
  8. package/dist/{chunk-gjjcc4hm.js → chunk-2z8wxx9g.js} +21 -6
  9. package/dist/{chunk-xg35h5a3.js → chunk-7fyepksb.js} +1 -1
  10. package/dist/{chunk-njytmdb4.js → chunk-pxh5encs.js} +34 -24
  11. package/dist/{chunk-n8aekdnr.js → chunk-qkn1ykrj.js} +33 -23
  12. package/dist/{chunk-kwp83w8b.js → chunk-wmvjvn7b.js} +4 -4
  13. package/dist/{chunk-qrt22f6e.js → chunk-wq314kkx.js} +35 -25
  14. package/dist/{chunk-eqtsfyjf.js → chunk-x2ejaftz.js} +52 -28
  15. package/dist/{chunk-6ew02s0c.js → chunk-xtwc125q.js} +18 -18
  16. package/dist/cli/index.js +5 -5
  17. package/dist/db/better-sqlite.d.ts +1 -0
  18. package/dist/db/better-sqlite.js +3 -3
  19. package/dist/db/bun-sqlite.d.ts +1 -0
  20. package/dist/db/bun-sqlite.js +3 -3
  21. package/dist/db/d1.js +3 -3
  22. package/dist/db/index.d.ts +3 -0
  23. package/dist/db/index.js +17 -13
  24. package/dist/db/postgres.js +3 -3
  25. package/dist/db/sqlite.js +3 -3
  26. package/dist/runtimes/bun.js +2 -2
  27. package/dist/runtimes/cloudflare-workers.js +2 -2
  28. package/dist/runtimes/next.js +2 -2
  29. package/dist/runtimes/node.js +2 -2
  30. package/dist/server.js +2 -2
  31. package/package.json +8 -2
  32. package/bun.lock +0 -34
  33. package/dist/admin/index.css +0 -47
  34. package/dist/api.d.ts +0 -6
  35. package/dist/api.js +0 -27
  36. package/dist/chunk-2zm8cy1w.js +0 -9482
  37. package/global.d.ts +0 -11
  38. package/src/admin/api-client.ts +0 -63
  39. package/src/admin/auth-client.ts +0 -40
  40. package/src/admin/custom-field.ts +0 -179
  41. package/src/admin/index.ts +0 -15
  42. package/src/admin/react.tsx +0 -72
  43. package/src/admin/router.ts +0 -9
  44. package/src/admin/stores/admin-queries.ts +0 -121
  45. package/src/admin/stores/auth.ts +0 -61
  46. package/src/admin/stores/column-visibility.ts +0 -67
  47. package/src/admin/stores/config.ts +0 -15
  48. package/src/admin/stores/media.ts +0 -95
  49. package/src/admin/stores/query.ts +0 -13
  50. package/src/admin/stores/ui.ts +0 -29
  51. package/src/admin/ui/admin-client.tsx +0 -283
  52. package/src/admin/ui/admin-layout.tsx +0 -276
  53. package/src/admin/ui/components/ColumnVisibilityToggle.tsx +0 -141
  54. package/src/admin/ui/components/DataDetailSheet.tsx +0 -141
  55. package/src/admin/ui/components/DataDetailView.tsx +0 -175
  56. package/src/admin/ui/components/Table.tsx +0 -67
  57. package/src/admin/ui/components/fields/ArrayField.tsx +0 -166
  58. package/src/admin/ui/components/fields/BlocksField.tsx +0 -202
  59. package/src/admin/ui/components/fields/BooleanField.tsx +0 -50
  60. package/src/admin/ui/components/fields/CollapsibleField.tsx +0 -75
  61. package/src/admin/ui/components/fields/DateField.tsx +0 -45
  62. package/src/admin/ui/components/fields/FileField.tsx +0 -322
  63. package/src/admin/ui/components/fields/GroupField.tsx +0 -50
  64. package/src/admin/ui/components/fields/JoinField.tsx +0 -23
  65. package/src/admin/ui/components/fields/NumberField.tsx +0 -46
  66. package/src/admin/ui/components/fields/RadioField.tsx +0 -62
  67. package/src/admin/ui/components/fields/RelationshipField.tsx +0 -278
  68. package/src/admin/ui/components/fields/RowField.tsx +0 -40
  69. package/src/admin/ui/components/fields/SelectField.tsx +0 -59
  70. package/src/admin/ui/components/fields/TabsField.tsx +0 -101
  71. package/src/admin/ui/components/fields/TextAreaField.tsx +0 -54
  72. package/src/admin/ui/components/fields/TextField.tsx +0 -49
  73. package/src/admin/ui/components/fields/VirtualField.tsx +0 -53
  74. package/src/admin/ui/components/fields/index.tsx +0 -371
  75. package/src/admin/ui/components/fields/richtext-editor/index.tsx +0 -211
  76. package/src/admin/ui/components/fields/richtext-editor/nodes/ImageComponent.tsx +0 -142
  77. package/src/admin/ui/components/fields/richtext-editor/nodes/ImageNode.tsx +0 -95
  78. package/src/admin/ui/components/fields/richtext-editor/plugins/ComponentPickerPlugin.tsx +0 -226
  79. package/src/admin/ui/components/fields/richtext-editor/plugins/EditableSyncPlugin.tsx +0 -16
  80. package/src/admin/ui/components/fields/richtext-editor/plugins/NotionToolbarPlugin.tsx +0 -184
  81. package/src/admin/ui/components/fields/richtext-editor/plugins/SimpleToolbarPlugin.tsx +0 -240
  82. package/src/admin/ui/components/fields/richtext-editor/plugins/ValueSyncPlugin.tsx +0 -40
  83. package/src/admin/ui/components/fields/utils.ts +0 -1
  84. package/src/admin/ui/components/link.tsx +0 -41
  85. package/src/admin/ui/components/media/AssetManagerModal.tsx +0 -334
  86. package/src/admin/ui/components/toast.tsx +0 -72
  87. package/src/admin/ui/components/ui/accordion.tsx +0 -51
  88. package/src/admin/ui/components/ui/alert-dialog.tsx +0 -98
  89. package/src/admin/ui/components/ui/blocks.tsx +0 -32
  90. package/src/admin/ui/components/ui/breadcrumbs.tsx +0 -59
  91. package/src/admin/ui/components/ui/button.tsx +0 -26
  92. package/src/admin/ui/components/ui/collapsible.tsx +0 -124
  93. package/src/admin/ui/components/ui/dialog.tsx +0 -79
  94. package/src/admin/ui/components/ui/group.tsx +0 -20
  95. package/src/admin/ui/components/ui/index.ts +0 -17
  96. package/src/admin/ui/components/ui/input.tsx +0 -12
  97. package/src/admin/ui/components/ui/join.tsx +0 -53
  98. package/src/admin/ui/components/ui/label.tsx +0 -11
  99. package/src/admin/ui/components/ui/radio-group.tsx +0 -75
  100. package/src/admin/ui/components/ui/relationship-detail-sheet.tsx +0 -122
  101. package/src/admin/ui/components/ui/relationship.tsx +0 -58
  102. package/src/admin/ui/components/ui/scroll-area.tsx +0 -19
  103. package/src/admin/ui/components/ui/select.tsx +0 -187
  104. package/src/admin/ui/components/ui/separator.tsx +0 -21
  105. package/src/admin/ui/components/ui/sheet.tsx +0 -106
  106. package/src/admin/ui/components/ui/tabs.tsx +0 -116
  107. package/src/admin/ui/components/ui/utils.ts +0 -3
  108. package/src/admin/ui/hooks/use-debounce.ts +0 -15
  109. package/src/admin/ui/styles/_locale-switcher.scss +0 -33
  110. package/src/admin/ui/styles/accordion.scss +0 -60
  111. package/src/admin/ui/styles/animations.scss +0 -41
  112. package/src/admin/ui/styles/asset-manager.scss +0 -547
  113. package/src/admin/ui/styles/badge.scss +0 -13
  114. package/src/admin/ui/styles/base.scss +0 -22
  115. package/src/admin/ui/styles/button.scss +0 -161
  116. package/src/admin/ui/styles/card.scss +0 -13
  117. package/src/admin/ui/styles/collapsible.scss +0 -75
  118. package/src/admin/ui/styles/data-detail.scss +0 -92
  119. package/src/admin/ui/styles/dialog.scss +0 -102
  120. package/src/admin/ui/styles/empty-state.scss +0 -22
  121. package/src/admin/ui/styles/group.scss +0 -19
  122. package/src/admin/ui/styles/index.scss +0 -33
  123. package/src/admin/ui/styles/input.scss +0 -80
  124. package/src/admin/ui/styles/label.scss +0 -12
  125. package/src/admin/ui/styles/layout.scss +0 -56
  126. package/src/admin/ui/styles/lexical.scss +0 -469
  127. package/src/admin/ui/styles/loading.scss +0 -102
  128. package/src/admin/ui/styles/media-registry.scss +0 -597
  129. package/src/admin/ui/styles/pagination.scss +0 -20
  130. package/src/admin/ui/styles/radio-group.scss +0 -66
  131. package/src/admin/ui/styles/row.scss +0 -17
  132. package/src/admin/ui/styles/scrollbar.scss +0 -36
  133. package/src/admin/ui/styles/select.scss +0 -121
  134. package/src/admin/ui/styles/separator.scss +0 -14
  135. package/src/admin/ui/styles/sheet.scss +0 -152
  136. package/src/admin/ui/styles/sidebar.scss +0 -148
  137. package/src/admin/ui/styles/switch.scss +0 -59
  138. package/src/admin/ui/styles/table.scss +0 -207
  139. package/src/admin/ui/styles/tabs.scss +0 -62
  140. package/src/admin/ui/styles/toast.scss +0 -45
  141. package/src/admin/ui/styles/variables.scss +0 -24
  142. package/src/admin/ui/views/collection-list-view.tsx +0 -720
  143. package/src/admin/ui/views/dashboard-view.tsx +0 -263
  144. package/src/admin/ui/views/document-edit-view.tsx +0 -384
  145. package/src/admin/ui/views/global-edit-view.tsx +0 -226
  146. package/src/admin/ui/views/init-view.tsx +0 -182
  147. package/src/admin/ui/views/login-view.tsx +0 -123
  148. package/src/admin/ui/views/media-registry-view.tsx +0 -1104
  149. package/src/admin/ui/views/settings-view.tsx +0 -729
  150. package/src/admin/webcomponent.tsx +0 -15
  151. package/src/api.ts +0 -9
  152. package/src/auth/index.ts +0 -194
  153. package/src/auth/migrations.ts +0 -87
  154. package/src/auth/premissions.ts +0 -46
  155. package/src/cli/commands/generate-types.ts +0 -116
  156. package/src/cli/commands/init.ts +0 -95
  157. package/src/cli/commands/migrate-commands.ts +0 -160
  158. package/src/cli/commands/seed-command.ts +0 -11
  159. package/src/cli/d1-mock.ts +0 -101
  160. package/src/cli/index.test.ts +0 -84
  161. package/src/cli/index.ts +0 -183
  162. package/src/cli/r2-mock.ts +0 -217
  163. package/src/cli/seeding.ts +0 -409
  164. package/src/client.ts +0 -181
  165. package/src/config-utils.ts +0 -102
  166. package/src/config.ts +0 -49
  167. package/src/db/adapter.ts +0 -53
  168. package/src/db/better-sqlite.ts +0 -632
  169. package/src/db/bun-sqlite.ts +0 -646
  170. package/src/db/d1.ts +0 -711
  171. package/src/db/index.ts +0 -6
  172. package/src/db/kysely/data-mapper.ts +0 -142
  173. package/src/db/kysely/field-mapper.ts +0 -148
  174. package/src/db/kysely/migration-generator.ts +0 -223
  175. package/src/db/kysely/query-builder.ts +0 -92
  176. package/src/db/kysely/schema-builder.ts +0 -439
  177. package/src/db/kysely/sql-utils.ts +0 -13
  178. package/src/db/postgres.ts +0 -621
  179. package/src/db/sqlite.ts +0 -660
  180. package/src/db/system-schema.ts +0 -121
  181. package/src/index.ts +0 -13
  182. package/src/runtimes/README.md +0 -59
  183. package/src/runtimes/bun.ts +0 -49
  184. package/src/runtimes/cloudflare-workers.ts +0 -38
  185. package/src/runtimes/next.ts +0 -26
  186. package/src/runtimes/node.ts +0 -52
  187. package/src/schema/collection.ts +0 -184
  188. package/src/schema/fields/base.ts +0 -164
  189. package/src/schema/fields/index.ts +0 -427
  190. package/src/schema/global.ts +0 -145
  191. package/src/schema/index.ts +0 -4
  192. package/src/schema/infer.ts +0 -72
  193. package/src/server/admin-router.ts +0 -20
  194. package/src/server/admin.ts +0 -142
  195. package/src/server/assets.ts +0 -306
  196. package/src/server/collection-router.ts +0 -55
  197. package/src/server/handlers.ts +0 -722
  198. package/src/server/middlewares/admin.ts +0 -27
  199. package/src/server/middlewares/auth.ts +0 -89
  200. package/src/server/middlewares/context.ts +0 -17
  201. package/src/server/middlewares/cors.ts +0 -24
  202. package/src/server/middlewares/database-init.ts +0 -74
  203. package/src/server/middlewares/rate-limit.ts +0 -77
  204. package/src/server/router.ts +0 -47
  205. package/src/server/setup-middlewares.ts +0 -58
  206. package/src/server/system-router.ts +0 -35
  207. package/src/server.ts +0 -9
  208. package/src/storage/adapters/cloudflare-r2.ts +0 -136
  209. package/src/storage/adapters/local.ts +0 -146
  210. package/src/storage/adapters/s3.ts +0 -186
  211. package/src/storage/errors.ts +0 -46
  212. package/src/storage/index.ts +0 -5
  213. package/src/storage/types.ts +0 -39
  214. package/src/types.ts +0 -577
  215. package/src/utils/lexical.ts +0 -37
  216. package/src/utils/logger.ts +0 -73
  217. package/src/validation.ts +0 -429
  218. package/src/validator.ts +0 -179
  219. package/test/admin-custom-field.test.ts +0 -162
  220. package/test/admin-react-field.test.tsx +0 -134
  221. package/test/api-features.test.ts +0 -78
  222. package/test/api.test.ts +0 -178
  223. package/test/auth.test.ts +0 -62
  224. package/test/cli-integration.test.ts +0 -148
  225. package/test/cli.test.ts +0 -25
  226. package/test/db/postgres.test.ts +0 -95
  227. package/test/db/sqlite-filter.test.ts +0 -53
  228. package/test/db/sqlite.test.ts +0 -82
  229. package/test/engine-features.test.ts +0 -79
  230. package/test/globals.test.ts +0 -74
  231. package/test/integration-tmp/db-app/opacacms.config.ts +0 -15
  232. package/test/integration-tmp/my-sqlite-app/opacacms.config.ts +0 -25
  233. package/test/integration-tmp/my-test-app/index.ts +0 -8
  234. package/test/integration-tmp/my-test-app/opacacms.config.ts +0 -16
  235. package/test/integration-tmp/my-test-app/package.json +0 -12
  236. package/test/populate.test.ts +0 -79
  237. package/test/runtimes.test.ts +0 -43
  238. package/test/schema-builder.test.ts +0 -107
  239. package/test/schema-features.test.ts +0 -63
  240. package/test/seeding.test.ts +0 -68
  241. package/test/storage/local.test.ts +0 -72
  242. package/test/storage/s3.test.ts +0 -60
  243. package/test/structural-data.test.ts +0 -100
  244. package/test/test-setup.ts +0 -11
  245. package/test/validation.test.ts +0 -162
  246. package/tsconfig.json +0 -42
@@ -3,7 +3,7 @@ import {
3
3
  flattenPayload,
4
4
  pushSchema,
5
5
  unflattenRow
6
- } from "./chunk-6ew02s0c.js";
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-cvdd4eqh.js";
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
- let qb = this._db.selectFrom(collection).select((eb) => eb.fn.count("id").as("count"));
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(collection).values(coercedData).execute();
154
+ await tx.insertInto(tableName).values(coercedData).execute();
153
155
  for (const [key, values] of Object.entries(hasManyData)) {
154
- const joinTableName = `${collection}_${toSnakeCase(key)}_relations`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
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(collection).selectAll();
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
- let qb = this._db.selectFrom(collection).selectAll().limit(limit).offset(offset);
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(collection).set(coercedData).where("id", "=", current.id).execute();
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 = `${collection}_${toSnakeCase(key)}_relations`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(b.slug)}`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
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 = `${collection}_${snakeName}_relations`.toLowerCase();
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 = `${collection}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
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(collection).where("id", "=", current.id).execute();
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(collection);
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(collection).select("id");
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 = `${collection}_${snakeName}_relations`.toLowerCase();
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 = `${collection}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
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(collection).where("id", "in", ids).executeTakeFirst();
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 row = await this._db.selectFrom(slug).selectAll().limit(1).executeTakeFirst();
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(slug).values(flatData).execute();
502
+ await this._db.insertInto(tableName).values(flatData).execute();
493
503
  } else {
494
- await this._db.updateTable(slug).set(flatData).where("id", "=", existing.id).execute();
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-cvdd4eqh.js";
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 { Kysely, sql } from 'kysely';
135
+ return `import { type OpacaMigrationDb, sql } from 'opacacms/db';
136
136
 
137
- export async function up(db: Kysely<any>): Promise<void> {
137
+ export async function up(db: OpacaMigrationDb): Promise<void> {
138
138
  ${upCode}}
139
139
 
140
- export async function down(db: Kysely<any>): Promise<void> {
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-6ew02s0c.js";
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-cvdd4eqh.js";
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
- let qb = this._db.selectFrom(collection).select((eb) => eb.fn.count("id").as("count"));
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(collection).values(coercedData).execute();
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 = `${collection}_${toSnakeCase(key)}_relations`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
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(collection).selectAll();
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 = `${collection}_${snakeName}_relations`.toLowerCase();
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 = `${collection}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
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
- let qb = this._db.selectFrom(collection).selectAll().limit(limit).offset(offset);
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(collection).set(coercedData).where("id", "=", current.id).execute();
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 = `${collection}_${toSnakeCase(key)}_relations`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(b.slug)}`.toLowerCase();
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 = `${collection}_${toSnakeCase(key)}_${toSnakeCase(block.blockType)}`.toLowerCase();
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
- let qb = this._db.updateTable(collection);
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 = `${collection}_${snakeName}_relations`.toLowerCase();
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 = `${collection}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
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(collection).where("id", "=", current.id).execute();
470
+ await this._db.deleteFrom(tableName).where("id", "=", current.id).execute();
464
471
  return true;
465
472
  }
466
473
  async deleteMany(collection, query) {
467
- let selectQb = this._db.selectFrom(collection).select("id");
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 = `${collection}_${snakeName}_relations`.toLowerCase();
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 = `${collection}_${snakeName}_${toSnakeCase(b.slug)}`.toLowerCase();
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(collection).where("id", "in", ids).executeTakeFirst();
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 row = await this._db.selectFrom(slug).selectAll().limit(1).executeTakeFirst();
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(slug).values(flatData).execute();
533
+ await this._db.insertInto(tableName).values(flatData).execute();
524
534
  } else {
525
- await this._db.updateTable(slug).set(flatData).where("id", "=", existing.id).execute();
535
+ await this._db.updateTable(tableName).set(flatData).where("id", "=", existing.id).execute();
526
536
  }
527
537
  return this.findGlobal(slug);
528
538
  }