velocious 1.0.431 → 1.0.433

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 (794) hide show
  1. package/build/application.js +229 -0
  2. package/build/authorization/ability.js +329 -0
  3. package/build/authorization/base-resource.js +143 -0
  4. package/build/background-jobs/client.js +50 -0
  5. package/build/background-jobs/cron-expression.js +277 -0
  6. package/build/background-jobs/forked-runner-child.js +86 -0
  7. package/build/background-jobs/job-record.js +13 -0
  8. package/build/background-jobs/job-registry.js +92 -0
  9. package/build/background-jobs/job-runner.js +107 -0
  10. package/build/background-jobs/job.js +77 -0
  11. package/build/background-jobs/json-socket.js +78 -0
  12. package/build/background-jobs/main.js +926 -0
  13. package/build/background-jobs/normalize-error.js +26 -0
  14. package/build/background-jobs/scheduler.js +274 -0
  15. package/build/background-jobs/socket-request.js +68 -0
  16. package/build/background-jobs/status-reporter.js +101 -0
  17. package/build/background-jobs/store.js +994 -0
  18. package/build/background-jobs/types.js +70 -0
  19. package/build/background-jobs/web/authorization.js +89 -0
  20. package/build/background-jobs/web/controller.js +280 -0
  21. package/build/background-jobs/web/index.js +57 -0
  22. package/build/background-jobs/web/path-matcher.js +74 -0
  23. package/build/background-jobs/web/registry.js +49 -0
  24. package/build/background-jobs/worker.js +683 -0
  25. package/build/beacon/client.js +330 -0
  26. package/build/beacon/in-process-broker.js +71 -0
  27. package/build/beacon/in-process-client.js +139 -0
  28. package/build/beacon/server.js +148 -0
  29. package/build/beacon/types.js +55 -0
  30. package/build/cli/base-command.js +67 -0
  31. package/build/cli/browser-cli.js +45 -0
  32. package/build/cli/commands/background-jobs-main.js +7 -0
  33. package/build/cli/commands/background-jobs-runner.js +7 -0
  34. package/build/cli/commands/background-jobs-worker.js +7 -0
  35. package/build/cli/commands/beacon.js +7 -0
  36. package/build/cli/commands/console.js +12 -0
  37. package/build/cli/commands/db/base-command.js +82 -0
  38. package/build/cli/commands/db/create.js +64 -0
  39. package/build/cli/commands/db/drop.js +75 -0
  40. package/build/cli/commands/db/migrate.js +17 -0
  41. package/build/cli/commands/db/reset.js +22 -0
  42. package/build/cli/commands/db/rollback.js +15 -0
  43. package/build/cli/commands/db/schema/dump.js +12 -0
  44. package/build/cli/commands/db/schema/load.js +12 -0
  45. package/build/cli/commands/db/seed.js +12 -0
  46. package/build/cli/commands/db/tenants/check.js +38 -0
  47. package/build/cli/commands/db/tenants/create.js +33 -0
  48. package/build/cli/commands/db/tenants/migrate.js +49 -0
  49. package/build/cli/commands/destroy/migration.js +7 -0
  50. package/build/cli/commands/generate/base-models.js +7 -0
  51. package/build/cli/commands/generate/frontend-models.js +12 -0
  52. package/build/cli/commands/generate/migration.js +7 -0
  53. package/build/cli/commands/generate/model.js +7 -0
  54. package/build/cli/commands/init.js +11 -0
  55. package/build/cli/commands/routes.js +7 -0
  56. package/build/cli/commands/run-script.js +12 -0
  57. package/build/cli/commands/runner.js +12 -0
  58. package/build/cli/commands/server.js +7 -0
  59. package/build/cli/commands/test.js +9 -0
  60. package/build/cli/index.js +152 -0
  61. package/build/cli/tenant-database-command-helper.js +198 -0
  62. package/build/cli/use-browser-cli.js +30 -0
  63. package/build/configuration-resolver.js +65 -0
  64. package/build/configuration-types.js +429 -0
  65. package/build/configuration.js +2590 -0
  66. package/build/controller.js +421 -0
  67. package/build/current-configuration.js +31 -0
  68. package/build/current.js +80 -0
  69. package/build/database/annotations-async-hooks.js +47 -0
  70. package/build/database/annotations.js +40 -0
  71. package/build/database/drivers/base-column.js +182 -0
  72. package/build/database/drivers/base-columns-index.js +81 -0
  73. package/build/database/drivers/base-foreign-key.js +104 -0
  74. package/build/database/drivers/base-table.js +156 -0
  75. package/build/database/drivers/base.js +1609 -0
  76. package/build/database/drivers/mssql/column.js +74 -0
  77. package/build/database/drivers/mssql/columns-index.js +6 -0
  78. package/build/database/drivers/mssql/connect-connection.js +16 -0
  79. package/build/database/drivers/mssql/foreign-key.js +12 -0
  80. package/build/database/drivers/mssql/index.js +590 -0
  81. package/build/database/drivers/mssql/options.js +79 -0
  82. package/build/database/drivers/mssql/query-parser.js +6 -0
  83. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  84. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  85. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  87. package/build/database/drivers/mssql/sql/delete.js +19 -0
  88. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  89. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  90. package/build/database/drivers/mssql/sql/insert.js +4 -0
  91. package/build/database/drivers/mssql/sql/update.js +31 -0
  92. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  93. package/build/database/drivers/mssql/structure-sql.js +120 -0
  94. package/build/database/drivers/mssql/table.js +145 -0
  95. package/build/database/drivers/mysql/column.js +112 -0
  96. package/build/database/drivers/mysql/columns-index.js +22 -0
  97. package/build/database/drivers/mysql/foreign-key.js +12 -0
  98. package/build/database/drivers/mysql/index.js +473 -0
  99. package/build/database/drivers/mysql/options.js +34 -0
  100. package/build/database/drivers/mysql/query-parser.js +6 -0
  101. package/build/database/drivers/mysql/query.js +37 -0
  102. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  103. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  104. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  106. package/build/database/drivers/mysql/sql/delete.js +21 -0
  107. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  108. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  109. package/build/database/drivers/mysql/sql/insert.js +6 -0
  110. package/build/database/drivers/mysql/sql/update.js +33 -0
  111. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  112. package/build/database/drivers/mysql/structure-sql.js +93 -0
  113. package/build/database/drivers/mysql/table.js +121 -0
  114. package/build/database/drivers/pgsql/column.js +90 -0
  115. package/build/database/drivers/pgsql/columns-index.js +6 -0
  116. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  117. package/build/database/drivers/pgsql/index.js +441 -0
  118. package/build/database/drivers/pgsql/options.js +32 -0
  119. package/build/database/drivers/pgsql/query-parser.js +6 -0
  120. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  121. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  122. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  124. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  125. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  126. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  127. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  128. package/build/database/drivers/pgsql/sql/update.js +33 -0
  129. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  130. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  131. package/build/database/drivers/pgsql/table.js +135 -0
  132. package/build/database/drivers/sqlite/base.js +509 -0
  133. package/build/database/drivers/sqlite/column.js +75 -0
  134. package/build/database/drivers/sqlite/columns-index.js +30 -0
  135. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  136. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  137. package/build/database/drivers/sqlite/index.js +394 -0
  138. package/build/database/drivers/sqlite/index.native.js +72 -0
  139. package/build/database/drivers/sqlite/index.web.js +99 -0
  140. package/build/database/drivers/sqlite/options.js +32 -0
  141. package/build/database/drivers/sqlite/query-parser.js +6 -0
  142. package/build/database/drivers/sqlite/query.js +35 -0
  143. package/build/database/drivers/sqlite/query.native.js +35 -0
  144. package/build/database/drivers/sqlite/query.web.js +49 -0
  145. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  146. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  147. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  148. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  149. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  151. package/build/database/drivers/sqlite/sql/update.js +33 -0
  152. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  153. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  154. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  155. package/build/database/drivers/sqlite/table.js +131 -0
  156. package/build/database/drivers/structure-sql/utils.js +35 -0
  157. package/build/database/handler.js +13 -0
  158. package/build/database/initializer-from-require-context.js +101 -0
  159. package/build/database/migration/index.js +438 -0
  160. package/build/database/migrator/files-finder.js +55 -0
  161. package/build/database/migrator/types.js +31 -0
  162. package/build/database/migrator.js +557 -0
  163. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  164. package/build/database/pool/base-methods-forward.js +52 -0
  165. package/build/database/pool/base.js +380 -0
  166. package/build/database/pool/single-multi-use.js +118 -0
  167. package/build/database/query/alter-table-base.js +104 -0
  168. package/build/database/query/base.js +49 -0
  169. package/build/database/query/create-database-base.js +42 -0
  170. package/build/database/query/create-index-base.js +117 -0
  171. package/build/database/query/create-table-base.js +205 -0
  172. package/build/database/query/delete-base.js +19 -0
  173. package/build/database/query/drop-database-base.js +38 -0
  174. package/build/database/query/drop-table-base.js +58 -0
  175. package/build/database/query/from-base.js +36 -0
  176. package/build/database/query/from-plain.js +16 -0
  177. package/build/database/query/from-table.js +18 -0
  178. package/build/database/query/index.js +533 -0
  179. package/build/database/query/insert-base.js +172 -0
  180. package/build/database/query/join-base.js +43 -0
  181. package/build/database/query/join-object.js +167 -0
  182. package/build/database/query/join-plain.js +18 -0
  183. package/build/database/query/join-tracker.js +93 -0
  184. package/build/database/query/model-class-query.js +1577 -0
  185. package/build/database/query/order-base.js +33 -0
  186. package/build/database/query/order-column.js +77 -0
  187. package/build/database/query/order-plain.js +28 -0
  188. package/build/database/query/preloader/belongs-to.js +267 -0
  189. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  190. package/build/database/query/preloader/has-many.js +316 -0
  191. package/build/database/query/preloader/has-one.js +123 -0
  192. package/build/database/query/preloader/selection.js +152 -0
  193. package/build/database/query/preloader.js +201 -0
  194. package/build/database/query/query-data.js +305 -0
  195. package/build/database/query/select-base.js +30 -0
  196. package/build/database/query/select-plain.js +18 -0
  197. package/build/database/query/select-table-and-column.js +28 -0
  198. package/build/database/query/update-base.js +41 -0
  199. package/build/database/query/upsert-base.js +103 -0
  200. package/build/database/query/where-base.js +38 -0
  201. package/build/database/query/where-combinator.js +31 -0
  202. package/build/database/query/where-hash.js +77 -0
  203. package/build/database/query/where-model-class-hash.js +505 -0
  204. package/build/database/query/where-not.js +23 -0
  205. package/build/database/query/where-plain.js +20 -0
  206. package/build/database/query/with-count.js +219 -0
  207. package/build/database/query-parser/base-query-parser.js +40 -0
  208. package/build/database/query-parser/from-parser.js +49 -0
  209. package/build/database/query-parser/group-parser.js +55 -0
  210. package/build/database/query-parser/joins-parser.js +37 -0
  211. package/build/database/query-parser/limit-parser.js +77 -0
  212. package/build/database/query-parser/options.js +94 -0
  213. package/build/database/query-parser/order-parser.js +45 -0
  214. package/build/database/query-parser/select-parser.js +67 -0
  215. package/build/database/query-parser/where-parser.js +46 -0
  216. package/build/database/record/acts-as-list.js +374 -0
  217. package/build/database/record/attachments/download.js +49 -0
  218. package/build/database/record/attachments/handle.js +188 -0
  219. package/build/database/record/attachments/normalize-input.js +213 -0
  220. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  221. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  222. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  223. package/build/database/record/attachments/store.js +591 -0
  224. package/build/database/record/index.js +4119 -0
  225. package/build/database/record/instance-relationships/base.js +289 -0
  226. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  227. package/build/database/record/instance-relationships/has-many.js +284 -0
  228. package/build/database/record/instance-relationships/has-one.js +117 -0
  229. package/build/database/record/record-not-found-error.js +3 -0
  230. package/build/database/record/relationships/base.js +195 -0
  231. package/build/database/record/relationships/belongs-to.js +57 -0
  232. package/build/database/record/relationships/has-many.js +46 -0
  233. package/build/database/record/relationships/has-one.js +46 -0
  234. package/build/database/record/state-machine.js +278 -0
  235. package/build/database/record/user-module.js +43 -0
  236. package/build/database/record/validators/base.js +27 -0
  237. package/build/database/record/validators/format.js +50 -0
  238. package/build/database/record/validators/presence.js +24 -0
  239. package/build/database/record/validators/uniqueness.js +124 -0
  240. package/build/database/table-data/index.js +241 -0
  241. package/build/database/table-data/table-column.js +416 -0
  242. package/build/database/table-data/table-foreign-key.js +69 -0
  243. package/build/database/table-data/table-index.js +46 -0
  244. package/build/database/table-data/table-reference.js +13 -0
  245. package/build/database/use-database.js +48 -0
  246. package/build/environment-handlers/base.js +561 -0
  247. package/build/environment-handlers/browser.js +338 -0
  248. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  249. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  251. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  252. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  253. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  254. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  255. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  256. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  257. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  258. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  259. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  260. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  261. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  262. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  263. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  264. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  265. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  266. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  267. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  268. package/build/environment-handlers/node.js +887 -0
  269. package/build/error-logger.js +30 -0
  270. package/build/frontend-model-controller.js +3491 -0
  271. package/build/frontend-model-resource/base-resource.js +939 -0
  272. package/build/frontend-models/base.js +4004 -0
  273. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  274. package/build/frontend-models/event-hook-models.js +49 -0
  275. package/build/frontend-models/model-registry.js +28 -0
  276. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  277. package/build/frontend-models/preloader.js +169 -0
  278. package/build/frontend-models/query.js +2245 -0
  279. package/build/frontend-models/resource-config-validation.js +56 -0
  280. package/build/frontend-models/resource-definition.js +399 -0
  281. package/build/frontend-models/transport-serialization.js +369 -0
  282. package/build/frontend-models/use-created-event.js +21 -0
  283. package/build/frontend-models/use-destroyed-event.js +148 -0
  284. package/build/frontend-models/use-model-class-event.js +164 -0
  285. package/build/frontend-models/use-updated-event.js +152 -0
  286. package/build/frontend-models/websocket-channel.js +494 -0
  287. package/build/frontend-models/websocket-publishers.js +224 -0
  288. package/build/http-client/header.js +17 -0
  289. package/build/http-client/index.js +139 -0
  290. package/build/http-client/request.js +94 -0
  291. package/build/http-client/response.js +151 -0
  292. package/build/http-client/websocket-client.js +27 -0
  293. package/build/http-server/client/index.js +507 -0
  294. package/build/http-server/client/params-to-object.js +152 -0
  295. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  296. package/build/http-server/client/request-buffer/header.js +19 -0
  297. package/build/http-server/client/request-buffer/index.js +535 -0
  298. package/build/http-server/client/request-parser.js +195 -0
  299. package/build/http-server/client/request-runner.js +321 -0
  300. package/build/http-server/client/request-timing.js +171 -0
  301. package/build/http-server/client/request.js +114 -0
  302. package/build/http-server/client/response.js +251 -0
  303. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  304. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  305. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  306. package/build/http-server/client/websocket-request.js +147 -0
  307. package/build/http-server/client/websocket-session.js +1755 -0
  308. package/build/http-server/cookie.js +245 -0
  309. package/build/http-server/development-reloader.js +240 -0
  310. package/build/http-server/index.js +561 -0
  311. package/build/http-server/remote-address.js +77 -0
  312. package/build/http-server/server-client.js +222 -0
  313. package/build/http-server/server-lock.js +178 -0
  314. package/build/http-server/websocket-channel-subscribers.js +110 -0
  315. package/build/http-server/websocket-channel.js +137 -0
  316. package/build/http-server/websocket-connection.js +118 -0
  317. package/build/http-server/websocket-event-log-store.js +433 -0
  318. package/build/http-server/websocket-events-host.js +170 -0
  319. package/build/http-server/websocket-events.js +50 -0
  320. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  321. package/build/http-server/worker-handler/in-process.js +155 -0
  322. package/build/http-server/worker-handler/index.js +370 -0
  323. package/build/http-server/worker-handler/worker-script.js +6 -0
  324. package/build/http-server/worker-handler/worker-thread.js +286 -0
  325. package/build/initializer.js +39 -0
  326. package/build/jobs/mail-delivery.js +22 -0
  327. package/build/logger/base-logger.js +34 -0
  328. package/build/logger/console-logger.js +28 -0
  329. package/build/logger/file-logger.js +36 -0
  330. package/build/logger/outputs/array-output.js +50 -0
  331. package/build/logger/outputs/console-output.js +32 -0
  332. package/build/logger/outputs/file-output.js +55 -0
  333. package/build/logger/outputs/stdout-output.js +64 -0
  334. package/build/logger.js +507 -0
  335. package/build/mailer/backends/smtp.js +197 -0
  336. package/build/mailer/base.js +337 -0
  337. package/build/mailer/delivery.js +70 -0
  338. package/build/mailer/index.js +24 -0
  339. package/build/mailer.js +15 -0
  340. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  341. package/build/plugins/sqljs-wasm-route.js +71 -0
  342. package/build/record-payload-values.js +83 -0
  343. package/build/routes/app-routes.js +17 -0
  344. package/build/routes/base-route.js +133 -0
  345. package/build/routes/basic-route.js +109 -0
  346. package/build/routes/built-in/debug/controller.js +12 -0
  347. package/build/routes/built-in/errors/controller.js +7 -0
  348. package/build/routes/get-route.js +75 -0
  349. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  350. package/build/routes/index.js +50 -0
  351. package/build/routes/namespace-route.js +51 -0
  352. package/build/routes/plugin-routes.js +141 -0
  353. package/build/routes/post-route.js +74 -0
  354. package/build/routes/resolver.js +535 -0
  355. package/build/routes/resource-route.js +154 -0
  356. package/build/routes/root-route.js +11 -0
  357. package/build/src/application.js +187 -214
  358. package/build/src/authorization/ability.js +250 -297
  359. package/build/src/authorization/base-resource.js +120 -136
  360. package/build/src/background-jobs/client.js +43 -47
  361. package/build/src/background-jobs/cron-expression.js +127 -166
  362. package/build/src/background-jobs/forked-runner-child.js +37 -47
  363. package/build/src/background-jobs/job-record.js +8 -10
  364. package/build/src/background-jobs/job-registry.js +72 -84
  365. package/build/src/background-jobs/job-runner.js +74 -81
  366. package/build/src/background-jobs/job.js +62 -72
  367. package/build/src/background-jobs/json-socket.js +65 -70
  368. package/build/src/background-jobs/main.js +841 -900
  369. package/build/src/background-jobs/normalize-error.js +12 -11
  370. package/build/src/background-jobs/scheduler.js +205 -247
  371. package/build/src/background-jobs/socket-request.js +60 -65
  372. package/build/src/background-jobs/status-reporter.js +86 -96
  373. package/build/src/background-jobs/store.js +862 -980
  374. package/build/src/background-jobs/types.js +2 -3
  375. package/build/src/background-jobs/web/authorization.js +38 -50
  376. package/build/src/background-jobs/web/controller.js +232 -268
  377. package/build/src/background-jobs/web/index.js +36 -40
  378. package/build/src/background-jobs/web/path-matcher.js +45 -48
  379. package/build/src/background-jobs/web/registry.js +9 -14
  380. package/build/src/background-jobs/worker.js +585 -639
  381. package/build/src/beacon/client.js +264 -293
  382. package/build/src/beacon/in-process-broker.js +20 -25
  383. package/build/src/beacon/in-process-client.js +104 -116
  384. package/build/src/beacon/server.js +110 -126
  385. package/build/src/beacon/types.js +2 -8
  386. package/build/src/cli/base-command.js +49 -57
  387. package/build/src/cli/browser-cli.js +37 -42
  388. package/build/src/cli/commands/background-jobs-main.js +5 -5
  389. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  390. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  391. package/build/src/cli/commands/beacon.js +5 -5
  392. package/build/src/cli/commands/console.js +10 -10
  393. package/build/src/cli/commands/db/base-command.js +71 -76
  394. package/build/src/cli/commands/db/create.js +53 -61
  395. package/build/src/cli/commands/db/drop.js +62 -71
  396. package/build/src/cli/commands/db/migrate.js +13 -15
  397. package/build/src/cli/commands/db/reset.js +16 -19
  398. package/build/src/cli/commands/db/rollback.js +12 -13
  399. package/build/src/cli/commands/db/schema/dump.js +9 -9
  400. package/build/src/cli/commands/db/schema/load.js +9 -9
  401. package/build/src/cli/commands/db/seed.js +9 -9
  402. package/build/src/cli/commands/db/tenants/check.js +32 -35
  403. package/build/src/cli/commands/db/tenants/create.js +26 -29
  404. package/build/src/cli/commands/db/tenants/migrate.js +40 -44
  405. package/build/src/cli/commands/destroy/migration.js +5 -5
  406. package/build/src/cli/commands/generate/base-models.js +5 -5
  407. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  408. package/build/src/cli/commands/generate/migration.js +5 -5
  409. package/build/src/cli/commands/generate/model.js +5 -5
  410. package/build/src/cli/commands/init.js +7 -9
  411. package/build/src/cli/commands/routes.js +6 -6
  412. package/build/src/cli/commands/run-script.js +9 -9
  413. package/build/src/cli/commands/runner.js +9 -9
  414. package/build/src/cli/commands/server.js +6 -6
  415. package/build/src/cli/commands/test.js +6 -7
  416. package/build/src/cli/index.js +127 -141
  417. package/build/src/cli/tenant-database-command-helper.js +154 -185
  418. package/build/src/cli/use-browser-cli.js +15 -20
  419. package/build/src/configuration-resolver.js +47 -54
  420. package/build/src/configuration-types.d.ts +5 -3
  421. package/build/src/configuration-types.d.ts.map +1 -1
  422. package/build/src/configuration-types.js +3 -54
  423. package/build/src/configuration.js +2240 -2547
  424. package/build/src/controller.js +363 -407
  425. package/build/src/current-configuration.js +9 -12
  426. package/build/src/current.js +70 -75
  427. package/build/src/database/annotations-async-hooks.js +16 -22
  428. package/build/src/database/annotations.js +12 -18
  429. package/build/src/database/drivers/base-column.js +155 -179
  430. package/build/src/database/drivers/base-columns-index.js +69 -78
  431. package/build/src/database/drivers/base-foreign-key.js +89 -101
  432. package/build/src/database/drivers/base-table.js +124 -149
  433. package/build/src/database/drivers/base.js +1306 -1489
  434. package/build/src/database/drivers/mssql/column.js +39 -50
  435. package/build/src/database/drivers/mssql/columns-index.js +2 -3
  436. package/build/src/database/drivers/mssql/connect-connection.js +11 -9
  437. package/build/src/database/drivers/mssql/foreign-key.js +8 -9
  438. package/build/src/database/drivers/mssql/index.js +507 -587
  439. package/build/src/database/drivers/mssql/options.js +68 -75
  440. package/build/src/database/drivers/mssql/query-parser.js +2 -3
  441. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  442. package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
  443. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  444. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  445. package/build/src/database/drivers/mssql/sql/delete.js +14 -16
  446. package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
  447. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  448. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  449. package/build/src/database/drivers/mssql/sql/update.js +24 -28
  450. package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
  451. package/build/src/database/drivers/mssql/structure-sql.js +102 -114
  452. package/build/src/database/drivers/mssql/table.js +81 -96
  453. package/build/src/database/drivers/mysql/column.js +75 -92
  454. package/build/src/database/drivers/mysql/columns-index.js +16 -19
  455. package/build/src/database/drivers/mysql/foreign-key.js +8 -9
  456. package/build/src/database/drivers/mysql/index.js +396 -457
  457. package/build/src/database/drivers/mysql/options.js +26 -30
  458. package/build/src/database/drivers/mysql/query-parser.js +2 -3
  459. package/build/src/database/drivers/mysql/query.js +26 -29
  460. package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
  461. package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
  462. package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
  463. package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
  464. package/build/src/database/drivers/mysql/sql/delete.js +14 -17
  465. package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
  466. package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
  467. package/build/src/database/drivers/mysql/sql/insert.js +2 -3
  468. package/build/src/database/drivers/mysql/sql/update.js +24 -29
  469. package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
  470. package/build/src/database/drivers/mysql/structure-sql.js +79 -88
  471. package/build/src/database/drivers/mysql/table.js +83 -98
  472. package/build/src/database/drivers/pgsql/column.js +56 -72
  473. package/build/src/database/drivers/pgsql/columns-index.js +2 -3
  474. package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
  475. package/build/src/database/drivers/pgsql/index.js +377 -438
  476. package/build/src/database/drivers/pgsql/options.js +25 -28
  477. package/build/src/database/drivers/pgsql/query-parser.js +2 -3
  478. package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
  479. package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
  480. package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
  481. package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
  482. package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
  483. package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
  484. package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
  485. package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
  486. package/build/src/database/drivers/pgsql/sql/update.js +24 -29
  487. package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
  488. package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
  489. package/build/src/database/drivers/pgsql/table.js +60 -77
  490. package/build/src/database/drivers/sqlite/base.js +405 -478
  491. package/build/src/database/drivers/sqlite/column.js +54 -69
  492. package/build/src/database/drivers/sqlite/columns-index.js +22 -27
  493. package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
  494. package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
  495. package/build/src/database/drivers/sqlite/index.js +330 -373
  496. package/build/src/database/drivers/sqlite/index.native.js +55 -64
  497. package/build/src/database/drivers/sqlite/index.web.js +69 -87
  498. package/build/src/database/drivers/sqlite/options.js +25 -28
  499. package/build/src/database/drivers/sqlite/query-parser.js +2 -3
  500. package/build/src/database/drivers/sqlite/query.js +21 -24
  501. package/build/src/database/drivers/sqlite/query.native.js +20 -25
  502. package/build/src/database/drivers/sqlite/query.web.js +30 -37
  503. package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
  504. package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
  505. package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
  506. package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
  507. package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
  508. package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
  509. package/build/src/database/drivers/sqlite/sql/update.js +24 -29
  510. package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
  511. package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
  512. package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
  513. package/build/src/database/drivers/sqlite/table.js +102 -125
  514. package/build/src/database/drivers/structure-sql/utils.js +14 -17
  515. package/build/src/database/handler.js +9 -10
  516. package/build/src/database/initializer-from-require-context.js +76 -87
  517. package/build/src/database/migration/index.js +332 -395
  518. package/build/src/database/migrator/files-finder.js +40 -50
  519. package/build/src/database/migrator/types.js +2 -30
  520. package/build/src/database/migrator.js +454 -526
  521. package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
  522. package/build/src/database/pool/base-methods-forward.js +40 -43
  523. package/build/src/database/pool/base.js +298 -343
  524. package/build/src/database/pool/single-multi-use.js +93 -110
  525. package/build/src/database/query/alter-table-base.js +84 -99
  526. package/build/src/database/query/base.js +39 -46
  527. package/build/src/database/query/create-database-base.js +25 -30
  528. package/build/src/database/query/create-index-base.js +75 -94
  529. package/build/src/database/query/create-table-base.js +151 -193
  530. package/build/src/database/query/delete-base.js +14 -16
  531. package/build/src/database/query/drop-database-base.js +23 -28
  532. package/build/src/database/query/drop-table-base.js +42 -53
  533. package/build/src/database/query/from-base.js +30 -33
  534. package/build/src/database/query/from-plain.js +11 -13
  535. package/build/src/database/query/from-table.js +13 -15
  536. package/build/src/database/query/index.js +410 -472
  537. package/build/src/database/query/insert-base.js +143 -164
  538. package/build/src/database/query/join-base.js +35 -40
  539. package/build/src/database/query/join-object.js +128 -153
  540. package/build/src/database/query/join-plain.js +13 -15
  541. package/build/src/database/query/join-tracker.js +76 -90
  542. package/build/src/database/query/model-class-query.js +1134 -1370
  543. package/build/src/database/query/order-base.js +27 -30
  544. package/build/src/database/query/order-column.js +44 -53
  545. package/build/src/database/query/order-plain.js +20 -24
  546. package/build/src/database/query/preloader/belongs-to.js +210 -258
  547. package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
  548. package/build/src/database/query/preloader/has-many.js +240 -301
  549. package/build/src/database/query/preloader/has-one.js +91 -117
  550. package/build/src/database/query/preloader/selection.js +117 -129
  551. package/build/src/database/query/preloader.js +160 -185
  552. package/build/src/database/query/query-data.js +157 -201
  553. package/build/src/database/query/select-base.js +25 -27
  554. package/build/src/database/query/select-plain.js +13 -15
  555. package/build/src/database/query/select-table-and-column.js +21 -25
  556. package/build/src/database/query/update-base.js +35 -38
  557. package/build/src/database/query/upsert-base.js +93 -100
  558. package/build/src/database/query/where-base.js +32 -35
  559. package/build/src/database/query/where-combinator.js +25 -28
  560. package/build/src/database/query/where-hash.js +61 -68
  561. package/build/src/database/query/where-model-class-hash.js +414 -469
  562. package/build/src/database/query/where-not.js +18 -20
  563. package/build/src/database/query/where-plain.js +15 -17
  564. package/build/src/database/query/with-count.js +125 -159
  565. package/build/src/database/query-parser/base-query-parser.js +32 -37
  566. package/build/src/database/query-parser/from-parser.js +36 -45
  567. package/build/src/database/query-parser/group-parser.js +42 -50
  568. package/build/src/database/query-parser/joins-parser.js +28 -33
  569. package/build/src/database/query-parser/limit-parser.js +67 -70
  570. package/build/src/database/query-parser/options.js +75 -82
  571. package/build/src/database/query-parser/order-parser.js +36 -40
  572. package/build/src/database/query-parser/select-parser.js +49 -60
  573. package/build/src/database/query-parser/where-parser.js +36 -41
  574. package/build/src/database/record/acts-as-list.js +235 -273
  575. package/build/src/database/record/attachments/download.js +44 -45
  576. package/build/src/database/record/attachments/handle.js +141 -161
  577. package/build/src/database/record/attachments/normalize-input.js +128 -138
  578. package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
  579. package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
  580. package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
  581. package/build/src/database/record/attachments/store.js +467 -539
  582. package/build/src/database/record/index.d.ts +109 -25
  583. package/build/src/database/record/index.d.ts.map +1 -1
  584. package/build/src/database/record/index.js +3502 -3898
  585. package/build/src/database/record/instance-relationships/base.js +234 -268
  586. package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
  587. package/build/src/database/record/instance-relationships/has-many.js +225 -264
  588. package/build/src/database/record/instance-relationships/has-one.js +85 -105
  589. package/build/src/database/record/record-not-found-error.js +3 -2
  590. package/build/src/database/record/relationships/base.js +144 -166
  591. package/build/src/database/record/relationships/belongs-to.js +44 -51
  592. package/build/src/database/record/relationships/has-many.js +32 -40
  593. package/build/src/database/record/relationships/has-one.js +32 -40
  594. package/build/src/database/record/state-machine.js +156 -208
  595. package/build/src/database/record/user-module.js +32 -38
  596. package/build/src/database/record/validators/base.js +22 -24
  597. package/build/src/database/record/validators/format.js +36 -46
  598. package/build/src/database/record/validators/presence.js +18 -20
  599. package/build/src/database/record/validators/uniqueness.js +99 -117
  600. package/build/src/database/table-data/index.js +199 -231
  601. package/build/src/database/table-data/table-column.js +338 -382
  602. package/build/src/database/table-data/table-foreign-key.js +57 -66
  603. package/build/src/database/table-data/table-index.js +29 -36
  604. package/build/src/database/table-data/table-reference.js +10 -10
  605. package/build/src/database/use-database.js +32 -40
  606. package/build/src/environment-handlers/base.js +484 -544
  607. package/build/src/environment-handlers/browser.js +241 -294
  608. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
  609. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
  610. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
  611. package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
  612. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
  613. package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
  614. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
  615. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
  616. package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
  617. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
  618. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  619. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  620. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +326 -358
  621. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
  622. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  623. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
  624. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
  625. package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
  626. package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
  627. package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
  628. package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
  629. package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
  630. package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
  631. package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
  632. package/build/src/environment-handlers/node.js +753 -874
  633. package/build/src/error-logger.js +22 -21
  634. package/build/src/frontend-model-controller.js +2791 -3291
  635. package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
  636. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  637. package/build/src/frontend-model-resource/base-resource.js +770 -865
  638. package/build/src/frontend-models/base.js +3136 -3593
  639. package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
  640. package/build/src/frontend-models/event-hook-models.js +16 -21
  641. package/build/src/frontend-models/model-registry.js +9 -11
  642. package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
  643. package/build/src/frontend-models/preloader.js +131 -149
  644. package/build/src/frontend-models/query.js +1557 -1855
  645. package/build/src/frontend-models/resource-config-validation.js +27 -37
  646. package/build/src/frontend-models/resource-definition.d.ts +6 -7
  647. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  648. package/build/src/frontend-models/resource-definition.js +237 -291
  649. package/build/src/frontend-models/transport-serialization.js +203 -266
  650. package/build/src/frontend-models/use-created-event.js +5 -7
  651. package/build/src/frontend-models/use-destroyed-event.js +80 -93
  652. package/build/src/frontend-models/use-model-class-event.js +79 -91
  653. package/build/src/frontend-models/use-updated-event.js +84 -97
  654. package/build/src/frontend-models/websocket-channel.js +381 -441
  655. package/build/src/frontend-models/websocket-publishers.js +142 -175
  656. package/build/src/http-client/header.js +13 -14
  657. package/build/src/http-client/index.js +116 -132
  658. package/build/src/http-client/request.js +71 -87
  659. package/build/src/http-client/response.js +122 -140
  660. package/build/src/http-client/websocket-client.js +15 -17
  661. package/build/src/http-server/client/index.js +409 -465
  662. package/build/src/http-server/client/params-to-object.js +124 -135
  663. package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
  664. package/build/src/http-server/client/request-buffer/header.js +15 -16
  665. package/build/src/http-server/client/request-buffer/index.js +446 -506
  666. package/build/src/http-server/client/request-parser.js +163 -186
  667. package/build/src/http-server/client/request-runner.js +226 -259
  668. package/build/src/http-server/client/request-timing.js +132 -151
  669. package/build/src/http-server/client/request.js +96 -108
  670. package/build/src/http-server/client/response.js +213 -235
  671. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
  672. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
  673. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  674. package/build/src/http-server/client/websocket-request.js +114 -137
  675. package/build/src/http-server/client/websocket-session.js +1452 -1657
  676. package/build/src/http-server/cookie.js +216 -236
  677. package/build/src/http-server/development-reloader.js +190 -221
  678. package/build/src/http-server/index.js +451 -525
  679. package/build/src/http-server/remote-address.js +38 -50
  680. package/build/src/http-server/server-client.js +181 -208
  681. package/build/src/http-server/server-lock.js +153 -167
  682. package/build/src/http-server/websocket-channel-subscribers.js +81 -93
  683. package/build/src/http-server/websocket-channel.js +104 -117
  684. package/build/src/http-server/websocket-connection.js +96 -104
  685. package/build/src/http-server/websocket-event-log-store.js +350 -404
  686. package/build/src/http-server/websocket-events-host.js +145 -164
  687. package/build/src/http-server/websocket-events.js +47 -47
  688. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
  689. package/build/src/http-server/worker-handler/in-process.js +123 -141
  690. package/build/src/http-server/worker-handler/index.js +313 -349
  691. package/build/src/http-server/worker-handler/worker-script.js +4 -5
  692. package/build/src/http-server/worker-handler/worker-thread.js +240 -269
  693. package/build/src/initializer.js +31 -36
  694. package/build/src/jobs/mail-delivery.js +13 -15
  695. package/build/src/logger/base-logger.js +24 -26
  696. package/build/src/logger/console-logger.js +21 -23
  697. package/build/src/logger/file-logger.js +29 -31
  698. package/build/src/logger/outputs/array-output.js +37 -42
  699. package/build/src/logger/outputs/console-output.js +20 -24
  700. package/build/src/logger/outputs/file-output.js +43 -48
  701. package/build/src/logger/outputs/stdout-output.js +39 -48
  702. package/build/src/logger.js +338 -394
  703. package/build/src/mailer/backends/smtp.js +134 -163
  704. package/build/src/mailer/base.js +211 -251
  705. package/build/src/mailer/delivery.js +56 -64
  706. package/build/src/mailer/index.js +4 -22
  707. package/build/src/mailer.js +4 -13
  708. package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
  709. package/build/src/plugins/sqljs-wasm-route.js +28 -38
  710. package/build/src/record-payload-values.js +25 -28
  711. package/build/src/routes/app-routes.js +12 -14
  712. package/build/src/routes/base-route.js +112 -130
  713. package/build/src/routes/basic-route.js +83 -102
  714. package/build/src/routes/built-in/debug/controller.js +10 -10
  715. package/build/src/routes/built-in/errors/controller.js +5 -5
  716. package/build/src/routes/get-route.js +50 -63
  717. package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
  718. package/build/src/routes/index.js +36 -43
  719. package/build/src/routes/namespace-route.js +38 -47
  720. package/build/src/routes/plugin-routes.js +107 -124
  721. package/build/src/routes/post-route.js +51 -62
  722. package/build/src/routes/resolver.js +422 -494
  723. package/build/src/routes/resource-route.js +124 -143
  724. package/build/src/routes/root-route.js +7 -8
  725. package/build/src/testing/base-expect.js +13 -14
  726. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
  727. package/build/src/testing/browser-test-app.js +23 -29
  728. package/build/src/testing/expect-to-change.js +41 -50
  729. package/build/src/testing/expect-utils.js +139 -184
  730. package/build/src/testing/expect.js +638 -731
  731. package/build/src/testing/request-client.js +70 -85
  732. package/build/src/testing/test-files-finder.js +285 -339
  733. package/build/src/testing/test-filter-parser.js +124 -155
  734. package/build/src/testing/test-runner.js +883 -1020
  735. package/build/src/testing/test-suite-splitter.js +114 -142
  736. package/build/src/testing/test.js +216 -256
  737. package/build/src/utils/backtrace-cleaner-node.js +62 -69
  738. package/build/src/utils/backtrace-cleaner.js +188 -216
  739. package/build/src/utils/ensure-error.js +7 -7
  740. package/build/src/utils/event-emitter.js +4 -6
  741. package/build/src/utils/file-exists.js +9 -10
  742. package/build/src/utils/format-value.js +67 -76
  743. package/build/src/utils/model-scope.js +27 -31
  744. package/build/src/utils/nest-callbacks.js +10 -13
  745. package/build/src/utils/plain-object.js +5 -6
  746. package/build/src/utils/ransack.js +448 -563
  747. package/build/src/utils/rest-args-error.js +5 -6
  748. package/build/src/utils/singularize-model-name.js +9 -11
  749. package/build/src/utils/split-sql-statements.js +68 -79
  750. package/build/src/utils/to-import-specifier.js +24 -30
  751. package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
  752. package/build/src/utils/with-tracked-stack.js +14 -18
  753. package/build/src/velocious-error.js +27 -30
  754. package/build/templates/configuration.js +61 -0
  755. package/build/templates/generate-migration.js +11 -0
  756. package/build/templates/generate-model.js +6 -0
  757. package/build/templates/routes.js +11 -0
  758. package/build/testing/base-expect.js +17 -0
  759. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  760. package/build/testing/browser-test-app.js +32 -0
  761. package/build/testing/expect-to-change.js +55 -0
  762. package/build/testing/expect-utils.js +269 -0
  763. package/build/testing/expect.js +763 -0
  764. package/build/testing/request-client.js +90 -0
  765. package/build/testing/test-files-finder.js +364 -0
  766. package/build/testing/test-filter-parser.js +198 -0
  767. package/build/testing/test-runner.js +1168 -0
  768. package/build/testing/test-suite-splitter.js +177 -0
  769. package/build/testing/test.js +370 -0
  770. package/build/utils/backtrace-cleaner-node.js +87 -0
  771. package/build/utils/backtrace-cleaner.js +266 -0
  772. package/build/utils/ensure-error.js +15 -0
  773. package/build/utils/event-emitter.js +8 -0
  774. package/build/utils/file-exists.js +18 -0
  775. package/build/utils/format-value.js +101 -0
  776. package/build/utils/model-scope.js +56 -0
  777. package/build/utils/nest-callbacks.js +22 -0
  778. package/build/utils/plain-object.js +14 -0
  779. package/build/utils/ransack.js +859 -0
  780. package/build/utils/rest-args-error.js +14 -0
  781. package/build/utils/singularize-model-name.js +18 -0
  782. package/build/utils/split-sql-statements.js +88 -0
  783. package/build/utils/to-import-specifier.js +53 -0
  784. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  785. package/build/utils/with-tracked-stack.js +38 -0
  786. package/build/velocious-error.js +34 -0
  787. package/package.json +3 -3
  788. package/src/configuration-types.js +1 -1
  789. package/src/database/record/index.js +174 -25
  790. package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
  791. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
  792. package/src/frontend-model-resource/base-resource.js +6 -2
  793. package/src/frontend-models/resource-definition.js +3 -3
  794. package/src/frontend-models/websocket-publishers.js +6 -6
@@ -0,0 +1,74 @@
1
+ // @ts-check
2
+
3
+ import BaseColumn from "../base-column.js"
4
+ import ColumnsIndex from "./columns-index.js"
5
+ import {digg} from "diggerize"
6
+
7
+ export default class VelociousDatabaseDriversMssqlColumn extends BaseColumn {
8
+ /**
9
+ * Runs constructor.
10
+ * @param {import("../base-table.js").default} table - Table.
11
+ * @param {Record<string, ?>} data - Data payload.
12
+ */
13
+ constructor(table, data) {
14
+ super()
15
+ this.data = data
16
+ this.table = table
17
+ }
18
+
19
+ getAutoIncrement() { return digg(this, "data", "isIdentity") === 1 }
20
+
21
+ async getIndexes() {
22
+ const options = this.getOptions()
23
+ const sql = `
24
+ SELECT
25
+ sys.tables.name AS TableName,
26
+ sys.columns.name AS ColumnName,
27
+ sys.indexes.name AS index_name,
28
+ sys.indexes.type_desc AS IndexType,
29
+ sys.index_columns.is_included_column AS IsIncludedColumn,
30
+ sys.indexes.is_unique,
31
+ sys.indexes.is_primary_key,
32
+ sys.indexes.is_unique_constraint
33
+ FROM sys.indexes
34
+ INNER JOIN sys.index_columns ON sys.indexes.object_id = sys.index_columns.object_id AND sys.indexes.index_id = sys.index_columns.index_id
35
+ INNER JOIN sys.columns ON sys.index_columns.object_id = sys.columns.object_id AND sys.index_columns.column_id = sys.columns.column_id
36
+ INNER JOIN sys.tables ON sys.indexes.object_id = sys.tables.object_id
37
+ WHERE
38
+ sys.tables.name = ${options.quote(this.getTable().getName())} AND
39
+ sys.columns.name = ${options.quote(this.getName())}
40
+ ORDER BY
41
+ sys.indexes.name,
42
+ sys.index_columns.key_ordinal
43
+ `
44
+
45
+ const rows = await this.getDriver().query(sql)
46
+ const indexes = []
47
+
48
+ for (const row of rows) {
49
+ const index = new ColumnsIndex(this.getTable(), row)
50
+
51
+ indexes.push(index)
52
+ }
53
+
54
+ return indexes
55
+ }
56
+
57
+ getDefault() { return digg(this, "data", "COLUMN_DEFAULT") }
58
+ getMaxLength() { return digg(this, "data", "CHARACTER_MAXIMUM_LENGTH") }
59
+ getName() { return digg(this, "data", "COLUMN_NAME") }
60
+
61
+ getNull() {
62
+ const nullValue = digg(this, "data", "IS_NULLABLE")
63
+
64
+ if (nullValue == "NO") {
65
+ return false
66
+ } else {
67
+ return true
68
+ }
69
+ }
70
+
71
+ getPrimaryKey() { return digg(this, "data", "isIdentity") === 1 }
72
+ getType() { return digg(this, "data", "DATA_TYPE") }
73
+ }
74
+
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ import BaseColumnsIndex from "../base-columns-index.js"
4
+
5
+ export default class VelociousDatabaseDriversMssqlColumnsIndex extends BaseColumnsIndex {
6
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Connect a MSSQL connection instance.
3
+ * @param {import("mssql").Connection} connection - MSSQL connection instance.
4
+ * @returns {Promise<void>} - Resolves when the connection is established.
5
+ */
6
+ export default function connectConnection(connection) {
7
+ return new Promise((resolve, reject) => {
8
+ connection.connect((error) => {
9
+ if (error) {
10
+ reject(error)
11
+ } else {
12
+ resolve()
13
+ }
14
+ })
15
+ })
16
+ }
@@ -0,0 +1,12 @@
1
+ // @ts-check
2
+
3
+ import BaseForeignKey from "../base-foreign-key.js"
4
+ import {digg} from "diggerize"
5
+
6
+ export default class VelociousDatabaseDriversMssqlForeignKey extends BaseForeignKey {
7
+ getColumnName() { return digg(this, "data", "ParentColumn") }
8
+ getName() { return digg(this, "data", "CONSTRAINT_NAME") }
9
+ getTableName() { return digg(this, "data", "TableName") }
10
+ getReferencedColumnName() { return digg(this, "data", "ReferencedColumn") }
11
+ getReferencedTableName() { return digg(this, "data", "ReferencedTable") }
12
+ }
@@ -0,0 +1,590 @@
1
+ // @ts-check
2
+
3
+ import AlterTable from "./sql/alter-table.js"
4
+ import Base from "../base.js"
5
+ import CreateDatabase from "./sql/create-database.js"
6
+ import CreateIndex from "./sql/create-index.js"
7
+ import CreateTable from "./sql/create-table.js"
8
+ import Delete from "./sql/delete.js"
9
+ import DropDatabase from "./sql/drop-database.js"
10
+ import DropTable from "./sql/drop-table.js"
11
+ import {digg} from "diggerize"
12
+ import escapeString from "sql-escape-string"
13
+ import Insert from "./sql/insert.js"
14
+ import Options from "./options.js"
15
+ import mssql from "mssql"
16
+ import net from "node:net"
17
+ import QueryParser from "./query-parser.js"
18
+ import Table from "./table.js"
19
+ import StructureSql from "./structure-sql.js"
20
+ import timeout from "awaitery/build/timeout.js"
21
+ import Upsert from "./sql/upsert.js"
22
+ import Update from "./sql/update.js"
23
+ import UUID from "pure-uuid"
24
+
25
+ export default class VelociousDatabaseDriversMssql extends Base{
26
+ async connect() {
27
+ const args = this.getArgs()
28
+ const sqlConfig = digg(args, "sqlConfig")
29
+
30
+ try {
31
+ if (this.connection) await this.close()
32
+
33
+ if (sqlConfig?.server && !sqlConfig.options?.serverName && net.isIP(sqlConfig.server)) {
34
+ sqlConfig.options = Object.assign({}, sqlConfig.options, {serverName: ""})
35
+ }
36
+
37
+ this.connection = new mssql.ConnectionPool(sqlConfig)
38
+ await this.connection.connect()
39
+ } catch (error) {
40
+ // Re-throw to fix unuseable stack trace.
41
+ throw new Error(`Couldn't connect to database: ${error instanceof Error ? error.message : error}`, {cause: error})
42
+ }
43
+ }
44
+
45
+ async close() {
46
+ if (!this.connection) return
47
+
48
+ const connection = this.connection
49
+ this.connection = undefined
50
+ this._currentTransaction = null
51
+ this._transactionsCount = 0
52
+
53
+ try {
54
+ await timeout({timeout: 2000}, () => connection.close())
55
+ } catch (error) {
56
+ this.logger.warn("Failed to close MSSQL connection cleanly", {error})
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Runs alter table sqls.
62
+ * @param {import("../../table-data/index.js").default} tableData - Table data.
63
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
64
+ */
65
+ async alterTableSQLs(tableData) {
66
+ const alterArgs = {tableData, driver: this}
67
+ const alterTable = new AlterTable(alterArgs)
68
+
69
+ return await alterTable.toSQLs()
70
+ }
71
+
72
+ /**
73
+ * Runs create database sql.
74
+ * @param {string} databaseName - Database name.
75
+ * @param {object} [args] - Options object.
76
+ * @param {boolean} [args.ifNotExists] - Whether if not exists.
77
+ * @returns {string[]} - SQL statements.
78
+ */
79
+ createDatabaseSql(databaseName, args) {
80
+ const createArgs = Object.assign({databaseName, driver: this}, args)
81
+ const createDatabase = new CreateDatabase(createArgs)
82
+
83
+ return createDatabase.toSql()
84
+ }
85
+
86
+ /**
87
+ * Runs drop database sql.
88
+ * @param {string} databaseName - Database name.
89
+ * @param {object} [args] - Options object.
90
+ * @param {boolean} [args.ifExists] - Whether if exists.
91
+ * @returns {string[]} - SQL statements.
92
+ */
93
+ dropDatabaseSql(databaseName, args) {
94
+ const dropArgs = Object.assign({databaseName, driver: this}, args)
95
+ const dropDatabase = new DropDatabase(dropArgs)
96
+
97
+ return dropDatabase.toSql()
98
+ }
99
+
100
+ /**
101
+ * Runs create index sqls.
102
+ * @param {import("../base.js").CreateIndexSqlArgs} indexData - Index data.
103
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
104
+ */
105
+ async createIndexSQLs(indexData) {
106
+ const createArgs = Object.assign({driver: this}, indexData)
107
+ const createIndex = new CreateIndex(createArgs)
108
+
109
+ return await createIndex.toSQLs()
110
+ }
111
+
112
+ /**
113
+ * Runs create table sql.
114
+ * @param {import("../../table-data/index.js").default} tableData - Table data.
115
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
116
+ */
117
+ async createTableSql(tableData) {
118
+ const createArgs = {tableData, driver: this, indexInCreateTable: false}
119
+ const createTable = new CreateTable(createArgs)
120
+
121
+ return await createTable.toSql()
122
+ }
123
+
124
+ /**
125
+ * Runs current database.
126
+ * @returns {Promise<string>} - Resolves with the current database.
127
+ */
128
+ async currentDatabase() {
129
+ const rows = await this.query("SELECT DB_NAME() AS db_name")
130
+
131
+ return digg(rows, 0, "db_name")
132
+ }
133
+
134
+ async disableForeignKeys() {
135
+ await this.query("EXEC sp_MSforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT all\"")
136
+ }
137
+
138
+ async enableForeignKeys() {
139
+ await this.query("EXEC sp_MSforeachtable @command1=\"print '?'\", @command2=\"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all\"")
140
+ }
141
+
142
+ /**
143
+ * Runs drop table sqls.
144
+ * @param {string} tableName - Table name.
145
+ * @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
146
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
147
+ */
148
+ async dropTableSQLs(tableName, args = {}) {
149
+ const dropArgs = Object.assign({tableName, driver: this}, args)
150
+ const dropTable = new DropTable(dropArgs)
151
+
152
+ return await dropTable.toSQLs()
153
+ }
154
+
155
+ /**
156
+ * Drops the foreign key constraints that reference the given table. MSSQL
157
+ * refuses to drop a table that is still referenced by a FOREIGN KEY
158
+ * constraint even when constraints are disabled via NOCHECK, so the
159
+ * referencing constraints must be removed before the table can be dropped.
160
+ * This lets callers drop tables in any order (e.g. wiping a whole schema)
161
+ * without first dropping every dependent table.
162
+ * @param {string} tableName - Table name.
163
+ * @returns {Promise<void>} - Resolves when complete.
164
+ */
165
+ async _dropReferencingForeignKeys(tableName) {
166
+ const rows = await this.query(
167
+ "SELECT fk.name AS constraint_name, OBJECT_NAME(fk.parent_object_id) AS parent_table " +
168
+ `FROM sys.foreign_keys fk WHERE fk.referenced_object_id = OBJECT_ID(${this.quote(tableName)})`
169
+ )
170
+
171
+ for (const row of rows) {
172
+ const constraintName = row.constraint_name ?? row.CONSTRAINT_NAME
173
+ const parentTable = row.parent_table ?? row.PARENT_TABLE
174
+
175
+ await this.query(`ALTER TABLE [${parentTable}] DROP CONSTRAINT [${constraintName}]`)
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Runs drop table.
181
+ * @param {string} tableName - Table name.
182
+ * @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
183
+ * @returns {Promise<void>} - Resolves when complete.
184
+ */
185
+ async dropTable(tableName, args = {}) {
186
+ this._assertNotReadOnly()
187
+ await this._dropReferencingForeignKeys(tableName)
188
+
189
+ const sqls = await this.dropTableSQLs(tableName, args)
190
+
191
+ for (const sql of sqls) {
192
+ await this.query(sql)
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Runs get type.
198
+ * @returns {string} - The type.
199
+ */
200
+ getType() { return "mssql" }
201
+
202
+ /**
203
+ * Runs primary key type.
204
+ * @returns {string} - The primary key type.
205
+ */
206
+ primaryKeyType() { return "bigint" }
207
+
208
+ /**
209
+ * Runs query actual.
210
+ * @param {string} sql - SQL string.
211
+ * @returns {Promise<import("../base.js").QueryResultType>} - Resolves with the query actual.
212
+ */
213
+ async _queryActual(sql) {
214
+ let result
215
+ let tries = 0
216
+
217
+ while (true) {
218
+ tries++
219
+
220
+ try {
221
+ const request = this._currentTransaction
222
+ ? new mssql.Request(this._currentTransaction)
223
+ : new mssql.Request(this.connection)
224
+ result = await request.query(sql)
225
+ break
226
+ } catch (error) {
227
+ if (error instanceof Error && error.message == "No connection is specified for that request." && tries <= 3) {
228
+ this.logger.warn("Reconnecting to database")
229
+ await this.reconnect()
230
+ // Retry
231
+ } else if (error instanceof Error) {
232
+ // Re-throw error because the stack-trace is broken and can't be used for app-development.
233
+ throw new Error(`Query failed '${error.message}': ${sql}`, {cause: error})
234
+ } else {
235
+ throw new Error(`Query failed '${error}': ${sql}`, {cause: error})
236
+ }
237
+ }
238
+ }
239
+
240
+ return Array.isArray(result.recordsets) ? result.recordsets[0] || [] : []
241
+ }
242
+
243
+ /**
244
+ * Runs query to sql.
245
+ * @param {import("../../query/index.js").default} query - Query instance.
246
+ * @returns {string} - SQL string.
247
+ */
248
+ queryToSql(query) { return new QueryParser({query}).toSql() }
249
+
250
+ shouldSetAutoIncrementWhenPrimaryKey() { return true }
251
+ supportsDefaultPrimaryKeyUUID() { return true }
252
+
253
+ /**
254
+ * Runs escape.
255
+ * @param {?} value - Value to use.
256
+ * @returns {string} - The escape.
257
+ */
258
+ escape(value) {
259
+ value = this._convertValue(value)
260
+ const stringValue = typeof value == "string" ? value : `${value}`
261
+
262
+ const resultWithQuotes = escapeString(stringValue, null)
263
+ const result = resultWithQuotes.substring(1, resultWithQuotes.length - 1)
264
+
265
+ return result
266
+ }
267
+
268
+ /**
269
+ * Runs quote.
270
+ * @param {?} value - Value to use.
271
+ * @returns {string | number} - The quoted value.
272
+ */
273
+ quote(value) {
274
+ value = this._convertValue(value)
275
+
276
+ if (typeof value == "number") return value
277
+ const stringValue = typeof value == "string" ? value : String(value)
278
+
279
+ return `N${escapeString(stringValue, null)}`
280
+ }
281
+
282
+ /**
283
+ * Runs quote column.
284
+ * @param {string} columnName - Column name.
285
+ * @returns {string} - The quote column.
286
+ */
287
+ quoteColumn(columnName) { return this.options().quoteColumnName(columnName) }
288
+
289
+ /**
290
+ * Runs quote table.
291
+ * @param {string} string - String.
292
+ * @returns {string} - The quote table.
293
+ */
294
+ quoteTable(string) { return this.options().quoteTableName(string) }
295
+
296
+ /**
297
+ * Runs rename column.
298
+ * @param {string} tableName - Table name.
299
+ * @param {string} oldColumnName - Previous column name.
300
+ * @param {string} newColumnName - New column name.
301
+ * @returns {Promise<void>} - Resolves when complete.
302
+ */
303
+ async renameColumn(tableName, oldColumnName, newColumnName) {
304
+ await this.query(`EXEC sp_rename ${this.quote(`${tableName}.${oldColumnName}`)}, ${this.quote(newColumnName)}, 'COLUMN'`)
305
+ }
306
+
307
+ /**
308
+ * Runs delete sql.
309
+ * @param {import("../base.js").DeleteSqlArgsType} args - Options object.
310
+ * @returns {string} - SQL string.
311
+ */
312
+ deleteSql({tableName, conditions}) {
313
+ const deleteInstruction = new Delete({conditions, driver: this, tableName})
314
+
315
+ return deleteInstruction.toSql()
316
+ }
317
+
318
+ /**
319
+ * Runs insert sql.
320
+ * @abstract
321
+ * @param {import("../base.js").InsertSqlArgsType} args - Options object.
322
+ * @returns {string} - SQL string.
323
+ */
324
+ insertSql(args) {
325
+ const insertArgs = Object.assign({driver: this}, args)
326
+ const insert = new Insert(insertArgs)
327
+
328
+ return insert.toSql()
329
+ }
330
+
331
+ /**
332
+ * Runs get tables.
333
+ * @returns {Promise<Array<import("../base-table.js").default>>} - Resolves with the tables.
334
+ */
335
+ async getTables() {
336
+ return await this._cachedSchemaMetadata("tables", async () => {
337
+ const schema = this.getArgs()?.schema || this.getArgs()?.sqlConfig?.options?.schema
338
+ const schemaClause = schema
339
+ ? ` AND [TABLE_SCHEMA] = ${this.quote(schema)}`
340
+ : " AND [TABLE_SCHEMA] = SCHEMA_NAME()"
341
+ const result = await this.query(`SELECT [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_CATALOG] = DB_NAME()${schemaClause}`)
342
+ const tables = []
343
+
344
+ for (const row of result) {
345
+ const table = new Table(this, /**
346
+ * Narrows the runtime value to the documented type.
347
+ @type {Record<string, string>} */ (row))
348
+
349
+ tables.push(table)
350
+ }
351
+
352
+ return tables
353
+ })
354
+ }
355
+
356
+ async lastInsertID() {
357
+ const result = await this.query("SELECT SCOPE_IDENTITY() AS last_insert_id")
358
+ const lastInsertID = digg(result, 0, "last_insert_id")
359
+
360
+ if (lastInsertID === null) throw new Error("Couldn't get the last inserted ID")
361
+
362
+ return lastInsertID
363
+ }
364
+
365
+ /**
366
+ * Runs options.
367
+ * @returns {Options} - The options options.
368
+ */
369
+ options() {
370
+ if (!this._options) this._options = new Options({driver: this})
371
+
372
+ return this._options
373
+ }
374
+
375
+ async _startTransactionAction() {
376
+ if (this._currentTransaction) throw new Error("A transaction is already running")
377
+ if (!this.connection) await this.connect()
378
+
379
+ this._currentTransaction = new mssql.Transaction(this.connection)
380
+
381
+ try {
382
+ await this._currentTransaction.begin()
383
+ } catch (error) {
384
+ this._currentTransaction = null
385
+ throw error
386
+ }
387
+ }
388
+
389
+ async _commitTransactionAction() {
390
+ if (!this._currentTransaction) throw new Error("A transaction isn't running")
391
+
392
+ await this._currentTransaction.commit()
393
+ this._currentTransaction = null
394
+ }
395
+
396
+ async _rollbackTransactionAction() {
397
+ if (!this._currentTransaction) {
398
+ this.logger.debug("A transaction isn't running - ignoring because that can happen if something else has failed in the db")
399
+ return
400
+ }
401
+
402
+ try {
403
+ await this._currentTransaction.rollback()
404
+ } catch (transactionRollbackError) {
405
+ // When SQL Server has already aborted the transaction (e.g., a
406
+ // stale concurrent request triggered XACT_ABORT), the
407
+ // mssql.Transaction.rollback() call fails because the
408
+ // Transaction object is dead. Issue a raw ROLLBACK on the
409
+ // underlying connection to clear SQL Server's session-level
410
+ // aborted-transaction state so the connection is usable for the
411
+ // next BEGIN TRANSACTION.
412
+ this.logger.warn("Transaction.rollback() failed, clearing session state with raw ROLLBACK", {
413
+ error: transactionRollbackError instanceof Error ? transactionRollbackError.message : transactionRollbackError
414
+ })
415
+
416
+ const request = new mssql.Request(this.connection)
417
+
418
+ await request.query("IF @@TRANCOUNT > 0 ROLLBACK")
419
+ } finally {
420
+ this._currentTransaction = null
421
+ }
422
+ }
423
+
424
+ /**
425
+ * Runs start save point action.
426
+ * @param {string} savePointName - Save point name.
427
+ * @returns {Promise<void>} - Resolves when complete.
428
+ */
429
+ async _startSavePointAction(savePointName) {
430
+ await this.query(`SAVE TRANSACTION [${savePointName}]`)
431
+ }
432
+
433
+ /**
434
+ * Runs release save point action.
435
+ * @param {string} savePointName - Save point name.
436
+ * @returns {Promise<void>} - Resolves when complete.
437
+ */
438
+ async _releaseSavePointAction(savePointName) { // eslint-disable-line no-unused-vars
439
+ // Do nothing in MS-SQL.
440
+ }
441
+
442
+ /**
443
+ * Runs rollback save point action.
444
+ * @param {string} savePointName - Save point name.
445
+ * @returns {Promise<void>} - Resolves when complete.
446
+ */
447
+ async _rollbackSavePointAction(savePointName) {
448
+ try {
449
+ await this.query(`ROLLBACK TRANSACTION [${savePointName}]`)
450
+ } catch (error) {
451
+ const message = error instanceof Error ? error.message : `${error}`
452
+
453
+ // When XACT_ABORT kills the entire transaction, the savepoint
454
+ // no longer exists and the ROLLBACK TRANSACTION [name] fails.
455
+ // Issue a raw IF @@TRANCOUNT > 0 ROLLBACK to clear whatever
456
+ // session state remains, then let the error propagate so the
457
+ // outer transaction() call knows the transaction is dead.
458
+ if (message.includes("Transaction has not begun") || message.includes("Transaction has been aborted")) {
459
+ this.logger.debug("Savepoint rollback failed; transaction already dead, clearing session state")
460
+
461
+ const request = new mssql.Request(this.connection)
462
+
463
+ await request.query("IF @@TRANCOUNT > 0 ROLLBACK")
464
+
465
+ return
466
+ }
467
+
468
+ throw error
469
+ }
470
+ }
471
+
472
+ generateSavePointName() {
473
+ return `sp${new UUID(4).format().replaceAll("-", "")}`.substring(0, 32)
474
+ }
475
+
476
+ /**
477
+ * Runs update sql.
478
+ * @param {import("../base.js").UpdateSqlArgsType} args - Options object.
479
+ * @returns {string} - SQL string.
480
+ */
481
+ updateSql({conditions, data, tableName}) {
482
+ const update = new Update({conditions, data, driver: this, tableName})
483
+
484
+ return update.toSql()
485
+ }
486
+
487
+ /**
488
+ * Runs upsert sql.
489
+ * @param {import("../base.js").UpsertSqlArgsType} args - Options object.
490
+ * @returns {string} - SQL string.
491
+ */
492
+ upsertSql(args) {
493
+ const upsert = new Upsert({...args, driver: this})
494
+
495
+ return upsert.toSql()
496
+ }
497
+
498
+ /**
499
+ * Runs structure sql.
500
+ * @returns {Promise<string | null>} - Resolves with SQL string.
501
+ */
502
+ async structureSql() {
503
+ return await this._cachedSchemaMetadata("structureSql", async () => await new StructureSql({driver: this}).toSql())
504
+ }
505
+
506
+ /**
507
+ * Blocks until a SQL Server application lock is acquired on this
508
+ * connection via `sp_getapplock`. The Session lock owner scopes the lock
509
+ * to the current session, matching the connection-scoped semantics on
510
+ * MySQL and PostgreSQL.
511
+ *
512
+ * `sp_getapplock` returns 0 on immediate grant, 1 after waiting, and
513
+ * negative values on failure (timeout, deadlock, canceled, parameter
514
+ * error). We treat 0/1 as success and -1 (timeout) as a clean `false`;
515
+ * anything else throws.
516
+ * @param {string} name - Lock name.
517
+ * @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
518
+ * @returns {Promise<boolean>} - True if the lock was acquired, false if the timeout elapsed.
519
+ */
520
+ async acquireAdvisoryLock(name, {timeoutMs} = {}) {
521
+ const timeoutValue = typeof timeoutMs === "number" && timeoutMs >= 0 ? Math.ceil(timeoutMs) : -1
522
+ const rows = await this.query(
523
+ `DECLARE @velocious_advisory_lock_result INT; EXEC @velocious_advisory_lock_result = sp_getapplock @Resource = ${this.quote(name)}, @LockMode = 'Exclusive', @LockOwner = 'Session', @LockTimeout = ${timeoutValue}; SELECT @velocious_advisory_lock_result AS velocious_advisory_lock_result`
524
+ )
525
+ const result = Number(rows?.[0]?.velocious_advisory_lock_result)
526
+
527
+ if (result === 0 || result === 1) return true
528
+ if (result === -1) return false
529
+
530
+ throw new Error(`sp_getapplock returned ${result} for advisory lock ${JSON.stringify(name)} (see SQL Server documentation for sp_getapplock return codes)`)
531
+ }
532
+
533
+ /**
534
+ * Runs try acquire advisory lock.
535
+ * @param {string} name - Lock name.
536
+ * @returns {Promise<boolean>} - True if the lock was acquired, false if it was already held.
537
+ */
538
+ async tryAcquireAdvisoryLock(name) {
539
+ return await this.acquireAdvisoryLock(name, {timeoutMs: 0})
540
+ }
541
+
542
+ /**
543
+ * Runs release advisory lock.
544
+ * @param {string} name - Lock name.
545
+ * @returns {Promise<boolean>} - True if the lock was held by this session and has now been released.
546
+ */
547
+ async releaseAdvisoryLock(name) {
548
+ const rows = await this.query(
549
+ `DECLARE @velocious_advisory_lock_result INT; EXEC @velocious_advisory_lock_result = sp_releaseapplock @Resource = ${this.quote(name)}, @LockOwner = 'Session'; SELECT @velocious_advisory_lock_result AS velocious_advisory_lock_result`
550
+ )
551
+ const result = Number(rows?.[0]?.velocious_advisory_lock_result)
552
+
553
+ return result === 0
554
+ }
555
+
556
+ /**
557
+ * Returns true if any session currently holds the application lock.
558
+ *
559
+ * This combines two probes because neither is sufficient on its own:
560
+ * - `APPLOCK_MODE(..., 'Session')` only reports locks held by the
561
+ * **current** session, so it misses locks held by any other
562
+ * session and would return `NoLock` even under cross-session
563
+ * contention.
564
+ * - `APPLOCK_TEST(..., 'Exclusive', 'Session')` returns whether an
565
+ * Exclusive lock could be granted to *this* session right now. A
566
+ * return value of 0 means somebody else holds an incompatible
567
+ * lock; a value of 1 means it is either free **or** already held
568
+ * by us re-entrantly (which the `APPLOCK_MODE` check catches).
569
+ *
570
+ * The combined result is "held" iff we hold it ourselves or
571
+ * `APPLOCK_TEST` reports we cannot acquire it without waiting.
572
+ * @param {string} name - Lock name.
573
+ * @returns {Promise<boolean>} - True if any session currently holds the lock.
574
+ */
575
+ async isAdvisoryLockHeld(name) {
576
+ const rows = await this.query(
577
+ `SELECT ` +
578
+ `APPLOCK_MODE('public', ${this.quote(name)}, 'Session') AS velocious_advisory_self_mode, ` +
579
+ `APPLOCK_TEST('public', ${this.quote(name)}, 'Exclusive', 'Session') AS velocious_advisory_test_result`
580
+ )
581
+ const selfMode = rows?.[0]?.velocious_advisory_self_mode
582
+ const heldBySelf = typeof selfMode === "string" && selfMode.length > 0 && selfMode !== "NoLock"
583
+
584
+ if (heldBySelf) return true
585
+
586
+ const testResult = Number(rows?.[0]?.velocious_advisory_test_result)
587
+
588
+ return testResult === 0
589
+ }
590
+ }