@hot-updater/server 0.36.6 → 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.
Files changed (291) hide show
  1. package/dist/adapters/databaseConstraintErrors.cjs +23 -0
  2. package/dist/adapters/databaseConstraintErrors.mjs +21 -0
  3. package/dist/adapters/databasePluginUtils.cjs +117 -0
  4. package/dist/adapters/databasePluginUtils.mjs +106 -0
  5. package/dist/adapters/drizzle.cjs +53 -176
  6. package/dist/adapters/drizzle.d.cts +6 -4
  7. package/dist/adapters/drizzle.d.mts +6 -4
  8. package/dist/adapters/drizzle.mjs +54 -177
  9. package/dist/adapters/drizzleCrud.cjs +250 -0
  10. package/dist/adapters/drizzleCrud.mjs +249 -0
  11. package/dist/adapters/drizzleLazyDB.cjs +84 -36
  12. package/dist/adapters/drizzleLazyDB.mjs +84 -36
  13. package/dist/adapters/drizzleQuery.cjs +68 -0
  14. package/dist/adapters/drizzleQuery.mjs +67 -0
  15. package/dist/adapters/kysely.cjs +18 -138
  16. package/dist/adapters/kysely.d.cts +3 -12
  17. package/dist/adapters/kysely.d.mts +3 -12
  18. package/dist/adapters/kysely.mjs +19 -139
  19. package/dist/adapters/kyselyCrud.cjs +254 -0
  20. package/dist/adapters/kyselyCrud.mjs +253 -0
  21. package/dist/adapters/kyselyQuery.cjs +56 -0
  22. package/dist/adapters/kyselyQuery.mjs +55 -0
  23. package/dist/adapters/mongodb.cjs +21 -174
  24. package/dist/adapters/mongodb.d.cts +3 -2
  25. package/dist/adapters/mongodb.d.mts +3 -2
  26. package/dist/adapters/mongodb.mjs +21 -174
  27. package/dist/adapters/mongodbCollections.cjs +36 -0
  28. package/dist/adapters/mongodbCollections.mjs +30 -0
  29. package/dist/adapters/mongodbQuery.cjs +77 -0
  30. package/dist/adapters/mongodbQuery.mjs +70 -0
  31. package/dist/adapters/mongodbReads.cjs +148 -0
  32. package/dist/adapters/mongodbReads.mjs +147 -0
  33. package/dist/adapters/mongodbWrites.cjs +134 -0
  34. package/dist/adapters/mongodbWrites.mjs +133 -0
  35. package/dist/adapters/prisma.cjs +205 -180
  36. package/dist/adapters/prisma.d.cts +3 -3
  37. package/dist/adapters/prisma.d.mts +3 -3
  38. package/dist/adapters/prisma.mjs +206 -181
  39. package/dist/adapters/prismaQuery.cjs +58 -0
  40. package/dist/adapters/prismaQuery.mjs +56 -0
  41. package/dist/adapters/prismaRows.cjs +198 -0
  42. package/dist/adapters/prismaRows.mjs +188 -0
  43. package/dist/analytics/bounded/activeOverview.cjs +87 -0
  44. package/dist/analytics/bounded/activeOverview.mjs +85 -0
  45. package/dist/analytics/bounded/installationSearch.cjs +42 -0
  46. package/dist/analytics/bounded/installationSearch.mjs +42 -0
  47. package/dist/analytics/bounded/persistence.cjs +39 -0
  48. package/dist/analytics/bounded/persistence.mjs +38 -0
  49. package/dist/analytics/bounded/provider.cjs +170 -0
  50. package/dist/analytics/bounded/provider.d.cts +7 -0
  51. package/dist/analytics/bounded/provider.d.mts +7 -0
  52. package/dist/analytics/bounded/provider.mjs +170 -0
  53. package/dist/analytics/bounded/scan.cjs +144 -0
  54. package/dist/analytics/bounded/scan.mjs +138 -0
  55. package/dist/analytics/domain.d.cts +121 -0
  56. package/dist/analytics/domain.d.mts +121 -0
  57. package/dist/analytics/errors.cjs +22 -0
  58. package/dist/analytics/errors.mjs +20 -0
  59. package/dist/analytics/eventInput.cjs +111 -0
  60. package/dist/analytics/eventInput.mjs +111 -0
  61. package/dist/analytics/persistence.d.cts +6 -0
  62. package/dist/analytics/persistence.d.mts +6 -0
  63. package/dist/analytics/queryInput.cjs +58 -0
  64. package/dist/analytics/queryInput.mjs +55 -0
  65. package/dist/analytics/routes.cjs +63 -0
  66. package/dist/analytics/routes.mjs +61 -0
  67. package/dist/analytics/types.d.cts +17 -0
  68. package/dist/analytics/types.d.mts +17 -0
  69. package/dist/apiKeys.cjs +139 -0
  70. package/dist/apiKeys.d.cts +50 -0
  71. package/dist/apiKeys.d.mts +50 -0
  72. package/dist/apiKeys.mjs +133 -0
  73. package/dist/createHotUpdaterCore.cjs +48 -26
  74. package/dist/createHotUpdaterCore.d.cts +49 -17
  75. package/dist/createHotUpdaterCore.d.mts +49 -17
  76. package/dist/createHotUpdaterCore.mjs +51 -29
  77. package/dist/db/createBundleDiff.cjs +45 -68
  78. package/dist/db/createBundleDiff.d.cts +3 -3
  79. package/dist/db/createBundleDiff.d.mts +3 -3
  80. package/dist/db/createBundleDiff.mjs +47 -68
  81. package/dist/db/databasePluginCore.cjs +138 -0
  82. package/dist/db/databasePluginCore.mjs +137 -0
  83. package/dist/db/fixedMigrator.cjs +36 -93
  84. package/dist/db/fixedMigrator.mjs +36 -93
  85. package/dist/db/fixedMigratorMongo.cjs +319 -0
  86. package/dist/db/fixedMigratorMongo.mjs +319 -0
  87. package/dist/db/fixedMigratorShared.cjs +23 -0
  88. package/dist/db/fixedMigratorShared.mjs +18 -0
  89. package/dist/db/mongoMigrationExecution.cjs +11 -0
  90. package/dist/db/mongoMigrationExecution.mjs +11 -0
  91. package/dist/db/releaseCatalog.cjs +66 -0
  92. package/dist/db/releaseCatalog.d.cts +17 -0
  93. package/dist/db/releaseCatalog.d.mts +17 -0
  94. package/dist/db/releaseCatalog.mjs +64 -0
  95. package/dist/db/schema/mongodb.cjs +14 -6
  96. package/dist/db/schema/mongodb.mjs +14 -6
  97. package/dist/db/schema/registry.cjs +0 -2
  98. package/dist/db/schema/registry.mjs +1 -2
  99. package/dist/db/schema/sql.cjs +31 -14
  100. package/dist/db/schema/sql.mjs +32 -13
  101. package/dist/db/schema/sqlOperations.cjs +4 -4
  102. package/dist/db/schema/sqlOperations.mjs +5 -5
  103. package/dist/db/schemaGenerators.cjs +52 -18
  104. package/dist/db/schemaGenerators.mjs +52 -18
  105. package/dist/db/schemaReadiness.cjs +4 -3
  106. package/dist/db/schemaReadiness.mjs +4 -3
  107. package/dist/db/sqlMigrationExecution.cjs +67 -0
  108. package/dist/db/sqlMigrationExecution.mjs +66 -0
  109. package/dist/db/types.cjs +2 -6
  110. package/dist/db/types.d.cts +60 -16
  111. package/dist/db/types.d.mts +60 -16
  112. package/dist/db/types.mjs +3 -6
  113. package/dist/db/updateArtifacts.cjs +114 -60
  114. package/dist/db/updateArtifacts.mjs +117 -62
  115. package/dist/handler.cjs +108 -282
  116. package/dist/handler.d.cts +3 -46
  117. package/dist/handler.d.mts +3 -46
  118. package/dist/handler.mjs +107 -281
  119. package/dist/handlerBundleRoutes.cjs +155 -0
  120. package/dist/handlerBundleRoutes.mjs +155 -0
  121. package/dist/handlerErrors.cjs +9 -0
  122. package/dist/handlerErrors.mjs +9 -0
  123. package/dist/handlerParameters.cjs +39 -0
  124. package/dist/handlerParameters.mjs +34 -0
  125. package/dist/handlerReleaseCatalogRoutes.cjs +111 -0
  126. package/dist/handlerReleaseCatalogRoutes.mjs +110 -0
  127. package/dist/handlerReleaseManagementRoutes.cjs +125 -0
  128. package/dist/handlerReleaseManagementRoutes.mjs +124 -0
  129. package/dist/handlerTypes.d.cts +63 -0
  130. package/dist/handlerTypes.d.mts +63 -0
  131. package/dist/handlerVersionRoutes.cjs +10 -0
  132. package/dist/handlerVersionRoutes.d.cts +4 -0
  133. package/dist/handlerVersionRoutes.d.mts +4 -0
  134. package/dist/handlerVersionRoutes.mjs +9 -0
  135. package/dist/index.cjs +10 -1
  136. package/dist/index.d.cts +9 -3
  137. package/dist/index.d.mts +9 -3
  138. package/dist/index.mjs +5 -2
  139. package/dist/node.cjs +19 -12
  140. package/dist/node.d.cts +15 -10
  141. package/dist/node.d.mts +15 -10
  142. package/dist/node.mjs +19 -13
  143. package/dist/package.cjs +1 -1
  144. package/dist/package.mjs +1 -1
  145. package/dist/schema/dsl.cjs +19 -2
  146. package/dist/schema/dsl.mjs +17 -3
  147. package/dist/schema/index.cjs +1 -8
  148. package/dist/schema/index.mjs +2 -8
  149. package/dist/schema/types.cjs +3 -1
  150. package/dist/schema/types.mjs +3 -2
  151. package/dist/schema/v1_0_0.cjs +364 -0
  152. package/dist/schema/v1_0_0.mjs +357 -0
  153. package/dist/storageAccess.cjs +69 -25
  154. package/dist/storageAccess.mjs +68 -25
  155. package/dist/types/index.d.cts +4 -3
  156. package/dist/types/index.d.mts +5 -4
  157. package/package.json +8 -7
  158. package/src/adapters/databaseConstraintErrors.ts +25 -0
  159. package/src/adapters/databasePluginTestDatabase.ts +106 -0
  160. package/src/adapters/databasePluginUtils.spec.ts +29 -0
  161. package/src/adapters/databasePluginUtils.ts +214 -0
  162. package/src/adapters/drizzle.spec.ts +208 -47
  163. package/src/adapters/drizzle.ts +106 -293
  164. package/src/adapters/drizzleCrud.ts +419 -0
  165. package/src/adapters/drizzleLazyDB.ts +206 -100
  166. package/src/adapters/drizzleQuery.ts +164 -0
  167. package/src/adapters/kysely.spec.ts +126 -88
  168. package/src/adapters/kysely.ts +76 -334
  169. package/src/adapters/kyselyCrud.ts +588 -0
  170. package/src/adapters/kyselyQuery.ts +128 -0
  171. package/src/adapters/mongodb.spec.ts +141 -0
  172. package/src/adapters/mongodb.ts +60 -288
  173. package/src/adapters/mongodbCollections.ts +62 -0
  174. package/src/adapters/mongodbQuery.ts +226 -0
  175. package/src/adapters/mongodbReads.ts +311 -0
  176. package/src/adapters/mongodbRows.spec.ts +64 -0
  177. package/src/adapters/mongodbRows.ts +118 -0
  178. package/src/adapters/mongodbTestClient.ts +342 -0
  179. package/src/adapters/mongodbTestFilter.ts +166 -0
  180. package/src/adapters/mongodbWrites.ts +260 -0
  181. package/src/adapters/prisma.spec.ts +196 -0
  182. package/src/adapters/prisma.ts +417 -292
  183. package/src/adapters/prismaQuery.ts +129 -0
  184. package/src/adapters/prismaRows.spec.ts +98 -0
  185. package/src/adapters/prismaRows.ts +301 -0
  186. package/src/adapters/prismaTestClient.ts +396 -0
  187. package/src/analytics/analytics.integration.spec.ts +144 -0
  188. package/src/analytics/bounded/activeOverview.spec.ts +189 -0
  189. package/src/analytics/bounded/activeOverview.ts +148 -0
  190. package/src/analytics/bounded/installationSearch.spec.ts +130 -0
  191. package/src/analytics/bounded/installationSearch.ts +69 -0
  192. package/src/analytics/bounded/persistence.ts +43 -0
  193. package/src/analytics/bounded/provider.spec.ts +219 -0
  194. package/src/analytics/bounded/provider.ts +229 -0
  195. package/src/analytics/bounded/scan.ts +235 -0
  196. package/src/analytics/domain.ts +139 -0
  197. package/src/analytics/errors.ts +18 -0
  198. package/src/analytics/eventInput.ts +168 -0
  199. package/src/analytics/persistence.ts +10 -0
  200. package/src/analytics/queryInput.ts +102 -0
  201. package/src/analytics/routes.ts +123 -0
  202. package/src/analytics/types.ts +44 -0
  203. package/src/apiKeys.integration.spec.ts +192 -0
  204. package/src/apiKeys.spec.ts +162 -0
  205. package/src/apiKeys.ts +220 -0
  206. package/src/createHotUpdaterCore.ts +164 -100
  207. package/src/db/bundleRows.spec.ts +164 -0
  208. package/src/db/bundleRows.ts +10 -140
  209. package/src/db/createBundleDiff.spec.ts +172 -127
  210. package/src/db/createBundleDiff.ts +91 -110
  211. package/src/db/databasePluginCore.spec.ts +62 -0
  212. package/src/db/databasePluginCore.testFixtures.ts +76 -0
  213. package/src/db/databasePluginCore.ts +185 -0
  214. package/src/db/databasePluginUpdateCheck.bench.ts +107 -0
  215. package/src/db/fixedMigrator.spec.ts +184 -42
  216. package/src/db/fixedMigrator.ts +64 -205
  217. package/src/db/fixedMigratorMongo.spec.ts +192 -0
  218. package/src/db/fixedMigratorMongo.ts +425 -0
  219. package/src/db/fixedMigratorShared.ts +36 -0
  220. package/src/db/hotUpdaterSchema.ts +0 -1
  221. package/src/db/index.spec.ts +333 -1025
  222. package/src/db/mongoMigrationExecution.ts +23 -0
  223. package/src/db/node-sqlite.d.ts +25 -0
  224. package/src/db/releaseCatalog.ts +148 -0
  225. package/src/db/schema/mongodb.ts +20 -6
  226. package/src/db/schema/sql.ts +52 -11
  227. package/src/db/schema/sqlOperations.ts +5 -4
  228. package/src/db/schemaGenerators.ts +107 -23
  229. package/src/db/schemaReadiness.ts +2 -1
  230. package/src/db/sqlMigrationExecution.spec.ts +65 -0
  231. package/src/db/sqlMigrationExecution.ts +108 -0
  232. package/src/db/types.spec.ts +55 -0
  233. package/src/db/types.ts +129 -65
  234. package/src/db/updateArtifacts.spec.ts +359 -0
  235. package/src/db/updateArtifacts.ts +290 -126
  236. package/src/handler-standalone.integration.spec.ts +401 -364
  237. package/src/handler.spec.ts +137 -582
  238. package/src/handler.testFixtures.ts +30 -0
  239. package/src/handler.ts +218 -616
  240. package/src/handlerAuth.integration.spec.ts +33 -0
  241. package/src/handlerBundleRoutes.ts +259 -0
  242. package/src/handlerErrors.ts +7 -0
  243. package/src/handlerManagement.spec.ts +262 -0
  244. package/src/handlerParameters.ts +105 -0
  245. package/src/handlerReleaseCatalogRoutes.ts +154 -0
  246. package/src/handlerReleaseManagementRoutes.ts +213 -0
  247. package/src/handlerTypes.ts +96 -0
  248. package/src/handlerVersionRoutes.ts +12 -0
  249. package/src/index.ts +22 -2
  250. package/src/node.spec.ts +79 -10
  251. package/src/node.ts +20 -17
  252. package/src/releaseCatalogRoutes.integration.spec.ts +238 -0
  253. package/src/runtime.spec.ts +126 -959
  254. package/src/runtime.testFixtures.ts +71 -0
  255. package/src/schema/dsl-all-versions.spec.ts +26 -17
  256. package/src/schema/dsl.ts +41 -2
  257. package/src/schema/index.ts +3 -9
  258. package/src/schema/types.ts +9 -3
  259. package/src/schema/v1_0_0.spec.ts +146 -0
  260. package/src/schema/v1_0_0.ts +465 -0
  261. package/src/storageAccess.spec.ts +127 -32
  262. package/src/storageAccess.ts +106 -55
  263. package/src/types/index.ts +2 -1
  264. package/dist/db/bundleRows.cjs +0 -82
  265. package/dist/db/bundleRows.d.cts +0 -33
  266. package/dist/db/bundleRows.d.mts +0 -33
  267. package/dist/db/bundleRows.mjs +0 -79
  268. package/dist/db/pluginCore.cjs +0 -242
  269. package/dist/db/pluginCore.mjs +0 -241
  270. package/dist/db/schema/sqlMigrations.cjs +0 -74
  271. package/dist/db/schema/sqlMigrations.mjs +0 -73
  272. package/dist/db/schemaEnhancements.cjs +0 -20
  273. package/dist/db/schemaEnhancements.mjs +0 -19
  274. package/dist/route.cjs +0 -7
  275. package/dist/route.mjs +0 -7
  276. package/dist/schema/v0_21_0.cjs +0 -38
  277. package/dist/schema/v0_21_0.mjs +0 -37
  278. package/dist/schema/v0_29_0.cjs +0 -45
  279. package/dist/schema/v0_29_0.mjs +0 -44
  280. package/dist/schema/v0_31_0.cjs +0 -82
  281. package/dist/schema/v0_31_0.mjs +0 -80
  282. package/src/db/pluginCore.spec.ts +0 -1095
  283. package/src/db/pluginCore.ts +0 -475
  284. package/src/db/pluginUpdateCheck.bench.ts +0 -254
  285. package/src/db/schema/sqlMigrations.ts +0 -219
  286. package/src/db/schemaEnhancements.ts +0 -55
  287. package/src/route.ts +0 -7
  288. package/src/schema/v0_21_0.ts +0 -52
  289. package/src/schema/v0_29_0.ts +0 -62
  290. package/src/schema/v0_31_0.spec.ts +0 -73
  291. package/src/schema/v0_31_0.ts +0 -120
@@ -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 = [...table.columns.map((column) => sqlColumnDefinition(table, column, provider)), ...inlineSqlChecks(table, provider)];
65
- return `create table if not exists ${table.ormName} (\n${lines.join(",\n")}\n)`;
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;
@@ -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 = [...table.columns.map((column) => sqlColumnDefinition(table, column, provider)), ...inlineSqlChecks(table, provider)];
65
- return `create table if not exists ${table.ormName} (\n${lines.join(",\n")}\n)`;
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, createTableStatement, hotUpdaterCreateTableOperations, sqlColumnDefinition };
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 ('version', '${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 ('version', '${require_types.HOT_UPDATER_SCHEMA_VERSION}') on conflict (key) do update set value = '${require_types.HOT_UPDATER_SCHEMA_VERSION}'`;
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 ('version', '${HOT_UPDATER_SCHEMA_VERSION}') on duplicate key update value = '${HOT_UPDATER_SCHEMA_VERSION}'`;
7
- return `insert into ${HOT_UPDATER_SETTINGS_TABLE} (key, value) values ('version', '${HOT_UPDATER_SCHEMA_VERSION}') on conflict (key) do update set value = '${HOT_UPDATER_SCHEMA_VERSION}'`;
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 " @db.VarChar(255)";
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.startsWith("varchar")) return " @db.VarChar(255)";
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} ${relation.referencedTable === table.ormName ? "bundle_patches" : relation.referencedTable}[] @relation(${literal(relation.relationName)})`);
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
- lines.push(`${relation.targetFieldName} ${targetType === "Bundles" ? "bundles" : relation.referencedTable} @relation(${literal(relation.relationName)}, fields: [${relation.columns.join(", ")}], references: [${relation.referencedColumns.join(", ")}], onUpdate: Restrict, onDelete: Cascade)`);
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) => `@@index([${index.columns.join(", ")}], map: ${literal(index.name)})`);
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: 255 })`,
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: 255 })`,
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: 255 })`,
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 ".default({})";
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: [${foreignKey.referencedTable}.${foreignKey.referencedColumns.join(`, ${foreignKey.referencedTable}.`)}],
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
- imports.add("index");
175
- callbacks.push(`index(${literal(index.name)}).on(${index.columns.map((column) => `table.${column}`).join(", ")})`);
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
- if (!table.relations || table.relations.length === 0) return void 0;
186
- const lines = table.relations.map((relation) => ` ${relation.targetFieldName}: one(${relation.referencedTable}, {
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
- return `export const ${table.ormName}Relations = relations(${table.ormName}, ({ one }) => ({
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 " @db.VarChar(255)";
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.startsWith("varchar")) return " @db.VarChar(255)";
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} ${relation.referencedTable === table.ormName ? "bundle_patches" : relation.referencedTable}[] @relation(${literal(relation.relationName)})`);
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
- lines.push(`${relation.targetFieldName} ${targetType === "Bundles" ? "bundles" : relation.referencedTable} @relation(${literal(relation.relationName)}, fields: [${relation.columns.join(", ")}], references: [${relation.referencedColumns.join(", ")}], onUpdate: Restrict, onDelete: Cascade)`);
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) => `@@index([${index.columns.join(", ")}], map: ${literal(index.name)})`);
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: 255 })`,
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: 255 })`,
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: 255 })`,
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 ".default({})";
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: [${foreignKey.referencedTable}.${foreignKey.referencedColumns.join(`, ${foreignKey.referencedTable}.`)}],
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
- imports.add("index");
175
- callbacks.push(`index(${literal(index.name)}).on(${index.columns.map((column) => `table.${column}`).join(", ")})`);
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
- if (!table.relations || table.relations.length === 0) return void 0;
186
- const lines = table.relations.map((relation) => ` ${relation.targetFieldName}: one(${relation.referencedTable}, {
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
- return `export const ${table.ormName}Relations = relations(${table.ormName}, ({ one }) => ({
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
- const require_types = require("../schema/types.cjs");
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.` : `Hot Updater database schema version ${currentVersion} is not supported by ${adapterName}. Run \`hot-updater db migrate\` to upgrade to ${require_types.HOT_UPDATER_SCHEMA_VERSION}.`);
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.31.0") throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version);
18
+ if (version !== "1.0.0") throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version);
18
19
  ready = true;
19
20
  };
20
21
  };