nextly 0.0.1 → 0.0.2-alpha.1
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,206 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getColumnDescriptor,
|
|
3
|
+
getSystemColumnDescriptors
|
|
4
|
+
} from "./chunk-DNNG377Z.mjs";
|
|
5
|
+
|
|
6
|
+
// src/domains/schema/services/runtime-schema-generator.ts
|
|
7
|
+
import {
|
|
8
|
+
mysqlTable,
|
|
9
|
+
text as mysqlText,
|
|
10
|
+
boolean as mysqlBoolean,
|
|
11
|
+
timestamp as mysqlTimestamp,
|
|
12
|
+
json as mysqlJson,
|
|
13
|
+
varchar as mysqlVarchar,
|
|
14
|
+
double as mysqlDouble,
|
|
15
|
+
int as mysqlInt
|
|
16
|
+
} from "drizzle-orm/mysql-core";
|
|
17
|
+
import {
|
|
18
|
+
pgTable,
|
|
19
|
+
text as pgText,
|
|
20
|
+
boolean as pgBoolean,
|
|
21
|
+
timestamp as pgTimestamp,
|
|
22
|
+
jsonb as pgJsonb,
|
|
23
|
+
doublePrecision as pgDoublePrecision,
|
|
24
|
+
varchar as pgVarchar,
|
|
25
|
+
integer as pgInteger
|
|
26
|
+
} from "drizzle-orm/pg-core";
|
|
27
|
+
import {
|
|
28
|
+
sqliteTable,
|
|
29
|
+
text as sqliteText,
|
|
30
|
+
integer as sqliteInteger,
|
|
31
|
+
real as sqliteReal
|
|
32
|
+
} from "drizzle-orm/sqlite-core";
|
|
33
|
+
function generateRuntimeSchema(tableName, fields, dialect, options = {}) {
|
|
34
|
+
let table;
|
|
35
|
+
switch (dialect) {
|
|
36
|
+
case "postgresql":
|
|
37
|
+
table = generatePostgresSchema(tableName, fields, options);
|
|
38
|
+
break;
|
|
39
|
+
case "mysql":
|
|
40
|
+
table = generateMySQLSchema(tableName, fields, options);
|
|
41
|
+
break;
|
|
42
|
+
case "sqlite":
|
|
43
|
+
table = generateSQLiteSchema(tableName, fields, options);
|
|
44
|
+
break;
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unsupported dialect: ${String(dialect)}`);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
table,
|
|
50
|
+
schemaRecord: { [tableName]: table }
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function generatePostgresSchema(tableName, fields, options) {
|
|
54
|
+
const columns = buildDrizzleColumnRecord(fields, "postgresql", options);
|
|
55
|
+
return pgTable(tableName, columns);
|
|
56
|
+
}
|
|
57
|
+
function generateMySQLSchema(tableName, fields, options) {
|
|
58
|
+
const columns = buildDrizzleColumnRecord(fields, "mysql", options);
|
|
59
|
+
return mysqlTable(tableName, columns);
|
|
60
|
+
}
|
|
61
|
+
function generateSQLiteSchema(tableName, fields, options) {
|
|
62
|
+
const columns = buildDrizzleColumnRecord(fields, "sqlite", options);
|
|
63
|
+
return sqliteTable(tableName, columns);
|
|
64
|
+
}
|
|
65
|
+
function buildDrizzleColumnRecord(fields, dialect, options = {}) {
|
|
66
|
+
const out = {};
|
|
67
|
+
const hasTitleField = fields.some((f) => f.name === "title");
|
|
68
|
+
const hasSlugField = fields.some((f) => f.name === "slug");
|
|
69
|
+
for (const sys of getSystemColumnDescriptors(dialect, {
|
|
70
|
+
hasTitleField,
|
|
71
|
+
hasSlugField,
|
|
72
|
+
hasStatus: options.status === true
|
|
73
|
+
})) {
|
|
74
|
+
out[sys.name] = buildSystemDrizzleColumn(sys, dialect);
|
|
75
|
+
}
|
|
76
|
+
for (const field of fields) {
|
|
77
|
+
const desc = getColumnDescriptor(field, dialect);
|
|
78
|
+
if (!desc) continue;
|
|
79
|
+
out[field.name] = buildUserDrizzleColumn(desc, dialect);
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function buildSystemDrizzleColumn(sys, dialect) {
|
|
84
|
+
if (dialect === "postgresql") {
|
|
85
|
+
if (sys.name === "id") return pgText("id").primaryKey();
|
|
86
|
+
if (sys.name === "created_at") return pgTimestamp("created_at").defaultNow();
|
|
87
|
+
if (sys.name === "updated_at") return pgTimestamp("updated_at").defaultNow();
|
|
88
|
+
if (sys.name === "status") {
|
|
89
|
+
return pgVarchar("status", { length: 20 }).notNull().default("draft");
|
|
90
|
+
}
|
|
91
|
+
return pgText(sys.name).notNull();
|
|
92
|
+
}
|
|
93
|
+
if (dialect === "mysql") {
|
|
94
|
+
if (sys.name === "id") {
|
|
95
|
+
return mysqlVarchar("id", { length: 36 }).primaryKey();
|
|
96
|
+
}
|
|
97
|
+
if (sys.name === "created_at") {
|
|
98
|
+
return mysqlTimestamp("created_at").defaultNow();
|
|
99
|
+
}
|
|
100
|
+
if (sys.name === "updated_at") {
|
|
101
|
+
return mysqlTimestamp("updated_at").defaultNow();
|
|
102
|
+
}
|
|
103
|
+
if (sys.name === "status") {
|
|
104
|
+
return mysqlVarchar("status", { length: 20 }).notNull().default("draft");
|
|
105
|
+
}
|
|
106
|
+
return mysqlVarchar(sys.name, { length: 255 }).notNull();
|
|
107
|
+
}
|
|
108
|
+
if (sys.name === "id") return sqliteText("id").primaryKey();
|
|
109
|
+
if (sys.name === "created_at") {
|
|
110
|
+
return sqliteInteger("created_at", { mode: "timestamp" });
|
|
111
|
+
}
|
|
112
|
+
if (sys.name === "updated_at") {
|
|
113
|
+
return sqliteInteger("updated_at", { mode: "timestamp" });
|
|
114
|
+
}
|
|
115
|
+
if (sys.name === "status") {
|
|
116
|
+
return sqliteText("status").notNull().default("draft");
|
|
117
|
+
}
|
|
118
|
+
return sqliteText(sys.name).notNull();
|
|
119
|
+
}
|
|
120
|
+
function buildUserDrizzleColumn(desc, dialect) {
|
|
121
|
+
if (dialect === "postgresql") {
|
|
122
|
+
return buildPgColumnFromKind(desc.kind, desc.name, desc.nullable);
|
|
123
|
+
}
|
|
124
|
+
if (dialect === "mysql") {
|
|
125
|
+
return buildMysqlColumnFromKind(
|
|
126
|
+
desc.kind,
|
|
127
|
+
desc.name,
|
|
128
|
+
desc.nullable,
|
|
129
|
+
desc.length
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
return buildSqliteColumnFromKind(desc.kind, desc.name, desc.nullable);
|
|
133
|
+
}
|
|
134
|
+
function buildPgColumnFromKind(kind, name, nullable) {
|
|
135
|
+
switch (kind) {
|
|
136
|
+
case "text":
|
|
137
|
+
case "longText":
|
|
138
|
+
case "varchar":
|
|
139
|
+
return nullable ? pgText(name) : pgText(name).notNull();
|
|
140
|
+
case "boolean":
|
|
141
|
+
return nullable ? pgBoolean(name) : pgBoolean(name).notNull();
|
|
142
|
+
case "integer":
|
|
143
|
+
return nullable ? pgInteger(name) : pgInteger(name).notNull();
|
|
144
|
+
case "double":
|
|
145
|
+
return nullable ? pgDoublePrecision(name) : pgDoublePrecision(name).notNull();
|
|
146
|
+
case "timestamp":
|
|
147
|
+
return nullable ? pgTimestamp(name) : pgTimestamp(name).notNull();
|
|
148
|
+
case "json":
|
|
149
|
+
return nullable ? pgJsonb(name) : pgJsonb(name).notNull();
|
|
150
|
+
case "fkSingle":
|
|
151
|
+
return pgText(name);
|
|
152
|
+
case "skip":
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function buildMysqlColumnFromKind(kind, name, nullable, length) {
|
|
157
|
+
switch (kind) {
|
|
158
|
+
case "text":
|
|
159
|
+
case "varchar": {
|
|
160
|
+
const col = mysqlVarchar(name, { length: length ?? 255 });
|
|
161
|
+
return nullable ? col : col.notNull();
|
|
162
|
+
}
|
|
163
|
+
case "longText":
|
|
164
|
+
return nullable ? mysqlText(name) : mysqlText(name).notNull();
|
|
165
|
+
case "boolean":
|
|
166
|
+
return nullable ? mysqlBoolean(name) : mysqlBoolean(name).notNull();
|
|
167
|
+
case "integer":
|
|
168
|
+
return nullable ? mysqlInt(name) : mysqlInt(name).notNull();
|
|
169
|
+
case "double":
|
|
170
|
+
return nullable ? mysqlDouble(name) : mysqlDouble(name).notNull();
|
|
171
|
+
case "timestamp":
|
|
172
|
+
return nullable ? mysqlTimestamp(name) : mysqlTimestamp(name).notNull();
|
|
173
|
+
case "json":
|
|
174
|
+
return nullable ? mysqlJson(name) : mysqlJson(name).notNull();
|
|
175
|
+
case "fkSingle":
|
|
176
|
+
return mysqlVarchar(name, { length: length ?? 36 });
|
|
177
|
+
case "skip":
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function buildSqliteColumnFromKind(kind, name, nullable) {
|
|
182
|
+
switch (kind) {
|
|
183
|
+
case "text":
|
|
184
|
+
case "longText":
|
|
185
|
+
case "varchar":
|
|
186
|
+
return nullable ? sqliteText(name) : sqliteText(name).notNull();
|
|
187
|
+
case "boolean":
|
|
188
|
+
return nullable ? sqliteInteger(name, { mode: "boolean" }) : sqliteInteger(name, { mode: "boolean" }).notNull();
|
|
189
|
+
case "integer":
|
|
190
|
+
return nullable ? sqliteInteger(name) : sqliteInteger(name).notNull();
|
|
191
|
+
case "double":
|
|
192
|
+
return nullable ? sqliteReal(name) : sqliteReal(name).notNull();
|
|
193
|
+
case "timestamp":
|
|
194
|
+
return nullable ? sqliteInteger(name, { mode: "timestamp" }) : sqliteInteger(name, { mode: "timestamp" }).notNull();
|
|
195
|
+
case "json":
|
|
196
|
+
return nullable ? sqliteText(name) : sqliteText(name).notNull();
|
|
197
|
+
case "fkSingle":
|
|
198
|
+
return sqliteText(name);
|
|
199
|
+
case "skip":
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
generateRuntimeSchema
|
|
206
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/domains/schema/pipeline/database-url.ts
|
|
2
|
+
function extractDatabaseNameFromUrl(url) {
|
|
3
|
+
if (!url) return void 0;
|
|
4
|
+
try {
|
|
5
|
+
const parsed = new URL(url);
|
|
6
|
+
const name = parsed.pathname.replace(/^\//, "");
|
|
7
|
+
return name.length > 0 ? name : void 0;
|
|
8
|
+
} catch {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
extractDatabaseNameFromUrl
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/domains/singles/services/reconcile-single-tables.ts
|
|
2
|
+
async function reconcileSingleTables(reconciler) {
|
|
3
|
+
const [registered, existing] = await Promise.all([
|
|
4
|
+
reconciler.registeredSingles(),
|
|
5
|
+
reconciler.existingTableNames()
|
|
6
|
+
]);
|
|
7
|
+
for (const single of registered) {
|
|
8
|
+
if (existing.has(single.tableName)) continue;
|
|
9
|
+
await reconciler.createTable(single);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
reconcileSingleTables
|
|
15
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
container
|
|
3
|
+
} from "./chunk-D5HQBNUB.mjs";
|
|
4
|
+
|
|
5
|
+
// src/shared/lib/logger.ts
|
|
6
|
+
var levelPriority = {
|
|
7
|
+
debug: 10,
|
|
8
|
+
info: 20,
|
|
9
|
+
warn: 30,
|
|
10
|
+
error: 40
|
|
11
|
+
};
|
|
12
|
+
var DB_LOG_ENABLED = false;
|
|
13
|
+
var DB_LOG_LEVEL = "warn";
|
|
14
|
+
function isEnabled(level) {
|
|
15
|
+
if (!DB_LOG_ENABLED) return false;
|
|
16
|
+
if (DB_LOG_LEVEL === "silent") return false;
|
|
17
|
+
if (level === "silent") return false;
|
|
18
|
+
const current = levelPriority[DB_LOG_LEVEL];
|
|
19
|
+
const req = levelPriority[level];
|
|
20
|
+
return req >= current;
|
|
21
|
+
}
|
|
22
|
+
var DefaultDbLogger = class {
|
|
23
|
+
log(level, event) {
|
|
24
|
+
if (!isEnabled(level)) return;
|
|
25
|
+
const timeIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
26
|
+
const payload = { time: timeIso, level, ...event };
|
|
27
|
+
if (level === "error") console.error("[db]", JSON.stringify(payload));
|
|
28
|
+
else if (level === "warn") console.warn("[db]", JSON.stringify(payload));
|
|
29
|
+
else console.log("[db]", JSON.stringify(payload));
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var activeLogger = new DefaultDbLogger();
|
|
33
|
+
function logDbConn(level, event) {
|
|
34
|
+
const full = {
|
|
35
|
+
...event,
|
|
36
|
+
category: "connection"
|
|
37
|
+
};
|
|
38
|
+
activeLogger.log(level, full);
|
|
39
|
+
}
|
|
40
|
+
function nowMs() {
|
|
41
|
+
if (typeof process !== "undefined" && typeof process.hrtime === "function") {
|
|
42
|
+
const ns = process.hrtime.bigint();
|
|
43
|
+
return Number(ns / BigInt(1e6));
|
|
44
|
+
}
|
|
45
|
+
if (typeof performance !== "undefined" && typeof performance.now === "function") {
|
|
46
|
+
return performance.now();
|
|
47
|
+
}
|
|
48
|
+
return Date.now();
|
|
49
|
+
}
|
|
50
|
+
var DefaultAuthLogger = class {
|
|
51
|
+
log(level, event) {
|
|
52
|
+
const timeIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
53
|
+
const payload = { time: timeIso, level, ...event };
|
|
54
|
+
if (level === "error") console.error("[auth]", JSON.stringify(payload));
|
|
55
|
+
else if (level === "warn") console.warn("[auth]", JSON.stringify(payload));
|
|
56
|
+
else console.log("[auth]", JSON.stringify(payload));
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var activeAuthLogger = new DefaultAuthLogger();
|
|
60
|
+
function getAuthLogger() {
|
|
61
|
+
return activeAuthLogger;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/database/health.ts
|
|
65
|
+
async function healthCheck() {
|
|
66
|
+
const started = nowMs();
|
|
67
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
68
|
+
try {
|
|
69
|
+
const adapter = container.get("adapter");
|
|
70
|
+
const dialect = adapter.getCapabilities().dialect;
|
|
71
|
+
await adapter.executeQuery("SELECT 1");
|
|
72
|
+
const latencyMs = nowMs() - started;
|
|
73
|
+
logDbConn("info", { op: "health-ok", dialect, durationMs: latencyMs });
|
|
74
|
+
return {
|
|
75
|
+
ok: true,
|
|
76
|
+
timestamp,
|
|
77
|
+
database: { connected: true, dialect, latencyMs }
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const latencyMs = nowMs() - started;
|
|
81
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown database error";
|
|
82
|
+
logDbConn("error", {
|
|
83
|
+
op: "health-fail",
|
|
84
|
+
dialect: "unknown",
|
|
85
|
+
durationMs: latencyMs,
|
|
86
|
+
errorMessage
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
timestamp,
|
|
91
|
+
database: { connected: false, dialect: "unknown", latencyMs },
|
|
92
|
+
error: errorMessage
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export {
|
|
98
|
+
getAuthLogger,
|
|
99
|
+
healthCheck
|
|
100
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isErrorResponse,
|
|
3
|
+
requireAuthentication,
|
|
4
|
+
toNextlyAuthError
|
|
5
|
+
} from "./chunk-2Q2SX2CS.mjs";
|
|
6
|
+
import {
|
|
7
|
+
nextlyValidationFromZod
|
|
8
|
+
} from "./chunk-GJNSJU4S.mjs";
|
|
9
|
+
import {
|
|
10
|
+
withErrorHandler
|
|
11
|
+
} from "./chunk-TO5AFLVQ.mjs";
|
|
12
|
+
import {
|
|
13
|
+
getCachedNextly
|
|
14
|
+
} from "./chunk-P7NH2OSC.mjs";
|
|
15
|
+
import {
|
|
16
|
+
respondAction
|
|
17
|
+
} from "./chunk-IUDOC7N7.mjs";
|
|
18
|
+
import {
|
|
19
|
+
container
|
|
20
|
+
} from "./chunk-D5HQBNUB.mjs";
|
|
21
|
+
import {
|
|
22
|
+
NextlyError
|
|
23
|
+
} from "./chunk-NRUWQ5Z7.mjs";
|
|
24
|
+
|
|
25
|
+
// src/api/email-send-template.ts
|
|
26
|
+
import { z } from "zod";
|
|
27
|
+
async function getEmailService() {
|
|
28
|
+
await getCachedNextly();
|
|
29
|
+
return container.get("emailService");
|
|
30
|
+
}
|
|
31
|
+
var attachmentInputSchema = z.object({
|
|
32
|
+
mediaId: z.string().min(1, "mediaId is required"),
|
|
33
|
+
filename: z.string().min(1).optional()
|
|
34
|
+
});
|
|
35
|
+
var sendTemplateSchema = z.object({
|
|
36
|
+
to: z.string().email("A valid recipient email is required"),
|
|
37
|
+
template: z.string().min(1, "template slug is required"),
|
|
38
|
+
variables: z.record(z.string(), z.unknown()).optional(),
|
|
39
|
+
cc: z.array(z.string().email()).optional(),
|
|
40
|
+
bcc: z.array(z.string().email()).optional(),
|
|
41
|
+
providerId: z.string().optional(),
|
|
42
|
+
attachments: z.array(attachmentInputSchema).optional()
|
|
43
|
+
});
|
|
44
|
+
var POST = withErrorHandler(
|
|
45
|
+
async (request) => {
|
|
46
|
+
const authResult = await requireAuthentication(request);
|
|
47
|
+
if (isErrorResponse(authResult)) throw toNextlyAuthError(authResult);
|
|
48
|
+
let raw;
|
|
49
|
+
try {
|
|
50
|
+
raw = await request.json();
|
|
51
|
+
} catch {
|
|
52
|
+
throw new NextlyError({
|
|
53
|
+
code: "VALIDATION_ERROR",
|
|
54
|
+
publicMessage: "Validation failed.",
|
|
55
|
+
publicData: {
|
|
56
|
+
errors: [
|
|
57
|
+
{
|
|
58
|
+
path: "",
|
|
59
|
+
code: "invalid_json",
|
|
60
|
+
message: "Request body is not valid JSON."
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
logContext: { reason: "invalid-json-body" }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
let args;
|
|
68
|
+
try {
|
|
69
|
+
args = sendTemplateSchema.parse(raw);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
if (err instanceof z.ZodError) throw nextlyValidationFromZod(err);
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
const service = await getEmailService();
|
|
75
|
+
const result = await service.sendWithTemplate(
|
|
76
|
+
args.template,
|
|
77
|
+
args.to,
|
|
78
|
+
args.variables ?? {},
|
|
79
|
+
{
|
|
80
|
+
providerId: args.providerId,
|
|
81
|
+
cc: args.cc,
|
|
82
|
+
bcc: args.bcc,
|
|
83
|
+
attachments: args.attachments
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
return respondAction("Email queued.", {
|
|
87
|
+
...result,
|
|
88
|
+
templateId: args.template
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
export {
|
|
94
|
+
POST
|
|
95
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// src/cli/utils/adapter.ts
|
|
2
|
+
function detectDialectFromUrl(url) {
|
|
3
|
+
if (url.startsWith("postgresql://") || url.startsWith("postgres://")) {
|
|
4
|
+
return "postgresql";
|
|
5
|
+
}
|
|
6
|
+
if (url.startsWith("mysql://")) {
|
|
7
|
+
return "mysql";
|
|
8
|
+
}
|
|
9
|
+
if (url.startsWith("file:") || url.endsWith(".db") || url.endsWith(".sqlite") || url.endsWith(".sqlite3")) {
|
|
10
|
+
return "sqlite";
|
|
11
|
+
}
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
function validateDatabaseEnv() {
|
|
15
|
+
const errors = [];
|
|
16
|
+
const databaseUrl = process.env.DATABASE_URL;
|
|
17
|
+
const dialectEnv = process.env.DB_DIALECT;
|
|
18
|
+
if (!databaseUrl) {
|
|
19
|
+
errors.push("DATABASE_URL environment variable is required");
|
|
20
|
+
}
|
|
21
|
+
let dialect = dialectEnv;
|
|
22
|
+
if (!dialect && databaseUrl) {
|
|
23
|
+
dialect = detectDialectFromUrl(databaseUrl);
|
|
24
|
+
}
|
|
25
|
+
if (!dialect) {
|
|
26
|
+
errors.push(
|
|
27
|
+
"Could not detect database dialect. Set DB_DIALECT to one of: postgresql, mysql, sqlite"
|
|
28
|
+
);
|
|
29
|
+
} else if (!["postgresql", "mysql", "sqlite"].includes(dialect)) {
|
|
30
|
+
errors.push(
|
|
31
|
+
`Invalid DB_DIALECT: ${dialect}. Must be one of: postgresql, mysql, sqlite`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
valid: errors.length === 0,
|
|
36
|
+
errors,
|
|
37
|
+
dialect: errors.length === 0 ? dialect : void 0,
|
|
38
|
+
databaseUrl: errors.length === 0 ? databaseUrl : void 0
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function createAdapter(options = {}) {
|
|
42
|
+
const { logger } = options;
|
|
43
|
+
const databaseUrl = options.databaseUrl ?? process.env.DATABASE_URL;
|
|
44
|
+
let dialect = options.dialect;
|
|
45
|
+
if (!dialect && databaseUrl) {
|
|
46
|
+
dialect = detectDialectFromUrl(databaseUrl);
|
|
47
|
+
}
|
|
48
|
+
if (!dialect) {
|
|
49
|
+
dialect = process.env.DB_DIALECT;
|
|
50
|
+
}
|
|
51
|
+
if (!databaseUrl) {
|
|
52
|
+
throw new Error("DATABASE_URL is required");
|
|
53
|
+
}
|
|
54
|
+
if (!dialect) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
"Could not detect database dialect. Set DB_DIALECT environment variable."
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
logger?.debug(`Creating ${dialect} adapter...`);
|
|
60
|
+
const { createAdapterFromEnv } = await import("./factory-IWMBKUJM.mjs");
|
|
61
|
+
const originalDialect = process.env.DB_DIALECT;
|
|
62
|
+
const originalUrl = process.env.DATABASE_URL;
|
|
63
|
+
try {
|
|
64
|
+
process.env.DB_DIALECT = dialect;
|
|
65
|
+
process.env.DATABASE_URL = databaseUrl;
|
|
66
|
+
const adapter = await createAdapterFromEnv();
|
|
67
|
+
return adapter;
|
|
68
|
+
} finally {
|
|
69
|
+
if (originalDialect !== void 0) {
|
|
70
|
+
process.env.DB_DIALECT = originalDialect;
|
|
71
|
+
}
|
|
72
|
+
if (originalUrl !== void 0) {
|
|
73
|
+
process.env.DATABASE_URL = originalUrl;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function withAdapter(fn, options = {}) {
|
|
78
|
+
const adapter = await createAdapter(options);
|
|
79
|
+
try {
|
|
80
|
+
return await fn(adapter);
|
|
81
|
+
} finally {
|
|
82
|
+
await adapter.disconnect();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getDialectDisplayName(dialect) {
|
|
86
|
+
switch (dialect) {
|
|
87
|
+
case "postgresql":
|
|
88
|
+
return "PostgreSQL";
|
|
89
|
+
case "mysql":
|
|
90
|
+
return "MySQL";
|
|
91
|
+
case "sqlite":
|
|
92
|
+
return "SQLite";
|
|
93
|
+
default:
|
|
94
|
+
return dialect;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function dialectSupports(dialect, feature) {
|
|
98
|
+
switch (feature) {
|
|
99
|
+
case "transactions":
|
|
100
|
+
return true;
|
|
101
|
+
case "jsonb":
|
|
102
|
+
return dialect === "postgresql";
|
|
103
|
+
case "arrays":
|
|
104
|
+
return dialect === "postgresql";
|
|
105
|
+
case "uuids":
|
|
106
|
+
return dialect === "postgresql";
|
|
107
|
+
default:
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
detectDialectFromUrl,
|
|
114
|
+
validateDatabaseEnv,
|
|
115
|
+
createAdapter,
|
|
116
|
+
withAdapter,
|
|
117
|
+
getDialectDisplayName,
|
|
118
|
+
dialectSupports
|
|
119
|
+
};
|