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.
- package/LICENSE +22 -0
- package/README.md +122 -0
- package/dist/_dts-chunks/collections-handler.d-DjgO74Wt.d.ts +20540 -0
- package/dist/_dts-chunks/config.d-DNwsDnjs.d.ts +2589 -0
- package/dist/_dts-chunks/define-component.d-BUgTHmt3.d.ts +1149 -0
- package/dist/_dts-chunks/image-processor.d-OO1PmMrv.d.ts +335 -0
- package/dist/_dts-chunks/index.d-axCAzZ7m.d.ts +17842 -0
- package/dist/_dts-chunks/media.d-DjDOZo4B.d.ts +117 -0
- package/dist/_dts-chunks/on-error.d-CHIKWNxd.d.ts +38 -0
- package/dist/_dts-chunks/storage.d-BUhQ2we_.d.ts +404 -0
- package/dist/actions/index.d.ts +239 -0
- package/dist/actions/index.mjs +281 -0
- package/dist/api/auth-state.d.ts +5 -0
- package/dist/api/auth-state.mjs +131 -0
- package/dist/api/collections-schema-detail.d.ts +56 -0
- package/dist/api/collections-schema-detail.mjs +244 -0
- package/dist/api/collections-schema-export.d.ts +56 -0
- package/dist/api/collections-schema-export.mjs +129 -0
- package/dist/api/collections-schema.d.ts +59 -0
- package/dist/api/collections-schema.mjs +207 -0
- package/dist/api/components-detail.d.ts +50 -0
- package/dist/api/components-detail.mjs +132 -0
- package/dist/api/components.d.ts +69 -0
- package/dist/api/components.mjs +144 -0
- package/dist/api/email-providers-default.d.ts +40 -0
- package/dist/api/email-providers-default.mjs +75 -0
- package/dist/api/email-providers-detail.d.ts +81 -0
- package/dist/api/email-providers-detail.mjs +109 -0
- package/dist/api/email-providers-test.d.ts +43 -0
- package/dist/api/email-providers-test.mjs +114 -0
- package/dist/api/email-providers.d.ts +69 -0
- package/dist/api/email-providers.mjs +110 -0
- package/dist/api/email-send-template.d.ts +41 -0
- package/dist/api/email-send-template.mjs +58 -0
- package/dist/api/email-send.d.ts +42 -0
- package/dist/api/email-send.mjs +58 -0
- package/dist/api/email-templates-detail.d.ts +74 -0
- package/dist/api/email-templates-detail.mjs +112 -0
- package/dist/api/email-templates-layout.d.ts +55 -0
- package/dist/api/email-templates-layout.mjs +92 -0
- package/dist/api/email-templates-preview.d.ts +48 -0
- package/dist/api/email-templates-preview.mjs +93 -0
- package/dist/api/email-templates.d.ts +61 -0
- package/dist/api/email-templates.mjs +118 -0
- package/dist/api/health.d.ts +68 -0
- package/dist/api/health.mjs +67 -0
- package/dist/api/index.d.ts +54 -0
- package/dist/api/index.mjs +16 -0
- package/dist/api/media-bulk.d.ts +74 -0
- package/dist/api/media-bulk.mjs +196 -0
- package/dist/api/media-folders.d.ts +112 -0
- package/dist/api/media-folders.mjs +187 -0
- package/dist/api/media-handlers.d.ts +102 -0
- package/dist/api/media-handlers.mjs +437 -0
- package/dist/api/media.d.ts +117 -0
- package/dist/api/media.mjs +242 -0
- package/dist/api/singles-detail.d.ts +87 -0
- package/dist/api/singles-detail.mjs +170 -0
- package/dist/api/singles-schema-detail.d.ts +54 -0
- package/dist/api/singles-schema-detail.mjs +182 -0
- package/dist/api/singles.d.ts +34 -0
- package/dist/api/singles.mjs +94 -0
- package/dist/api/storage-upload-url.d.ts +48 -0
- package/dist/api/storage-upload-url.mjs +202 -0
- package/dist/api/uploads.d.ts +109 -0
- package/dist/api/uploads.mjs +359 -0
- package/dist/auth/index.d.ts +425 -0
- package/dist/auth/index.mjs +199 -0
- package/dist/boot-apply-PQSYLDIN.mjs +7 -0
- package/dist/chunk-2OALJTK6.mjs +489 -0
- package/dist/chunk-2Q2SX2CS.mjs +365 -0
- package/dist/chunk-2TFX4ND3.mjs +13 -0
- package/dist/chunk-2TWPDSYD.mjs +87 -0
- package/dist/chunk-2W3DVD7S.mjs +647 -0
- package/dist/chunk-2ZFKXPQM.mjs +88 -0
- package/dist/chunk-3FA7FKAV.mjs +832 -0
- package/dist/chunk-3NZ2KMBL.mjs +58 -0
- package/dist/chunk-4MJLT6PZ.mjs +0 -0
- package/dist/chunk-56WO4WX7.mjs +0 -0
- package/dist/chunk-5APFUGAD.mjs +89 -0
- package/dist/chunk-5HMZ644B.mjs +108 -0
- package/dist/chunk-67GXH6PR.mjs +32 -0
- package/dist/chunk-6JNEPWRW.mjs +14368 -0
- package/dist/chunk-6NFHQIJD.mjs +45 -0
- package/dist/chunk-7P6ASYW6.mjs +9 -0
- package/dist/chunk-A3WPLSDT.mjs +1364 -0
- package/dist/chunk-AGJ6F2T3.mjs +144 -0
- package/dist/chunk-AK6Z23OX.mjs +1464 -0
- package/dist/chunk-APKKRD2G.mjs +102 -0
- package/dist/chunk-B2GV2BWH.mjs +73 -0
- package/dist/chunk-D5HQBNUB.mjs +74 -0
- package/dist/chunk-DNNG377Z.mjs +204 -0
- package/dist/chunk-DP3G27G5.mjs +135 -0
- package/dist/chunk-DV6WVX2Q.mjs +0 -0
- package/dist/chunk-DXGGXIUZ.mjs +57 -0
- package/dist/chunk-EGXBZCGC.mjs +943 -0
- package/dist/chunk-ERCNLX3V.mjs +176 -0
- package/dist/chunk-FQULBZ53.mjs +850 -0
- package/dist/chunk-G2AA4QLC.mjs +262 -0
- package/dist/chunk-GDBJ5JCU.mjs +488 -0
- package/dist/chunk-GJNSJU4S.mjs +19 -0
- package/dist/chunk-GZ6DCQKC.mjs +69 -0
- package/dist/chunk-H26B4FYG.mjs +167 -0
- package/dist/chunk-I4JMR3UR.mjs +21 -0
- package/dist/chunk-INV7QKLG.mjs +508 -0
- package/dist/chunk-IUDOC7N7.mjs +46 -0
- package/dist/chunk-IZWPRDC3.mjs +206 -0
- package/dist/chunk-KIMNCZGV.mjs +15 -0
- package/dist/chunk-L6HW2DA7.mjs +15 -0
- package/dist/chunk-LAZXX4HR.mjs +100 -0
- package/dist/chunk-LDKCUMHK.mjs +95 -0
- package/dist/chunk-LRXMECUA.mjs +0 -0
- package/dist/chunk-M52VMPGA.mjs +119 -0
- package/dist/chunk-MGUWEEI6.mjs +160 -0
- package/dist/chunk-NRUWQ5Z7.mjs +419 -0
- package/dist/chunk-NSEFNNU4.mjs +25360 -0
- package/dist/chunk-NTHVDFGO.mjs +138 -0
- package/dist/chunk-O3QHXMOX.mjs +3166 -0
- package/dist/chunk-P7NH2OSC.mjs +2605 -0
- package/dist/chunk-PKMABBB5.mjs +184 -0
- package/dist/chunk-PWS6XGJK.mjs +76 -0
- package/dist/chunk-R6JJQHFC.mjs +20 -0
- package/dist/chunk-RJLLGGPG.mjs +0 -0
- package/dist/chunk-SBACDPNX.mjs +689 -0
- package/dist/chunk-TO5AFLVQ.mjs +124 -0
- package/dist/chunk-TS7GHTG2.mjs +5436 -0
- package/dist/chunk-UJ2IMJ4W.mjs +133 -0
- package/dist/chunk-UOP63Q54.mjs +102 -0
- package/dist/chunk-UUOFWCM6.mjs +78 -0
- package/dist/chunk-V4EQTOA4.mjs +893 -0
- package/dist/chunk-VJ66NCL4.mjs +193 -0
- package/dist/chunk-VQJQHVEV.mjs +29 -0
- package/dist/chunk-VTJADRO3.mjs +141 -0
- package/dist/chunk-VWF3JO32.mjs +0 -0
- package/dist/chunk-W4MGXIRR.mjs +27 -0
- package/dist/chunk-W5KKPZT5.mjs +1204 -0
- package/dist/chunk-WD34YQ6T.mjs +381 -0
- package/dist/chunk-WZBYMYVW.mjs +14 -0
- package/dist/chunk-X23WKS3Z.mjs +50 -0
- package/dist/chunk-X7TXCYYN.mjs +6496 -0
- package/dist/chunk-XGI4EMS3.mjs +140 -0
- package/dist/chunk-XZKLBMN6.mjs +1153 -0
- package/dist/chunk-YB7INWPY.mjs +0 -0
- package/dist/chunk-YV4Y7SDL.mjs +83 -0
- package/dist/chunk-YZNBLFIW.mjs +1688 -0
- package/dist/chunk-YZZCTONM.mjs +263 -0
- package/dist/chunk-ZE6A3FYH.mjs +289 -0
- package/dist/cli/nextly.mjs +68 -0
- package/dist/cli/utils/index.d.ts +449 -0
- package/dist/cli/utils/index.mjs +49 -0
- package/dist/component-schema-service-5577KVW6.mjs +11 -0
- package/dist/config-loader-23YEMC3Z.mjs +23 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.mjs +109 -0
- package/dist/container-ORGFGYSZ.mjs +9 -0
- package/dist/database/index.d.ts +12 -0
- package/dist/database/index.mjs +40 -0
- package/dist/database/seeders/index.d.ts +93 -0
- package/dist/database/seeders/index.mjs +47 -0
- package/dist/db-sync-demote-LJGKLB3S.mjs +117 -0
- package/dist/db-sync-promote-B26VSYQF.mjs +113 -0
- package/dist/dev-reload-broadcaster-B73IQ53V.mjs +25 -0
- package/dist/dist-M2NOU37V.mjs +19 -0
- package/dist/drizzle-kit-lazy-D2M2PXR2.mjs +13 -0
- package/dist/dynamic-collection-schema-service-IEXTPIZ7.mjs +8 -0
- package/dist/errors/index.d.ts +159 -0
- package/dist/errors/index.mjs +10 -0
- package/dist/factory-IWMBKUJM.mjs +15 -0
- package/dist/first-run-QIVKWJIF.mjs +63 -0
- package/dist/fresh-push-NR67DC3R.mjs +8 -0
- package/dist/index.d.ts +4175 -0
- package/dist/index.mjs +1336 -0
- package/dist/local-plugin-PTET4NAT.mjs +7 -0
- package/dist/logger-NU46DXNY.mjs +15 -0
- package/dist/logger-YE4TC7ZN.mjs +9 -0
- package/dist/migration-journal-EP532Y4L.mjs +139 -0
- package/dist/migrations/mysql/0000_eager_sentry.sql +174 -0
- package/dist/migrations/mysql/0001_soft_giant_girl.sql +27 -0
- package/dist/migrations/mysql/0002_media_table.sql +24 -0
- package/dist/migrations/mysql/0003_dynamic_singles.sql +37 -0
- package/dist/migrations/mysql/0004_dynamic_components.sql +35 -0
- package/dist/migrations/mysql/0005_user_management_tables.sql +92 -0
- package/dist/migrations/mysql/0006_api_keys.sql +36 -0
- package/dist/migrations/mysql/0007_general_settings.sql +20 -0
- package/dist/migrations/mysql/0008_site_settings_logo_url.sql +9 -0
- package/dist/migrations/mysql/0009_activity_log.sql +30 -0
- package/dist/migrations/mysql/0010_site_settings_sidebar.sql +13 -0
- package/dist/migrations/mysql/0011_missing_tables_and_columns.sql +54 -0
- package/dist/migrations/mysql/0012_image_sizes_and_focal_point.sql +30 -0
- package/dist/migrations/mysql/0012_media_folders.sql +43 -0
- package/dist/migrations/mysql/0013_user_brute_force_protection.sql +31 -0
- package/dist/migrations/mysql/0014_email_template_attachments.sql +12 -0
- package/dist/migrations/mysql/0015_media_uploaded_by_nullable.sql +15 -0
- package/dist/migrations/mysql/20260429_000000_000_initial_journal.sql +22 -0
- package/dist/migrations/mysql/20260501_000000_journal_batch.sql +17 -0
- package/dist/migrations/mysql/20260501_000001_audit_log.sql +24 -0
- package/dist/migrations/mysql/20260504_000000_nextly_meta.sql +21 -0
- package/dist/migrations/mysql/meta/0000_snapshot.json +1005 -0
- package/dist/migrations/mysql/meta/0001_snapshot.json +1099 -0
- package/dist/migrations/mysql/meta/_journal.json +41 -0
- package/dist/migrations/postgresql/0000_misty_king_bedlam.sql +169 -0
- package/dist/migrations/postgresql/0001_perpetual_captain_marvel.sql +8 -0
- package/dist/migrations/postgresql/0002_sad_spectrum.sql +16 -0
- package/dist/migrations/postgresql/0003_hesitant_ultron.sql +17 -0
- package/dist/migrations/postgresql/0004_media_table.sql +24 -0
- package/dist/migrations/postgresql/0005_media_folders.sql +36 -0
- package/dist/migrations/postgresql/0006_dynamic_collections_update.sql +50 -0
- package/dist/migrations/postgresql/0007_dynamic_singles.sql +38 -0
- package/dist/migrations/postgresql/0008_dynamic_components.sql +37 -0
- package/dist/migrations/postgresql/0009_user_management_tables.sql +95 -0
- package/dist/migrations/postgresql/0010_api_keys.sql +34 -0
- package/dist/migrations/postgresql/0011_general_settings.sql +20 -0
- package/dist/migrations/postgresql/0012_site_settings_logo_url.sql +9 -0
- package/dist/migrations/postgresql/0013_activity_log.sql +29 -0
- package/dist/migrations/postgresql/0014_image_sizes_and_focal_point.sql +33 -0
- package/dist/migrations/postgresql/0014_site_settings_sidebar.sql +13 -0
- package/dist/migrations/postgresql/0015_user_brute_force_protection.sql +29 -0
- package/dist/migrations/postgresql/0016_email_template_attachments.sql +12 -0
- package/dist/migrations/postgresql/0017_media_uploaded_by_nullable.sql +15 -0
- package/dist/migrations/postgresql/20260429_000000_000_initial_journal.sql +24 -0
- package/dist/migrations/postgresql/20260501_000000_journal_batch.sql +17 -0
- package/dist/migrations/postgresql/20260501_000001_audit_log.sql +24 -0
- package/dist/migrations/postgresql/20260504_000000_nextly_meta.sql +22 -0
- package/dist/migrations/postgresql/meta/0000_snapshot.json +1286 -0
- package/dist/migrations/postgresql/meta/0001_snapshot.json +1407 -0
- package/dist/migrations/postgresql/meta/0002_snapshot.json +1552 -0
- package/dist/migrations/postgresql/meta/0003_snapshot.json +1695 -0
- package/dist/migrations/postgresql/meta/0010_snapshot.json +2345 -0
- package/dist/migrations/postgresql/meta/_journal.json +90 -0
- package/dist/migrations/sqlite/0000_api_keys.sql +34 -0
- package/dist/migrations/sqlite/0001_general_settings.sql +20 -0
- package/dist/migrations/sqlite/0002_site_settings_logo_url.sql +9 -0
- package/dist/migrations/sqlite/0003_activity_log.sql +29 -0
- package/dist/migrations/sqlite/0004_image_sizes_and_focal_point.sql +29 -0
- package/dist/migrations/sqlite/0004_site_settings_sidebar.sql +11 -0
- package/dist/migrations/sqlite/0005_user_brute_force_protection.sql +29 -0
- package/dist/migrations/sqlite/0006_email_template_attachments.sql +12 -0
- package/dist/migrations/sqlite/0007_media_uploaded_by_nullable.sql +111 -0
- package/dist/migrations/sqlite/20260429_000000_000_initial_journal.sql +24 -0
- package/dist/migrations/sqlite/20260501_000000_journal_batch.sql +19 -0
- package/dist/migrations/sqlite/20260501_000001_audit_log.sql +24 -0
- package/dist/migrations/sqlite/20260504_000000_nextly_meta.sql +21 -0
- package/dist/migrations/sqlite/20260505_000000_user_management_tables.sql +77 -0
- package/dist/next.d.ts +57 -0
- package/dist/next.mjs +55 -0
- package/dist/observability/index.d.ts +87 -0
- package/dist/observability/index.mjs +57 -0
- package/dist/permissions-3DZZQZMI.mjs +39 -0
- package/dist/pipeline-YOML7SWF.mjs +29 -0
- package/dist/preview-ZZTR3QGS.mjs +9 -0
- package/dist/program-PW6UB2ZC.mjs +5934 -0
- package/dist/reconcile-single-tables-7ENVXJGB.mjs +7 -0
- package/dist/register-SF6E6FVU.mjs +49 -0
- package/dist/reload-config-HWQ4G5MM.mjs +23 -0
- package/dist/resolve-single-table-name-JSOMUB3R.mjs +7 -0
- package/dist/routeHandler-UNMMJIBM.mjs +77 -0
- package/dist/runtime-schema-generator-NRA6A6Z6.mjs +8 -0
- package/dist/runtime.d.ts +120 -0
- package/dist/runtime.mjs +73 -0
- package/dist/schema-hash-FMMG6VPJ.mjs +13 -0
- package/dist/schema-registry-EQ36FZDP.mjs +7 -0
- package/dist/scripts/load-env.mjs +42 -0
- package/dist/storage/index.d.ts +566 -0
- package/dist/storage/index.mjs +45 -0
- package/dist/super-admin-G5ZK5F4T.mjs +39 -0
- package/dist/system-table-service-WGSRVEGT.mjs +17 -0
- package/dist/users-7KELGRYJ.mjs +38 -0
- 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
|
+
};
|