@hot-updater/server 0.36.7 → 1.0.0-rc.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/dist/adapters/databaseConstraintErrors.cjs +23 -0
- package/dist/adapters/databaseConstraintErrors.mjs +21 -0
- package/dist/adapters/databasePluginUtils.cjs +117 -0
- package/dist/adapters/databasePluginUtils.mjs +106 -0
- package/dist/adapters/drizzle.cjs +53 -176
- package/dist/adapters/drizzle.d.cts +6 -4
- package/dist/adapters/drizzle.d.mts +6 -4
- package/dist/adapters/drizzle.mjs +54 -177
- package/dist/adapters/drizzleCrud.cjs +250 -0
- package/dist/adapters/drizzleCrud.mjs +249 -0
- package/dist/adapters/drizzleLazyDB.cjs +84 -36
- package/dist/adapters/drizzleLazyDB.mjs +84 -36
- package/dist/adapters/drizzleQuery.cjs +68 -0
- package/dist/adapters/drizzleQuery.mjs +67 -0
- package/dist/adapters/kysely.cjs +18 -138
- package/dist/adapters/kysely.d.cts +3 -12
- package/dist/adapters/kysely.d.mts +3 -12
- package/dist/adapters/kysely.mjs +19 -139
- package/dist/adapters/kyselyCrud.cjs +254 -0
- package/dist/adapters/kyselyCrud.mjs +253 -0
- package/dist/adapters/kyselyQuery.cjs +56 -0
- package/dist/adapters/kyselyQuery.mjs +55 -0
- package/dist/adapters/mongodb.cjs +21 -174
- package/dist/adapters/mongodb.d.cts +3 -2
- package/dist/adapters/mongodb.d.mts +3 -2
- package/dist/adapters/mongodb.mjs +21 -174
- package/dist/adapters/mongodbCollections.cjs +36 -0
- package/dist/adapters/mongodbCollections.mjs +30 -0
- package/dist/adapters/mongodbQuery.cjs +77 -0
- package/dist/adapters/mongodbQuery.mjs +70 -0
- package/dist/adapters/mongodbReads.cjs +148 -0
- package/dist/adapters/mongodbReads.mjs +147 -0
- package/dist/adapters/mongodbWrites.cjs +134 -0
- package/dist/adapters/mongodbWrites.mjs +133 -0
- package/dist/adapters/prisma.cjs +205 -180
- package/dist/adapters/prisma.d.cts +3 -3
- package/dist/adapters/prisma.d.mts +3 -3
- package/dist/adapters/prisma.mjs +206 -181
- package/dist/adapters/prismaQuery.cjs +58 -0
- package/dist/adapters/prismaQuery.mjs +56 -0
- package/dist/adapters/prismaRows.cjs +198 -0
- package/dist/adapters/prismaRows.mjs +188 -0
- package/dist/analytics/bounded/activeOverview.cjs +87 -0
- package/dist/analytics/bounded/activeOverview.mjs +85 -0
- package/dist/analytics/bounded/installationSearch.cjs +42 -0
- package/dist/analytics/bounded/installationSearch.mjs +42 -0
- package/dist/analytics/bounded/persistence.cjs +39 -0
- package/dist/analytics/bounded/persistence.mjs +38 -0
- package/dist/analytics/bounded/provider.cjs +170 -0
- package/dist/analytics/bounded/provider.d.cts +7 -0
- package/dist/analytics/bounded/provider.d.mts +7 -0
- package/dist/analytics/bounded/provider.mjs +170 -0
- package/dist/analytics/bounded/scan.cjs +144 -0
- package/dist/analytics/bounded/scan.mjs +138 -0
- package/dist/analytics/domain.d.cts +121 -0
- package/dist/analytics/domain.d.mts +121 -0
- package/dist/analytics/errors.cjs +22 -0
- package/dist/analytics/errors.mjs +20 -0
- package/dist/analytics/eventInput.cjs +111 -0
- package/dist/analytics/eventInput.mjs +111 -0
- package/dist/analytics/persistence.d.cts +6 -0
- package/dist/analytics/persistence.d.mts +6 -0
- package/dist/analytics/queryInput.cjs +58 -0
- package/dist/analytics/queryInput.mjs +55 -0
- package/dist/analytics/routes.cjs +63 -0
- package/dist/analytics/routes.mjs +61 -0
- package/dist/analytics/types.d.cts +17 -0
- package/dist/analytics/types.d.mts +17 -0
- package/dist/apiKeys.cjs +139 -0
- package/dist/apiKeys.d.cts +50 -0
- package/dist/apiKeys.d.mts +50 -0
- package/dist/apiKeys.mjs +133 -0
- package/dist/createHotUpdaterCore.cjs +48 -26
- package/dist/createHotUpdaterCore.d.cts +49 -17
- package/dist/createHotUpdaterCore.d.mts +49 -17
- package/dist/createHotUpdaterCore.mjs +51 -29
- package/dist/db/createBundleDiff.cjs +45 -68
- package/dist/db/createBundleDiff.d.cts +3 -3
- package/dist/db/createBundleDiff.d.mts +3 -3
- package/dist/db/createBundleDiff.mjs +47 -68
- package/dist/db/databasePluginCore.cjs +138 -0
- package/dist/db/databasePluginCore.mjs +137 -0
- package/dist/db/fixedMigrator.cjs +36 -93
- package/dist/db/fixedMigrator.mjs +36 -93
- package/dist/db/fixedMigratorMongo.cjs +319 -0
- package/dist/db/fixedMigratorMongo.mjs +319 -0
- package/dist/db/fixedMigratorShared.cjs +23 -0
- package/dist/db/fixedMigratorShared.mjs +18 -0
- package/dist/db/mongoMigrationExecution.cjs +11 -0
- package/dist/db/mongoMigrationExecution.mjs +11 -0
- package/dist/db/releaseCatalog.cjs +66 -0
- package/dist/db/releaseCatalog.d.cts +17 -0
- package/dist/db/releaseCatalog.d.mts +17 -0
- package/dist/db/releaseCatalog.mjs +64 -0
- package/dist/db/schema/mongodb.cjs +14 -6
- package/dist/db/schema/mongodb.mjs +14 -6
- package/dist/db/schema/registry.cjs +0 -2
- package/dist/db/schema/registry.mjs +1 -2
- package/dist/db/schema/sql.cjs +31 -14
- package/dist/db/schema/sql.mjs +32 -13
- package/dist/db/schema/sqlOperations.cjs +4 -4
- package/dist/db/schema/sqlOperations.mjs +5 -5
- package/dist/db/schemaGenerators.cjs +52 -18
- package/dist/db/schemaGenerators.mjs +52 -18
- package/dist/db/schemaReadiness.cjs +4 -3
- package/dist/db/schemaReadiness.mjs +4 -3
- package/dist/db/sqlMigrationExecution.cjs +67 -0
- package/dist/db/sqlMigrationExecution.mjs +66 -0
- package/dist/db/types.cjs +2 -6
- package/dist/db/types.d.cts +60 -16
- package/dist/db/types.d.mts +60 -16
- package/dist/db/types.mjs +3 -6
- package/dist/db/updateArtifacts.cjs +114 -60
- package/dist/db/updateArtifacts.mjs +117 -62
- package/dist/handler.cjs +108 -282
- package/dist/handler.d.cts +3 -46
- package/dist/handler.d.mts +3 -46
- package/dist/handler.mjs +107 -281
- package/dist/handlerBundleRoutes.cjs +155 -0
- package/dist/handlerBundleRoutes.mjs +155 -0
- package/dist/handlerErrors.cjs +9 -0
- package/dist/handlerErrors.mjs +9 -0
- package/dist/handlerParameters.cjs +39 -0
- package/dist/handlerParameters.mjs +34 -0
- package/dist/handlerReleaseCatalogRoutes.cjs +111 -0
- package/dist/handlerReleaseCatalogRoutes.mjs +110 -0
- package/dist/handlerReleaseManagementRoutes.cjs +125 -0
- package/dist/handlerReleaseManagementRoutes.mjs +124 -0
- package/dist/handlerTypes.d.cts +63 -0
- package/dist/handlerTypes.d.mts +63 -0
- package/dist/handlerVersionRoutes.cjs +10 -0
- package/dist/handlerVersionRoutes.d.cts +4 -0
- package/dist/handlerVersionRoutes.d.mts +4 -0
- package/dist/handlerVersionRoutes.mjs +9 -0
- package/dist/index.cjs +10 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.mts +9 -3
- package/dist/index.mjs +5 -2
- package/dist/node.cjs +19 -12
- package/dist/node.d.cts +15 -10
- package/dist/node.d.mts +15 -10
- package/dist/node.mjs +19 -13
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/schema/dsl.cjs +19 -2
- package/dist/schema/dsl.mjs +17 -3
- package/dist/schema/index.cjs +1 -8
- package/dist/schema/index.mjs +2 -8
- package/dist/schema/types.cjs +3 -1
- package/dist/schema/types.mjs +3 -2
- package/dist/schema/v1_0_0.cjs +364 -0
- package/dist/schema/v1_0_0.mjs +357 -0
- package/dist/storageAccess.cjs +69 -25
- package/dist/storageAccess.mjs +68 -25
- package/dist/types/index.d.cts +4 -3
- package/dist/types/index.d.mts +5 -4
- package/package.json +8 -7
- package/src/adapters/databaseConstraintErrors.ts +25 -0
- package/src/adapters/databasePluginTestDatabase.ts +106 -0
- package/src/adapters/databasePluginUtils.spec.ts +29 -0
- package/src/adapters/databasePluginUtils.ts +214 -0
- package/src/adapters/drizzle.spec.ts +208 -47
- package/src/adapters/drizzle.ts +106 -293
- package/src/adapters/drizzleCrud.ts +419 -0
- package/src/adapters/drizzleLazyDB.ts +206 -100
- package/src/adapters/drizzleQuery.ts +164 -0
- package/src/adapters/kysely.spec.ts +126 -88
- package/src/adapters/kysely.ts +76 -334
- package/src/adapters/kyselyCrud.ts +588 -0
- package/src/adapters/kyselyQuery.ts +128 -0
- package/src/adapters/mongodb.spec.ts +141 -0
- package/src/adapters/mongodb.ts +60 -288
- package/src/adapters/mongodbCollections.ts +62 -0
- package/src/adapters/mongodbQuery.ts +226 -0
- package/src/adapters/mongodbReads.ts +311 -0
- package/src/adapters/mongodbRows.spec.ts +64 -0
- package/src/adapters/mongodbRows.ts +118 -0
- package/src/adapters/mongodbTestClient.ts +342 -0
- package/src/adapters/mongodbTestFilter.ts +166 -0
- package/src/adapters/mongodbWrites.ts +260 -0
- package/src/adapters/prisma.spec.ts +196 -0
- package/src/adapters/prisma.ts +417 -292
- package/src/adapters/prismaQuery.ts +129 -0
- package/src/adapters/prismaRows.spec.ts +98 -0
- package/src/adapters/prismaRows.ts +301 -0
- package/src/adapters/prismaTestClient.ts +396 -0
- package/src/analytics/analytics.integration.spec.ts +144 -0
- package/src/analytics/bounded/activeOverview.spec.ts +189 -0
- package/src/analytics/bounded/activeOverview.ts +148 -0
- package/src/analytics/bounded/installationSearch.spec.ts +130 -0
- package/src/analytics/bounded/installationSearch.ts +69 -0
- package/src/analytics/bounded/persistence.ts +43 -0
- package/src/analytics/bounded/provider.spec.ts +219 -0
- package/src/analytics/bounded/provider.ts +229 -0
- package/src/analytics/bounded/scan.ts +235 -0
- package/src/analytics/domain.ts +139 -0
- package/src/analytics/errors.ts +18 -0
- package/src/analytics/eventInput.ts +168 -0
- package/src/analytics/persistence.ts +10 -0
- package/src/analytics/queryInput.ts +102 -0
- package/src/analytics/routes.ts +123 -0
- package/src/analytics/types.ts +44 -0
- package/src/apiKeys.integration.spec.ts +192 -0
- package/src/apiKeys.spec.ts +162 -0
- package/src/apiKeys.ts +220 -0
- package/src/createHotUpdaterCore.ts +164 -100
- package/src/db/bundleRows.spec.ts +164 -0
- package/src/db/bundleRows.ts +10 -140
- package/src/db/createBundleDiff.spec.ts +172 -127
- package/src/db/createBundleDiff.ts +91 -110
- package/src/db/databasePluginCore.spec.ts +62 -0
- package/src/db/databasePluginCore.testFixtures.ts +76 -0
- package/src/db/databasePluginCore.ts +185 -0
- package/src/db/databasePluginUpdateCheck.bench.ts +107 -0
- package/src/db/fixedMigrator.spec.ts +184 -42
- package/src/db/fixedMigrator.ts +64 -205
- package/src/db/fixedMigratorMongo.spec.ts +192 -0
- package/src/db/fixedMigratorMongo.ts +425 -0
- package/src/db/fixedMigratorShared.ts +36 -0
- package/src/db/hotUpdaterSchema.ts +0 -1
- package/src/db/index.spec.ts +333 -1025
- package/src/db/mongoMigrationExecution.ts +23 -0
- package/src/db/node-sqlite.d.ts +25 -0
- package/src/db/releaseCatalog.ts +148 -0
- package/src/db/schema/mongodb.ts +20 -6
- package/src/db/schema/sql.ts +52 -11
- package/src/db/schema/sqlOperations.ts +5 -4
- package/src/db/schemaGenerators.ts +107 -23
- package/src/db/schemaReadiness.ts +2 -1
- package/src/db/sqlMigrationExecution.spec.ts +65 -0
- package/src/db/sqlMigrationExecution.ts +108 -0
- package/src/db/types.spec.ts +55 -0
- package/src/db/types.ts +129 -65
- package/src/db/updateArtifacts.spec.ts +359 -0
- package/src/db/updateArtifacts.ts +290 -126
- package/src/handler-standalone.integration.spec.ts +401 -364
- package/src/handler.spec.ts +137 -582
- package/src/handler.testFixtures.ts +30 -0
- package/src/handler.ts +218 -616
- package/src/handlerAuth.integration.spec.ts +33 -0
- package/src/handlerBundleRoutes.ts +259 -0
- package/src/handlerErrors.ts +7 -0
- package/src/handlerManagement.spec.ts +262 -0
- package/src/handlerParameters.ts +105 -0
- package/src/handlerReleaseCatalogRoutes.ts +154 -0
- package/src/handlerReleaseManagementRoutes.ts +213 -0
- package/src/handlerTypes.ts +96 -0
- package/src/handlerVersionRoutes.ts +12 -0
- package/src/index.ts +22 -2
- package/src/node.spec.ts +79 -10
- package/src/node.ts +20 -17
- package/src/releaseCatalogRoutes.integration.spec.ts +238 -0
- package/src/runtime.spec.ts +126 -959
- package/src/runtime.testFixtures.ts +71 -0
- package/src/schema/dsl-all-versions.spec.ts +26 -17
- package/src/schema/dsl.ts +41 -2
- package/src/schema/index.ts +3 -9
- package/src/schema/types.ts +9 -3
- package/src/schema/v1_0_0.spec.ts +146 -0
- package/src/schema/v1_0_0.ts +465 -0
- package/src/storageAccess.spec.ts +127 -32
- package/src/storageAccess.ts +106 -55
- package/src/types/index.ts +2 -1
- package/dist/db/bundleRows.cjs +0 -82
- package/dist/db/bundleRows.d.cts +0 -33
- package/dist/db/bundleRows.d.mts +0 -33
- package/dist/db/bundleRows.mjs +0 -79
- package/dist/db/pluginCore.cjs +0 -242
- package/dist/db/pluginCore.mjs +0 -241
- package/dist/db/schema/sqlMigrations.cjs +0 -74
- package/dist/db/schema/sqlMigrations.mjs +0 -73
- package/dist/db/schemaEnhancements.cjs +0 -20
- package/dist/db/schemaEnhancements.mjs +0 -19
- package/dist/route.cjs +0 -7
- package/dist/route.mjs +0 -7
- package/dist/schema/v0_21_0.cjs +0 -38
- package/dist/schema/v0_21_0.mjs +0 -37
- package/dist/schema/v0_29_0.cjs +0 -45
- package/dist/schema/v0_29_0.mjs +0 -44
- package/dist/schema/v0_31_0.cjs +0 -82
- package/dist/schema/v0_31_0.mjs +0 -80
- package/src/db/pluginCore.spec.ts +0 -1095
- package/src/db/pluginCore.ts +0 -475
- package/src/db/pluginUpdateCheck.bench.ts +0 -254
- package/src/db/schema/sqlMigrations.ts +0 -219
- package/src/db/schemaEnhancements.ts +0 -55
- package/src/route.ts +0 -7
- package/src/schema/v0_21_0.ts +0 -52
- package/src/schema/v0_29_0.ts +0 -62
- package/src/schema/v0_31_0.spec.ts +0 -73
- package/src/schema/v0_31_0.ts +0 -120
package/dist/db/schema/sql.cjs
CHANGED
|
@@ -14,19 +14,31 @@ const hotUpdaterCreateTableOperations = require_registry.hotUpdaterDataTables.ma
|
|
|
14
14
|
const getSqlType = (type, provider) => {
|
|
15
15
|
if (provider === "sqlite") {
|
|
16
16
|
if (type === "bool" || type === "integer") return "integer";
|
|
17
|
+
if (type === "float") return "real";
|
|
17
18
|
return "text";
|
|
18
19
|
}
|
|
19
20
|
if (provider === "mysql") {
|
|
20
21
|
if (type === "uuid") return "char(36)";
|
|
21
22
|
if (type === "bool") return "boolean";
|
|
22
23
|
if (type === "integer") return "integer";
|
|
24
|
+
if (type === "float") return "double";
|
|
23
25
|
if (type === "json") return "json";
|
|
26
|
+
if (type === "large-string") return "mediumtext";
|
|
24
27
|
if (type.startsWith("varchar")) return type;
|
|
25
28
|
return "text";
|
|
26
29
|
}
|
|
30
|
+
if (provider === "mssql") {
|
|
31
|
+
if (type === "uuid") return "uniqueidentifier";
|
|
32
|
+
if (type === "bool") return "bit";
|
|
33
|
+
if (type === "integer") return "int";
|
|
34
|
+
if (type === "float") return "float";
|
|
35
|
+
if (type.startsWith("varchar")) return type.replace("varchar", "nvarchar");
|
|
36
|
+
return "nvarchar(max)";
|
|
37
|
+
}
|
|
27
38
|
if (type === "uuid") return "uuid";
|
|
28
39
|
if (type === "bool") return "boolean";
|
|
29
40
|
if (type === "integer") return "integer";
|
|
41
|
+
if (type === "float") return "double precision";
|
|
30
42
|
if (type === "json") return "json";
|
|
31
43
|
if (type.startsWith("varchar")) return type;
|
|
32
44
|
return "text";
|
|
@@ -35,7 +47,7 @@ const sqlStringLiteral = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
|
35
47
|
const sqlDefaultClause = (column, provider) => {
|
|
36
48
|
const value = column.default;
|
|
37
49
|
if (!value) return "";
|
|
38
|
-
if (provider === "mysql" && (column.type === "json" || column.type === "string")) return "";
|
|
50
|
+
if (provider === "mysql" && (column.type === "json" || column.type === "large-string" || column.type === "string")) return "";
|
|
39
51
|
if (value.type === "json") {
|
|
40
52
|
const json = sqlStringLiteral(JSON.stringify(value.value));
|
|
41
53
|
return provider === "postgresql" || provider === "cockroachdb" ? ` default ${json}::json` : ` default ${json}`;
|
|
@@ -46,32 +58,39 @@ const sqlDefaultClause = (column, provider) => {
|
|
|
46
58
|
const sqlColumnName = (table, column, provider) => table.ormName === "private_hot_updater_settings" && column.ormName === "key" && provider === "mysql" ? "`key`" : column.ormName;
|
|
47
59
|
const sqlColumnDefinition = (table, column, provider) => {
|
|
48
60
|
const constraints = [column.primaryKey ? "primary key" : void 0, column.nullable ? void 0 : "not null"].filter(Boolean);
|
|
61
|
+
const collation = column.providerCollations?.[provider];
|
|
62
|
+
const collationClause = collation ? provider === "mysql" ? `character set ${collation === "ascii_bin" ? "ascii" : "utf8mb4"} collate ${collation}` : `collate ${collation}` : void 0;
|
|
49
63
|
return [
|
|
50
64
|
sqlColumnName(table, column, provider),
|
|
51
65
|
getSqlType(column.type, provider),
|
|
66
|
+
collationClause,
|
|
52
67
|
...constraints
|
|
53
|
-
].join(" ") + sqlDefaultClause(column, provider);
|
|
68
|
+
].filter(Boolean).join(" ") + sqlDefaultClause(column, provider);
|
|
54
69
|
};
|
|
55
70
|
const sqlIndexColumn = (table, columnName, provider) => {
|
|
56
71
|
const column = require_registry.getSchemaColumn(table, columnName);
|
|
57
72
|
return provider === "mysql" && column.type === "string" ? `${columnName}(255)` : columnName;
|
|
58
73
|
};
|
|
59
|
-
const createIndexSql = (table, index, provider) => `create index ${index.name} on ${table.ormName}(${index.columns.map((column) => sqlIndexColumn(table, column, provider)).join(", ")})`;
|
|
60
|
-
const createForeignKeySql = (table, foreignKey) => `alter table ${table.ormName} add constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${foreignKey.onUpdate} on delete ${foreignKey.onDelete}`;
|
|
61
|
-
const createCheckSql = (table, check) => `alter table ${table.ormName} add constraint ${check.name} check (${check.expression})`;
|
|
62
|
-
const inlineSqlChecks = (table, provider) => provider === "sqlite" ? (table.checks ?? []).filter((check) => check.sqliteInline).map((check) => `constraint ${check.name} check (${check.expression})`) : [];
|
|
63
|
-
const createTableStatement = (table, provider) => {
|
|
64
|
-
const lines = [
|
|
65
|
-
|
|
74
|
+
const createIndexSql = (table, index, provider) => `create ${index.unique ? "unique " : ""}index ${index.name} on ${table.ormName}(${index.columns.map((column) => sqlIndexColumn(table, column, provider)).join(", ")})`;
|
|
75
|
+
const createForeignKeySql = (table, foreignKey, provider) => `alter table ${table.ormName} add constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${provider === "mssql" && foreignKey.onUpdate === "restrict" ? "no action" : foreignKey.onUpdate} on delete ${provider === "mssql" && foreignKey.onDelete === "restrict" ? "no action" : foreignKey.onDelete}`;
|
|
76
|
+
const createCheckSql = (table, check, provider) => `alter table ${table.ormName} add constraint ${check.name} check (${(provider && check.providerExpressions?.[provider]) ?? check.expression})`;
|
|
77
|
+
const inlineSqlChecks = (table, provider) => provider === "sqlite" ? (table.checks ?? []).filter((check) => check.sqliteInline).map((check) => `constraint ${check.name} check (${check.providerExpressions?.sqlite ?? check.expression})`) : [];
|
|
78
|
+
const createTableStatement = (table, provider, relationMode = "foreign-keys") => {
|
|
79
|
+
const lines = [
|
|
80
|
+
...table.columns.map((column) => sqlColumnDefinition(table, column, provider)),
|
|
81
|
+
...inlineSqlChecks(table, provider),
|
|
82
|
+
...provider === "sqlite" && relationMode === "foreign-keys" ? (table.foreignKeys ?? []).map((foreignKey) => `constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${foreignKey.onUpdate} on delete ${foreignKey.onDelete}`) : []
|
|
83
|
+
];
|
|
84
|
+
return `create table ${table.ormName} (\n${lines.join(",\n")}\n)`;
|
|
66
85
|
};
|
|
67
86
|
const createForeignKeySqlStatements = (provider, relationMode = "foreign-keys") => {
|
|
68
87
|
if (relationMode !== "foreign-keys" || provider === "sqlite") return [];
|
|
69
|
-
return require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => createForeignKeySql(table, foreignKey)));
|
|
88
|
+
return require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => createForeignKeySql(table, foreignKey, provider)));
|
|
70
89
|
};
|
|
71
90
|
const createTableSql = (provider, relationMode = "foreign-keys") => [
|
|
72
|
-
...require_registry.hotUpdaterSchema.tables.map((table) => createTableStatement(table, provider)),
|
|
91
|
+
...require_registry.hotUpdaterSchema.tables.map((table) => createTableStatement(table, provider, relationMode)),
|
|
73
92
|
...require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.indexes ?? []).filter((index) => require_registry.schemaIndexAppliesToProvider(index, provider)).map((index) => createIndexSql(table, index, provider))),
|
|
74
|
-
...provider === "sqlite" ? [] : require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => createCheckSql(table, check))),
|
|
93
|
+
...provider === "sqlite" ? [] : require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => createCheckSql(table, check, provider))),
|
|
75
94
|
...createForeignKeySqlStatements(provider, relationMode)
|
|
76
95
|
];
|
|
77
96
|
//#endregion
|
|
@@ -79,6 +98,4 @@ exports.createCheckSql = createCheckSql;
|
|
|
79
98
|
exports.createForeignKeySql = createForeignKeySql;
|
|
80
99
|
exports.createIndexSql = createIndexSql;
|
|
81
100
|
exports.createTableSql = createTableSql;
|
|
82
|
-
exports.createTableStatement = createTableStatement;
|
|
83
101
|
exports.hotUpdaterCreateTableOperations = hotUpdaterCreateTableOperations;
|
|
84
|
-
exports.sqlColumnDefinition = sqlColumnDefinition;
|
package/dist/db/schema/sql.mjs
CHANGED
|
@@ -14,19 +14,31 @@ const hotUpdaterCreateTableOperations = hotUpdaterDataTables.map((table) => ({
|
|
|
14
14
|
const getSqlType = (type, provider) => {
|
|
15
15
|
if (provider === "sqlite") {
|
|
16
16
|
if (type === "bool" || type === "integer") return "integer";
|
|
17
|
+
if (type === "float") return "real";
|
|
17
18
|
return "text";
|
|
18
19
|
}
|
|
19
20
|
if (provider === "mysql") {
|
|
20
21
|
if (type === "uuid") return "char(36)";
|
|
21
22
|
if (type === "bool") return "boolean";
|
|
22
23
|
if (type === "integer") return "integer";
|
|
24
|
+
if (type === "float") return "double";
|
|
23
25
|
if (type === "json") return "json";
|
|
26
|
+
if (type === "large-string") return "mediumtext";
|
|
24
27
|
if (type.startsWith("varchar")) return type;
|
|
25
28
|
return "text";
|
|
26
29
|
}
|
|
30
|
+
if (provider === "mssql") {
|
|
31
|
+
if (type === "uuid") return "uniqueidentifier";
|
|
32
|
+
if (type === "bool") return "bit";
|
|
33
|
+
if (type === "integer") return "int";
|
|
34
|
+
if (type === "float") return "float";
|
|
35
|
+
if (type.startsWith("varchar")) return type.replace("varchar", "nvarchar");
|
|
36
|
+
return "nvarchar(max)";
|
|
37
|
+
}
|
|
27
38
|
if (type === "uuid") return "uuid";
|
|
28
39
|
if (type === "bool") return "boolean";
|
|
29
40
|
if (type === "integer") return "integer";
|
|
41
|
+
if (type === "float") return "double precision";
|
|
30
42
|
if (type === "json") return "json";
|
|
31
43
|
if (type.startsWith("varchar")) return type;
|
|
32
44
|
return "text";
|
|
@@ -35,7 +47,7 @@ const sqlStringLiteral = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
|
35
47
|
const sqlDefaultClause = (column, provider) => {
|
|
36
48
|
const value = column.default;
|
|
37
49
|
if (!value) return "";
|
|
38
|
-
if (provider === "mysql" && (column.type === "json" || column.type === "string")) return "";
|
|
50
|
+
if (provider === "mysql" && (column.type === "json" || column.type === "large-string" || column.type === "string")) return "";
|
|
39
51
|
if (value.type === "json") {
|
|
40
52
|
const json = sqlStringLiteral(JSON.stringify(value.value));
|
|
41
53
|
return provider === "postgresql" || provider === "cockroachdb" ? ` default ${json}::json` : ` default ${json}`;
|
|
@@ -46,33 +58,40 @@ const sqlDefaultClause = (column, provider) => {
|
|
|
46
58
|
const sqlColumnName = (table, column, provider) => table.ormName === "private_hot_updater_settings" && column.ormName === "key" && provider === "mysql" ? "`key`" : column.ormName;
|
|
47
59
|
const sqlColumnDefinition = (table, column, provider) => {
|
|
48
60
|
const constraints = [column.primaryKey ? "primary key" : void 0, column.nullable ? void 0 : "not null"].filter(Boolean);
|
|
61
|
+
const collation = column.providerCollations?.[provider];
|
|
62
|
+
const collationClause = collation ? provider === "mysql" ? `character set ${collation === "ascii_bin" ? "ascii" : "utf8mb4"} collate ${collation}` : `collate ${collation}` : void 0;
|
|
49
63
|
return [
|
|
50
64
|
sqlColumnName(table, column, provider),
|
|
51
65
|
getSqlType(column.type, provider),
|
|
66
|
+
collationClause,
|
|
52
67
|
...constraints
|
|
53
|
-
].join(" ") + sqlDefaultClause(column, provider);
|
|
68
|
+
].filter(Boolean).join(" ") + sqlDefaultClause(column, provider);
|
|
54
69
|
};
|
|
55
70
|
const sqlIndexColumn = (table, columnName, provider) => {
|
|
56
71
|
const column = getSchemaColumn(table, columnName);
|
|
57
72
|
return provider === "mysql" && column.type === "string" ? `${columnName}(255)` : columnName;
|
|
58
73
|
};
|
|
59
|
-
const createIndexSql = (table, index, provider) => `create index ${index.name} on ${table.ormName}(${index.columns.map((column) => sqlIndexColumn(table, column, provider)).join(", ")})`;
|
|
60
|
-
const createForeignKeySql = (table, foreignKey) => `alter table ${table.ormName} add constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${foreignKey.onUpdate} on delete ${foreignKey.onDelete}`;
|
|
61
|
-
const createCheckSql = (table, check) => `alter table ${table.ormName} add constraint ${check.name} check (${check.expression})`;
|
|
62
|
-
const inlineSqlChecks = (table, provider) => provider === "sqlite" ? (table.checks ?? []).filter((check) => check.sqliteInline).map((check) => `constraint ${check.name} check (${check.expression})`) : [];
|
|
63
|
-
const createTableStatement = (table, provider) => {
|
|
64
|
-
const lines = [
|
|
65
|
-
|
|
74
|
+
const createIndexSql = (table, index, provider) => `create ${index.unique ? "unique " : ""}index ${index.name} on ${table.ormName}(${index.columns.map((column) => sqlIndexColumn(table, column, provider)).join(", ")})`;
|
|
75
|
+
const createForeignKeySql = (table, foreignKey, provider) => `alter table ${table.ormName} add constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${provider === "mssql" && foreignKey.onUpdate === "restrict" ? "no action" : foreignKey.onUpdate} on delete ${provider === "mssql" && foreignKey.onDelete === "restrict" ? "no action" : foreignKey.onDelete}`;
|
|
76
|
+
const createCheckSql = (table, check, provider) => `alter table ${table.ormName} add constraint ${check.name} check (${(provider && check.providerExpressions?.[provider]) ?? check.expression})`;
|
|
77
|
+
const inlineSqlChecks = (table, provider) => provider === "sqlite" ? (table.checks ?? []).filter((check) => check.sqliteInline).map((check) => `constraint ${check.name} check (${check.providerExpressions?.sqlite ?? check.expression})`) : [];
|
|
78
|
+
const createTableStatement = (table, provider, relationMode = "foreign-keys") => {
|
|
79
|
+
const lines = [
|
|
80
|
+
...table.columns.map((column) => sqlColumnDefinition(table, column, provider)),
|
|
81
|
+
...inlineSqlChecks(table, provider),
|
|
82
|
+
...provider === "sqlite" && relationMode === "foreign-keys" ? (table.foreignKeys ?? []).map((foreignKey) => `constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${foreignKey.onUpdate} on delete ${foreignKey.onDelete}`) : []
|
|
83
|
+
];
|
|
84
|
+
return `create table ${table.ormName} (\n${lines.join(",\n")}\n)`;
|
|
66
85
|
};
|
|
67
86
|
const createForeignKeySqlStatements = (provider, relationMode = "foreign-keys") => {
|
|
68
87
|
if (relationMode !== "foreign-keys" || provider === "sqlite") return [];
|
|
69
|
-
return hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => createForeignKeySql(table, foreignKey)));
|
|
88
|
+
return hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => createForeignKeySql(table, foreignKey, provider)));
|
|
70
89
|
};
|
|
71
90
|
const createTableSql = (provider, relationMode = "foreign-keys") => [
|
|
72
|
-
...hotUpdaterSchema.tables.map((table) => createTableStatement(table, provider)),
|
|
91
|
+
...hotUpdaterSchema.tables.map((table) => createTableStatement(table, provider, relationMode)),
|
|
73
92
|
...hotUpdaterSchema.tables.flatMap((table) => (table.indexes ?? []).filter((index) => schemaIndexAppliesToProvider(index, provider)).map((index) => createIndexSql(table, index, provider))),
|
|
74
|
-
...provider === "sqlite" ? [] : hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => createCheckSql(table, check))),
|
|
93
|
+
...provider === "sqlite" ? [] : hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => createCheckSql(table, check, provider))),
|
|
75
94
|
...createForeignKeySqlStatements(provider, relationMode)
|
|
76
95
|
];
|
|
77
96
|
//#endregion
|
|
78
|
-
export { createCheckSql, createForeignKeySql, createIndexSql, createTableSql,
|
|
97
|
+
export { createCheckSql, createForeignKeySql, createIndexSql, createTableSql, hotUpdaterCreateTableOperations };
|
|
@@ -3,8 +3,8 @@ const require_registry = require("./registry.cjs");
|
|
|
3
3
|
const require_sql = require("./sql.cjs");
|
|
4
4
|
//#region src/db/schema/sqlOperations.ts
|
|
5
5
|
const getSettingsInsertSql = (provider) => {
|
|
6
|
-
if (provider === "mysql") return `insert into ${require_types.HOT_UPDATER_SETTINGS_TABLE} (\`key\`, value) values ('
|
|
7
|
-
return `insert into ${require_types.HOT_UPDATER_SETTINGS_TABLE} (key, value) values ('
|
|
6
|
+
if (provider === "mysql") return `insert into ${require_types.HOT_UPDATER_SETTINGS_TABLE} (\`key\`, value) values ('${require_types.HOT_UPDATER_CORE_SCHEMA_KEY}', '${require_types.HOT_UPDATER_SCHEMA_VERSION}') on duplicate key update value = '${require_types.HOT_UPDATER_SCHEMA_VERSION}'`;
|
|
7
|
+
return `insert into ${require_types.HOT_UPDATER_SETTINGS_TABLE} (key, value) values ('${require_types.HOT_UPDATER_CORE_SCHEMA_KEY}', '${require_types.HOT_UPDATER_SCHEMA_VERSION}') on conflict (key) do update set value = '${require_types.HOT_UPDATER_SCHEMA_VERSION}'`;
|
|
8
8
|
};
|
|
9
9
|
const createSqlCreateOperations = (provider, relationMode, settingsOperation) => [
|
|
10
10
|
...require_sql.hotUpdaterCreateTableOperations,
|
|
@@ -14,11 +14,11 @@ const createSqlCreateOperations = (provider, relationMode, settingsOperation) =>
|
|
|
14
14
|
}))),
|
|
15
15
|
...provider === "sqlite" ? [] : require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => ({
|
|
16
16
|
type: "custom",
|
|
17
|
-
sql: require_sql.createCheckSql(table, check)
|
|
17
|
+
sql: require_sql.createCheckSql(table, check, provider)
|
|
18
18
|
}))),
|
|
19
19
|
...relationMode === "foreign-keys" && provider !== "sqlite" ? require_registry.hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => ({
|
|
20
20
|
type: "custom",
|
|
21
|
-
sql: require_sql.createForeignKeySql(table, foreignKey)
|
|
21
|
+
sql: require_sql.createForeignKeySql(table, foreignKey, provider)
|
|
22
22
|
}))) : [],
|
|
23
23
|
...settingsOperation ? [settingsOperation] : []
|
|
24
24
|
];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { HOT_UPDATER_SCHEMA_VERSION, HOT_UPDATER_SETTINGS_TABLE } from "../../schema/types.mjs";
|
|
1
|
+
import { HOT_UPDATER_CORE_SCHEMA_KEY, HOT_UPDATER_SCHEMA_VERSION, HOT_UPDATER_SETTINGS_TABLE } from "../../schema/types.mjs";
|
|
2
2
|
import { hotUpdaterSchema, schemaIndexAppliesToProvider } from "./registry.mjs";
|
|
3
3
|
import { createCheckSql, createForeignKeySql, createIndexSql, hotUpdaterCreateTableOperations } from "./sql.mjs";
|
|
4
4
|
//#region src/db/schema/sqlOperations.ts
|
|
5
5
|
const getSettingsInsertSql = (provider) => {
|
|
6
|
-
if (provider === "mysql") return `insert into ${HOT_UPDATER_SETTINGS_TABLE} (\`key\`, value) values ('
|
|
7
|
-
return `insert into ${HOT_UPDATER_SETTINGS_TABLE} (key, value) values ('
|
|
6
|
+
if (provider === "mysql") return `insert into ${HOT_UPDATER_SETTINGS_TABLE} (\`key\`, value) values ('${HOT_UPDATER_CORE_SCHEMA_KEY}', '${HOT_UPDATER_SCHEMA_VERSION}') on duplicate key update value = '${HOT_UPDATER_SCHEMA_VERSION}'`;
|
|
7
|
+
return `insert into ${HOT_UPDATER_SETTINGS_TABLE} (key, value) values ('${HOT_UPDATER_CORE_SCHEMA_KEY}', '${HOT_UPDATER_SCHEMA_VERSION}') on conflict (key) do update set value = '${HOT_UPDATER_SCHEMA_VERSION}'`;
|
|
8
8
|
};
|
|
9
9
|
const createSqlCreateOperations = (provider, relationMode, settingsOperation) => [
|
|
10
10
|
...hotUpdaterCreateTableOperations,
|
|
@@ -14,11 +14,11 @@ const createSqlCreateOperations = (provider, relationMode, settingsOperation) =>
|
|
|
14
14
|
}))),
|
|
15
15
|
...provider === "sqlite" ? [] : hotUpdaterSchema.tables.flatMap((table) => (table.checks ?? []).map((check) => ({
|
|
16
16
|
type: "custom",
|
|
17
|
-
sql: createCheckSql(table, check)
|
|
17
|
+
sql: createCheckSql(table, check, provider)
|
|
18
18
|
}))),
|
|
19
19
|
...relationMode === "foreign-keys" && provider !== "sqlite" ? hotUpdaterSchema.tables.flatMap((table) => (table.foreignKeys ?? []).map((foreignKey) => ({
|
|
20
20
|
type: "custom",
|
|
21
|
-
sql: createForeignKeySql(table, foreignKey)
|
|
21
|
+
sql: createForeignKeySql(table, foreignKey, provider)
|
|
22
22
|
}))) : [],
|
|
23
23
|
...settingsOperation ? [settingsOperation] : []
|
|
24
24
|
];
|
|
@@ -3,21 +3,24 @@ const require_types$1 = require("./types.cjs");
|
|
|
3
3
|
const require_registry = require("./schema/registry.cjs");
|
|
4
4
|
//#region src/db/schemaGenerators.ts
|
|
5
5
|
const literal = (value) => JSON.stringify(value);
|
|
6
|
+
const varcharLength = (type) => Number(type.slice(8, -1));
|
|
6
7
|
const toPascalCase = (value) => value.split("_").filter(Boolean).map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`).join("");
|
|
7
8
|
const prismaDb = (type, provider) => {
|
|
8
9
|
if (provider === "postgresql") {
|
|
9
10
|
if (type === "uuid") return " @db.Uuid";
|
|
10
|
-
if (type.startsWith("varchar")) return
|
|
11
|
+
if (type.startsWith("varchar")) return ` @db.VarChar(${varcharLength(type)})`;
|
|
11
12
|
}
|
|
12
13
|
if (provider === "mysql") {
|
|
13
14
|
if (type === "uuid") return " @db.Char(36)";
|
|
14
|
-
if (type
|
|
15
|
+
if (type === "large-string") return " @db.MediumText";
|
|
16
|
+
if (type.startsWith("varchar")) return ` @db.VarChar(${varcharLength(type)})`;
|
|
15
17
|
}
|
|
16
18
|
return "";
|
|
17
19
|
};
|
|
18
20
|
const prismaType = (column, provider) => {
|
|
19
21
|
return `${(() => {
|
|
20
22
|
if (column.type === "bool") return "Boolean";
|
|
23
|
+
if (column.type === "float") return "Float";
|
|
21
24
|
if (column.type === "integer") return "Int";
|
|
22
25
|
if (column.type === "json") return "Json";
|
|
23
26
|
return "String";
|
|
@@ -35,16 +38,23 @@ const prismaField = (column, provider) => [
|
|
|
35
38
|
column.primaryKey ? "@id" : void 0,
|
|
36
39
|
prismaDefault(column, provider).trim() || void 0
|
|
37
40
|
].filter(Boolean).join(" ");
|
|
38
|
-
const relationTargetFields = (table, schema) => schema.tables.flatMap((sourceTable) => (sourceTable.relations ?? []).filter((relation) => relation.referencedTable === table.ormName))
|
|
41
|
+
const relationTargetFields = (table, schema) => schema.tables.flatMap((sourceTable) => (sourceTable.relations ?? []).filter((relation) => relation.referencedTable === table.ormName).map((relation) => ({
|
|
42
|
+
relation,
|
|
43
|
+
sourceTable
|
|
44
|
+
})));
|
|
39
45
|
const prismaRelationFields = (table, schema) => {
|
|
40
|
-
const lines = relationTargetFields(table, schema).map((relation) => `${relation.fieldName} ${
|
|
46
|
+
const lines = relationTargetFields(table, schema).map(({ relation, sourceTable }) => `${relation.fieldName} ${sourceTable.ormName}[] @relation(${literal(relation.relationName)})`);
|
|
41
47
|
for (const relation of table.relations ?? []) {
|
|
42
48
|
const targetType = toPascalCase(relation.referencedTable);
|
|
43
|
-
|
|
49
|
+
const foreignKey = table.foreignKeys?.find((item) => item.referencedTable === relation.referencedTable && item.columns.join("\0") === relation.columns.join("\0") && item.referencedColumns.join("\0") === relation.referencedColumns.join("\0"));
|
|
50
|
+
if (!foreignKey) throw new Error(`Missing foreign key metadata for relation ${table.ormName}.${relation.name}`);
|
|
51
|
+
const optional = relation.columns.some((columnName) => table.columns.find(({ ormName }) => ormName === columnName)?.nullable);
|
|
52
|
+
const onDelete = foreignKey.onDelete === "cascade" ? "Cascade" : foreignKey.onDelete === "set null" ? "SetNull" : "Restrict";
|
|
53
|
+
lines.push(`${relation.targetFieldName} ${targetType === "Bundles" ? "bundles" : relation.referencedTable}${optional ? "?" : ""} @relation(${literal(relation.relationName)}, fields: [${relation.columns.join(", ")}], references: [${relation.referencedColumns.join(", ")}], onUpdate: Restrict, onDelete: ${onDelete})`);
|
|
44
54
|
}
|
|
45
55
|
return lines;
|
|
46
56
|
};
|
|
47
|
-
const prismaIndexes = (table, provider) => (table.indexes ?? []).filter((index) => require_registry.schemaIndexAppliesToProvider(index, provider)).map((index) =>
|
|
57
|
+
const prismaIndexes = (table, provider) => (table.indexes ?? []).filter((index) => require_registry.schemaIndexAppliesToProvider(index, provider)).map((index) => `@@${index.unique ? "unique" : "index"}([${index.columns.join(", ")}], map: ${literal(index.name)})`);
|
|
48
58
|
const generatePrismaSchema = (provider, schema = require_registry.hotUpdaterSchema) => schema.tables.map((table) => {
|
|
49
59
|
const lines = [
|
|
50
60
|
...table.columns.map((column) => prismaField(column, provider)),
|
|
@@ -65,12 +75,16 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
65
75
|
code: `integer(${literal(column.ormName)})`,
|
|
66
76
|
imports: ["integer"]
|
|
67
77
|
};
|
|
78
|
+
if (column.type === "float") return {
|
|
79
|
+
code: `real(${literal(column.ormName)})`,
|
|
80
|
+
imports: ["real"]
|
|
81
|
+
};
|
|
68
82
|
if (column.type === "json") return {
|
|
69
83
|
code: `blob(${literal(column.ormName)}, { mode: "json" })`,
|
|
70
84
|
imports: ["blob"]
|
|
71
85
|
};
|
|
72
86
|
if (column.type.startsWith("varchar")) return {
|
|
73
|
-
code: `text(${literal(column.ormName)}, { length:
|
|
87
|
+
code: `text(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
74
88
|
imports: ["text"]
|
|
75
89
|
};
|
|
76
90
|
return {
|
|
@@ -91,12 +105,20 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
91
105
|
code: `int(${literal(column.ormName)})`,
|
|
92
106
|
imports: ["int"]
|
|
93
107
|
};
|
|
108
|
+
if (column.type === "float") return {
|
|
109
|
+
code: `double(${literal(column.ormName)})`,
|
|
110
|
+
imports: ["double"]
|
|
111
|
+
};
|
|
94
112
|
if (column.type === "json") return {
|
|
95
113
|
code: `json(${literal(column.ormName)})`,
|
|
96
114
|
imports: ["json"]
|
|
97
115
|
};
|
|
116
|
+
if (column.type === "large-string") return {
|
|
117
|
+
code: `mediumtext(${literal(column.ormName)})`,
|
|
118
|
+
imports: ["mediumtext"]
|
|
119
|
+
};
|
|
98
120
|
if (column.type.startsWith("varchar")) return {
|
|
99
|
-
code: `varchar(${literal(column.ormName)}, { length:
|
|
121
|
+
code: `varchar(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
100
122
|
imports: ["varchar"]
|
|
101
123
|
};
|
|
102
124
|
return {
|
|
@@ -116,12 +138,16 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
116
138
|
code: `integer(${literal(column.ormName)})`,
|
|
117
139
|
imports: ["integer"]
|
|
118
140
|
};
|
|
141
|
+
if (column.type === "float") return {
|
|
142
|
+
code: `doublePrecision(${literal(column.ormName)})`,
|
|
143
|
+
imports: ["doublePrecision"]
|
|
144
|
+
};
|
|
119
145
|
if (column.type === "json") return {
|
|
120
146
|
code: `json(${literal(column.ormName)})`,
|
|
121
147
|
imports: ["json"]
|
|
122
148
|
};
|
|
123
149
|
if (column.type.startsWith("varchar")) return {
|
|
124
|
-
code: `varchar(${literal(column.ormName)}, { length:
|
|
150
|
+
code: `varchar(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
125
151
|
imports: ["varchar"]
|
|
126
152
|
};
|
|
127
153
|
return {
|
|
@@ -131,7 +157,7 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
131
157
|
};
|
|
132
158
|
const drizzleDefault = (value) => {
|
|
133
159
|
if (!value) return "";
|
|
134
|
-
if (value.type === "json") return
|
|
160
|
+
if (value.type === "json") return `.default(${JSON.stringify(value.value)})`;
|
|
135
161
|
return `.default(${JSON.stringify(value.value)})`;
|
|
136
162
|
};
|
|
137
163
|
const drizzleColumn = (table, column) => {
|
|
@@ -164,15 +190,17 @@ const drizzleTable = (table, provider, imports) => {
|
|
|
164
190
|
const callbacks = [];
|
|
165
191
|
for (const foreignKey of table.foreignKeys ?? []) {
|
|
166
192
|
imports.add("foreignKey");
|
|
193
|
+
const referencedTable = foreignKey.referencedTable === table.ormName ? "table" : foreignKey.referencedTable;
|
|
167
194
|
callbacks.push(`foreignKey({
|
|
168
195
|
columns: [table.${foreignKey.columns.join(", table.")}],
|
|
169
|
-
foreignColumns: [${
|
|
196
|
+
foreignColumns: [${referencedTable}.${foreignKey.referencedColumns.join(`, ${referencedTable}.`)}],
|
|
170
197
|
name: ${literal(foreignKey.name)}
|
|
171
198
|
}).onUpdate(${literal(foreignKey.onUpdate)}).onDelete(${literal(foreignKey.onDelete)})`);
|
|
172
199
|
}
|
|
173
200
|
for (const index of (table.indexes ?? []).filter((item) => require_registry.schemaIndexAppliesToProvider(item, provider))) {
|
|
174
|
-
|
|
175
|
-
|
|
201
|
+
const indexFunction = index.unique ? "uniqueIndex" : "index";
|
|
202
|
+
imports.add(indexFunction);
|
|
203
|
+
callbacks.push(`${indexFunction}(${literal(index.name)}).on(${index.columns.map((column) => `table.${column}`).join(", ")})`);
|
|
176
204
|
}
|
|
177
205
|
const args = [
|
|
178
206
|
literal(table.ormName),
|
|
@@ -181,14 +209,20 @@ const drizzleTable = (table, provider, imports) => {
|
|
|
181
209
|
].filter(Boolean);
|
|
182
210
|
return `export const ${table.ormName} = ${drizzleTableFn(provider)}(${args.join(", ")})`;
|
|
183
211
|
};
|
|
184
|
-
const drizzleRelations = (table) => {
|
|
185
|
-
|
|
186
|
-
const
|
|
212
|
+
const drizzleRelations = (table, schema) => {
|
|
213
|
+
const sourceRelations = table.relations ?? [];
|
|
214
|
+
const targetRelations = relationTargetFields(table, schema);
|
|
215
|
+
if (sourceRelations.length === 0 && targetRelations.length === 0) return;
|
|
216
|
+
const lines = sourceRelations.map((relation) => ` ${relation.targetFieldName}: one(${relation.referencedTable}, {
|
|
187
217
|
relationName: ${literal(relation.relationName)},
|
|
188
218
|
fields: [${relation.columns.map((column) => `${table.ormName}.${column}`).join(", ")}],
|
|
189
219
|
references: [${relation.referencedColumns.map((column) => `${relation.referencedTable}.${column}`).join(", ")}]
|
|
190
220
|
})`);
|
|
191
|
-
|
|
221
|
+
lines.push(...targetRelations.map(({ relation, sourceTable }) => ` ${relation.fieldName}: many(${sourceTable.ormName}, {
|
|
222
|
+
relationName: ${literal(relation.relationName)}
|
|
223
|
+
})`));
|
|
224
|
+
const callbacks = [...sourceRelations.length > 0 ? ["one"] : [], ...targetRelations.length > 0 ? ["many"] : []];
|
|
225
|
+
return `export const ${table.ormName}Relations = relations(${table.ormName}, ({ ${callbacks.join(", ")} }) => ({
|
|
192
226
|
${lines.join(",\n")}
|
|
193
227
|
}))`;
|
|
194
228
|
};
|
|
@@ -197,7 +231,7 @@ const generateDrizzleSchema = (provider, schema = require_registry.hotUpdaterSch
|
|
|
197
231
|
const body = [];
|
|
198
232
|
for (const table of schema.tables) {
|
|
199
233
|
body.push(drizzleTable(table, provider, imports));
|
|
200
|
-
const relations = drizzleRelations(table);
|
|
234
|
+
const relations = drizzleRelations(table, schema);
|
|
201
235
|
if (relations) body.push(relations);
|
|
202
236
|
}
|
|
203
237
|
if (body.some((block) => block.includes("relations("))) body.unshift("import { relations } from \"drizzle-orm\"");
|
|
@@ -3,21 +3,24 @@ import { getSQLProvider } from "./types.mjs";
|
|
|
3
3
|
import { getHotUpdaterSchemaVersion, hotUpdaterSchema, schemaIndexAppliesToProvider } from "./schema/registry.mjs";
|
|
4
4
|
//#region src/db/schemaGenerators.ts
|
|
5
5
|
const literal = (value) => JSON.stringify(value);
|
|
6
|
+
const varcharLength = (type) => Number(type.slice(8, -1));
|
|
6
7
|
const toPascalCase = (value) => value.split("_").filter(Boolean).map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`).join("");
|
|
7
8
|
const prismaDb = (type, provider) => {
|
|
8
9
|
if (provider === "postgresql") {
|
|
9
10
|
if (type === "uuid") return " @db.Uuid";
|
|
10
|
-
if (type.startsWith("varchar")) return
|
|
11
|
+
if (type.startsWith("varchar")) return ` @db.VarChar(${varcharLength(type)})`;
|
|
11
12
|
}
|
|
12
13
|
if (provider === "mysql") {
|
|
13
14
|
if (type === "uuid") return " @db.Char(36)";
|
|
14
|
-
if (type
|
|
15
|
+
if (type === "large-string") return " @db.MediumText";
|
|
16
|
+
if (type.startsWith("varchar")) return ` @db.VarChar(${varcharLength(type)})`;
|
|
15
17
|
}
|
|
16
18
|
return "";
|
|
17
19
|
};
|
|
18
20
|
const prismaType = (column, provider) => {
|
|
19
21
|
return `${(() => {
|
|
20
22
|
if (column.type === "bool") return "Boolean";
|
|
23
|
+
if (column.type === "float") return "Float";
|
|
21
24
|
if (column.type === "integer") return "Int";
|
|
22
25
|
if (column.type === "json") return "Json";
|
|
23
26
|
return "String";
|
|
@@ -35,16 +38,23 @@ const prismaField = (column, provider) => [
|
|
|
35
38
|
column.primaryKey ? "@id" : void 0,
|
|
36
39
|
prismaDefault(column, provider).trim() || void 0
|
|
37
40
|
].filter(Boolean).join(" ");
|
|
38
|
-
const relationTargetFields = (table, schema) => schema.tables.flatMap((sourceTable) => (sourceTable.relations ?? []).filter((relation) => relation.referencedTable === table.ormName))
|
|
41
|
+
const relationTargetFields = (table, schema) => schema.tables.flatMap((sourceTable) => (sourceTable.relations ?? []).filter((relation) => relation.referencedTable === table.ormName).map((relation) => ({
|
|
42
|
+
relation,
|
|
43
|
+
sourceTable
|
|
44
|
+
})));
|
|
39
45
|
const prismaRelationFields = (table, schema) => {
|
|
40
|
-
const lines = relationTargetFields(table, schema).map((relation) => `${relation.fieldName} ${
|
|
46
|
+
const lines = relationTargetFields(table, schema).map(({ relation, sourceTable }) => `${relation.fieldName} ${sourceTable.ormName}[] @relation(${literal(relation.relationName)})`);
|
|
41
47
|
for (const relation of table.relations ?? []) {
|
|
42
48
|
const targetType = toPascalCase(relation.referencedTable);
|
|
43
|
-
|
|
49
|
+
const foreignKey = table.foreignKeys?.find((item) => item.referencedTable === relation.referencedTable && item.columns.join("\0") === relation.columns.join("\0") && item.referencedColumns.join("\0") === relation.referencedColumns.join("\0"));
|
|
50
|
+
if (!foreignKey) throw new Error(`Missing foreign key metadata for relation ${table.ormName}.${relation.name}`);
|
|
51
|
+
const optional = relation.columns.some((columnName) => table.columns.find(({ ormName }) => ormName === columnName)?.nullable);
|
|
52
|
+
const onDelete = foreignKey.onDelete === "cascade" ? "Cascade" : foreignKey.onDelete === "set null" ? "SetNull" : "Restrict";
|
|
53
|
+
lines.push(`${relation.targetFieldName} ${targetType === "Bundles" ? "bundles" : relation.referencedTable}${optional ? "?" : ""} @relation(${literal(relation.relationName)}, fields: [${relation.columns.join(", ")}], references: [${relation.referencedColumns.join(", ")}], onUpdate: Restrict, onDelete: ${onDelete})`);
|
|
44
54
|
}
|
|
45
55
|
return lines;
|
|
46
56
|
};
|
|
47
|
-
const prismaIndexes = (table, provider) => (table.indexes ?? []).filter((index) => schemaIndexAppliesToProvider(index, provider)).map((index) =>
|
|
57
|
+
const prismaIndexes = (table, provider) => (table.indexes ?? []).filter((index) => schemaIndexAppliesToProvider(index, provider)).map((index) => `@@${index.unique ? "unique" : "index"}([${index.columns.join(", ")}], map: ${literal(index.name)})`);
|
|
48
58
|
const generatePrismaSchema = (provider, schema = hotUpdaterSchema) => schema.tables.map((table) => {
|
|
49
59
|
const lines = [
|
|
50
60
|
...table.columns.map((column) => prismaField(column, provider)),
|
|
@@ -65,12 +75,16 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
65
75
|
code: `integer(${literal(column.ormName)})`,
|
|
66
76
|
imports: ["integer"]
|
|
67
77
|
};
|
|
78
|
+
if (column.type === "float") return {
|
|
79
|
+
code: `real(${literal(column.ormName)})`,
|
|
80
|
+
imports: ["real"]
|
|
81
|
+
};
|
|
68
82
|
if (column.type === "json") return {
|
|
69
83
|
code: `blob(${literal(column.ormName)}, { mode: "json" })`,
|
|
70
84
|
imports: ["blob"]
|
|
71
85
|
};
|
|
72
86
|
if (column.type.startsWith("varchar")) return {
|
|
73
|
-
code: `text(${literal(column.ormName)}, { length:
|
|
87
|
+
code: `text(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
74
88
|
imports: ["text"]
|
|
75
89
|
};
|
|
76
90
|
return {
|
|
@@ -91,12 +105,20 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
91
105
|
code: `int(${literal(column.ormName)})`,
|
|
92
106
|
imports: ["int"]
|
|
93
107
|
};
|
|
108
|
+
if (column.type === "float") return {
|
|
109
|
+
code: `double(${literal(column.ormName)})`,
|
|
110
|
+
imports: ["double"]
|
|
111
|
+
};
|
|
94
112
|
if (column.type === "json") return {
|
|
95
113
|
code: `json(${literal(column.ormName)})`,
|
|
96
114
|
imports: ["json"]
|
|
97
115
|
};
|
|
116
|
+
if (column.type === "large-string") return {
|
|
117
|
+
code: `mediumtext(${literal(column.ormName)})`,
|
|
118
|
+
imports: ["mediumtext"]
|
|
119
|
+
};
|
|
98
120
|
if (column.type.startsWith("varchar")) return {
|
|
99
|
-
code: `varchar(${literal(column.ormName)}, { length:
|
|
121
|
+
code: `varchar(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
100
122
|
imports: ["varchar"]
|
|
101
123
|
};
|
|
102
124
|
return {
|
|
@@ -116,12 +138,16 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
116
138
|
code: `integer(${literal(column.ormName)})`,
|
|
117
139
|
imports: ["integer"]
|
|
118
140
|
};
|
|
141
|
+
if (column.type === "float") return {
|
|
142
|
+
code: `doublePrecision(${literal(column.ormName)})`,
|
|
143
|
+
imports: ["doublePrecision"]
|
|
144
|
+
};
|
|
119
145
|
if (column.type === "json") return {
|
|
120
146
|
code: `json(${literal(column.ormName)})`,
|
|
121
147
|
imports: ["json"]
|
|
122
148
|
};
|
|
123
149
|
if (column.type.startsWith("varchar")) return {
|
|
124
|
-
code: `varchar(${literal(column.ormName)}, { length:
|
|
150
|
+
code: `varchar(${literal(column.ormName)}, { length: ${varcharLength(column.type)} })`,
|
|
125
151
|
imports: ["varchar"]
|
|
126
152
|
};
|
|
127
153
|
return {
|
|
@@ -131,7 +157,7 @@ const drizzleColumnFn = (column, provider) => {
|
|
|
131
157
|
};
|
|
132
158
|
const drizzleDefault = (value) => {
|
|
133
159
|
if (!value) return "";
|
|
134
|
-
if (value.type === "json") return
|
|
160
|
+
if (value.type === "json") return `.default(${JSON.stringify(value.value)})`;
|
|
135
161
|
return `.default(${JSON.stringify(value.value)})`;
|
|
136
162
|
};
|
|
137
163
|
const drizzleColumn = (table, column) => {
|
|
@@ -164,15 +190,17 @@ const drizzleTable = (table, provider, imports) => {
|
|
|
164
190
|
const callbacks = [];
|
|
165
191
|
for (const foreignKey of table.foreignKeys ?? []) {
|
|
166
192
|
imports.add("foreignKey");
|
|
193
|
+
const referencedTable = foreignKey.referencedTable === table.ormName ? "table" : foreignKey.referencedTable;
|
|
167
194
|
callbacks.push(`foreignKey({
|
|
168
195
|
columns: [table.${foreignKey.columns.join(", table.")}],
|
|
169
|
-
foreignColumns: [${
|
|
196
|
+
foreignColumns: [${referencedTable}.${foreignKey.referencedColumns.join(`, ${referencedTable}.`)}],
|
|
170
197
|
name: ${literal(foreignKey.name)}
|
|
171
198
|
}).onUpdate(${literal(foreignKey.onUpdate)}).onDelete(${literal(foreignKey.onDelete)})`);
|
|
172
199
|
}
|
|
173
200
|
for (const index of (table.indexes ?? []).filter((item) => schemaIndexAppliesToProvider(item, provider))) {
|
|
174
|
-
|
|
175
|
-
|
|
201
|
+
const indexFunction = index.unique ? "uniqueIndex" : "index";
|
|
202
|
+
imports.add(indexFunction);
|
|
203
|
+
callbacks.push(`${indexFunction}(${literal(index.name)}).on(${index.columns.map((column) => `table.${column}`).join(", ")})`);
|
|
176
204
|
}
|
|
177
205
|
const args = [
|
|
178
206
|
literal(table.ormName),
|
|
@@ -181,14 +209,20 @@ const drizzleTable = (table, provider, imports) => {
|
|
|
181
209
|
].filter(Boolean);
|
|
182
210
|
return `export const ${table.ormName} = ${drizzleTableFn(provider)}(${args.join(", ")})`;
|
|
183
211
|
};
|
|
184
|
-
const drizzleRelations = (table) => {
|
|
185
|
-
|
|
186
|
-
const
|
|
212
|
+
const drizzleRelations = (table, schema) => {
|
|
213
|
+
const sourceRelations = table.relations ?? [];
|
|
214
|
+
const targetRelations = relationTargetFields(table, schema);
|
|
215
|
+
if (sourceRelations.length === 0 && targetRelations.length === 0) return;
|
|
216
|
+
const lines = sourceRelations.map((relation) => ` ${relation.targetFieldName}: one(${relation.referencedTable}, {
|
|
187
217
|
relationName: ${literal(relation.relationName)},
|
|
188
218
|
fields: [${relation.columns.map((column) => `${table.ormName}.${column}`).join(", ")}],
|
|
189
219
|
references: [${relation.referencedColumns.map((column) => `${relation.referencedTable}.${column}`).join(", ")}]
|
|
190
220
|
})`);
|
|
191
|
-
|
|
221
|
+
lines.push(...targetRelations.map(({ relation, sourceTable }) => ` ${relation.fieldName}: many(${sourceTable.ormName}, {
|
|
222
|
+
relationName: ${literal(relation.relationName)}
|
|
223
|
+
})`));
|
|
224
|
+
const callbacks = [...sourceRelations.length > 0 ? ["one"] : [], ...targetRelations.length > 0 ? ["many"] : []];
|
|
225
|
+
return `export const ${table.ormName}Relations = relations(${table.ormName}, ({ ${callbacks.join(", ")} }) => ({
|
|
192
226
|
${lines.join(",\n")}
|
|
193
227
|
}))`;
|
|
194
228
|
};
|
|
@@ -197,7 +231,7 @@ const generateDrizzleSchema = (provider, schema = hotUpdaterSchema) => {
|
|
|
197
231
|
const body = [];
|
|
198
232
|
for (const table of schema.tables) {
|
|
199
233
|
body.push(drizzleTable(table, provider, imports));
|
|
200
|
-
const relations = drizzleRelations(table);
|
|
234
|
+
const relations = drizzleRelations(table, schema);
|
|
201
235
|
if (relations) body.push(relations);
|
|
202
236
|
}
|
|
203
237
|
if (body.some((block) => block.includes("relations("))) body.unshift("import { relations } from \"drizzle-orm\"");
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
require("../schema/types.cjs");
|
|
2
|
+
const require_fixedMigratorShared = require("./fixedMigratorShared.cjs");
|
|
2
3
|
//#region src/db/schemaReadiness.ts
|
|
3
4
|
var HotUpdaterSchemaMigrationRequiredError = class extends Error {
|
|
4
5
|
constructor(adapterName, currentVersion) {
|
|
5
|
-
super(currentVersion === void 0 ? `Hot Updater database schema is not initialized for ${adapterName}. Run \`hot-updater db migrate\` before using this adapter.` :
|
|
6
|
+
super(currentVersion === void 0 ? `Hot Updater database schema is not initialized for ${adapterName}. Run \`hot-updater db migrate\` before using this adapter.` : require_fixedMigratorShared.unsupportedSchemaUpgradeMessage(currentVersion));
|
|
6
7
|
this.adapterName = adapterName;
|
|
7
8
|
this.currentVersion = currentVersion;
|
|
8
9
|
this.name = "HotUpdaterSchemaMigrationRequiredError";
|
|
@@ -14,7 +15,7 @@ const createSchemaReadinessChecker = (adapterName, createMigrator) => {
|
|
|
14
15
|
return async () => {
|
|
15
16
|
if (ready) return;
|
|
16
17
|
const version = await createMigrator().getVersion();
|
|
17
|
-
if (version !== "0.
|
|
18
|
+
if (version !== "1.0.0") throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version);
|
|
18
19
|
ready = true;
|
|
19
20
|
};
|
|
20
21
|
};
|