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,70 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {"inline" | "forked" | "spawned"} BackgroundJobExecutionMode
5
+ */
6
+ /**
7
+ * @typedef {object} BackgroundJobOptions
8
+ * @property {BackgroundJobExecutionMode} [executionMode] - How the job should run. Defaults to `"forked"`.
9
+ * @property {boolean} [forked] - Compatibility alias: `false` maps to `"inline"` and `true` maps to `"forked"`.
10
+ * @property {number} [maxRetries] - Max retries for a failed job before it is marked failed.
11
+ */
12
+ /**
13
+ * @typedef {object} BackgroundJobPayload
14
+ * @property {string} [id] - Job id.
15
+ * @property {string} jobName - Job class name.
16
+ * @property {Array<?>} [args] - Serialized job arguments.
17
+ * @property {string} [workerId] - Worker id handling the job.
18
+ * @property {number} [handedOffAtMs] - Time handed to a worker in ms.
19
+ * @property {BackgroundJobOptions} [options] - Runtime options.
20
+ */
21
+ /**
22
+ * @typedef {object} BackgroundJobRow
23
+ * @property {string} id - Job id.
24
+ * @property {string} jobName - Job class name.
25
+ * @property {Array<?>} args - Serialized job arguments.
26
+ * @property {BackgroundJobExecutionMode} executionMode - How the job should run.
27
+ * @property {boolean} forked - Compatibility flag; true for non-inline execution.
28
+ * @property {string} status - Current job status.
29
+ * @property {number | null} attempts - Failure attempts count.
30
+ * @property {number | null} maxRetries - Max retry attempts.
31
+ * @property {number | null} scheduledAtMs - Next scheduled time in ms.
32
+ * @property {number | null} createdAtMs - Creation time in ms.
33
+ * @property {number | null} handedOffAtMs - Time handed to worker in ms.
34
+ * @property {number | null} completedAtMs - Completion time in ms.
35
+ * @property {number | null} failedAtMs - Failure time in ms.
36
+ * @property {number | null} orphanedAtMs - Orphaned time in ms.
37
+ * @property {string | null} workerId - Worker id handling the job.
38
+ * @property {string | null} lastError - Last failure message.
39
+ */
40
+ /**
41
+ * @typedef {object} BackgroundJobFailureEvent
42
+ * @property {BackgroundJobRow} job - Updated job row after failure handling.
43
+ * @property {?} error - Failure error.
44
+ * @property {number | null} attempts - Updated failure attempts count.
45
+ * @property {boolean} terminal - Whether this failure ended the job.
46
+ * @property {boolean} willRetry - Whether the job was returned to the queue.
47
+ * @property {number | undefined} handedOffAtMs - Handoff timestamp from the worker report.
48
+ * @property {string | undefined} workerId - Worker id from the worker report.
49
+ */
50
+ /**
51
+ * @typedef {"worker" | "client" | "reporter"} BackgroundJobSocketRole
52
+ */
53
+ /**
54
+ * @typedef {{type: "hello", role: BackgroundJobSocketRole, workerId?: string}} BackgroundJobHelloMessage
55
+ * @typedef {{type: "ready", acceptsForked?: boolean, acceptsInline?: boolean, acceptsSpawned?: boolean}} BackgroundJobReadyMessage
56
+ * @typedef {{type: "draining"}} BackgroundJobDrainingMessage
57
+ * @typedef {{type: "enqueue", jobName: string, args?: Array<?>, options?: BackgroundJobOptions}} BackgroundJobEnqueueMessage
58
+ * @typedef {{type: "enqueued", jobId: string}} BackgroundJobEnqueuedMessage
59
+ * @typedef {{type: "enqueue-error", error?: string}} BackgroundJobEnqueueErrorMessage
60
+ * @typedef {{type: "job", payload: BackgroundJobPayload}} BackgroundJobJobMessage
61
+ * @typedef {{type: "job-complete", jobId: string, workerId?: string, handedOffAtMs?: number}} BackgroundJobCompleteMessage
62
+ * @typedef {{type: "job-failed", jobId: string, error?: ?, workerId?: string, handedOffAtMs?: number}} BackgroundJobFailedMessage
63
+ * @typedef {{type: "job-updated", jobId: string}} BackgroundJobUpdatedMessage
64
+ * @typedef {{type: "job-update-error", jobId: string, error?: string}} BackgroundJobUpdateErrorMessage
65
+ */
66
+ /**
67
+ * @typedef {BackgroundJobHelloMessage | BackgroundJobReadyMessage | BackgroundJobDrainingMessage | BackgroundJobEnqueueMessage | BackgroundJobEnqueuedMessage | BackgroundJobEnqueueErrorMessage | BackgroundJobJobMessage | BackgroundJobCompleteMessage | BackgroundJobFailedMessage | BackgroundJobUpdatedMessage | BackgroundJobUpdateErrorMessage} BackgroundJobSocketMessage
68
+ */
69
+
70
+ export const nothing = {}
@@ -0,0 +1,89 @@
1
+ // @ts-check
2
+
3
+ import crypto from "node:crypto"
4
+
5
+ /**
6
+ * Constant-time comparison so token checks don't leak length/contents through
7
+ * timing. Returns false for differing lengths before the timing-safe compare.
8
+ * @param {string} a - First value.
9
+ * @param {string} b - Second value.
10
+ * @returns {boolean} - Whether the values are equal.
11
+ */
12
+ function safeEqual(a, b) {
13
+ const bufferA = Buffer.from(String(a))
14
+ const bufferB = Buffer.from(String(b))
15
+
16
+ if (bufferA.length !== bufferB.length) return false
17
+
18
+ return crypto.timingSafeEqual(bufferA, bufferB)
19
+ }
20
+
21
+ /**
22
+ * Runs bearer token.
23
+ * @param {import("../../http-server/client/request.js").default} request - Request object.
24
+ * @returns {string | null} - Bearer token from the Authorization header, if any.
25
+ */
26
+ function bearerToken(request) {
27
+ const header = request.header("authorization")
28
+
29
+ if (typeof header !== "string") return null
30
+
31
+ const match = header.match(/^Bearer\s+(.+)$/i)
32
+
33
+ return match ? match[1].trim() : null
34
+ }
35
+
36
+ /**
37
+ * Runs is loopback.
38
+ * @param {string | undefined} remoteAddress - Remote address.
39
+ * @returns {boolean} - Whether the address is loopback.
40
+ */
41
+ function isLoopback(remoteAddress) {
42
+ if (!remoteAddress) return false
43
+
44
+ return (
45
+ remoteAddress === "127.0.0.1" ||
46
+ remoteAddress === "::1" ||
47
+ remoteAddress === "::ffff:127.0.0.1" ||
48
+ remoteAddress.startsWith("127.")
49
+ )
50
+ }
51
+
52
+ /**
53
+ * Decides whether a jobs-dashboard request is authorized. Order of precedence:
54
+ * a matching bearer token, then the host-supplied `authorize` callback. When
55
+ * neither tokens nor an authorize callback are configured, access falls back to
56
+ * loopback-only so a freshly mounted dashboard is reachable on the same host
57
+ * during development without being exposed to the network.
58
+ * @param {object} args - Options.
59
+ * @param {import("./registry.js").JobsMountOptions} args.options - Mount options.
60
+ * @param {import("../../http-server/client/request.js").default} args.request - Request object.
61
+ * @param {import("../../configuration.js").default} args.configuration - Configuration instance.
62
+ * @param {import("../../authorization/ability.js").default | undefined} args.ability - Current ability.
63
+ * @returns {Promise<boolean>} - Whether the request is authorized.
64
+ */
65
+ export async function authorizeJobsRequest({ability, configuration, options, request}) {
66
+ const accessTokens = Array.isArray(options.accessTokens)
67
+ ? options.accessTokens.filter((token) => typeof token === "string" && token.length > 0)
68
+ : []
69
+ const authorize = typeof options.authorize === "function" ? options.authorize : null
70
+ const token = bearerToken(request)
71
+
72
+ if (accessTokens.length > 0 && token) {
73
+ for (const accessToken of accessTokens) {
74
+ if (safeEqual(token, accessToken)) return true
75
+ }
76
+ }
77
+
78
+ if (authorize) {
79
+ const result = await authorize({ability, configuration, request, token})
80
+
81
+ if (result === true) return true
82
+ }
83
+
84
+ if (accessTokens.length === 0 && !authorize) {
85
+ return isLoopback(request.remoteAddress())
86
+ }
87
+
88
+ return false
89
+ }
@@ -0,0 +1,280 @@
1
+ // @ts-check
2
+
3
+ import Controller from "../../controller.js"
4
+ import BackgroundJobsStore from "../store.js"
5
+ import {authorizeJobsRequest} from "./authorization.js"
6
+ import {getJobsMount} from "./registry.js"
7
+
8
+ const DASHBOARD_STATUSES = ["queued", "handed_off", "completed", "failed", "orphaned"]
9
+ const SORTABLE_KEYS = ["attempts", "completedAtMs", "createdAtMs", "failedAtMs", "handedOffAtMs", "scheduledAtMs"]
10
+ const DEFAULT_PER_PAGE = 25
11
+ const MAX_PER_PAGE = 100
12
+
13
+ /**
14
+ * Read-only HTTP API backing the background-jobs dashboard. Mounted by
15
+ * {@link import("./index.js").default} as a route-resolver hook so it can ship
16
+ * inside the velocious package. Every action is gated by {@link authorizeJobsRequest}.
17
+ */
18
+ export default class VelociousBackgroundJobsWebController extends Controller {
19
+ /**
20
+ * Runs mount options.
21
+ * @returns {import("./registry.js").JobsMountOptions} - Options for the mount that matched this request.
22
+ */
23
+ _mountOptions() {
24
+ const at = this.params().velociousJobsMountAt
25
+
26
+ return getJobsMount(this.getConfiguration(), at) || {}
27
+ }
28
+
29
+ /**
30
+ * Runs store.
31
+ * @returns {BackgroundJobsStore} - Jobs store scoped to the mount's database.
32
+ */
33
+ _store() {
34
+ if (!this._jobsStore) {
35
+ this._jobsStore = new BackgroundJobsStore({
36
+ configuration: this.getConfiguration(),
37
+ databaseIdentifier: this._mountOptions().databaseIdentifier
38
+ })
39
+ }
40
+
41
+ return this._jobsStore
42
+ }
43
+
44
+ /**
45
+ * Adds CORS headers when the request origin is allowed, so the standalone
46
+ * browser dashboard can read the API cross-origin.
47
+ * @param {import("./registry.js").JobsMountOptions} options - Mount options.
48
+ * @returns {void} - No return value.
49
+ */
50
+ _applyCorsHeaders(options) {
51
+ const allowedOrigins = Array.isArray(options.allowedOrigins) ? options.allowedOrigins : []
52
+
53
+ if (allowedOrigins.length === 0) return
54
+
55
+ const origin = this.request().origin()
56
+ const allowAll = allowedOrigins.includes("*")
57
+
58
+ if (!origin) return
59
+ if (!allowAll && !allowedOrigins.includes(origin)) return
60
+
61
+ const response = this.response()
62
+
63
+ response.setHeader("Access-Control-Allow-Origin", allowAll ? "*" : origin)
64
+ response.setHeader("Vary", "Origin")
65
+ response.setHeader("Access-Control-Allow-Headers", "authorization, content-type")
66
+ response.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS")
67
+ }
68
+
69
+ /**
70
+ * Applies CORS headers, authorizes the request, and runs the action body only
71
+ * when authorized. Renders a 401 otherwise. The base controller has no
72
+ * before-action halting, so authorization is enforced here per action.
73
+ * @param {() => Promise<void>} actionFn - Action body.
74
+ * @returns {Promise<void>} - Resolves when complete.
75
+ */
76
+ async _respond(actionFn) {
77
+ const options = this._mountOptions()
78
+
79
+ this._applyCorsHeaders(options)
80
+
81
+ const authorized = await authorizeJobsRequest({
82
+ ability: this.currentAbility(),
83
+ configuration: this.getConfiguration(),
84
+ options,
85
+ request: this.request()
86
+ })
87
+
88
+ if (!authorized) {
89
+ await this.render({json: {error: "unauthorized"}, status: 401})
90
+ return
91
+ }
92
+
93
+ await actionFn()
94
+ }
95
+
96
+ /**
97
+ * Runs health.
98
+ * @returns {Promise<void>} - Resolves when complete.
99
+ */
100
+ async health() {
101
+ await this._respond(async () => {
102
+ await this.render({json: {ok: true, service: "velocious-background-jobs"}})
103
+ })
104
+ }
105
+
106
+ /**
107
+ * Runs stats.
108
+ * @returns {Promise<void>} - Resolves when complete.
109
+ */
110
+ async stats() {
111
+ await this._respond(async () => {
112
+ const counts = await this._store().countsByStatus()
113
+ /**
114
+ * By status.
115
+ @type {Record<string, number>} */
116
+ const byStatus = {}
117
+ let total = 0
118
+
119
+ for (const status of DASHBOARD_STATUSES) {
120
+ byStatus[status] = counts[status] || 0
121
+ }
122
+
123
+ for (const value of Object.values(counts)) {
124
+ total += value
125
+ }
126
+
127
+ await this.render({json: {counts: byStatus, generatedAtMs: Date.now(), total}})
128
+ })
129
+ }
130
+
131
+ /**
132
+ * Runs index.
133
+ * @returns {Promise<void>} - Resolves when complete.
134
+ */
135
+ async index() {
136
+ await this._respond(async () => {
137
+ const params = this.params()
138
+ const status = this._sanitizeStatus(params.status)
139
+ const jobName = typeof params.jobName === "string" && params.jobName.length > 0 ? params.jobName : undefined
140
+ const page = this._positiveInt(params.page, 1)
141
+ const perPage = Math.min(this._positiveInt(params.perPage, DEFAULT_PER_PAGE), MAX_PER_PAGE)
142
+ const {sortColumn, sortDirection} = this._sanitizeSort(params.sort)
143
+ const store = this._store()
144
+ const jobs = await store.listJobs({jobName, limit: perPage, offset: (page - 1) * perPage, sortColumn, sortDirection, status})
145
+ const total = await store.countJobs({jobName, status})
146
+
147
+ await this.render({json: {
148
+ jobs: jobs.map((job) => this._serializeJob(job)),
149
+ pagination: {page, perPage, total, totalPages: perPage > 0 ? Math.ceil(total / perPage) : 0}
150
+ }})
151
+ })
152
+ }
153
+
154
+ /**
155
+ * Runs show.
156
+ * @returns {Promise<void>} - Resolves when complete.
157
+ */
158
+ async show() {
159
+ await this._respond(async () => {
160
+ const job = await this._store().getJob(this.params().id)
161
+
162
+ if (!job) {
163
+ await this.render({json: {error: "not_found"}, status: 404})
164
+ return
165
+ }
166
+
167
+ await this.render({json: {job: this._serializeJob(job)}})
168
+ })
169
+ }
170
+
171
+ /**
172
+ * Runs schedule.
173
+ * @returns {Promise<void>} - Resolves when complete.
174
+ */
175
+ async schedule() {
176
+ await this._respond(async () => {
177
+ const scheduled = await this.getConfiguration().getScheduledBackgroundJobsConfig()
178
+
179
+ await this.render({json: {schedule: this._serializeSchedule(scheduled)}})
180
+ })
181
+ }
182
+
183
+ /**
184
+ * Runs serialize job.
185
+ * @param {import("../types.js").BackgroundJobRow} job - Job row.
186
+ * @returns {Record<string, ?>} - Serialized job for the API.
187
+ */
188
+ _serializeJob(job) {
189
+ const redactArgs = Boolean(this._mountOptions().redactArgs)
190
+
191
+ return {
192
+ args: redactArgs ? undefined : job.args,
193
+ argsRedacted: redactArgs,
194
+ attempts: job.attempts,
195
+ completedAtMs: job.completedAtMs,
196
+ createdAtMs: job.createdAtMs,
197
+ executionMode: job.executionMode,
198
+ failedAtMs: job.failedAtMs,
199
+ forked: job.forked,
200
+ handedOffAtMs: job.handedOffAtMs,
201
+ id: job.id,
202
+ jobName: job.jobName,
203
+ lastError: job.lastError,
204
+ maxRetries: job.maxRetries,
205
+ orphanedAtMs: job.orphanedAtMs,
206
+ scheduledAtMs: job.scheduledAtMs,
207
+ status: job.status,
208
+ workerId: job.workerId
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Runs serialize schedule.
214
+ * @param {import("../../configuration-types.js").ScheduledBackgroundJobsConfiguration | undefined} scheduled - Scheduled jobs config.
215
+ * @returns {Array<Record<string, ?>>} - Serialized recurring jobs.
216
+ */
217
+ _serializeSchedule(scheduled) {
218
+ const jobs = scheduled?.jobs
219
+
220
+ if (!jobs || typeof jobs !== "object") return []
221
+
222
+ const redactArgs = Boolean(this._mountOptions().redactArgs)
223
+
224
+ return Object.keys(jobs).map((name) => {
225
+ const entry = jobs[name] || /**
226
+ * Narrows the runtime value to the documented type.
227
+ @type {?} */ ({})
228
+
229
+ return {
230
+ args: redactArgs ? undefined : (entry.args || []),
231
+ cron: entry.cron,
232
+ enabled: entry.enabled !== false,
233
+ every: entry.every,
234
+ jobName: typeof entry.class === "function" ? entry.class.name : undefined,
235
+ name,
236
+ options: entry.options || {}
237
+ }
238
+ })
239
+ }
240
+
241
+ /**
242
+ * Runs sanitize status.
243
+ * @param {?} value - Raw status param.
244
+ * @returns {string | undefined} - Valid status or undefined.
245
+ */
246
+ _sanitizeStatus(value) {
247
+ return typeof value === "string" && DASHBOARD_STATUSES.includes(value) ? value : undefined
248
+ }
249
+
250
+ /**
251
+ * Runs sanitize sort.
252
+ * @param {?} value - Raw sort param (e.g. "createdAtMs" or "-failedAtMs").
253
+ * @returns {{sortColumn: string, sortDirection: "ASC" | "DESC"}} - Normalized sort.
254
+ */
255
+ _sanitizeSort(value) {
256
+ if (typeof value !== "string" || value.length === 0) {
257
+ return {sortColumn: "createdAtMs", sortDirection: "DESC"}
258
+ }
259
+
260
+ const descending = value.startsWith("-")
261
+ const key = descending ? value.slice(1) : value
262
+ const sortColumn = SORTABLE_KEYS.includes(key) ? key : "createdAtMs"
263
+
264
+ return {sortColumn, sortDirection: descending ? "DESC" : "ASC"}
265
+ }
266
+
267
+ /**
268
+ * Runs positive int.
269
+ * @param {?} value - Raw numeric param.
270
+ * @param {number} fallback - Fallback when invalid.
271
+ * @returns {number} - Positive integer.
272
+ */
273
+ _positiveInt(value, fallback) {
274
+ const numeric = Number(Array.isArray(value) ? value[0] : value)
275
+
276
+ if (!Number.isFinite(numeric) || numeric < 1) return fallback
277
+
278
+ return Math.floor(numeric)
279
+ }
280
+ }
@@ -0,0 +1,57 @@
1
+ // @ts-check
2
+
3
+ import VelociousBackgroundJobsWebController from "./controller.js"
4
+ import {matchJobsApiPath, normalizeMountPrefix} from "./path-matcher.js"
5
+ import {registerJobsMount} from "./registry.js"
6
+
7
+ /**
8
+ * Mountable read-only background-jobs dashboard API. Include it in a routes file
9
+ * the way Sidekiq::Web is mounted in Rails:
10
+ *
11
+ * ```js
12
+ * routes.draw((route) => {
13
+ * route.mount(VelociousBackgroundJobsApi, {
14
+ * at: "/velocious/jobs",
15
+ * authorize: async ({request, ability}) => { ... },
16
+ * accessTokens: [process.env.VELOCIOUS_JOBS_TOKEN]
17
+ * })
18
+ * })
19
+ * ```
20
+ */
21
+ export default class VelociousBackgroundJobsApi {
22
+ /**
23
+ * Registers the jobs API under `at`. Implemented as a route-resolver hook so
24
+ * the controller can live inside the velocious package rather than the host
25
+ * app's `src/routes` directory. Invoked by the routing layer for each
26
+ * `route.mount(...)` registration.
27
+ * @param {object} args - Options.
28
+ * @param {import("../../configuration.js").default} args.configuration - Configuration instance.
29
+ * @param {string} args.at - Mount path prefix (e.g. "/velocious/jobs").
30
+ * @param {import("./registry.js").JobsMountOptions["authorize"]} [args.authorize] - Authorization callback.
31
+ * @param {string[]} [args.accessTokens] - Accepted bearer tokens for cross-origin/native access.
32
+ * @param {string[]} [args.allowedOrigins] - Allowed CORS origins for browser access.
33
+ * @param {boolean} [args.redactArgs] - When true, job arguments are omitted from responses.
34
+ * @param {string} [args.databaseIdentifier] - Database identifier the jobs store reads from.
35
+ * @returns {void} - No return value.
36
+ */
37
+ static mountInto({accessTokens, allowedOrigins, at, authorize, configuration, databaseIdentifier, redactArgs}) {
38
+ if (!configuration) throw new Error("No configuration given")
39
+
40
+ const prefix = normalizeMountPrefix(at)
41
+
42
+ registerJobsMount(configuration, prefix, {accessTokens, allowedOrigins, authorize, databaseIdentifier, redactArgs})
43
+
44
+ configuration.addRouteResolverHook(({currentPath, request}) => {
45
+ const match = matchJobsApiPath({method: request.httpMethod(), path: currentPath, prefix})
46
+
47
+ if (!match) return null
48
+
49
+ return {
50
+ action: match.action,
51
+ controller: "velociousBackgroundJobsWeb",
52
+ controllerClass: VelociousBackgroundJobsWebController,
53
+ params: {...match.params, velociousJobsMountAt: prefix}
54
+ }
55
+ })
56
+ }
57
+ }
@@ -0,0 +1,74 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {object} JobsApiMatch
5
+ * @property {string} action - Controller action to run.
6
+ * @property {Record<string, string>} params - Extra params extracted from the path.
7
+ */
8
+
9
+ /**
10
+ * Normalizes a mount prefix: ensures a leading slash and strips any trailing
11
+ * slash so `/velocious/jobs/` and `/velocious/jobs` behave identically.
12
+ * @param {string} at - Raw mount prefix.
13
+ * @returns {string} - Normalized prefix.
14
+ */
15
+ export function normalizeMountPrefix(at) {
16
+ if (typeof at !== "string" || !at.startsWith("/")) {
17
+ throw new Error(`mount requires an 'at' path starting with '/', got: ${String(at)}`)
18
+ }
19
+
20
+ if (at.length > 1 && at.endsWith("/")) {
21
+ return at.slice(0, -1)
22
+ }
23
+
24
+ return at
25
+ }
26
+
27
+ /**
28
+ * Matches an incoming request against the read-only jobs API routes that live
29
+ * under the mount prefix. Returns the controller action plus any extracted
30
+ * params, or null when the path/method isn't part of the jobs API.
31
+ * @param {object} args - Options.
32
+ * @param {string} args.prefix - Normalized mount prefix.
33
+ * @param {string} args.path - Request path without query string.
34
+ * @param {string} args.method - HTTP method.
35
+ * @returns {JobsApiMatch | null} - Matched action or null.
36
+ */
37
+ export function matchJobsApiPath({prefix, path, method}) {
38
+ /** @type {string} */
39
+ let subPath
40
+
41
+ if (prefix === "/") {
42
+ // Root mount: the whole path is the sub-path (avoid building a "//" guard).
43
+ subPath = path
44
+ } else if (path === prefix) {
45
+ subPath = "/"
46
+ } else if (path.startsWith(`${prefix}/`)) {
47
+ subPath = path.slice(prefix.length)
48
+ } else {
49
+ return null
50
+ }
51
+
52
+ if (method === "GET" && subPath === "/api/health") return {action: "health", params: {}}
53
+ if (method === "GET" && subPath === "/api/stats") return {action: "stats", params: {}}
54
+ if (method === "GET" && subPath === "/api/schedule") return {action: "schedule", params: {}}
55
+ if (method === "GET" && subPath === "/api/jobs") return {action: "index", params: {}}
56
+
57
+ if (method === "GET") {
58
+ const jobMatch = subPath.match(/^\/api\/jobs\/([^/]+)$/)
59
+
60
+ if (jobMatch) {
61
+ let id
62
+
63
+ try {
64
+ id = decodeURIComponent(jobMatch[1])
65
+ } catch {
66
+ return null
67
+ }
68
+
69
+ return {action: "show", params: {id}}
70
+ }
71
+ }
72
+
73
+ return null
74
+ }
@@ -0,0 +1,49 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * JobsMountOptions type.
5
+ * @typedef {object} JobsMountOptions
6
+ * @property {(args: {request: import("../../http-server/client/request.js").default, ability: (import("../../authorization/ability.js").default | undefined), token: (string | null), configuration: import("../../configuration.js").default}) => (boolean | void | Promise<boolean | void>)} [authorize] - Authorization callback. Return true to allow the request.
7
+ * @property {string[]} [accessTokens] - Bearer tokens accepted for cross-origin/native access.
8
+ * @property {string[]} [allowedOrigins] - Origins allowed for cross-origin browser access.
9
+ * @property {boolean} [redactArgs] - When true, job arguments are omitted from API responses.
10
+ * @property {string} [databaseIdentifier] - Database identifier the jobs store reads from.
11
+ */
12
+
13
+ /**
14
+ * Mount options are keyed by configuration so multiple configurations (e.g.
15
+ * across tests) never share state, and by mount path so a single configuration
16
+ * can mount the dashboard at more than one prefix. Functions in the options
17
+ * (the `authorize` callback) can't travel through route params, so the
18
+ * controller looks them up here using the plain `at` string it receives.
19
+ * @type {WeakMap<import("../../configuration.js").default, Map<string, JobsMountOptions>>}
20
+ */
21
+ const registry = new WeakMap()
22
+
23
+ /**
24
+ * Runs the registerJobsMount helper.
25
+ * @param {import("../../configuration.js").default} configuration - Configuration instance.
26
+ * @param {string} at - Normalized mount path.
27
+ * @param {JobsMountOptions} options - Mount options.
28
+ * @returns {void} - No return value.
29
+ */
30
+ export function registerJobsMount(configuration, at, options) {
31
+ let byPath = registry.get(configuration)
32
+
33
+ if (!byPath) {
34
+ byPath = new Map()
35
+ registry.set(configuration, byPath)
36
+ }
37
+
38
+ byPath.set(at, options)
39
+ }
40
+
41
+ /**
42
+ * Runs the getJobsMount helper.
43
+ * @param {import("../../configuration.js").default} configuration - Configuration instance.
44
+ * @param {string} at - Normalized mount path.
45
+ * @returns {JobsMountOptions | undefined} - Mount options if registered.
46
+ */
47
+ export function getJobsMount(configuration, at) {
48
+ return registry.get(configuration)?.get(at)
49
+ }