nextly 0.0.1 → 0.0.2-alpha.0

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 (268) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +122 -0
  3. package/dist/_dts-chunks/collections-handler.d-DjgO74Wt.d.ts +20540 -0
  4. package/dist/_dts-chunks/config.d-DNwsDnjs.d.ts +2589 -0
  5. package/dist/_dts-chunks/define-component.d-BUgTHmt3.d.ts +1149 -0
  6. package/dist/_dts-chunks/image-processor.d-OO1PmMrv.d.ts +335 -0
  7. package/dist/_dts-chunks/index.d-axCAzZ7m.d.ts +17842 -0
  8. package/dist/_dts-chunks/media.d-DjDOZo4B.d.ts +117 -0
  9. package/dist/_dts-chunks/on-error.d-CHIKWNxd.d.ts +38 -0
  10. package/dist/_dts-chunks/storage.d-BUhQ2we_.d.ts +404 -0
  11. package/dist/actions/index.d.ts +239 -0
  12. package/dist/actions/index.mjs +281 -0
  13. package/dist/api/auth-state.d.ts +5 -0
  14. package/dist/api/auth-state.mjs +131 -0
  15. package/dist/api/collections-schema-detail.d.ts +56 -0
  16. package/dist/api/collections-schema-detail.mjs +244 -0
  17. package/dist/api/collections-schema-export.d.ts +56 -0
  18. package/dist/api/collections-schema-export.mjs +129 -0
  19. package/dist/api/collections-schema.d.ts +59 -0
  20. package/dist/api/collections-schema.mjs +207 -0
  21. package/dist/api/components-detail.d.ts +50 -0
  22. package/dist/api/components-detail.mjs +132 -0
  23. package/dist/api/components.d.ts +69 -0
  24. package/dist/api/components.mjs +144 -0
  25. package/dist/api/email-providers-default.d.ts +40 -0
  26. package/dist/api/email-providers-default.mjs +75 -0
  27. package/dist/api/email-providers-detail.d.ts +81 -0
  28. package/dist/api/email-providers-detail.mjs +109 -0
  29. package/dist/api/email-providers-test.d.ts +43 -0
  30. package/dist/api/email-providers-test.mjs +114 -0
  31. package/dist/api/email-providers.d.ts +69 -0
  32. package/dist/api/email-providers.mjs +110 -0
  33. package/dist/api/email-send-template.d.ts +41 -0
  34. package/dist/api/email-send-template.mjs +58 -0
  35. package/dist/api/email-send.d.ts +42 -0
  36. package/dist/api/email-send.mjs +58 -0
  37. package/dist/api/email-templates-detail.d.ts +74 -0
  38. package/dist/api/email-templates-detail.mjs +112 -0
  39. package/dist/api/email-templates-layout.d.ts +55 -0
  40. package/dist/api/email-templates-layout.mjs +92 -0
  41. package/dist/api/email-templates-preview.d.ts +48 -0
  42. package/dist/api/email-templates-preview.mjs +93 -0
  43. package/dist/api/email-templates.d.ts +61 -0
  44. package/dist/api/email-templates.mjs +118 -0
  45. package/dist/api/health.d.ts +68 -0
  46. package/dist/api/health.mjs +67 -0
  47. package/dist/api/index.d.ts +54 -0
  48. package/dist/api/index.mjs +16 -0
  49. package/dist/api/media-bulk.d.ts +74 -0
  50. package/dist/api/media-bulk.mjs +196 -0
  51. package/dist/api/media-folders.d.ts +112 -0
  52. package/dist/api/media-folders.mjs +187 -0
  53. package/dist/api/media-handlers.d.ts +102 -0
  54. package/dist/api/media-handlers.mjs +437 -0
  55. package/dist/api/media.d.ts +117 -0
  56. package/dist/api/media.mjs +242 -0
  57. package/dist/api/singles-detail.d.ts +87 -0
  58. package/dist/api/singles-detail.mjs +170 -0
  59. package/dist/api/singles-schema-detail.d.ts +54 -0
  60. package/dist/api/singles-schema-detail.mjs +182 -0
  61. package/dist/api/singles.d.ts +34 -0
  62. package/dist/api/singles.mjs +94 -0
  63. package/dist/api/storage-upload-url.d.ts +48 -0
  64. package/dist/api/storage-upload-url.mjs +202 -0
  65. package/dist/api/uploads.d.ts +109 -0
  66. package/dist/api/uploads.mjs +359 -0
  67. package/dist/auth/index.d.ts +425 -0
  68. package/dist/auth/index.mjs +199 -0
  69. package/dist/boot-apply-PQSYLDIN.mjs +7 -0
  70. package/dist/chunk-2OALJTK6.mjs +489 -0
  71. package/dist/chunk-2Q2SX2CS.mjs +365 -0
  72. package/dist/chunk-2TFX4ND3.mjs +13 -0
  73. package/dist/chunk-2TWPDSYD.mjs +87 -0
  74. package/dist/chunk-2W3DVD7S.mjs +647 -0
  75. package/dist/chunk-2ZFKXPQM.mjs +88 -0
  76. package/dist/chunk-3FA7FKAV.mjs +832 -0
  77. package/dist/chunk-3NZ2KMBL.mjs +58 -0
  78. package/dist/chunk-4MJLT6PZ.mjs +0 -0
  79. package/dist/chunk-56WO4WX7.mjs +0 -0
  80. package/dist/chunk-5APFUGAD.mjs +89 -0
  81. package/dist/chunk-5HMZ644B.mjs +108 -0
  82. package/dist/chunk-67GXH6PR.mjs +32 -0
  83. package/dist/chunk-6JNEPWRW.mjs +14368 -0
  84. package/dist/chunk-6NFHQIJD.mjs +45 -0
  85. package/dist/chunk-7P6ASYW6.mjs +9 -0
  86. package/dist/chunk-A3WPLSDT.mjs +1364 -0
  87. package/dist/chunk-AGJ6F2T3.mjs +144 -0
  88. package/dist/chunk-AK6Z23OX.mjs +1464 -0
  89. package/dist/chunk-APKKRD2G.mjs +102 -0
  90. package/dist/chunk-B2GV2BWH.mjs +73 -0
  91. package/dist/chunk-D5HQBNUB.mjs +74 -0
  92. package/dist/chunk-DNNG377Z.mjs +204 -0
  93. package/dist/chunk-DP3G27G5.mjs +135 -0
  94. package/dist/chunk-DV6WVX2Q.mjs +0 -0
  95. package/dist/chunk-DXGGXIUZ.mjs +57 -0
  96. package/dist/chunk-EGXBZCGC.mjs +943 -0
  97. package/dist/chunk-ERCNLX3V.mjs +176 -0
  98. package/dist/chunk-FQULBZ53.mjs +850 -0
  99. package/dist/chunk-G2AA4QLC.mjs +262 -0
  100. package/dist/chunk-GDBJ5JCU.mjs +488 -0
  101. package/dist/chunk-GJNSJU4S.mjs +19 -0
  102. package/dist/chunk-GZ6DCQKC.mjs +69 -0
  103. package/dist/chunk-H26B4FYG.mjs +167 -0
  104. package/dist/chunk-I4JMR3UR.mjs +21 -0
  105. package/dist/chunk-INV7QKLG.mjs +508 -0
  106. package/dist/chunk-IUDOC7N7.mjs +46 -0
  107. package/dist/chunk-IZWPRDC3.mjs +206 -0
  108. package/dist/chunk-KIMNCZGV.mjs +15 -0
  109. package/dist/chunk-L6HW2DA7.mjs +15 -0
  110. package/dist/chunk-LAZXX4HR.mjs +100 -0
  111. package/dist/chunk-LDKCUMHK.mjs +95 -0
  112. package/dist/chunk-LRXMECUA.mjs +0 -0
  113. package/dist/chunk-M52VMPGA.mjs +119 -0
  114. package/dist/chunk-MGUWEEI6.mjs +160 -0
  115. package/dist/chunk-NRUWQ5Z7.mjs +419 -0
  116. package/dist/chunk-NSEFNNU4.mjs +25360 -0
  117. package/dist/chunk-NTHVDFGO.mjs +138 -0
  118. package/dist/chunk-O3QHXMOX.mjs +3166 -0
  119. package/dist/chunk-P7NH2OSC.mjs +2605 -0
  120. package/dist/chunk-PKMABBB5.mjs +184 -0
  121. package/dist/chunk-PWS6XGJK.mjs +76 -0
  122. package/dist/chunk-R6JJQHFC.mjs +20 -0
  123. package/dist/chunk-RJLLGGPG.mjs +0 -0
  124. package/dist/chunk-SBACDPNX.mjs +689 -0
  125. package/dist/chunk-TO5AFLVQ.mjs +124 -0
  126. package/dist/chunk-TS7GHTG2.mjs +5436 -0
  127. package/dist/chunk-UJ2IMJ4W.mjs +133 -0
  128. package/dist/chunk-UOP63Q54.mjs +102 -0
  129. package/dist/chunk-UUOFWCM6.mjs +78 -0
  130. package/dist/chunk-V4EQTOA4.mjs +893 -0
  131. package/dist/chunk-VJ66NCL4.mjs +193 -0
  132. package/dist/chunk-VQJQHVEV.mjs +29 -0
  133. package/dist/chunk-VTJADRO3.mjs +141 -0
  134. package/dist/chunk-VWF3JO32.mjs +0 -0
  135. package/dist/chunk-W4MGXIRR.mjs +27 -0
  136. package/dist/chunk-W5KKPZT5.mjs +1204 -0
  137. package/dist/chunk-WD34YQ6T.mjs +381 -0
  138. package/dist/chunk-WZBYMYVW.mjs +14 -0
  139. package/dist/chunk-X23WKS3Z.mjs +50 -0
  140. package/dist/chunk-X7TXCYYN.mjs +6496 -0
  141. package/dist/chunk-XGI4EMS3.mjs +140 -0
  142. package/dist/chunk-XZKLBMN6.mjs +1153 -0
  143. package/dist/chunk-YB7INWPY.mjs +0 -0
  144. package/dist/chunk-YV4Y7SDL.mjs +83 -0
  145. package/dist/chunk-YZNBLFIW.mjs +1688 -0
  146. package/dist/chunk-YZZCTONM.mjs +263 -0
  147. package/dist/chunk-ZE6A3FYH.mjs +289 -0
  148. package/dist/cli/nextly.mjs +68 -0
  149. package/dist/cli/utils/index.d.ts +449 -0
  150. package/dist/cli/utils/index.mjs +49 -0
  151. package/dist/component-schema-service-5577KVW6.mjs +11 -0
  152. package/dist/config-loader-23YEMC3Z.mjs +23 -0
  153. package/dist/config.d.ts +44 -0
  154. package/dist/config.mjs +109 -0
  155. package/dist/container-ORGFGYSZ.mjs +9 -0
  156. package/dist/database/index.d.ts +12 -0
  157. package/dist/database/index.mjs +40 -0
  158. package/dist/database/seeders/index.d.ts +93 -0
  159. package/dist/database/seeders/index.mjs +47 -0
  160. package/dist/db-sync-demote-LJGKLB3S.mjs +117 -0
  161. package/dist/db-sync-promote-B26VSYQF.mjs +113 -0
  162. package/dist/dev-reload-broadcaster-B73IQ53V.mjs +25 -0
  163. package/dist/dist-M2NOU37V.mjs +19 -0
  164. package/dist/drizzle-kit-lazy-D2M2PXR2.mjs +13 -0
  165. package/dist/dynamic-collection-schema-service-IEXTPIZ7.mjs +8 -0
  166. package/dist/errors/index.d.ts +159 -0
  167. package/dist/errors/index.mjs +10 -0
  168. package/dist/factory-IWMBKUJM.mjs +15 -0
  169. package/dist/first-run-QIVKWJIF.mjs +63 -0
  170. package/dist/fresh-push-NR67DC3R.mjs +8 -0
  171. package/dist/index.d.ts +4175 -0
  172. package/dist/index.mjs +1336 -0
  173. package/dist/local-plugin-PTET4NAT.mjs +7 -0
  174. package/dist/logger-NU46DXNY.mjs +15 -0
  175. package/dist/logger-YE4TC7ZN.mjs +9 -0
  176. package/dist/migration-journal-EP532Y4L.mjs +139 -0
  177. package/dist/migrations/mysql/0000_eager_sentry.sql +174 -0
  178. package/dist/migrations/mysql/0001_soft_giant_girl.sql +27 -0
  179. package/dist/migrations/mysql/0002_media_table.sql +24 -0
  180. package/dist/migrations/mysql/0003_dynamic_singles.sql +37 -0
  181. package/dist/migrations/mysql/0004_dynamic_components.sql +35 -0
  182. package/dist/migrations/mysql/0005_user_management_tables.sql +92 -0
  183. package/dist/migrations/mysql/0006_api_keys.sql +36 -0
  184. package/dist/migrations/mysql/0007_general_settings.sql +20 -0
  185. package/dist/migrations/mysql/0008_site_settings_logo_url.sql +9 -0
  186. package/dist/migrations/mysql/0009_activity_log.sql +30 -0
  187. package/dist/migrations/mysql/0010_site_settings_sidebar.sql +13 -0
  188. package/dist/migrations/mysql/0011_missing_tables_and_columns.sql +54 -0
  189. package/dist/migrations/mysql/0012_image_sizes_and_focal_point.sql +30 -0
  190. package/dist/migrations/mysql/0012_media_folders.sql +43 -0
  191. package/dist/migrations/mysql/0013_user_brute_force_protection.sql +31 -0
  192. package/dist/migrations/mysql/0014_email_template_attachments.sql +12 -0
  193. package/dist/migrations/mysql/0015_media_uploaded_by_nullable.sql +15 -0
  194. package/dist/migrations/mysql/20260429_000000_000_initial_journal.sql +22 -0
  195. package/dist/migrations/mysql/20260501_000000_journal_batch.sql +17 -0
  196. package/dist/migrations/mysql/20260501_000001_audit_log.sql +24 -0
  197. package/dist/migrations/mysql/20260504_000000_nextly_meta.sql +21 -0
  198. package/dist/migrations/mysql/meta/0000_snapshot.json +1005 -0
  199. package/dist/migrations/mysql/meta/0001_snapshot.json +1099 -0
  200. package/dist/migrations/mysql/meta/_journal.json +41 -0
  201. package/dist/migrations/postgresql/0000_misty_king_bedlam.sql +169 -0
  202. package/dist/migrations/postgresql/0001_perpetual_captain_marvel.sql +8 -0
  203. package/dist/migrations/postgresql/0002_sad_spectrum.sql +16 -0
  204. package/dist/migrations/postgresql/0003_hesitant_ultron.sql +17 -0
  205. package/dist/migrations/postgresql/0004_media_table.sql +24 -0
  206. package/dist/migrations/postgresql/0005_media_folders.sql +36 -0
  207. package/dist/migrations/postgresql/0006_dynamic_collections_update.sql +50 -0
  208. package/dist/migrations/postgresql/0007_dynamic_singles.sql +38 -0
  209. package/dist/migrations/postgresql/0008_dynamic_components.sql +37 -0
  210. package/dist/migrations/postgresql/0009_user_management_tables.sql +95 -0
  211. package/dist/migrations/postgresql/0010_api_keys.sql +34 -0
  212. package/dist/migrations/postgresql/0011_general_settings.sql +20 -0
  213. package/dist/migrations/postgresql/0012_site_settings_logo_url.sql +9 -0
  214. package/dist/migrations/postgresql/0013_activity_log.sql +29 -0
  215. package/dist/migrations/postgresql/0014_image_sizes_and_focal_point.sql +33 -0
  216. package/dist/migrations/postgresql/0014_site_settings_sidebar.sql +13 -0
  217. package/dist/migrations/postgresql/0015_user_brute_force_protection.sql +29 -0
  218. package/dist/migrations/postgresql/0016_email_template_attachments.sql +12 -0
  219. package/dist/migrations/postgresql/0017_media_uploaded_by_nullable.sql +15 -0
  220. package/dist/migrations/postgresql/20260429_000000_000_initial_journal.sql +24 -0
  221. package/dist/migrations/postgresql/20260501_000000_journal_batch.sql +17 -0
  222. package/dist/migrations/postgresql/20260501_000001_audit_log.sql +24 -0
  223. package/dist/migrations/postgresql/20260504_000000_nextly_meta.sql +22 -0
  224. package/dist/migrations/postgresql/meta/0000_snapshot.json +1286 -0
  225. package/dist/migrations/postgresql/meta/0001_snapshot.json +1407 -0
  226. package/dist/migrations/postgresql/meta/0002_snapshot.json +1552 -0
  227. package/dist/migrations/postgresql/meta/0003_snapshot.json +1695 -0
  228. package/dist/migrations/postgresql/meta/0010_snapshot.json +2345 -0
  229. package/dist/migrations/postgresql/meta/_journal.json +90 -0
  230. package/dist/migrations/sqlite/0000_api_keys.sql +34 -0
  231. package/dist/migrations/sqlite/0001_general_settings.sql +20 -0
  232. package/dist/migrations/sqlite/0002_site_settings_logo_url.sql +9 -0
  233. package/dist/migrations/sqlite/0003_activity_log.sql +29 -0
  234. package/dist/migrations/sqlite/0004_image_sizes_and_focal_point.sql +29 -0
  235. package/dist/migrations/sqlite/0004_site_settings_sidebar.sql +11 -0
  236. package/dist/migrations/sqlite/0005_user_brute_force_protection.sql +29 -0
  237. package/dist/migrations/sqlite/0006_email_template_attachments.sql +12 -0
  238. package/dist/migrations/sqlite/0007_media_uploaded_by_nullable.sql +111 -0
  239. package/dist/migrations/sqlite/20260429_000000_000_initial_journal.sql +24 -0
  240. package/dist/migrations/sqlite/20260501_000000_journal_batch.sql +19 -0
  241. package/dist/migrations/sqlite/20260501_000001_audit_log.sql +24 -0
  242. package/dist/migrations/sqlite/20260504_000000_nextly_meta.sql +21 -0
  243. package/dist/migrations/sqlite/20260505_000000_user_management_tables.sql +77 -0
  244. package/dist/next.d.ts +57 -0
  245. package/dist/next.mjs +55 -0
  246. package/dist/observability/index.d.ts +87 -0
  247. package/dist/observability/index.mjs +57 -0
  248. package/dist/permissions-3DZZQZMI.mjs +39 -0
  249. package/dist/pipeline-YOML7SWF.mjs +29 -0
  250. package/dist/preview-ZZTR3QGS.mjs +9 -0
  251. package/dist/program-PW6UB2ZC.mjs +5934 -0
  252. package/dist/reconcile-single-tables-7ENVXJGB.mjs +7 -0
  253. package/dist/register-SF6E6FVU.mjs +49 -0
  254. package/dist/reload-config-HWQ4G5MM.mjs +23 -0
  255. package/dist/resolve-single-table-name-JSOMUB3R.mjs +7 -0
  256. package/dist/routeHandler-UNMMJIBM.mjs +77 -0
  257. package/dist/runtime-schema-generator-NRA6A6Z6.mjs +8 -0
  258. package/dist/runtime.d.ts +120 -0
  259. package/dist/runtime.mjs +73 -0
  260. package/dist/schema-hash-FMMG6VPJ.mjs +13 -0
  261. package/dist/schema-registry-EQ36FZDP.mjs +7 -0
  262. package/dist/scripts/load-env.mjs +42 -0
  263. package/dist/storage/index.d.ts +566 -0
  264. package/dist/storage/index.mjs +45 -0
  265. package/dist/super-admin-G5ZK5F4T.mjs +39 -0
  266. package/dist/system-table-service-WGSRVEGT.mjs +17 -0
  267. package/dist/users-7KELGRYJ.mjs +38 -0
  268. package/package.json +308 -9
@@ -0,0 +1,508 @@
1
+ import {
2
+ BaseService
3
+ } from "./chunk-2W3DVD7S.mjs";
4
+
5
+ // src/services/system/system-table-service.ts
6
+ var POSTGRES_SQL = {
7
+ checkTable: `
8
+ SELECT EXISTS (
9
+ SELECT FROM information_schema.tables
10
+ WHERE table_schema = 'public'
11
+ AND table_name = $1
12
+ ) AS exists
13
+ `,
14
+ createDynamicCollections: `
15
+ CREATE TABLE IF NOT EXISTS "dynamic_collections" (
16
+ "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
17
+ "slug" VARCHAR(255) NOT NULL UNIQUE,
18
+ "labels" JSONB NOT NULL,
19
+ "table_name" VARCHAR(255) NOT NULL UNIQUE,
20
+ "description" TEXT,
21
+ "fields" JSONB NOT NULL,
22
+ "timestamps" BOOLEAN NOT NULL DEFAULT true,
23
+ "admin" JSONB,
24
+ "source" VARCHAR(20) NOT NULL DEFAULT 'ui',
25
+ "locked" BOOLEAN NOT NULL DEFAULT false,
26
+ "config_path" VARCHAR(500),
27
+ "schema_hash" VARCHAR(64) NOT NULL,
28
+ "schema_version" INTEGER NOT NULL DEFAULT 1,
29
+ "migration_status" VARCHAR(20) NOT NULL DEFAULT 'pending',
30
+ "last_migration_id" UUID,
31
+ "created_by" UUID,
32
+ "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
33
+ "updated_at" TIMESTAMP NOT NULL DEFAULT NOW()
34
+ );
35
+
36
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_source_idx" ON "dynamic_collections" ("source");
37
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_migration_status_idx" ON "dynamic_collections" ("migration_status");
38
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_created_by_idx" ON "dynamic_collections" ("created_by");
39
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_created_at_idx" ON "dynamic_collections" ("created_at");
40
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_updated_at_idx" ON "dynamic_collections" ("updated_at");
41
+ `,
42
+ createNextlyMigrations: `
43
+ CREATE TABLE IF NOT EXISTS "nextly_migrations" (
44
+ "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
45
+ "name" VARCHAR(255) NOT NULL UNIQUE,
46
+ "batch" INTEGER NOT NULL,
47
+ "checksum" VARCHAR(64) NOT NULL,
48
+ "status" VARCHAR(20) NOT NULL DEFAULT 'pending',
49
+ "error_message" TEXT,
50
+ "executed_at" TIMESTAMP NOT NULL DEFAULT NOW()
51
+ );
52
+
53
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_batch_idx" ON "nextly_migrations" ("batch");
54
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_status_idx" ON "nextly_migrations" ("status");
55
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_executed_at_idx" ON "nextly_migrations" ("executed_at");
56
+ `,
57
+ createDynamicComponents: `
58
+ CREATE TABLE IF NOT EXISTS "dynamic_components" (
59
+ "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
60
+ "slug" VARCHAR(255) NOT NULL UNIQUE,
61
+ "label" VARCHAR(255) NOT NULL,
62
+ "table_name" VARCHAR(255) NOT NULL UNIQUE,
63
+ "description" TEXT,
64
+ "fields" JSONB NOT NULL,
65
+ "admin" JSONB,
66
+ "source" VARCHAR(20) NOT NULL DEFAULT 'ui',
67
+ "locked" BOOLEAN NOT NULL DEFAULT false,
68
+ "config_path" VARCHAR(500),
69
+ "schema_hash" VARCHAR(64) NOT NULL,
70
+ "schema_version" INTEGER NOT NULL DEFAULT 1,
71
+ "migration_status" VARCHAR(20) NOT NULL DEFAULT 'pending',
72
+ "last_migration_id" UUID,
73
+ "created_by" UUID,
74
+ "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
75
+ "updated_at" TIMESTAMP NOT NULL DEFAULT NOW()
76
+ );
77
+
78
+ CREATE INDEX IF NOT EXISTS "dynamic_components_source_idx" ON "dynamic_components" ("source");
79
+ CREATE INDEX IF NOT EXISTS "dynamic_components_migration_status_idx" ON "dynamic_components" ("migration_status");
80
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_by_idx" ON "dynamic_components" ("created_by");
81
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_at_idx" ON "dynamic_components" ("created_at");
82
+ CREATE INDEX IF NOT EXISTS "dynamic_components_updated_at_idx" ON "dynamic_components" ("updated_at");
83
+ `,
84
+ dropDynamicCollections: `
85
+ DROP TABLE IF EXISTS "dynamic_collections" CASCADE;
86
+ `,
87
+ dropDynamicComponents: `
88
+ DROP TABLE IF EXISTS "dynamic_components" CASCADE;
89
+ `,
90
+ dropNextlyMigrations: `
91
+ DROP TABLE IF EXISTS "nextly_migrations" CASCADE;
92
+ `
93
+ };
94
+ var MYSQL_SQL = {
95
+ checkTable: `
96
+ SELECT COUNT(*) AS count
97
+ FROM information_schema.tables
98
+ WHERE table_schema = DATABASE()
99
+ AND table_name = ?
100
+ `,
101
+ createDynamicCollections: `
102
+ CREATE TABLE IF NOT EXISTS \`dynamic_collections\` (
103
+ \`id\` VARCHAR(36) PRIMARY KEY,
104
+ \`slug\` VARCHAR(255) NOT NULL UNIQUE,
105
+ \`labels\` JSON NOT NULL,
106
+ \`table_name\` VARCHAR(255) NOT NULL UNIQUE,
107
+ \`description\` TEXT,
108
+ \`fields\` JSON NOT NULL,
109
+ \`timestamps\` BOOLEAN NOT NULL DEFAULT true,
110
+ \`admin\` JSON,
111
+ \`source\` VARCHAR(20) NOT NULL DEFAULT 'ui',
112
+ \`locked\` BOOLEAN NOT NULL DEFAULT false,
113
+ \`config_path\` VARCHAR(500),
114
+ \`schema_hash\` VARCHAR(64) NOT NULL,
115
+ \`schema_version\` INTEGER NOT NULL DEFAULT 1,
116
+ \`migration_status\` VARCHAR(20) NOT NULL DEFAULT 'pending',
117
+ \`last_migration_id\` VARCHAR(36),
118
+ \`created_by\` VARCHAR(36),
119
+ \`created_at\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
120
+ \`updated_at\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
121
+ INDEX \`dynamic_collections_source_idx\` (\`source\`),
122
+ INDEX \`dynamic_collections_migration_status_idx\` (\`migration_status\`),
123
+ INDEX \`dynamic_collections_created_by_idx\` (\`created_by\`),
124
+ INDEX \`dynamic_collections_created_at_idx\` (\`created_at\`),
125
+ INDEX \`dynamic_collections_updated_at_idx\` (\`updated_at\`)
126
+ );
127
+ `,
128
+ createNextlyMigrations: `
129
+ CREATE TABLE IF NOT EXISTS \`nextly_migrations\` (
130
+ \`id\` VARCHAR(36) PRIMARY KEY,
131
+ \`name\` VARCHAR(255) NOT NULL UNIQUE,
132
+ \`batch\` INTEGER NOT NULL,
133
+ \`checksum\` VARCHAR(64) NOT NULL,
134
+ \`status\` VARCHAR(20) NOT NULL DEFAULT 'pending',
135
+ \`error_message\` TEXT,
136
+ \`executed_at\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
137
+ INDEX \`nextly_migrations_batch_idx\` (\`batch\`),
138
+ INDEX \`nextly_migrations_status_idx\` (\`status\`),
139
+ INDEX \`nextly_migrations_executed_at_idx\` (\`executed_at\`)
140
+ );
141
+ `,
142
+ createDynamicComponents: `
143
+ CREATE TABLE IF NOT EXISTS \`dynamic_components\` (
144
+ \`id\` VARCHAR(36) PRIMARY KEY,
145
+ \`slug\` VARCHAR(255) NOT NULL UNIQUE,
146
+ \`label\` VARCHAR(255) NOT NULL,
147
+ \`table_name\` VARCHAR(255) NOT NULL UNIQUE,
148
+ \`description\` TEXT,
149
+ \`fields\` JSON NOT NULL,
150
+ \`admin\` JSON,
151
+ \`source\` VARCHAR(20) NOT NULL DEFAULT 'ui',
152
+ \`locked\` BOOLEAN NOT NULL DEFAULT false,
153
+ \`config_path\` VARCHAR(500),
154
+ \`schema_hash\` VARCHAR(64) NOT NULL,
155
+ \`schema_version\` INTEGER NOT NULL DEFAULT 1,
156
+ \`migration_status\` VARCHAR(20) NOT NULL DEFAULT 'pending',
157
+ \`last_migration_id\` VARCHAR(36),
158
+ \`created_by\` VARCHAR(36),
159
+ \`created_at\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
160
+ \`updated_at\` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
161
+ INDEX \`dynamic_components_source_idx\` (\`source\`),
162
+ INDEX \`dynamic_components_migration_status_idx\` (\`migration_status\`),
163
+ INDEX \`dynamic_components_created_by_idx\` (\`created_by\`),
164
+ INDEX \`dynamic_components_created_at_idx\` (\`created_at\`),
165
+ INDEX \`dynamic_components_updated_at_idx\` (\`updated_at\`)
166
+ );
167
+ `,
168
+ dropDynamicCollections: `
169
+ DROP TABLE IF EXISTS \`dynamic_collections\`;
170
+ `,
171
+ dropDynamicComponents: `
172
+ DROP TABLE IF EXISTS \`dynamic_components\`;
173
+ `,
174
+ dropNextlyMigrations: `
175
+ DROP TABLE IF EXISTS \`nextly_migrations\`;
176
+ `
177
+ };
178
+ var SQLITE_SQL = {
179
+ checkTable: `
180
+ SELECT COUNT(*) AS count
181
+ FROM sqlite_master
182
+ WHERE type = 'table'
183
+ AND name = ?
184
+ `,
185
+ createDynamicCollections: `
186
+ CREATE TABLE IF NOT EXISTS "dynamic_collections" (
187
+ "id" TEXT PRIMARY KEY,
188
+ "slug" TEXT NOT NULL UNIQUE,
189
+ "labels" TEXT NOT NULL,
190
+ "table_name" TEXT NOT NULL UNIQUE,
191
+ "description" TEXT,
192
+ "fields" TEXT NOT NULL,
193
+ "timestamps" INTEGER NOT NULL DEFAULT 1,
194
+ "admin" TEXT,
195
+ "source" TEXT NOT NULL DEFAULT 'ui',
196
+ "locked" INTEGER NOT NULL DEFAULT 0,
197
+ "config_path" TEXT,
198
+ "schema_hash" TEXT NOT NULL,
199
+ "schema_version" INTEGER NOT NULL DEFAULT 1,
200
+ "migration_status" TEXT NOT NULL DEFAULT 'pending',
201
+ "last_migration_id" TEXT,
202
+ "access_rules" TEXT,
203
+ "hooks" TEXT,
204
+ "created_by" TEXT,
205
+ "created_at" INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
206
+ "updated_at" INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
207
+ );
208
+
209
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_source_idx" ON "dynamic_collections" ("source");
210
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_migration_status_idx" ON "dynamic_collections" ("migration_status");
211
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_created_by_idx" ON "dynamic_collections" ("created_by");
212
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_created_at_idx" ON "dynamic_collections" ("created_at");
213
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_updated_at_idx" ON "dynamic_collections" ("updated_at");
214
+ `,
215
+ createNextlyMigrations: `
216
+ CREATE TABLE IF NOT EXISTS "nextly_migrations" (
217
+ "id" TEXT PRIMARY KEY,
218
+ "name" TEXT NOT NULL UNIQUE,
219
+ "batch" INTEGER NOT NULL,
220
+ "checksum" TEXT NOT NULL,
221
+ "status" TEXT NOT NULL DEFAULT 'pending',
222
+ "error_message" TEXT,
223
+ "executed_at" INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
224
+ );
225
+
226
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_batch_idx" ON "nextly_migrations" ("batch");
227
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_status_idx" ON "nextly_migrations" ("status");
228
+ CREATE INDEX IF NOT EXISTS "nextly_migrations_executed_at_idx" ON "nextly_migrations" ("executed_at");
229
+ `,
230
+ createDynamicComponents: `
231
+ CREATE TABLE IF NOT EXISTS "dynamic_components" (
232
+ "id" TEXT PRIMARY KEY,
233
+ "slug" TEXT NOT NULL UNIQUE,
234
+ "label" TEXT NOT NULL,
235
+ "table_name" TEXT NOT NULL UNIQUE,
236
+ "description" TEXT,
237
+ "fields" TEXT NOT NULL,
238
+ "admin" TEXT,
239
+ "source" TEXT NOT NULL DEFAULT 'ui',
240
+ "locked" INTEGER NOT NULL DEFAULT 0,
241
+ "config_path" TEXT,
242
+ "schema_hash" TEXT NOT NULL,
243
+ "schema_version" INTEGER NOT NULL DEFAULT 1,
244
+ "migration_status" TEXT NOT NULL DEFAULT 'pending',
245
+ "last_migration_id" TEXT,
246
+ "created_by" TEXT,
247
+ "created_at" INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
248
+ "updated_at" INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
249
+ );
250
+
251
+ CREATE INDEX IF NOT EXISTS "dynamic_components_source_idx" ON "dynamic_components" ("source");
252
+ CREATE INDEX IF NOT EXISTS "dynamic_components_migration_status_idx" ON "dynamic_components" ("migration_status");
253
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_by_idx" ON "dynamic_components" ("created_by");
254
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_at_idx" ON "dynamic_components" ("created_at");
255
+ CREATE INDEX IF NOT EXISTS "dynamic_components_updated_at_idx" ON "dynamic_components" ("updated_at");
256
+ `,
257
+ dropDynamicCollections: `
258
+ DROP TABLE IF EXISTS "dynamic_collections";
259
+ `,
260
+ dropDynamicComponents: `
261
+ DROP TABLE IF EXISTS "dynamic_components";
262
+ `,
263
+ dropNextlyMigrations: `
264
+ DROP TABLE IF EXISTS "nextly_migrations";
265
+ `
266
+ };
267
+ var SystemTableService = class extends BaseService {
268
+ constructor(adapter, logger) {
269
+ super(adapter, logger);
270
+ }
271
+ /**
272
+ * Check if system tables exist in the database.
273
+ *
274
+ * @returns Status of each system table
275
+ *
276
+ * @example
277
+ * ```typescript
278
+ * const status = await service.checkSystemTables();
279
+ * console.log('Dynamic Collections:', status.dynamicCollectionsExists);
280
+ * console.log('Nextly Migrations:', status.nextlyMigrationsExists);
281
+ * console.log('All Ready:', status.allReady);
282
+ * ```
283
+ */
284
+ async checkSystemTables() {
285
+ const dynamicCollectionsExists = await this.tableExists(
286
+ "dynamic_collections"
287
+ );
288
+ const dynamicComponentsExists = await this.tableExists("dynamic_components");
289
+ const nextlyMigrationsExists = await this.tableExists("nextly_migrations");
290
+ return {
291
+ dynamicCollectionsExists,
292
+ dynamicComponentsExists,
293
+ nextlyMigrationsExists,
294
+ allReady: dynamicCollectionsExists && dynamicComponentsExists && nextlyMigrationsExists
295
+ };
296
+ }
297
+ /**
298
+ * Ensure system tables exist, creating them if necessary.
299
+ *
300
+ * This method is designed for **development mode** where we want
301
+ * zero-friction setup. For production, use `generateMigrationSQL()`
302
+ * and apply via CLI.
303
+ *
304
+ * @returns Result of initialization
305
+ *
306
+ * @example
307
+ * ```typescript
308
+ * const result = await service.ensureSystemTables();
309
+ * if (result.success) {
310
+ * console.log('Created tables:', result.created);
311
+ * console.log('Existing tables:', result.existing);
312
+ * } else {
313
+ * console.error('Failed:', result.error);
314
+ * }
315
+ * ```
316
+ */
317
+ async ensureSystemTables() {
318
+ const created = [];
319
+ const existing = [];
320
+ try {
321
+ const dcExists = await this.tableExists("dynamic_collections");
322
+ if (dcExists) {
323
+ existing.push("dynamic_collections");
324
+ this.logger.info("System table 'dynamic_collections' already exists");
325
+ } else {
326
+ await this.createDynamicCollectionsTable();
327
+ created.push("dynamic_collections");
328
+ this.logger.info("Created system table 'dynamic_collections'");
329
+ }
330
+ const dcompExists = await this.tableExists("dynamic_components");
331
+ if (dcompExists) {
332
+ existing.push("dynamic_components");
333
+ this.logger.info("System table 'dynamic_components' already exists");
334
+ } else {
335
+ await this.createDynamicComponentsTable();
336
+ created.push("dynamic_components");
337
+ this.logger.info("Created system table 'dynamic_components'");
338
+ }
339
+ const nmExists = await this.tableExists("nextly_migrations");
340
+ if (nmExists) {
341
+ existing.push("nextly_migrations");
342
+ this.logger.info("System table 'nextly_migrations' already exists");
343
+ } else {
344
+ await this.createNextlyMigrationsTable();
345
+ created.push("nextly_migrations");
346
+ this.logger.info("Created system table 'nextly_migrations'");
347
+ }
348
+ return { created, existing, success: true };
349
+ } catch (error) {
350
+ const errorMessage = error instanceof Error ? error.message : String(error);
351
+ this.logger.error("Failed to ensure system tables", {
352
+ error: errorMessage
353
+ });
354
+ return {
355
+ created,
356
+ existing,
357
+ success: false,
358
+ error: errorMessage
359
+ };
360
+ }
361
+ }
362
+ /**
363
+ * Generate migration SQL for system tables.
364
+ *
365
+ * Returns UP and DOWN migration SQL for the current dialect.
366
+ * This is used by CLI commands to generate migration files
367
+ * for production deployments.
368
+ *
369
+ * @returns Migration SQL with UP and DOWN statements
370
+ *
371
+ * @example
372
+ * ```typescript
373
+ * const migration = service.generateMigrationSQL();
374
+ * console.log('Dialect:', migration.dialect);
375
+ * console.log('UP SQL:\n', migration.up);
376
+ * console.log('DOWN SQL:\n', migration.down);
377
+ * ```
378
+ */
379
+ generateMigrationSQL() {
380
+ const sql = this.getSQLTemplates();
381
+ const up = [
382
+ "-- Create dynamic_collections table",
383
+ sql.createDynamicCollections.trim(),
384
+ "",
385
+ "-- Create dynamic_components table",
386
+ sql.createDynamicComponents.trim(),
387
+ "",
388
+ "-- Create nextly_migrations table",
389
+ sql.createNextlyMigrations.trim()
390
+ ].join("\n");
391
+ const down = [
392
+ "-- Drop nextly_migrations table",
393
+ sql.dropNextlyMigrations.trim(),
394
+ "",
395
+ "-- Drop dynamic_components table",
396
+ sql.dropDynamicComponents.trim(),
397
+ "",
398
+ "-- Drop dynamic_collections table",
399
+ sql.dropDynamicCollections.trim()
400
+ ].join("\n");
401
+ return {
402
+ up,
403
+ down,
404
+ dialect: this.dialect
405
+ };
406
+ }
407
+ /**
408
+ * Drop all system tables.
409
+ *
410
+ * **WARNING**: This is a destructive operation that removes all
411
+ * collection metadata and migration history. Use with extreme caution.
412
+ *
413
+ * @returns Result of drop operation
414
+ *
415
+ * @example
416
+ * ```typescript
417
+ * // Only use in development or testing!
418
+ * if (process.env.NODE_ENV === 'development') {
419
+ * await service.dropSystemTables();
420
+ * }
421
+ * ```
422
+ */
423
+ async dropSystemTables() {
424
+ const dropped = [];
425
+ try {
426
+ const sql = this.getSQLTemplates();
427
+ const nmExists = await this.tableExists("nextly_migrations");
428
+ if (nmExists) {
429
+ await this.executeSQL(sql.dropNextlyMigrations);
430
+ dropped.push("nextly_migrations");
431
+ this.logger.info("Dropped system table 'nextly_migrations'");
432
+ }
433
+ const dcompExists = await this.tableExists("dynamic_components");
434
+ if (dcompExists) {
435
+ await this.executeSQL(sql.dropDynamicComponents);
436
+ dropped.push("dynamic_components");
437
+ this.logger.info("Dropped system table 'dynamic_components'");
438
+ }
439
+ const dcExists = await this.tableExists("dynamic_collections");
440
+ if (dcExists) {
441
+ await this.executeSQL(sql.dropDynamicCollections);
442
+ dropped.push("dynamic_collections");
443
+ this.logger.info("Dropped system table 'dynamic_collections'");
444
+ }
445
+ return { created: dropped, existing: [], success: true };
446
+ } catch (error) {
447
+ const errorMessage = error instanceof Error ? error.message : String(error);
448
+ this.logger.error("Failed to drop system tables", {
449
+ error: errorMessage
450
+ });
451
+ return {
452
+ created: dropped,
453
+ existing: [],
454
+ success: false,
455
+ error: errorMessage
456
+ };
457
+ }
458
+ }
459
+ async tableExists(tableName) {
460
+ const sql = this.getSQLTemplates();
461
+ const results = await this.adapter.executeQuery(sql.checkTable.trim(), [tableName]);
462
+ if (results.length === 0) {
463
+ return false;
464
+ }
465
+ const result = results[0];
466
+ if (typeof result.exists === "boolean") {
467
+ return result.exists;
468
+ }
469
+ if (typeof result.count === "number") {
470
+ return result.count > 0;
471
+ }
472
+ return false;
473
+ }
474
+ async createDynamicCollectionsTable() {
475
+ const sql = this.getSQLTemplates();
476
+ await this.executeSQL(sql.createDynamicCollections);
477
+ }
478
+ async createDynamicComponentsTable() {
479
+ const sql = this.getSQLTemplates();
480
+ await this.executeSQL(sql.createDynamicComponents);
481
+ }
482
+ async createNextlyMigrationsTable() {
483
+ const sql = this.getSQLTemplates();
484
+ await this.executeSQL(sql.createNextlyMigrations);
485
+ }
486
+ async executeSQL(sql) {
487
+ const statements = sql.split(";").map((s) => s.trim()).filter((s) => s.length > 0 && !s.startsWith("--"));
488
+ for (const statement of statements) {
489
+ await this.adapter.executeQuery(statement + ";");
490
+ }
491
+ }
492
+ getSQLTemplates() {
493
+ switch (this.dialect) {
494
+ case "postgresql":
495
+ return POSTGRES_SQL;
496
+ case "mysql":
497
+ return MYSQL_SQL;
498
+ case "sqlite":
499
+ return SQLITE_SQL;
500
+ default:
501
+ throw new Error(`Unsupported dialect: ${String(this.dialect)}`);
502
+ }
503
+ }
504
+ };
505
+
506
+ export {
507
+ SystemTableService
508
+ };
@@ -0,0 +1,46 @@
1
+ // src/api/response-shapes.ts
2
+ function jsonResponse(body, init) {
3
+ const headers = new Headers(init?.headers);
4
+ if (!headers.has("content-type")) {
5
+ headers.set("content-type", "application/json");
6
+ }
7
+ return new Response(JSON.stringify(body), {
8
+ status: init?.status ?? 200,
9
+ headers
10
+ });
11
+ }
12
+ function respondList(items, meta, init) {
13
+ return jsonResponse({ items, meta }, init);
14
+ }
15
+ function respondDoc(doc, init) {
16
+ return jsonResponse(doc, init);
17
+ }
18
+ function respondMutation(message, item, init) {
19
+ return jsonResponse({ message, item }, init);
20
+ }
21
+ function respondAction(message, result = {}, init) {
22
+ return jsonResponse({ message, ...result }, init);
23
+ }
24
+ function respondData(result, init) {
25
+ return jsonResponse(result, init);
26
+ }
27
+ function respondCount(total, init) {
28
+ return jsonResponse({ total }, init);
29
+ }
30
+ function respondBulk(message, items, errors, init) {
31
+ return jsonResponse({ message, items, errors }, init);
32
+ }
33
+ function respondBulkUpload(message, items, errors, init) {
34
+ return jsonResponse({ message, items, errors }, init);
35
+ }
36
+
37
+ export {
38
+ respondList,
39
+ respondDoc,
40
+ respondMutation,
41
+ respondAction,
42
+ respondData,
43
+ respondCount,
44
+ respondBulk,
45
+ respondBulkUpload
46
+ };