velocious 1.0.430 → 1.0.431

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 (811) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/bin/velocious.js +39 -34
  3. package/build/index.js +1 -2
  4. package/build/src/application.js +214 -187
  5. package/build/src/authorization/ability.d.ts +24 -23
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +300 -252
  8. package/build/src/authorization/base-resource.d.ts +20 -26
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +136 -118
  11. package/build/src/background-jobs/client.js +47 -43
  12. package/build/src/background-jobs/cron-expression.js +166 -127
  13. package/build/src/background-jobs/forked-runner-child.js +47 -37
  14. package/build/src/background-jobs/job-record.js +10 -8
  15. package/build/src/background-jobs/job-registry.js +84 -72
  16. package/build/src/background-jobs/job-runner.js +81 -74
  17. package/build/src/background-jobs/job.js +72 -62
  18. package/build/src/background-jobs/json-socket.js +70 -65
  19. package/build/src/background-jobs/main.js +900 -841
  20. package/build/src/background-jobs/normalize-error.js +11 -12
  21. package/build/src/background-jobs/scheduler.js +247 -205
  22. package/build/src/background-jobs/socket-request.js +65 -60
  23. package/build/src/background-jobs/status-reporter.js +96 -86
  24. package/build/src/background-jobs/store.js +980 -862
  25. package/build/src/background-jobs/types.js +3 -2
  26. package/build/src/background-jobs/web/authorization.js +50 -38
  27. package/build/src/background-jobs/web/controller.js +268 -232
  28. package/build/src/background-jobs/web/index.js +40 -36
  29. package/build/src/background-jobs/web/path-matcher.js +48 -45
  30. package/build/src/background-jobs/web/registry.js +14 -9
  31. package/build/src/background-jobs/worker.js +639 -585
  32. package/build/src/beacon/client.js +293 -264
  33. package/build/src/beacon/in-process-broker.js +25 -20
  34. package/build/src/beacon/in-process-client.js +116 -104
  35. package/build/src/beacon/server.js +126 -110
  36. package/build/src/beacon/types.js +8 -2
  37. package/build/src/cli/base-command.js +57 -49
  38. package/build/src/cli/browser-cli.js +42 -37
  39. package/build/src/cli/commands/background-jobs-main.js +5 -5
  40. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  41. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  42. package/build/src/cli/commands/beacon.js +5 -5
  43. package/build/src/cli/commands/console.js +10 -10
  44. package/build/src/cli/commands/db/base-command.js +76 -71
  45. package/build/src/cli/commands/db/create.js +61 -53
  46. package/build/src/cli/commands/db/drop.js +71 -62
  47. package/build/src/cli/commands/db/migrate.js +15 -13
  48. package/build/src/cli/commands/db/reset.js +19 -16
  49. package/build/src/cli/commands/db/rollback.js +13 -12
  50. package/build/src/cli/commands/db/schema/dump.js +9 -9
  51. package/build/src/cli/commands/db/schema/load.js +9 -9
  52. package/build/src/cli/commands/db/seed.js +9 -9
  53. package/build/src/cli/commands/db/tenants/check.js +35 -32
  54. package/build/src/cli/commands/db/tenants/create.js +29 -26
  55. package/build/src/cli/commands/db/tenants/migrate.js +44 -40
  56. package/build/src/cli/commands/destroy/migration.js +5 -5
  57. package/build/src/cli/commands/generate/base-models.js +5 -5
  58. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  59. package/build/src/cli/commands/generate/migration.js +5 -5
  60. package/build/src/cli/commands/generate/model.js +5 -5
  61. package/build/src/cli/commands/init.js +9 -7
  62. package/build/src/cli/commands/routes.js +6 -6
  63. package/build/src/cli/commands/run-script.js +9 -9
  64. package/build/src/cli/commands/runner.js +9 -9
  65. package/build/src/cli/commands/server.js +6 -6
  66. package/build/src/cli/commands/test.js +7 -6
  67. package/build/src/cli/index.js +141 -127
  68. package/build/src/cli/tenant-database-command-helper.js +185 -154
  69. package/build/src/cli/use-browser-cli.js +20 -15
  70. package/build/src/configuration-resolver.js +54 -47
  71. package/build/src/configuration-types.d.ts +21 -2
  72. package/build/src/configuration-types.d.ts.map +1 -1
  73. package/build/src/configuration-types.js +60 -3
  74. package/build/src/configuration.js +2547 -2240
  75. package/build/src/controller.js +407 -363
  76. package/build/src/current-configuration.js +12 -9
  77. package/build/src/current.js +75 -70
  78. package/build/src/database/annotations-async-hooks.js +22 -16
  79. package/build/src/database/annotations.js +18 -12
  80. package/build/src/database/drivers/base-column.js +179 -155
  81. package/build/src/database/drivers/base-columns-index.js +78 -69
  82. package/build/src/database/drivers/base-foreign-key.js +101 -89
  83. package/build/src/database/drivers/base-table.js +149 -124
  84. package/build/src/database/drivers/base.js +1489 -1306
  85. package/build/src/database/drivers/mssql/column.js +50 -39
  86. package/build/src/database/drivers/mssql/columns-index.js +3 -2
  87. package/build/src/database/drivers/mssql/connect-connection.js +9 -11
  88. package/build/src/database/drivers/mssql/foreign-key.js +9 -8
  89. package/build/src/database/drivers/mssql/index.js +587 -507
  90. package/build/src/database/drivers/mssql/options.js +75 -68
  91. package/build/src/database/drivers/mssql/query-parser.js +3 -2
  92. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  93. package/build/src/database/drivers/mssql/sql/create-database.js +31 -24
  94. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  95. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  96. package/build/src/database/drivers/mssql/sql/delete.js +16 -14
  97. package/build/src/database/drivers/mssql/sql/drop-database.js +31 -24
  98. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  99. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  100. package/build/src/database/drivers/mssql/sql/update.js +28 -24
  101. package/build/src/database/drivers/mssql/sql/upsert.js +20 -18
  102. package/build/src/database/drivers/mssql/structure-sql.js +114 -102
  103. package/build/src/database/drivers/mssql/table.js +96 -81
  104. package/build/src/database/drivers/mysql/column.js +92 -75
  105. package/build/src/database/drivers/mysql/columns-index.js +19 -16
  106. package/build/src/database/drivers/mysql/foreign-key.js +9 -8
  107. package/build/src/database/drivers/mysql/index.js +457 -396
  108. package/build/src/database/drivers/mysql/options.js +30 -26
  109. package/build/src/database/drivers/mysql/query-parser.js +3 -2
  110. package/build/src/database/drivers/mysql/query.js +29 -26
  111. package/build/src/database/drivers/mysql/sql/alter-table.js +3 -2
  112. package/build/src/database/drivers/mysql/sql/create-database.js +28 -23
  113. package/build/src/database/drivers/mysql/sql/create-index.js +3 -2
  114. package/build/src/database/drivers/mysql/sql/create-table.js +3 -2
  115. package/build/src/database/drivers/mysql/sql/delete.js +17 -14
  116. package/build/src/database/drivers/mysql/sql/drop-database.js +3 -2
  117. package/build/src/database/drivers/mysql/sql/drop-table.js +3 -2
  118. package/build/src/database/drivers/mysql/sql/insert.js +3 -2
  119. package/build/src/database/drivers/mysql/sql/update.js +29 -24
  120. package/build/src/database/drivers/mysql/sql/upsert.js +10 -8
  121. package/build/src/database/drivers/mysql/structure-sql.js +88 -79
  122. package/build/src/database/drivers/mysql/table.js +98 -83
  123. package/build/src/database/drivers/pgsql/column.js +72 -56
  124. package/build/src/database/drivers/pgsql/columns-index.js +3 -2
  125. package/build/src/database/drivers/pgsql/foreign-key.js +9 -8
  126. package/build/src/database/drivers/pgsql/index.js +438 -377
  127. package/build/src/database/drivers/pgsql/options.js +28 -25
  128. package/build/src/database/drivers/pgsql/query-parser.js +3 -2
  129. package/build/src/database/drivers/pgsql/sql/alter-table.js +3 -2
  130. package/build/src/database/drivers/pgsql/sql/create-database.js +23 -19
  131. package/build/src/database/drivers/pgsql/sql/create-index.js +3 -2
  132. package/build/src/database/drivers/pgsql/sql/create-table.js +3 -2
  133. package/build/src/database/drivers/pgsql/sql/delete.js +17 -14
  134. package/build/src/database/drivers/pgsql/sql/drop-database.js +3 -2
  135. package/build/src/database/drivers/pgsql/sql/drop-table.js +3 -2
  136. package/build/src/database/drivers/pgsql/sql/insert.js +3 -2
  137. package/build/src/database/drivers/pgsql/sql/update.js +29 -24
  138. package/build/src/database/drivers/pgsql/sql/upsert.js +11 -9
  139. package/build/src/database/drivers/pgsql/structure-sql.js +120 -108
  140. package/build/src/database/drivers/pgsql/table.js +77 -60
  141. package/build/src/database/drivers/sqlite/base.js +478 -405
  142. package/build/src/database/drivers/sqlite/column.js +69 -54
  143. package/build/src/database/drivers/sqlite/columns-index.js +27 -22
  144. package/build/src/database/drivers/sqlite/connection-sql-js.js +42 -35
  145. package/build/src/database/drivers/sqlite/foreign-key.js +21 -18
  146. package/build/src/database/drivers/sqlite/index.js +373 -330
  147. package/build/src/database/drivers/sqlite/index.native.js +64 -55
  148. package/build/src/database/drivers/sqlite/index.web.js +87 -69
  149. package/build/src/database/drivers/sqlite/options.js +28 -25
  150. package/build/src/database/drivers/sqlite/query-parser.js +3 -2
  151. package/build/src/database/drivers/sqlite/query.js +24 -21
  152. package/build/src/database/drivers/sqlite/query.native.js +25 -20
  153. package/build/src/database/drivers/sqlite/query.web.js +37 -30
  154. package/build/src/database/drivers/sqlite/sql/alter-table.js +179 -159
  155. package/build/src/database/drivers/sqlite/sql/create-index.js +3 -2
  156. package/build/src/database/drivers/sqlite/sql/create-table.js +3 -2
  157. package/build/src/database/drivers/sqlite/sql/delete.js +22 -17
  158. package/build/src/database/drivers/sqlite/sql/drop-table.js +3 -2
  159. package/build/src/database/drivers/sqlite/sql/insert.js +3 -2
  160. package/build/src/database/drivers/sqlite/sql/update.js +29 -24
  161. package/build/src/database/drivers/sqlite/sql/upsert.js +11 -9
  162. package/build/src/database/drivers/sqlite/structure-sql.js +52 -49
  163. package/build/src/database/drivers/sqlite/table-rebuilder.js +75 -62
  164. package/build/src/database/drivers/sqlite/table.js +125 -102
  165. package/build/src/database/drivers/structure-sql/utils.js +17 -14
  166. package/build/src/database/handler.js +10 -9
  167. package/build/src/database/initializer-from-require-context.js +87 -76
  168. package/build/src/database/migration/index.js +395 -332
  169. package/build/src/database/migrator/files-finder.js +50 -40
  170. package/build/src/database/migrator/types.js +30 -2
  171. package/build/src/database/migrator.js +526 -454
  172. package/build/src/database/pool/async-tracked-multi-connection.js +1147 -997
  173. package/build/src/database/pool/base-methods-forward.js +43 -40
  174. package/build/src/database/pool/base.js +343 -298
  175. package/build/src/database/pool/single-multi-use.js +110 -93
  176. package/build/src/database/query/alter-table-base.js +99 -84
  177. package/build/src/database/query/base.js +46 -39
  178. package/build/src/database/query/create-database-base.js +30 -25
  179. package/build/src/database/query/create-index-base.js +94 -75
  180. package/build/src/database/query/create-table-base.js +193 -151
  181. package/build/src/database/query/delete-base.js +16 -14
  182. package/build/src/database/query/drop-database-base.js +28 -23
  183. package/build/src/database/query/drop-table-base.js +53 -42
  184. package/build/src/database/query/from-base.js +33 -30
  185. package/build/src/database/query/from-plain.js +13 -11
  186. package/build/src/database/query/from-table.js +15 -13
  187. package/build/src/database/query/index.js +472 -410
  188. package/build/src/database/query/insert-base.js +164 -143
  189. package/build/src/database/query/join-base.js +40 -35
  190. package/build/src/database/query/join-object.js +153 -128
  191. package/build/src/database/query/join-plain.js +15 -13
  192. package/build/src/database/query/join-tracker.js +90 -76
  193. package/build/src/database/query/model-class-query.js +1370 -1134
  194. package/build/src/database/query/order-base.js +30 -27
  195. package/build/src/database/query/order-column.js +53 -44
  196. package/build/src/database/query/order-plain.js +24 -20
  197. package/build/src/database/query/preloader/belongs-to.js +258 -210
  198. package/build/src/database/query/preloader/ensure-model-class-initialized.js +9 -8
  199. package/build/src/database/query/preloader/has-many.js +301 -240
  200. package/build/src/database/query/preloader/has-one.js +117 -91
  201. package/build/src/database/query/preloader/selection.js +129 -117
  202. package/build/src/database/query/preloader.js +185 -160
  203. package/build/src/database/query/query-data.js +201 -157
  204. package/build/src/database/query/select-base.js +27 -25
  205. package/build/src/database/query/select-plain.js +15 -13
  206. package/build/src/database/query/select-table-and-column.js +25 -21
  207. package/build/src/database/query/update-base.js +38 -35
  208. package/build/src/database/query/upsert-base.js +100 -93
  209. package/build/src/database/query/where-base.js +35 -32
  210. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  211. package/build/src/database/query/where-combinator.js +28 -26
  212. package/build/src/database/query/where-hash.js +68 -61
  213. package/build/src/database/query/where-model-class-hash.js +469 -414
  214. package/build/src/database/query/where-not.js +20 -18
  215. package/build/src/database/query/where-plain.js +17 -15
  216. package/build/src/database/query/with-count.js +159 -125
  217. package/build/src/database/query-parser/base-query-parser.js +37 -32
  218. package/build/src/database/query-parser/from-parser.js +45 -36
  219. package/build/src/database/query-parser/group-parser.js +50 -42
  220. package/build/src/database/query-parser/joins-parser.js +33 -28
  221. package/build/src/database/query-parser/limit-parser.js +70 -67
  222. package/build/src/database/query-parser/options.js +82 -75
  223. package/build/src/database/query-parser/order-parser.js +40 -36
  224. package/build/src/database/query-parser/select-parser.js +60 -49
  225. package/build/src/database/query-parser/where-parser.js +41 -36
  226. package/build/src/database/record/acts-as-list.js +273 -235
  227. package/build/src/database/record/attachments/download.js +45 -44
  228. package/build/src/database/record/attachments/handle.js +161 -141
  229. package/build/src/database/record/attachments/normalize-input.js +138 -128
  230. package/build/src/database/record/attachments/storage-drivers/filesystem.js +91 -77
  231. package/build/src/database/record/attachments/storage-drivers/native.js +121 -112
  232. package/build/src/database/record/attachments/storage-drivers/s3.js +208 -177
  233. package/build/src/database/record/attachments/store.d.ts +1 -1
  234. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  235. package/build/src/database/record/attachments/store.js +540 -468
  236. package/build/src/database/record/index.d.ts +17 -15
  237. package/build/src/database/record/index.d.ts.map +1 -1
  238. package/build/src/database/record/index.js +3894 -3361
  239. package/build/src/database/record/instance-relationships/base.js +268 -234
  240. package/build/src/database/record/instance-relationships/belongs-to.js +73 -58
  241. package/build/src/database/record/instance-relationships/has-many.js +264 -225
  242. package/build/src/database/record/instance-relationships/has-one.js +105 -85
  243. package/build/src/database/record/record-not-found-error.js +2 -3
  244. package/build/src/database/record/relationships/base.d.ts +2 -2
  245. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  246. package/build/src/database/record/relationships/base.js +167 -145
  247. package/build/src/database/record/relationships/belongs-to.js +51 -44
  248. package/build/src/database/record/relationships/has-many.js +40 -32
  249. package/build/src/database/record/relationships/has-one.js +40 -32
  250. package/build/src/database/record/state-machine.js +208 -156
  251. package/build/src/database/record/user-module.js +38 -32
  252. package/build/src/database/record/validators/base.js +24 -22
  253. package/build/src/database/record/validators/format.js +46 -36
  254. package/build/src/database/record/validators/presence.js +20 -18
  255. package/build/src/database/record/validators/uniqueness.js +117 -99
  256. package/build/src/database/table-data/index.js +231 -199
  257. package/build/src/database/table-data/table-column.js +382 -338
  258. package/build/src/database/table-data/table-foreign-key.js +66 -57
  259. package/build/src/database/table-data/table-index.js +36 -29
  260. package/build/src/database/table-data/table-reference.js +10 -10
  261. package/build/src/database/use-database.js +40 -32
  262. package/build/src/environment-handlers/base.js +544 -484
  263. package/build/src/environment-handlers/browser.js +294 -241
  264. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +19 -16
  265. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +21 -18
  266. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +29 -22
  267. package/build/src/environment-handlers/node/cli/commands/beacon.js +19 -16
  268. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +15 -14
  269. package/build/src/environment-handlers/node/cli/commands/console.js +120 -99
  270. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +39 -34
  271. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +63 -57
  272. package/build/src/environment-handlers/node/cli/commands/db/seed.js +63 -51
  273. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +40 -32
  274. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  275. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +353 -298
  276. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +844 -729
  277. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +38 -34
  278. package/build/src/environment-handlers/node/cli/commands/generate/model.js +38 -34
  279. package/build/src/environment-handlers/node/cli/commands/init.js +61 -56
  280. package/build/src/environment-handlers/node/cli/commands/routes.js +59 -51
  281. package/build/src/environment-handlers/node/cli/commands/run-script.js +68 -54
  282. package/build/src/environment-handlers/node/cli/commands/runner.js +74 -56
  283. package/build/src/environment-handlers/node/cli/commands/server.js +106 -93
  284. package/build/src/environment-handlers/node/cli/commands/test.js +113 -97
  285. package/build/src/environment-handlers/node.js +874 -753
  286. package/build/src/error-logger.js +21 -22
  287. package/build/src/frontend-model-controller.d.ts +6 -6
  288. package/build/src/frontend-model-controller.d.ts.map +1 -1
  289. package/build/src/frontend-model-controller.js +3288 -2788
  290. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  291. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  292. package/build/src/frontend-model-resource/base-resource.js +869 -759
  293. package/build/src/frontend-models/base.d.ts +19 -12
  294. package/build/src/frontend-models/base.d.ts.map +1 -1
  295. package/build/src/frontend-models/base.js +3602 -3114
  296. package/build/src/frontend-models/clear-pending-debounced-callback.js +8 -7
  297. package/build/src/frontend-models/event-hook-models.js +21 -16
  298. package/build/src/frontend-models/model-registry.js +11 -9
  299. package/build/src/frontend-models/outgoing-event-buffer.js +17 -10
  300. package/build/src/frontend-models/preloader.d.ts +6 -6
  301. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  302. package/build/src/frontend-models/preloader.js +149 -131
  303. package/build/src/frontend-models/query.d.ts.map +1 -1
  304. package/build/src/frontend-models/query.js +1855 -1560
  305. package/build/src/frontend-models/resource-config-validation.js +37 -27
  306. package/build/src/frontend-models/resource-definition.js +288 -234
  307. package/build/src/frontend-models/transport-serialization.js +266 -203
  308. package/build/src/frontend-models/use-created-event.js +7 -5
  309. package/build/src/frontend-models/use-destroyed-event.js +93 -80
  310. package/build/src/frontend-models/use-model-class-event.js +91 -79
  311. package/build/src/frontend-models/use-updated-event.js +97 -84
  312. package/build/src/frontend-models/websocket-channel.js +441 -381
  313. package/build/src/frontend-models/websocket-publishers.js +173 -140
  314. package/build/src/http-client/header.js +14 -13
  315. package/build/src/http-client/index.js +132 -116
  316. package/build/src/http-client/request.js +87 -71
  317. package/build/src/http-client/response.js +140 -122
  318. package/build/src/http-client/websocket-client.js +17 -15
  319. package/build/src/http-server/client/index.js +465 -409
  320. package/build/src/http-server/client/params-to-object.js +135 -124
  321. package/build/src/http-server/client/request-buffer/form-data-part.js +132 -111
  322. package/build/src/http-server/client/request-buffer/header.js +16 -15
  323. package/build/src/http-server/client/request-buffer/index.js +506 -446
  324. package/build/src/http-server/client/request-parser.js +186 -163
  325. package/build/src/http-server/client/request-runner.js +259 -226
  326. package/build/src/http-server/client/request-timing.js +151 -132
  327. package/build/src/http-server/client/request.js +108 -96
  328. package/build/src/http-server/client/response.js +235 -213
  329. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +29 -25
  330. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +29 -25
  331. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  332. package/build/src/http-server/client/websocket-request.js +137 -114
  333. package/build/src/http-server/client/websocket-session.js +1657 -1452
  334. package/build/src/http-server/cookie.js +236 -216
  335. package/build/src/http-server/development-reloader.js +221 -190
  336. package/build/src/http-server/index.js +525 -451
  337. package/build/src/http-server/remote-address.js +50 -38
  338. package/build/src/http-server/server-client.js +208 -181
  339. package/build/src/http-server/server-lock.js +167 -153
  340. package/build/src/http-server/websocket-channel-subscribers.js +93 -81
  341. package/build/src/http-server/websocket-channel.js +117 -104
  342. package/build/src/http-server/websocket-connection.js +104 -96
  343. package/build/src/http-server/websocket-event-log-store.js +404 -350
  344. package/build/src/http-server/websocket-events-host.js +164 -145
  345. package/build/src/http-server/websocket-events.js +47 -47
  346. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +14 -13
  347. package/build/src/http-server/worker-handler/in-process.js +141 -123
  348. package/build/src/http-server/worker-handler/index.js +349 -313
  349. package/build/src/http-server/worker-handler/worker-script.js +5 -4
  350. package/build/src/http-server/worker-handler/worker-thread.js +269 -240
  351. package/build/src/initializer.js +36 -31
  352. package/build/src/jobs/mail-delivery.js +15 -13
  353. package/build/src/logger/base-logger.js +26 -24
  354. package/build/src/logger/console-logger.js +23 -21
  355. package/build/src/logger/file-logger.js +31 -29
  356. package/build/src/logger/outputs/array-output.js +42 -37
  357. package/build/src/logger/outputs/console-output.js +24 -20
  358. package/build/src/logger/outputs/file-output.js +48 -43
  359. package/build/src/logger/outputs/stdout-output.js +48 -39
  360. package/build/src/logger.js +394 -338
  361. package/build/src/mailer/backends/smtp.js +163 -134
  362. package/build/src/mailer/base.js +251 -211
  363. package/build/src/mailer/delivery.js +64 -56
  364. package/build/src/mailer/index.js +22 -4
  365. package/build/src/mailer.js +13 -4
  366. package/build/src/plugins/sqljs-wasm-route-controller.js +52 -42
  367. package/build/src/plugins/sqljs-wasm-route.js +38 -28
  368. package/build/src/record-payload-values.js +28 -25
  369. package/build/src/routes/app-routes.js +14 -12
  370. package/build/src/routes/base-route.js +130 -112
  371. package/build/src/routes/basic-route.js +102 -83
  372. package/build/src/routes/built-in/debug/controller.js +10 -10
  373. package/build/src/routes/built-in/errors/controller.js +5 -5
  374. package/build/src/routes/get-route.js +63 -50
  375. package/build/src/routes/hooks/frontend-model-command-route-hook.js +80 -66
  376. package/build/src/routes/index.js +43 -36
  377. package/build/src/routes/namespace-route.js +47 -38
  378. package/build/src/routes/plugin-routes.js +124 -107
  379. package/build/src/routes/post-route.js +62 -51
  380. package/build/src/routes/resolver.js +494 -422
  381. package/build/src/routes/resource-route.js +143 -124
  382. package/build/src/routes/root-route.js +8 -7
  383. package/build/src/testing/base-expect.js +14 -13
  384. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +405 -329
  385. package/build/src/testing/browser-test-app.js +29 -23
  386. package/build/src/testing/expect-to-change.js +50 -41
  387. package/build/src/testing/expect-utils.js +184 -139
  388. package/build/src/testing/expect.js +731 -638
  389. package/build/src/testing/request-client.js +85 -70
  390. package/build/src/testing/test-files-finder.js +339 -285
  391. package/build/src/testing/test-filter-parser.js +155 -124
  392. package/build/src/testing/test-runner.js +1020 -883
  393. package/build/src/testing/test-suite-splitter.js +142 -114
  394. package/build/src/testing/test.js +256 -216
  395. package/build/src/utils/backtrace-cleaner-node.js +69 -62
  396. package/build/src/utils/backtrace-cleaner.js +216 -188
  397. package/build/src/utils/ensure-error.js +7 -7
  398. package/build/src/utils/event-emitter.js +6 -4
  399. package/build/src/utils/file-exists.js +10 -9
  400. package/build/src/utils/format-value.js +76 -67
  401. package/build/src/utils/model-scope.js +31 -27
  402. package/build/src/utils/nest-callbacks.js +13 -10
  403. package/build/src/utils/plain-object.js +6 -5
  404. package/build/src/utils/ransack.d.ts.map +1 -1
  405. package/build/src/utils/ransack.js +563 -449
  406. package/build/src/utils/rest-args-error.js +6 -5
  407. package/build/src/utils/singularize-model-name.js +11 -9
  408. package/build/src/utils/split-sql-statements.js +79 -68
  409. package/build/src/utils/to-import-specifier.js +30 -24
  410. package/build/src/utils/with-tracked-stack-async-hooks.js +74 -60
  411. package/build/src/utils/with-tracked-stack.js +18 -14
  412. package/build/src/velocious-error.js +30 -27
  413. package/index.js +1 -0
  414. package/package.json +10 -4
  415. package/scripts/clean-build.js +8 -0
  416. package/scripts/ensure-bin-executable.js +13 -0
  417. package/scripts/run-tests.js +37 -0
  418. package/scripts/test-browser.js +486 -0
  419. package/src/application.js +229 -0
  420. package/src/authorization/ability.js +329 -0
  421. package/src/authorization/base-resource.js +143 -0
  422. package/src/background-jobs/client.js +50 -0
  423. package/src/background-jobs/cron-expression.js +277 -0
  424. package/src/background-jobs/forked-runner-child.js +86 -0
  425. package/src/background-jobs/job-record.js +13 -0
  426. package/src/background-jobs/job-registry.js +92 -0
  427. package/src/background-jobs/job-runner.js +107 -0
  428. package/src/background-jobs/job.js +77 -0
  429. package/src/background-jobs/json-socket.js +78 -0
  430. package/src/background-jobs/main.js +926 -0
  431. package/src/background-jobs/normalize-error.js +26 -0
  432. package/src/background-jobs/scheduler.js +274 -0
  433. package/src/background-jobs/socket-request.js +68 -0
  434. package/src/background-jobs/status-reporter.js +101 -0
  435. package/src/background-jobs/store.js +994 -0
  436. package/src/background-jobs/types.js +70 -0
  437. package/src/background-jobs/web/authorization.js +89 -0
  438. package/src/background-jobs/web/controller.js +280 -0
  439. package/src/background-jobs/web/index.js +57 -0
  440. package/src/background-jobs/web/path-matcher.js +74 -0
  441. package/src/background-jobs/web/registry.js +49 -0
  442. package/src/background-jobs/worker.js +683 -0
  443. package/src/beacon/client.js +330 -0
  444. package/src/beacon/in-process-broker.js +71 -0
  445. package/src/beacon/in-process-client.js +139 -0
  446. package/src/beacon/server.js +148 -0
  447. package/src/beacon/types.js +55 -0
  448. package/src/cli/base-command.js +67 -0
  449. package/src/cli/browser-cli.js +45 -0
  450. package/src/cli/commands/background-jobs-main.js +7 -0
  451. package/src/cli/commands/background-jobs-runner.js +7 -0
  452. package/src/cli/commands/background-jobs-worker.js +7 -0
  453. package/src/cli/commands/beacon.js +7 -0
  454. package/src/cli/commands/console.js +12 -0
  455. package/src/cli/commands/db/base-command.js +82 -0
  456. package/src/cli/commands/db/create.js +64 -0
  457. package/src/cli/commands/db/drop.js +75 -0
  458. package/src/cli/commands/db/migrate.js +17 -0
  459. package/src/cli/commands/db/reset.js +22 -0
  460. package/src/cli/commands/db/rollback.js +15 -0
  461. package/src/cli/commands/db/schema/dump.js +12 -0
  462. package/src/cli/commands/db/schema/load.js +12 -0
  463. package/src/cli/commands/db/seed.js +12 -0
  464. package/src/cli/commands/db/tenants/check.js +38 -0
  465. package/src/cli/commands/db/tenants/create.js +33 -0
  466. package/src/cli/commands/db/tenants/migrate.js +49 -0
  467. package/src/cli/commands/destroy/migration.js +7 -0
  468. package/src/cli/commands/generate/base-models.js +7 -0
  469. package/src/cli/commands/generate/frontend-models.js +12 -0
  470. package/src/cli/commands/generate/migration.js +7 -0
  471. package/src/cli/commands/generate/model.js +7 -0
  472. package/src/cli/commands/init.js +11 -0
  473. package/src/cli/commands/routes.js +7 -0
  474. package/src/cli/commands/run-script.js +12 -0
  475. package/src/cli/commands/runner.js +12 -0
  476. package/src/cli/commands/server.js +7 -0
  477. package/src/cli/commands/test.js +9 -0
  478. package/src/cli/index.js +152 -0
  479. package/src/cli/tenant-database-command-helper.js +198 -0
  480. package/src/cli/use-browser-cli.js +30 -0
  481. package/src/configuration-resolver.js +65 -0
  482. package/src/configuration-types.js +429 -0
  483. package/src/configuration.js +2590 -0
  484. package/src/controller.js +421 -0
  485. package/src/current-configuration.js +31 -0
  486. package/src/current.js +80 -0
  487. package/src/database/annotations-async-hooks.js +47 -0
  488. package/src/database/annotations.js +40 -0
  489. package/src/database/drivers/base-column.js +182 -0
  490. package/src/database/drivers/base-columns-index.js +81 -0
  491. package/src/database/drivers/base-foreign-key.js +104 -0
  492. package/src/database/drivers/base-table.js +156 -0
  493. package/src/database/drivers/base.js +1609 -0
  494. package/src/database/drivers/mssql/column.js +74 -0
  495. package/src/database/drivers/mssql/columns-index.js +6 -0
  496. package/src/database/drivers/mssql/connect-connection.js +16 -0
  497. package/src/database/drivers/mssql/foreign-key.js +12 -0
  498. package/src/database/drivers/mssql/index.js +590 -0
  499. package/src/database/drivers/mssql/options.js +79 -0
  500. package/src/database/drivers/mssql/query-parser.js +6 -0
  501. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  502. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  503. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  504. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  505. package/src/database/drivers/mssql/sql/delete.js +19 -0
  506. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  507. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  508. package/src/database/drivers/mssql/sql/insert.js +4 -0
  509. package/src/database/drivers/mssql/sql/update.js +31 -0
  510. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  511. package/src/database/drivers/mssql/structure-sql.js +120 -0
  512. package/src/database/drivers/mssql/table.js +145 -0
  513. package/src/database/drivers/mysql/column.js +112 -0
  514. package/src/database/drivers/mysql/columns-index.js +22 -0
  515. package/src/database/drivers/mysql/foreign-key.js +12 -0
  516. package/src/database/drivers/mysql/index.js +473 -0
  517. package/src/database/drivers/mysql/options.js +34 -0
  518. package/src/database/drivers/mysql/query-parser.js +6 -0
  519. package/src/database/drivers/mysql/query.js +37 -0
  520. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  521. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  522. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  523. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  524. package/src/database/drivers/mysql/sql/delete.js +21 -0
  525. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  526. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  527. package/src/database/drivers/mysql/sql/insert.js +6 -0
  528. package/src/database/drivers/mysql/sql/update.js +33 -0
  529. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  530. package/src/database/drivers/mysql/structure-sql.js +93 -0
  531. package/src/database/drivers/mysql/table.js +121 -0
  532. package/src/database/drivers/pgsql/column.js +90 -0
  533. package/src/database/drivers/pgsql/columns-index.js +6 -0
  534. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  535. package/src/database/drivers/pgsql/index.js +441 -0
  536. package/src/database/drivers/pgsql/options.js +32 -0
  537. package/src/database/drivers/pgsql/query-parser.js +6 -0
  538. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  539. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  540. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  541. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  542. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  543. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  544. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  545. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  546. package/src/database/drivers/pgsql/sql/update.js +33 -0
  547. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  548. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  549. package/src/database/drivers/pgsql/table.js +135 -0
  550. package/src/database/drivers/sqlite/base.js +509 -0
  551. package/src/database/drivers/sqlite/column.js +75 -0
  552. package/src/database/drivers/sqlite/columns-index.js +30 -0
  553. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  554. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  555. package/src/database/drivers/sqlite/index.js +394 -0
  556. package/src/database/drivers/sqlite/index.native.js +72 -0
  557. package/src/database/drivers/sqlite/index.web.js +99 -0
  558. package/src/database/drivers/sqlite/options.js +32 -0
  559. package/src/database/drivers/sqlite/query-parser.js +6 -0
  560. package/src/database/drivers/sqlite/query.js +35 -0
  561. package/src/database/drivers/sqlite/query.native.js +35 -0
  562. package/src/database/drivers/sqlite/query.web.js +49 -0
  563. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  564. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  565. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  566. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  567. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  568. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  569. package/src/database/drivers/sqlite/sql/update.js +33 -0
  570. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  571. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  572. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  573. package/src/database/drivers/sqlite/table.js +131 -0
  574. package/src/database/drivers/structure-sql/utils.js +35 -0
  575. package/src/database/handler.js +13 -0
  576. package/src/database/initializer-from-require-context.js +101 -0
  577. package/src/database/migration/index.js +438 -0
  578. package/src/database/migrator/files-finder.js +55 -0
  579. package/src/database/migrator/types.js +31 -0
  580. package/src/database/migrator.js +557 -0
  581. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  582. package/src/database/pool/base-methods-forward.js +52 -0
  583. package/src/database/pool/base.js +380 -0
  584. package/src/database/pool/single-multi-use.js +118 -0
  585. package/src/database/query/alter-table-base.js +104 -0
  586. package/src/database/query/base.js +49 -0
  587. package/src/database/query/create-database-base.js +42 -0
  588. package/src/database/query/create-index-base.js +117 -0
  589. package/src/database/query/create-table-base.js +205 -0
  590. package/src/database/query/delete-base.js +19 -0
  591. package/src/database/query/drop-database-base.js +38 -0
  592. package/src/database/query/drop-table-base.js +58 -0
  593. package/src/database/query/from-base.js +36 -0
  594. package/src/database/query/from-plain.js +16 -0
  595. package/src/database/query/from-table.js +18 -0
  596. package/src/database/query/index.js +533 -0
  597. package/src/database/query/insert-base.js +172 -0
  598. package/src/database/query/join-base.js +43 -0
  599. package/src/database/query/join-object.js +167 -0
  600. package/src/database/query/join-plain.js +18 -0
  601. package/src/database/query/join-tracker.js +93 -0
  602. package/src/database/query/model-class-query.js +1577 -0
  603. package/src/database/query/order-base.js +33 -0
  604. package/src/database/query/order-column.js +77 -0
  605. package/src/database/query/order-plain.js +28 -0
  606. package/src/database/query/preloader/belongs-to.js +267 -0
  607. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  608. package/src/database/query/preloader/has-many.js +316 -0
  609. package/src/database/query/preloader/has-one.js +123 -0
  610. package/src/database/query/preloader/selection.js +152 -0
  611. package/src/database/query/preloader.js +201 -0
  612. package/src/database/query/query-data.js +305 -0
  613. package/src/database/query/select-base.js +30 -0
  614. package/src/database/query/select-plain.js +18 -0
  615. package/src/database/query/select-table-and-column.js +28 -0
  616. package/src/database/query/update-base.js +41 -0
  617. package/src/database/query/upsert-base.js +103 -0
  618. package/src/database/query/where-base.js +38 -0
  619. package/src/database/query/where-combinator.js +31 -0
  620. package/src/database/query/where-hash.js +77 -0
  621. package/src/database/query/where-model-class-hash.js +505 -0
  622. package/src/database/query/where-not.js +23 -0
  623. package/src/database/query/where-plain.js +20 -0
  624. package/src/database/query/with-count.js +219 -0
  625. package/src/database/query-parser/base-query-parser.js +40 -0
  626. package/src/database/query-parser/from-parser.js +49 -0
  627. package/src/database/query-parser/group-parser.js +55 -0
  628. package/src/database/query-parser/joins-parser.js +37 -0
  629. package/src/database/query-parser/limit-parser.js +77 -0
  630. package/src/database/query-parser/options.js +94 -0
  631. package/src/database/query-parser/order-parser.js +45 -0
  632. package/src/database/query-parser/select-parser.js +67 -0
  633. package/src/database/query-parser/where-parser.js +46 -0
  634. package/src/database/record/acts-as-list.js +374 -0
  635. package/src/database/record/attachments/download.js +49 -0
  636. package/src/database/record/attachments/handle.js +188 -0
  637. package/src/database/record/attachments/normalize-input.js +213 -0
  638. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  639. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  640. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  641. package/src/database/record/attachments/store.js +591 -0
  642. package/src/database/record/index.js +3970 -0
  643. package/src/database/record/instance-relationships/base.js +289 -0
  644. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  645. package/src/database/record/instance-relationships/has-many.js +284 -0
  646. package/src/database/record/instance-relationships/has-one.js +117 -0
  647. package/src/database/record/record-not-found-error.js +3 -0
  648. package/src/database/record/relationships/base.js +195 -0
  649. package/src/database/record/relationships/belongs-to.js +57 -0
  650. package/src/database/record/relationships/has-many.js +46 -0
  651. package/src/database/record/relationships/has-one.js +46 -0
  652. package/src/database/record/state-machine.js +278 -0
  653. package/src/database/record/user-module.js +43 -0
  654. package/src/database/record/validators/base.js +27 -0
  655. package/src/database/record/validators/format.js +50 -0
  656. package/src/database/record/validators/presence.js +24 -0
  657. package/src/database/record/validators/uniqueness.js +124 -0
  658. package/src/database/table-data/index.js +241 -0
  659. package/src/database/table-data/table-column.js +416 -0
  660. package/src/database/table-data/table-foreign-key.js +69 -0
  661. package/src/database/table-data/table-index.js +46 -0
  662. package/src/database/table-data/table-reference.js +13 -0
  663. package/src/database/use-database.js +48 -0
  664. package/src/environment-handlers/base.js +561 -0
  665. package/src/environment-handlers/browser.js +338 -0
  666. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  667. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  668. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  669. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  670. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  671. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  672. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  673. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  674. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  675. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  676. package/src/environment-handlers/node/cli/commands/generate/base-models.js +367 -0
  677. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  678. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  679. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  680. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  681. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  682. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  683. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  684. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  685. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  686. package/src/environment-handlers/node.js +887 -0
  687. package/src/error-logger.js +30 -0
  688. package/src/frontend-model-controller.js +3491 -0
  689. package/src/frontend-model-resource/base-resource.js +935 -0
  690. package/src/frontend-models/base.js +4004 -0
  691. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  692. package/src/frontend-models/event-hook-models.js +49 -0
  693. package/src/frontend-models/model-registry.js +28 -0
  694. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  695. package/src/frontend-models/preloader.js +169 -0
  696. package/src/frontend-models/query.js +2245 -0
  697. package/src/frontend-models/resource-config-validation.js +56 -0
  698. package/src/frontend-models/resource-definition.js +399 -0
  699. package/src/frontend-models/transport-serialization.js +369 -0
  700. package/src/frontend-models/use-created-event.js +21 -0
  701. package/src/frontend-models/use-destroyed-event.js +148 -0
  702. package/src/frontend-models/use-model-class-event.js +164 -0
  703. package/src/frontend-models/use-updated-event.js +152 -0
  704. package/src/frontend-models/websocket-channel.js +494 -0
  705. package/src/frontend-models/websocket-publishers.js +224 -0
  706. package/src/http-client/header.js +17 -0
  707. package/src/http-client/index.js +139 -0
  708. package/src/http-client/request.js +94 -0
  709. package/src/http-client/response.js +151 -0
  710. package/src/http-client/websocket-client.js +27 -0
  711. package/src/http-server/client/index.js +507 -0
  712. package/src/http-server/client/params-to-object.js +152 -0
  713. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  714. package/src/http-server/client/request-buffer/header.js +19 -0
  715. package/src/http-server/client/request-buffer/index.js +535 -0
  716. package/src/http-server/client/request-parser.js +195 -0
  717. package/src/http-server/client/request-runner.js +321 -0
  718. package/src/http-server/client/request-timing.js +171 -0
  719. package/src/http-server/client/request.js +114 -0
  720. package/src/http-server/client/response.js +251 -0
  721. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  722. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  723. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  724. package/src/http-server/client/websocket-request.js +147 -0
  725. package/src/http-server/client/websocket-session.js +1755 -0
  726. package/src/http-server/cookie.js +245 -0
  727. package/src/http-server/development-reloader.js +240 -0
  728. package/src/http-server/index.js +561 -0
  729. package/src/http-server/remote-address.js +77 -0
  730. package/src/http-server/server-client.js +222 -0
  731. package/src/http-server/server-lock.js +178 -0
  732. package/src/http-server/websocket-channel-subscribers.js +110 -0
  733. package/src/http-server/websocket-channel.js +137 -0
  734. package/src/http-server/websocket-connection.js +118 -0
  735. package/src/http-server/websocket-event-log-store.js +433 -0
  736. package/src/http-server/websocket-events-host.js +170 -0
  737. package/src/http-server/websocket-events.js +50 -0
  738. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  739. package/src/http-server/worker-handler/in-process.js +155 -0
  740. package/src/http-server/worker-handler/index.js +370 -0
  741. package/src/http-server/worker-handler/worker-script.js +6 -0
  742. package/src/http-server/worker-handler/worker-thread.js +286 -0
  743. package/src/initializer.js +39 -0
  744. package/src/jobs/.gitkeep +1 -0
  745. package/src/jobs/mail-delivery.js +22 -0
  746. package/src/logger/base-logger.js +34 -0
  747. package/src/logger/console-logger.js +28 -0
  748. package/src/logger/file-logger.js +36 -0
  749. package/src/logger/outputs/array-output.js +50 -0
  750. package/src/logger/outputs/console-output.js +32 -0
  751. package/src/logger/outputs/file-output.js +55 -0
  752. package/src/logger/outputs/stdout-output.js +64 -0
  753. package/src/logger.js +507 -0
  754. package/src/mailer/backends/smtp.js +197 -0
  755. package/src/mailer/base.js +337 -0
  756. package/src/mailer/delivery.js +70 -0
  757. package/src/mailer/index.js +24 -0
  758. package/src/mailer.js +15 -0
  759. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  760. package/src/plugins/sqljs-wasm-route.js +71 -0
  761. package/src/record-payload-values.js +83 -0
  762. package/src/routes/app-routes.js +17 -0
  763. package/src/routes/base-route.js +133 -0
  764. package/src/routes/basic-route.js +109 -0
  765. package/src/routes/built-in/debug/controller.js +12 -0
  766. package/src/routes/built-in/errors/controller.js +7 -0
  767. package/src/routes/built-in/errors/not-found.ejs +1 -0
  768. package/src/routes/get-route.js +75 -0
  769. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  770. package/src/routes/index.js +50 -0
  771. package/src/routes/namespace-route.js +51 -0
  772. package/src/routes/plugin-routes.js +141 -0
  773. package/src/routes/post-route.js +74 -0
  774. package/src/routes/resolver.js +535 -0
  775. package/src/routes/resource-route.js +154 -0
  776. package/src/routes/root-route.js +11 -0
  777. package/src/templates/configuration.js +61 -0
  778. package/src/templates/generate-migration.js +11 -0
  779. package/src/templates/generate-model.js +6 -0
  780. package/src/templates/routes.js +11 -0
  781. package/src/testing/base-expect.js +17 -0
  782. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  783. package/src/testing/browser-test-app.js +32 -0
  784. package/src/testing/expect-to-change.js +55 -0
  785. package/src/testing/expect-utils.js +269 -0
  786. package/src/testing/expect.js +763 -0
  787. package/src/testing/request-client.js +90 -0
  788. package/src/testing/test-files-finder.js +364 -0
  789. package/src/testing/test-filter-parser.js +198 -0
  790. package/src/testing/test-runner.js +1168 -0
  791. package/src/testing/test-suite-splitter.js +177 -0
  792. package/src/testing/test.js +370 -0
  793. package/src/types/external-modules.d.ts +57 -0
  794. package/src/utils/backtrace-cleaner-node.js +87 -0
  795. package/src/utils/backtrace-cleaner.js +266 -0
  796. package/src/utils/ensure-error.js +15 -0
  797. package/src/utils/event-emitter.js +8 -0
  798. package/src/utils/file-exists.js +18 -0
  799. package/src/utils/format-value.js +101 -0
  800. package/src/utils/model-scope.js +56 -0
  801. package/src/utils/nest-callbacks.js +22 -0
  802. package/src/utils/plain-object.js +14 -0
  803. package/src/utils/ransack.js +859 -0
  804. package/src/utils/rest-args-error.js +14 -0
  805. package/src/utils/singularize-model-name.js +18 -0
  806. package/src/utils/split-sql-statements.js +88 -0
  807. package/src/utils/to-import-specifier.js +53 -0
  808. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  809. package/src/utils/with-tracked-stack.js +38 -0
  810. package/src/velocious-error.js +34 -0
  811. package/tsconfig.json +16 -0
@@ -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
+ }