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,50 @@
1
+ // @ts-check
2
+
3
+ import configurationResolver from "../configuration-resolver.js"
4
+ import BackgroundJobsSocketRequest from "./socket-request.js"
5
+
6
+ export default class BackgroundJobsClient {
7
+ /**
8
+ * Runs constructor.
9
+ * @param {object} [args] - Options.
10
+ * @param {import("../configuration.js").default} [args.configuration] - Configuration.
11
+ */
12
+ constructor({configuration} = {}) {
13
+ this.configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver()
14
+ }
15
+
16
+ /**
17
+ * Runs enqueue.
18
+ * @param {object} args - Options.
19
+ * @param {string} args.jobName - Job name.
20
+ * @param {Array<?>} args.args - Job args.
21
+ * @param {import("./types.js").BackgroundJobOptions} [args.options] - Job options.
22
+ * @returns {Promise<string>} - Job id.
23
+ */
24
+ async enqueue({jobName, args, options}) {
25
+ const configuration = await this.configurationPromise
26
+ const {host, port} = configuration.getBackgroundJobsConfig()
27
+ const request = new BackgroundJobsSocketRequest({host, port, role: "client"})
28
+
29
+ return await request.run({
30
+ onConnect: (jsonSocket) => {
31
+ jsonSocket.send({
32
+ type: "enqueue",
33
+ jobName,
34
+ args,
35
+ options
36
+ })
37
+ },
38
+ onMessage: ({message, resolve, reject}) => {
39
+ if (message?.type === "enqueued") {
40
+ resolve(message.jobId)
41
+ return
42
+ }
43
+
44
+ if (message?.type === "enqueue-error") {
45
+ reject(new Error(message.error || "Failed to enqueue job"))
46
+ }
47
+ }
48
+ })
49
+ }
50
+ }
@@ -0,0 +1,277 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * Minimal POSIX-style 5-field cron parser used by the background-job
5
+ * scheduler. Supports `*`, single values, ranges (`N-M`), steps
6
+ * (`*\/N` or `N-M/N`), comma-separated lists, and the common
7
+ * `@hourly`/`@daily`/`@weekly`/`@monthly`/`@yearly`/`@midnight`
8
+ * shortcuts. Month and day-of-week names (`jan`-`dec`, `sun`-`sat`,
9
+ * case-insensitive) are also accepted.
10
+ *
11
+ * For day-of-month + day-of-week interaction, follows POSIX/Vixie
12
+ * cron semantics: when both fields are restricted (neither `*`), the
13
+ * job fires when EITHER matches. When one is `*` it has no effect.
14
+ */
15
+
16
+ const MONTH_NAMES = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"]
17
+ const DAY_NAMES = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]
18
+
19
+ const SHORTCUTS = {
20
+ "@hourly": "0 * * * *",
21
+ "@daily": "0 0 * * *",
22
+ "@midnight": "0 0 * * *",
23
+ "@weekly": "0 0 * * 0",
24
+ "@monthly": "0 0 1 * *",
25
+ "@yearly": "0 0 1 1 *",
26
+ "@annually": "0 0 1 1 *"
27
+ }
28
+
29
+ const FIELDS = [
30
+ {name: "minute", min: 0, max: 59},
31
+ {name: "hour", min: 0, max: 23},
32
+ {name: "dayOfMonth", min: 1, max: 31},
33
+ {name: "month", min: 1, max: 12, names: MONTH_NAMES},
34
+ // Accept 0-7 so ranges like `5-7` (Fri-Sun) work; we normalize 7
35
+ // down to 0 after parsing in `normalizeDayOfWeek` below.
36
+ {name: "dayOfWeek", min: 0, max: 7, names: DAY_NAMES}
37
+ ]
38
+
39
+ /**
40
+ * ParsedCron type.
41
+ * @typedef {object} ParsedCron
42
+ * @property {Set<number>} minute - Allowed minute values (0-59).
43
+ * @property {Set<number>} hour - Allowed hour values (0-23).
44
+ * @property {Set<number>} dayOfMonth - Allowed day-of-month values (1-31).
45
+ * @property {Set<number>} month - Allowed month values (1-12).
46
+ * @property {Set<number>} dayOfWeek - Allowed day-of-week values (0-6, 0=Sun).
47
+ * @property {boolean} dayOfMonthRestricted - True when the dayOfMonth field is not `?`.
48
+ * @property {boolean} dayOfWeekRestricted - True when the dayOfWeek field is not `?`.
49
+ * @property {string} expression - Original expression for diagnostics.
50
+ */
51
+
52
+ /**
53
+ * Runs the parseCronExpression helper.
54
+ * @param {string} expression - Cron expression or shortcut.
55
+ * @returns {ParsedCron}
56
+ */
57
+ export function parseCronExpression(expression) {
58
+ if (typeof expression !== "string" || !expression.trim()) {
59
+ throw new Error(`Invalid cron expression: ${expression}`)
60
+ }
61
+
62
+ const trimmed = expression.trim().toLowerCase()
63
+ const expanded = SHORTCUTS[/**
64
+ * Narrows the runtime value to the documented type.
65
+ @type {keyof typeof SHORTCUTS} */ (trimmed)] || trimmed
66
+ const fields = expanded.split(/\s+/)
67
+
68
+ if (fields.length !== 5) {
69
+ throw new Error(`Invalid cron expression "${expression}": expected 5 fields, got ${fields.length}`)
70
+ }
71
+
72
+ const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = fields
73
+ const parsed = {
74
+ minute: parseField(minuteField, FIELDS[0], expression),
75
+ hour: parseField(hourField, FIELDS[1], expression),
76
+ dayOfMonth: parseField(dayOfMonthField, FIELDS[2], expression),
77
+ month: parseField(monthField, FIELDS[3], expression),
78
+ // Cron treats both 0 and 7 as Sunday. We accept 7 throughout the
79
+ // parse pass (so `5-7` for Fri-Sun works) and then normalize any
80
+ // 7s down to 0 so the matcher only deals with 0-6.
81
+ dayOfWeek: normalizeDayOfWeek(parseField(dayOfWeekField, FIELDS[4], expression)),
82
+ dayOfMonthRestricted: dayOfMonthField !== "*",
83
+ dayOfWeekRestricted: dayOfWeekField !== "*",
84
+ expression
85
+ }
86
+
87
+ return parsed
88
+ }
89
+
90
+ /**
91
+ * Runs normalize day of week.
92
+ * @param {Set<number>} dayOfWeek
93
+ * @returns {Set<number>}
94
+ */
95
+ function normalizeDayOfWeek(dayOfWeek) {
96
+ if (dayOfWeek.has(7)) {
97
+ dayOfWeek.delete(7)
98
+ dayOfWeek.add(0)
99
+ }
100
+
101
+ return dayOfWeek
102
+ }
103
+
104
+ /**
105
+ * Runs parse field.
106
+ * @param {string} field - Field expression.
107
+ * @param {{name: string, min: number, max: number, names?: string[]}} fieldSpec - Field spec.
108
+ * @param {string} expression - Whole cron expression for error messages.
109
+ * @returns {Set<number>}
110
+ */
111
+ function parseField(field, fieldSpec, expression) {
112
+ const result = new Set()
113
+
114
+ for (const part of field.split(",")) {
115
+ addPartValues(part, fieldSpec, expression, result)
116
+ }
117
+
118
+ return result
119
+ }
120
+
121
+ /**
122
+ * Runs add part values.
123
+ * @param {string} part - Single comma-separated chunk.
124
+ * @param {{name: string, min: number, max: number, names?: string[]}} fieldSpec - Field spec.
125
+ * @param {string} expression - Original expression for errors.
126
+ * @param {Set<number>} result - Accumulator.
127
+ * @returns {void}
128
+ */
129
+ function addPartValues(part, fieldSpec, expression, result) {
130
+ if (!part) {
131
+ throw new Error(`Invalid ${fieldSpec.name} field in cron expression "${expression}"`)
132
+ }
133
+
134
+ const [rangePart, stepPart] = part.split("/")
135
+ const step = stepPart === undefined ? 1 : parseStep(stepPart, fieldSpec, expression)
136
+ const [start, end] = parseRange(rangePart, fieldSpec, expression, stepPart !== undefined)
137
+
138
+ for (let value = start; value <= end; value += step) {
139
+ if (value < fieldSpec.min || value > fieldSpec.max) {
140
+ throw new Error(`Value ${value} out of range for ${fieldSpec.name} in cron expression "${expression}"`)
141
+ }
142
+
143
+ result.add(value)
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Runs parse step.
149
+ * @param {string} value - Step value.
150
+ * @param {{name: string, min: number, max: number}} fieldSpec - Field spec.
151
+ * @param {string} expression - Original expression for errors.
152
+ * @returns {number}
153
+ */
154
+ function parseStep(value, fieldSpec, expression) {
155
+ const step = Number(value)
156
+
157
+ if (!Number.isInteger(step) || step <= 0) {
158
+ throw new Error(`Invalid step "${value}" for ${fieldSpec.name} in cron expression "${expression}"`)
159
+ }
160
+
161
+ return step
162
+ }
163
+
164
+ /**
165
+ * Runs parse range.
166
+ * @param {string} rangePart - Range portion (before ? `/`).
167
+ * @param {{name: string, min: number, max: number, names?: string[]}} fieldSpec - Field spec.
168
+ * @param {string} expression - Original expression for errors.
169
+ * @param {boolean} hasStep - Whether the part had a `/step` suffix.
170
+ * @returns {[number, number]}
171
+ */
172
+ function parseRange(rangePart, fieldSpec, expression, hasStep) {
173
+ if (rangePart === "*") {
174
+ return [fieldSpec.min, fieldSpec.max]
175
+ }
176
+
177
+ const dashIndex = rangePart.indexOf("-")
178
+
179
+ if (dashIndex === -1) {
180
+ const value = parseValue(rangePart, fieldSpec, expression)
181
+
182
+ // `N/step` is shorthand for `N-max/step` (Vixie cron).
183
+ return [value, hasStep ? fieldSpec.max : value]
184
+ }
185
+
186
+ const start = parseValue(rangePart.slice(0, dashIndex), fieldSpec, expression)
187
+ const end = parseValue(rangePart.slice(dashIndex + 1), fieldSpec, expression)
188
+
189
+ if (start > end) {
190
+ throw new Error(`Range start ${start} > end ${end} for ${fieldSpec.name} in cron expression "${expression}"`)
191
+ }
192
+
193
+ return [start, end]
194
+ }
195
+
196
+ /**
197
+ * Runs parse value.
198
+ * @param {string} rawValue - Raw value (may be a name).
199
+ * @param {{name: string, min: number, max: number, names?: string[]}} fieldSpec - Field spec.
200
+ * @param {string} expression - Original expression for errors.
201
+ * @returns {number}
202
+ */
203
+ function parseValue(rawValue, fieldSpec, expression) {
204
+ if (!rawValue) {
205
+ throw new Error(`Invalid ${fieldSpec.name} value in cron expression "${expression}"`)
206
+ }
207
+
208
+ const namedIndex = fieldSpec.names?.indexOf(rawValue)
209
+
210
+ if (typeof namedIndex === "number" && namedIndex !== -1) {
211
+ return namedIndex + fieldSpec.min
212
+ }
213
+
214
+ const value = Number(rawValue)
215
+
216
+ if (!Number.isInteger(value)) {
217
+ throw new Error(`Invalid ${fieldSpec.name} value "${rawValue}" in cron expression "${expression}"`)
218
+ }
219
+
220
+ return value
221
+ }
222
+
223
+ // 5 years of minutes — covers the worst-case legitimate gap, the
224
+ // `0 0 29 2 *` (Feb 29) leap-year-only schedule, with a one-year
225
+ // buffer so we never report a real cron pattern as "never matches".
226
+ const MAX_NEXT_FIRE_ITERATIONS = 5 * 366 * 24 * 60
227
+
228
+ /**
229
+ * Returns the next Date strictly after `from` that satisfies `parsed`.
230
+ * Operates at minute granularity. Bails out with an error after five
231
+ * years of search, which only happens if the expression matches no
232
+ * real time (e.g., `0 0 31 2 *` — Feb 31st).
233
+ * @param {ParsedCron} parsed - Parsed cron expression.
234
+ * @param {Date} from - Reference Date — the next match is strictly after this.
235
+ * @returns {Date}
236
+ */
237
+ export function nextCronFireDate(parsed, from) {
238
+ const candidate = new Date(from.getTime())
239
+
240
+ candidate.setSeconds(0, 0)
241
+ candidate.setMinutes(candidate.getMinutes() + 1)
242
+
243
+ for (let iterations = 0; iterations < MAX_NEXT_FIRE_ITERATIONS; iterations += 1) {
244
+ if (candidateMatches(candidate, parsed)) return candidate
245
+
246
+ candidate.setMinutes(candidate.getMinutes() + 1)
247
+ }
248
+
249
+ throw new Error(`Cron expression "${parsed.expression}" never matches`)
250
+ }
251
+
252
+ /**
253
+ * Runs candidate matches.
254
+ * @param {Date} candidate - Candidate Date (in local time).
255
+ * @param {ParsedCron} parsed - Parsed expression.
256
+ * @returns {boolean}
257
+ */
258
+ function candidateMatches(candidate, parsed) {
259
+ if (!parsed.minute.has(candidate.getMinutes())) return false
260
+ if (!parsed.hour.has(candidate.getHours())) return false
261
+ if (!parsed.month.has(candidate.getMonth() + 1)) return false
262
+
263
+ const dayOfMonthMatch = parsed.dayOfMonth.has(candidate.getDate())
264
+ const dayOfWeekMatch = parsed.dayOfWeek.has(candidate.getDay())
265
+
266
+ // POSIX/Vixie cron OR semantics: when both day fields are
267
+ // restricted, fire when EITHER matches. When only one is
268
+ // restricted, only that one applies.
269
+ if (parsed.dayOfMonthRestricted && parsed.dayOfWeekRestricted) {
270
+ return dayOfMonthMatch || dayOfWeekMatch
271
+ }
272
+
273
+ if (parsed.dayOfMonthRestricted) return dayOfMonthMatch
274
+ if (parsed.dayOfWeekRestricted) return dayOfWeekMatch
275
+
276
+ return true
277
+ }
@@ -0,0 +1,86 @@
1
+ // @ts-check
2
+
3
+ import runJobPayload from "./job-runner.js"
4
+
5
+ let finishing = false
6
+
7
+ /**
8
+ * Runs is job message.
9
+ * @param {?} message - IPC message.
10
+ * @returns {message is {type: "job", payload: import("./types.js").BackgroundJobPayload}} - Whether this is a job message.
11
+ */
12
+ function isJobMessage(message) {
13
+ if (!message || typeof message !== "object") return false
14
+
15
+ const messageRecord = /**
16
+ * Narrows the runtime value to the documented type.
17
+ @type {{type?: ?, payload?: ?}} */ (message)
18
+
19
+ return messageRecord.type === "job" && Object.hasOwn(messageRecord, "payload")
20
+ }
21
+
22
+ /**
23
+ * Runs finish.
24
+ * @param {number} exitCode - Process exit code.
25
+ * @returns {void}
26
+ */
27
+ function finish(exitCode) {
28
+ finishing = true
29
+ process.exitCode = exitCode
30
+
31
+ if (process.connected && process.disconnect) {
32
+ process.disconnect()
33
+ }
34
+
35
+ setImmediate(() => process.exit(exitCode))
36
+ }
37
+
38
+ /**
39
+ * Runs report job finished.
40
+ * @returns {void}
41
+ */
42
+ function reportJobFinished() {
43
+ if (process.send) process.send({type: "job-reported"})
44
+ }
45
+
46
+ /**
47
+ * Runs run job message.
48
+ * @param {?} message - IPC message.
49
+ * @returns {Promise<void>} - Resolves after the payload has run.
50
+ */
51
+ async function runJobMessage(message) {
52
+ if (!isJobMessage(message)) {
53
+ throw new Error("Forked background job runner received invalid payload")
54
+ }
55
+
56
+ await runJobPayload(message.payload)
57
+ }
58
+
59
+ /**
60
+ * Runs handle job message.
61
+ * @param {?} message - IPC message.
62
+ * @returns {Promise<void>} - Resolves after completion is reported.
63
+ */
64
+ async function handleJobMessage(message) {
65
+ try {
66
+ await runJobMessage(message)
67
+ reportJobFinished()
68
+ finish(0)
69
+ } catch (error) {
70
+ reportJobFinished()
71
+ console.error("Forked background job runner failed:", error)
72
+ finish(1)
73
+ }
74
+ }
75
+
76
+ for (const signal of ["SIGTERM", "SIGINT"]) {
77
+ process.once(signal, () => process.exit(1))
78
+ }
79
+
80
+ process.once("disconnect", () => {
81
+ if (!finishing) process.exit(0)
82
+ })
83
+
84
+ process.once("message", (message) => {
85
+ void handleJobMessage(message)
86
+ })
@@ -0,0 +1,13 @@
1
+ // @ts-check
2
+
3
+ import DatabaseRecord from "../database/record/index.js"
4
+
5
+ export default class BackgroundJobRecord extends DatabaseRecord {
6
+ static tableName() {
7
+ return "background_jobs"
8
+ }
9
+
10
+ static primaryKey() {
11
+ return "id"
12
+ }
13
+ }
@@ -0,0 +1,92 @@
1
+ // @ts-check
2
+
3
+ import fs from "fs/promises"
4
+ import path from "path"
5
+ import toImportSpecifier from "../utils/to-import-specifier.js"
6
+ import VelociousJob from "./job.js"
7
+
8
+ export default class BackgroundJobRegistry {
9
+ /**
10
+ * Runs constructor.
11
+ * @param {object} args - Options.
12
+ * @param {import("../configuration.js").default} args.configuration - Configuration.
13
+ */
14
+ constructor({configuration}) {
15
+ this.configuration = configuration
16
+ /**
17
+ * Narrows the runtime value to the documented type.
18
+ @type {Map<string, typeof VelociousJob>} */
19
+ this.jobsByName = new Map()
20
+ }
21
+
22
+ /**
23
+ * Runs load.
24
+ * @returns {Promise<void>} - Resolves when complete.
25
+ */
26
+ async load() {
27
+ const directory = this.configuration.getDirectory()
28
+ const jobsDir = path.join(directory, "src", "jobs")
29
+ await this._loadJobsFromDirectory(jobsDir, {skipDuplicates: false})
30
+
31
+ const velociousPath = await this.configuration.getEnvironmentHandler().getVelociousPath()
32
+ const velociousJobsDir = path.join(velociousPath, "src", "jobs")
33
+ const normalizedJobsDir = path.resolve(jobsDir)
34
+ const normalizedVelociousJobsDir = path.resolve(velociousJobsDir)
35
+
36
+ if (normalizedJobsDir !== normalizedVelociousJobsDir) {
37
+ await this._loadJobsFromDirectory(velociousJobsDir, {skipDuplicates: true})
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Runs get job by name.
43
+ * @param {string} jobName - Job name.
44
+ * @returns {typeof VelociousJob} - Job class.
45
+ */
46
+ getJobByName(jobName) {
47
+ const jobClass = this.jobsByName.get(jobName)
48
+
49
+ if (!jobClass) {
50
+ throw new Error(`Unknown job "${jobName}". Check src/jobs`)
51
+ }
52
+
53
+ return jobClass
54
+ }
55
+
56
+ /**
57
+ * Runs load jobs from directory.
58
+ * @param {string} jobsDir - Directory with job files.
59
+ * @param {object} args - Options.
60
+ * @param {boolean} args.skipDuplicates - Whether to skip duplicate job names.
61
+ * @returns {Promise<void>} - Resolves when complete.
62
+ */
63
+ async _loadJobsFromDirectory(jobsDir, {skipDuplicates}) {
64
+ try {
65
+ await fs.access(jobsDir)
66
+ } catch {
67
+ return
68
+ }
69
+
70
+ const jobFiles = fs.glob(`${jobsDir}/**/*.js`)
71
+
72
+ for await (const jobFile of jobFiles) {
73
+ const jobImport = await import(toImportSpecifier(jobFile))
74
+ const JobClass = jobImport.default
75
+
76
+ if (!JobClass) throw new Error(`Job file must export a default class: ${jobFile}`)
77
+ if (!(JobClass.prototype instanceof VelociousJob)) {
78
+ throw new Error(`Job class must extend VelociousJob: ${jobFile}`)
79
+ }
80
+
81
+ const jobName = JobClass.jobName()
82
+
83
+ if (this.jobsByName.has(jobName)) {
84
+ if (skipDuplicates) continue
85
+
86
+ throw new Error(`Duplicate job name "${jobName}" from ${jobFile}`)
87
+ }
88
+
89
+ this.jobsByName.set(jobName, JobClass)
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,107 @@
1
+ // @ts-check
2
+
3
+ import configurationResolver from "../configuration-resolver.js"
4
+ import BackgroundJobRegistry from "./job-registry.js"
5
+ import BackgroundJobsStatusReporter from "./status-reporter.js"
6
+
7
+ const BEACON_READY_TIMEOUT_MS = 5000
8
+
9
+ /**
10
+ * Runs report beacon ready error.
11
+ * @param {import("../configuration.js").default} configuration - Configuration.
12
+ * @param {?} error - Beacon readiness error.
13
+ * @returns {void}
14
+ */
15
+ function reportBeaconReadyError(configuration, error) {
16
+ const errorEvents = configuration.getErrorEvents()
17
+ const normalizedError = error instanceof Error ? error : new Error(String(error))
18
+ const payload = {
19
+ context: {peerType: "background-jobs-runner", stage: "beacon-ready"},
20
+ error: normalizedError
21
+ }
22
+ const hasListener = errorEvents.listenerCount("framework-error") > 0
23
+ || errorEvents.listenerCount("all-error") > 0
24
+
25
+ errorEvents.emit("framework-error", payload)
26
+ errorEvents.emit("all-error", {...payload, errorType: "framework-error"})
27
+
28
+ if (!hasListener) {
29
+ console.error(`[velocious framework-error stage=beacon-ready] ${normalizedError.message}`)
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Runs connect beacon.
35
+ * @param {import("../configuration.js").default} configuration - Configuration.
36
+ * @returns {Promise<void>}
37
+ */
38
+ async function connectBeacon(configuration) {
39
+ const beaconClient = await configuration.connectBeacon({peerType: "background-jobs-runner"})
40
+
41
+ if (!beaconClient) return
42
+
43
+ try {
44
+ await beaconClient.waitForReady({timeoutMs: BEACON_READY_TIMEOUT_MS})
45
+ } catch (error) {
46
+ reportBeaconReadyError(configuration, error)
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Runs run job payload.
52
+ * @param {import("./types.js").BackgroundJobPayload} payload - Payload.
53
+ * @returns {Promise<void>} - Resolves when complete.
54
+ */
55
+ export default async function runJobPayload(payload) {
56
+ const configuration = await configurationResolver()
57
+ configuration.setCurrent()
58
+ await configuration.initialize({type: "background-jobs-runner"})
59
+ await connectBeacon(configuration)
60
+ const reporter = new BackgroundJobsStatusReporter({configuration})
61
+
62
+ const registry = new BackgroundJobRegistry({configuration})
63
+ await registry.load()
64
+ const JobClass = registry.getJobByName(payload.jobName)
65
+ const jobInstance = new JobClass()
66
+ /**
67
+ * Perform.
68
+ @type {(...args: Array<?>) => Promise<void>} */
69
+ const perform = jobInstance.perform
70
+
71
+ try {
72
+ try {
73
+ await configuration.withConnections({name: `Background job runner: ${payload.jobName}`}, async () => {
74
+ await perform.apply(jobInstance, payload.args || [])
75
+ })
76
+
77
+ if (payload.id) {
78
+ await reporter.reportWithRetry({
79
+ jobId: payload.id,
80
+ status: "completed",
81
+ workerId: payload.workerId,
82
+ handedOffAtMs: payload.handedOffAtMs,
83
+ maxDurationMs: 30000
84
+ })
85
+ }
86
+ } catch (error) {
87
+ if (payload.id) {
88
+ await reporter.reportWithRetry({
89
+ jobId: payload.id,
90
+ status: "failed",
91
+ error,
92
+ workerId: payload.workerId,
93
+ handedOffAtMs: payload.handedOffAtMs,
94
+ maxDurationMs: 30000
95
+ })
96
+ }
97
+
98
+ throw error
99
+ }
100
+ } finally {
101
+ try {
102
+ await configuration.disconnectBeacon()
103
+ } finally {
104
+ await configuration.closeDatabaseConnections()
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,77 @@
1
+ // @ts-check
2
+
3
+ import BackgroundJobsClient from "./client.js"
4
+
5
+ export default class VelociousJob {
6
+ /**
7
+ * Runs job name.
8
+ * @returns {string} - Job name.
9
+ */
10
+ static jobName() {
11
+ return this.name
12
+ }
13
+
14
+ /**
15
+ * Runs perform later.
16
+ * @param {...?} args - Job args.
17
+ * @returns {Promise<string>} - Job id.
18
+ */
19
+ static async performLater(...args) {
20
+ const {jobArgs, jobOptions} = this._splitArgsAndOptions(args)
21
+ const client = new BackgroundJobsClient()
22
+
23
+ return await client.enqueue({
24
+ jobName: this.jobName(),
25
+ args: jobArgs,
26
+ options: jobOptions
27
+ })
28
+ }
29
+
30
+ /**
31
+ * Runs perform later with options.
32
+ * @param {object} args - Options.
33
+ * @param {Array<?>} args.args - Job args.
34
+ * @param {import("./types.js").BackgroundJobOptions} [args.options] - Job options.
35
+ * @returns {Promise<string>} - Job id.
36
+ */
37
+ static async performLaterWithOptions({args, options}) {
38
+ const client = new BackgroundJobsClient()
39
+
40
+ return await client.enqueue({
41
+ jobName: this.jobName(),
42
+ args,
43
+ options
44
+ })
45
+ }
46
+
47
+ /**
48
+ * Runs split args and options.
49
+ * @param {Array<?>} args - Job args.
50
+ * @returns {{jobArgs: Array<?>, jobOptions: import("./types.js").BackgroundJobOptions}} - Split args and options.
51
+ */
52
+ static _splitArgsAndOptions(args) {
53
+ if (args.length === 0) {
54
+ return {jobArgs: [], jobOptions: {}}
55
+ }
56
+
57
+ const lastArg = args[args.length - 1]
58
+ const isOptionsArg = lastArg && typeof lastArg === "object" && !Array.isArray(lastArg) && "jobOptions" in lastArg
59
+
60
+ if (isOptionsArg) {
61
+ const {jobOptions} = /**
62
+ * Narrows the runtime value to the documented type.
63
+ @type {{jobOptions: import("./types.js").BackgroundJobOptions}} */ (lastArg)
64
+ return {jobArgs: args.slice(0, -1), jobOptions: jobOptions || {}}
65
+ }
66
+
67
+ return {jobArgs: args, jobOptions: {}}
68
+ }
69
+
70
+ /**
71
+ * Override in subclasses.
72
+ * @returns {Promise<void>} - Resolves when complete.
73
+ */
74
+ async perform() {
75
+ throw new Error("perform not implemented")
76
+ }
77
+ }