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,887 @@
1
+ // @ts-check
2
+
3
+ import "../database/annotations-async-hooks.js"
4
+ import Base from "./base.js"
5
+ import CliCommandsDestroyMigration from "./node/cli/commands/destroy/migration.js"
6
+ import CliCommandsInit from "./node/cli/commands/init.js"
7
+ import CliCommandsGenerateBaseModels from "./node/cli/commands/generate/base-models.js"
8
+ import CliCommandsGenerateFrontendModels from "./node/cli/commands/generate/frontend-models.js"
9
+ import CliCommandsGenerateMigration from "./node/cli/commands/generate/migration.js"
10
+ import CliCommandsGenerateModel from "./node/cli/commands/generate/model.js"
11
+ import CliCommandsRoutes from "./node/cli/commands/routes.js"
12
+ import CliCommandsServer from "./node/cli/commands/server.js"
13
+ import CliCommandsTest from "./node/cli/commands/test.js"
14
+ import CliCommandsBackgroundJobsMain from "./node/cli/commands/background-jobs-main.js"
15
+ import CliCommandsBackgroundJobsWorker from "./node/cli/commands/background-jobs-worker.js"
16
+ import CliCommandsBackgroundJobsRunner from "./node/cli/commands/background-jobs-runner.js"
17
+ import CliCommandsBeacon from "./node/cli/commands/beacon.js"
18
+ import CliCommandsConsole from "./node/cli/commands/console.js"
19
+ import CliCommandsDbSchemaDump from "./node/cli/commands/db/schema/dump.js"
20
+ import CliCommandsDbSchemaLoad from "./node/cli/commands/db/schema/load.js"
21
+ import CliCommandsDbSeed from "./node/cli/commands/db/seed.js"
22
+ import CliCommandsRunner from "./node/cli/commands/runner.js"
23
+ import CliCommandsRunScript from "./node/cli/commands/run-script.js"
24
+ import frontendModelCommandRouteHook from "../routes/hooks/frontend-model-command-route-hook.js"
25
+ import {FRAMEWORK_SOURCE_DIRECTORY} from "../utils/backtrace-cleaner-node.js"
26
+ import {dirname} from "path"
27
+ import {fileURLToPath} from "url"
28
+ import fs from "fs/promises"
29
+ import * as inflection from "inflection"
30
+ import path from "path"
31
+ import {AsyncLocalStorage as NodeAsyncLocalStorage} from "node:async_hooks"
32
+ import {timingSafeEqual} from "node:crypto"
33
+ import toImportSpecifier from "../utils/to-import-specifier.js"
34
+
35
+ /**
36
+ * Defines this typedef.
37
+ @typedef {{ability?: import("../authorization/ability.js").default, offsetMinutes: number, requestTiming?: import("../http-server/client/request-timing.js").default, tenant?: ?}} TimezoneStore */
38
+
39
+ /**
40
+ * Runs path within allowed prefixes.
41
+ * @param {string} filePath - Input file path.
42
+ * @param {string[]} allowedPathPrefixes - Allowed path prefixes.
43
+ * @returns {boolean} - Whether input path is inside an allowed prefix.
44
+ */
45
+ function pathWithinAllowedPrefixes(filePath, allowedPathPrefixes) {
46
+ const resolvedPath = path.resolve(filePath)
47
+
48
+ return allowedPathPrefixes.some((allowedPrefix) => {
49
+ const resolvedPrefix = path.resolve(allowedPrefix)
50
+ const relativePath = path.relative(resolvedPrefix, resolvedPath)
51
+
52
+ if (!relativePath) return true
53
+ if (relativePath.startsWith("..")) return false
54
+ if (path.isAbsolute(relativePath)) return false
55
+
56
+ return true
57
+ })
58
+ }
59
+
60
+ export default class VelociousEnvironmentHandlerNode extends Base{
61
+ /**
62
+ * Timezone async local storage.
63
+ @type {import("node:async_hooks").AsyncLocalStorage<TimezoneStore> | undefined} */
64
+ _timezoneAsyncLocalStorage = NodeAsyncLocalStorage ? new NodeAsyncLocalStorage() : undefined
65
+
66
+ /**
67
+ * Find commands result.
68
+ @type {import("./base.js").CommandFileObjectType[] | undefined} */
69
+ _findCommandsResult = undefined
70
+
71
+ /**
72
+ * Runs debug endpoint token matches.
73
+ * @param {string} providedToken - Token from the request.
74
+ * @param {string} expectedToken - Configured token.
75
+ * @returns {boolean} - Whether both tokens match.
76
+ */
77
+ debugEndpointTokenMatches(providedToken, expectedToken) {
78
+ const provided = Buffer.from(providedToken)
79
+ const expected = Buffer.from(expectedToken)
80
+
81
+ return provided.length === expected.length && timingSafeEqual(provided, expected)
82
+ }
83
+
84
+ /**
85
+ * Runs get framework source directory.
86
+ * @returns {string | undefined} - Velocious source directory used to filter framework stack frames.
87
+ */
88
+ getFrameworkSourceDirectory() {
89
+ return FRAMEWORK_SOURCE_DIRECTORY
90
+ }
91
+
92
+ /**
93
+ * Auto-discovers resource classes from src/resources/ in each backend project.
94
+ * @param {import("../configuration.js").default} configuration - Configuration instance.
95
+ * @returns {Promise<void>}
96
+ */
97
+ async autoDiscoverResources(configuration) {
98
+ const {frontendModelResourceDefinitionIsClass} = await import("../frontend-models/resource-definition.js")
99
+ const backendProjects = configuration.getBackendProjects()
100
+
101
+ for (const backendProject of backendProjects) {
102
+ if (backendProject.frontendModels) continue
103
+
104
+ const resourcesDir = path.join(backendProject.path, "src", "resources")
105
+ let files
106
+
107
+ try {
108
+ files = await fs.readdir(resourcesDir)
109
+ } catch {
110
+ continue
111
+ }
112
+
113
+ /**
114
+ * Discovered.
115
+ @type {Record<string, ?>} */
116
+ const discovered = {}
117
+
118
+ for (const file of files) {
119
+ if (!file.endsWith(".js") && !file.endsWith(".mjs")) continue
120
+ if (file.startsWith("frontend-model-resources")) continue
121
+
122
+ const filePath = path.join(resourcesDir, file)
123
+ const imported = await import(filePath)
124
+ const ResourceClass = imported.default
125
+
126
+ if (!frontendModelResourceDefinitionIsClass(ResourceClass)) continue
127
+
128
+ const baseName = file.replace(/\.(js|mjs)$/, "")
129
+ const modelName = baseName.replace(/-resource$/, "")
130
+ .split("-")
131
+ .map((/**
132
+ * Narrows the runtime value to the documented type.
133
+ @type {string} */ part) => part.charAt(0).toUpperCase() + part.slice(1))
134
+ .join("")
135
+
136
+ discovered[modelName] = ResourceClass
137
+ }
138
+
139
+ if (Object.keys(discovered).length > 0) {
140
+ backendProject.frontendModels = discovered
141
+ }
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Runs set configuration.
147
+ * @param {import("../configuration.js").default} newConfiguration - New configuration.
148
+ * @returns {void} - No return value.
149
+ */
150
+ setConfiguration(newConfiguration) {
151
+ super.setConfiguration(newConfiguration)
152
+
153
+ if (!newConfiguration.getRouteResolverHooks().includes(frontendModelCommandRouteHook)) {
154
+ newConfiguration.addRouteResolverHook(frontendModelCommandRouteHook)
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Runs read attachment input file.
160
+ * @param {string} filePath - File path.
161
+ * @returns {Promise<Buffer>} - File bytes.
162
+ */
163
+ async readAttachmentInputFile(filePath) {
164
+ return await fs.readFile(filePath)
165
+ }
166
+
167
+ /**
168
+ * Runs resolve attachment input path.
169
+ * @param {object} args - Args.
170
+ * @param {string[]} args.allowedPathPrefixes - Allowed path prefixes.
171
+ * @param {string} args.inputPath - Input path.
172
+ * @returns {Promise<{buffer: Buffer, filePath: string}>} - Resolved path and bytes.
173
+ */
174
+ async resolveAttachmentInputPath({allowedPathPrefixes, inputPath}) {
175
+ const filePath = path.resolve(inputPath)
176
+ const prefixes = Array.isArray(allowedPathPrefixes)
177
+ ? allowedPathPrefixes.filter((entry) => typeof entry === "string" && entry.length > 0)
178
+ : []
179
+
180
+ if (prefixes.length > 0 && !pathWithinAllowedPrefixes(filePath, prefixes)) {
181
+ throw new Error("Attachment path is outside allowed directories")
182
+ }
183
+
184
+ const buffer = await this.readAttachmentInputFile(filePath)
185
+
186
+ return {buffer, filePath}
187
+ }
188
+
189
+ /**
190
+ * Runs find commands.
191
+ * @returns {Promise<Array<import("./base.js").CommandFileObjectType>>} - Resolves with the commands.
192
+ */
193
+ async findCommands() {
194
+ this._findCommandsResult ||= await this._actualFindCommands()
195
+
196
+ if (!this._findCommandsResult) throw new Error("Could not get commands")
197
+
198
+ return this._findCommandsResult
199
+ }
200
+
201
+ /**
202
+ * Runs run with timezone offset.
203
+ * @param {number} offsetMinutes - Offset in minutes (Date#getTimezoneOffset).
204
+ * @param {() => Promise<?>} callback - Callback to run.
205
+ * @returns {Promise<?>} - Result of the callback.
206
+ */
207
+ async runWithTimezoneOffset(offsetMinutes, callback) {
208
+ if (!this._timezoneAsyncLocalStorage) {
209
+ return await callback()
210
+ }
211
+
212
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
213
+
214
+ return await this._timezoneAsyncLocalStorage.run({
215
+ ability: existingStore?.ability,
216
+ offsetMinutes,
217
+ requestTiming: existingStore?.requestTiming,
218
+ tenant: existingStore?.tenant
219
+ }, callback)
220
+ }
221
+
222
+ /**
223
+ * Runs set timezone offset.
224
+ * @param {number} offsetMinutes - Offset in minutes (Date#getTimezoneOffset).
225
+ * @returns {void} - No return value.
226
+ */
227
+ setTimezoneOffset(offsetMinutes) {
228
+ if (!this._timezoneAsyncLocalStorage) return
229
+
230
+ const store = this._timezoneAsyncLocalStorage.getStore()
231
+
232
+ if (store) {
233
+ store.offsetMinutes = offsetMinutes
234
+ } else {
235
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
236
+
237
+ this._timezoneAsyncLocalStorage.enterWith({
238
+ ability: existingStore?.ability,
239
+ offsetMinutes,
240
+ requestTiming: existingStore?.requestTiming,
241
+ tenant: existingStore?.tenant
242
+ })
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Runs get timezone offset minutes.
248
+ * @param {import("../configuration.js").default | undefined} configuration - Configuration instance.
249
+ * @returns {number} - Offset in minutes.
250
+ */
251
+ getTimezoneOffsetMinutes(configuration) {
252
+ if (this._timezoneAsyncLocalStorage) {
253
+ const store = this._timezoneAsyncLocalStorage.getStore()
254
+
255
+ if (store && typeof store.offsetMinutes === "number") {
256
+ return store.offsetMinutes
257
+ }
258
+ }
259
+
260
+ return super.getTimezoneOffsetMinutes(configuration)
261
+ }
262
+
263
+ /**
264
+ * Runs run with ability.
265
+ * @param {import("../authorization/ability.js").default | undefined} ability - Ability to set for callback scope.
266
+ * @param {() => Promise<?>} callback - Callback.
267
+ * @returns {Promise<?>} - Callback result.
268
+ */
269
+ async runWithAbility(ability, callback) {
270
+ if (!this._timezoneAsyncLocalStorage) {
271
+ return await super.runWithAbility(ability, callback)
272
+ }
273
+
274
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
275
+
276
+ return await this._timezoneAsyncLocalStorage.run({
277
+ ability,
278
+ offsetMinutes: existingStore?.offsetMinutes ?? this.getTimezoneOffsetMinutes(this.getConfiguration()),
279
+ requestTiming: existingStore?.requestTiming,
280
+ tenant: existingStore?.tenant
281
+ }, callback)
282
+ }
283
+
284
+ /**
285
+ * Runs set current ability.
286
+ * @param {import("../authorization/ability.js").default | undefined} ability - Ability to set.
287
+ * @returns {void} - No return value.
288
+ */
289
+ setCurrentAbility(ability) {
290
+ if (!this._timezoneAsyncLocalStorage) {
291
+ super.setCurrentAbility(ability)
292
+ return
293
+ }
294
+
295
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
296
+
297
+ if (existingStore) {
298
+ existingStore.ability = ability
299
+ } else {
300
+ this._timezoneAsyncLocalStorage.enterWith({
301
+ ability,
302
+ offsetMinutes: this.getTimezoneOffsetMinutes(this.getConfiguration()),
303
+ requestTiming: undefined,
304
+ tenant: undefined
305
+ })
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Runs get current ability.
311
+ * @returns {import("../authorization/ability.js").default | undefined} - Current ability.
312
+ */
313
+ getCurrentAbility() {
314
+ if (!this._timezoneAsyncLocalStorage) {
315
+ return super.getCurrentAbility()
316
+ }
317
+
318
+ return this._timezoneAsyncLocalStorage.getStore()?.ability
319
+ }
320
+
321
+ /**
322
+ * Runs run with request timing.
323
+ * @param {import("../http-server/client/request-timing.js").default | undefined} requestTiming - Request timing collector.
324
+ * @param {() => Promise<?>} callback - Callback.
325
+ * @returns {Promise<?>} - Callback result.
326
+ */
327
+ async runWithRequestTiming(requestTiming, callback) {
328
+ if (!this._timezoneAsyncLocalStorage) {
329
+ return await super.runWithRequestTiming(requestTiming, callback)
330
+ }
331
+
332
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
333
+
334
+ return await this._timezoneAsyncLocalStorage.run({
335
+ ability: existingStore?.ability,
336
+ offsetMinutes: existingStore?.offsetMinutes ?? this.getTimezoneOffsetMinutes(this.getConfiguration()),
337
+ requestTiming,
338
+ tenant: existingStore?.tenant
339
+ }, callback)
340
+ }
341
+
342
+ /**
343
+ * Runs get current request timing.
344
+ * @returns {import("../http-server/client/request-timing.js").default | undefined} - Current request timing collector.
345
+ */
346
+ getCurrentRequestTiming() {
347
+ if (!this._timezoneAsyncLocalStorage) {
348
+ return super.getCurrentRequestTiming()
349
+ }
350
+
351
+ return this._timezoneAsyncLocalStorage.getStore()?.requestTiming
352
+ }
353
+
354
+ /**
355
+ * Runs run with tenant.
356
+ * @param {?} tenant - Tenant to set for callback scope.
357
+ * @param {() => Promise<?>} callback - Callback.
358
+ * @returns {Promise<?>} - Callback result.
359
+ */
360
+ async runWithTenant(tenant, callback) {
361
+ if (!this._timezoneAsyncLocalStorage) {
362
+ return await super.runWithTenant(tenant, callback)
363
+ }
364
+
365
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
366
+
367
+ return await this._timezoneAsyncLocalStorage.run({
368
+ ability: existingStore?.ability,
369
+ offsetMinutes: existingStore?.offsetMinutes ?? this.getTimezoneOffsetMinutes(this.getConfiguration()),
370
+ requestTiming: existingStore?.requestTiming,
371
+ tenant
372
+ }, callback)
373
+ }
374
+
375
+ /**
376
+ * Runs set current tenant.
377
+ * @param {?} tenant - Tenant to set.
378
+ * @returns {void} - No return value.
379
+ */
380
+ setCurrentTenant(tenant) {
381
+ if (!this._timezoneAsyncLocalStorage) {
382
+ super.setCurrentTenant(tenant)
383
+ return
384
+ }
385
+
386
+ const existingStore = this._timezoneAsyncLocalStorage.getStore()
387
+
388
+ if (existingStore) {
389
+ existingStore.tenant = tenant
390
+ } else {
391
+ this._timezoneAsyncLocalStorage.enterWith({
392
+ ability: undefined,
393
+ offsetMinutes: this.getTimezoneOffsetMinutes(this.getConfiguration()),
394
+ requestTiming: undefined,
395
+ tenant
396
+ })
397
+ }
398
+ }
399
+
400
+ /**
401
+ * Runs get current tenant.
402
+ * @returns {?} - Current tenant.
403
+ */
404
+ getCurrentTenant() {
405
+ if (!this._timezoneAsyncLocalStorage) {
406
+ return super.getCurrentTenant()
407
+ }
408
+
409
+ return this._timezoneAsyncLocalStorage.getStore()?.tenant
410
+ }
411
+
412
+ /**
413
+ * Runs actual find commands.
414
+ * @returns {Promise<Array<import("./base.js").CommandFileObjectType>>} - Resolves with discovered command files.
415
+ */
416
+ async _actualFindCommands() {
417
+ const basePath = await this.getBasePath()
418
+ const commandFiles = fs.glob(`${basePath}/src/cli/commands/**/*.js`)
419
+ const commands = []
420
+
421
+ for await (const aFilePath of commandFiles) {
422
+ const commandName = this.commandNameFromFilePath(aFilePath)
423
+
424
+ commands.push({name: commandName, file: aFilePath})
425
+ }
426
+
427
+ return commands
428
+ }
429
+
430
+ /**
431
+ * Runs command name from file path.
432
+ * @param {string} filePath - Full command file path.
433
+ * @returns {string} - Parsed command name.
434
+ */
435
+ commandNameFromFilePath(filePath) {
436
+ const aFilePathParts = filePath.split(/[\\/]/)
437
+ const commandPathLocation = aFilePathParts.indexOf("commands")
438
+
439
+ if (commandPathLocation === -1) {
440
+ throw new Error(`Could not parse command file path: ${filePath}`)
441
+ }
442
+
443
+ const commandParts = aFilePathParts.slice(commandPathLocation + 1)
444
+ const lastPart = commandParts[commandParts.length - 1]
445
+ let name, paths
446
+
447
+ if (lastPart == "index.js") {
448
+ name = commandParts[commandParts.length - 2]
449
+ paths = commandParts.slice(0, -2)
450
+ } else {
451
+ name = lastPart.replace(".js", "")
452
+ paths = commandParts.slice(0, -1)
453
+ }
454
+
455
+ return `${paths.join(":")}${paths.length > 0 ? ":" : ""}${name}`
456
+ }
457
+
458
+ /**
459
+ * Runs cli commands init.
460
+ * @param {import("../cli/base-command.js").default} command - Command.
461
+ * @returns {Promise<?>} - Resolves with the command result.
462
+ */
463
+ async cliCommandsInit(command) {
464
+ return await this.forwardCommand(command, CliCommandsInit)
465
+ }
466
+
467
+ /**
468
+ * Runs cli commands migration generate.
469
+ * @param {import("../cli/base-command.js").default} command - Command.
470
+ * @returns {Promise<?>} - Resolves with the command result.
471
+ */
472
+ async cliCommandsMigrationGenerate(command) {
473
+ return await this.forwardCommand(command, CliCommandsGenerateMigration)
474
+ }
475
+
476
+ /**
477
+ * Runs cli commands migration destroy.
478
+ * @param {import("../cli/base-command.js").default} command - Command.
479
+ * @returns {Promise<?>} - Resolves with the command result.
480
+ */
481
+ async cliCommandsMigrationDestroy(command) {
482
+ return await this.forwardCommand(command, CliCommandsDestroyMigration)
483
+ }
484
+
485
+ /**
486
+ * Runs cli commands generate base models.
487
+ * @param {import("../cli/base-command.js").default} command - Command.
488
+ * @returns {Promise<?>} - Resolves with the command result.
489
+ */
490
+ async cliCommandsGenerateBaseModels(command) {
491
+ return await this.forwardCommand(command, CliCommandsGenerateBaseModels)
492
+ }
493
+
494
+ /**
495
+ * Runs cli commands generate frontend models.
496
+ * @param {import("../cli/base-command.js").default} command - Command.
497
+ * @returns {Promise<?>} - Resolves with the command result.
498
+ */
499
+ async cliCommandsGenerateFrontendModels(command) {
500
+ return await this.forwardCommand(command, CliCommandsGenerateFrontendModels)
501
+ }
502
+
503
+ /**
504
+ * Runs cli commands generate model.
505
+ * @param {import("../cli/base-command.js").default} command - Command.
506
+ * @returns {Promise<?>} - Resolves with the command result.
507
+ */
508
+ async cliCommandsGenerateModel(command) {
509
+ return await this.forwardCommand(command, CliCommandsGenerateModel)
510
+ }
511
+
512
+ /**
513
+ * Runs cli commands routes.
514
+ * @param {import("../cli/base-command.js").default} command - Command.
515
+ * @returns {Promise<?>} - Resolves with the command result.
516
+ */
517
+ async cliCommandsRoutes(command) {
518
+ return await this.forwardCommand(command, CliCommandsRoutes)
519
+ }
520
+
521
+ /**
522
+ * Runs cli commands console.
523
+ * @param {import("../cli/base-command.js").default} command - Command.
524
+ * @returns {Promise<?>} - Resolves with the command result.
525
+ */
526
+ async cliCommandsConsole(command) {
527
+ return await this.forwardCommand(command, CliCommandsConsole)
528
+ }
529
+
530
+ /**
531
+ * Runs cli commands server.
532
+ * @param {import("../cli/base-command.js").default} command - Command.
533
+ * @returns {Promise<?>} - Resolves with the command result.
534
+ */
535
+ async cliCommandsServer(command) {
536
+ return await this.forwardCommand(command, CliCommandsServer)
537
+ }
538
+
539
+ /**
540
+ * Runs cli commands test.
541
+ * @param {import("../cli/base-command.js").default} command - Command.
542
+ * @returns {Promise<?>} - Resolves with the command result.
543
+ */
544
+ async cliCommandsTest(command) {
545
+ return await this.forwardCommand(command, CliCommandsTest)
546
+ }
547
+
548
+ /**
549
+ * Runs cli commands background jobs main.
550
+ * @param {import("../cli/base-command.js").default} command - Command.
551
+ * @returns {Promise<?>} - Resolves with the command result.
552
+ */
553
+ async cliCommandsBackgroundJobsMain(command) {
554
+ return await this.forwardCommand(command, CliCommandsBackgroundJobsMain)
555
+ }
556
+
557
+ /**
558
+ * Runs cli commands background jobs worker.
559
+ * @param {import("../cli/base-command.js").default} command - Command.
560
+ * @returns {Promise<?>} - Resolves with the command result.
561
+ */
562
+ async cliCommandsBackgroundJobsWorker(command) {
563
+ return await this.forwardCommand(command, CliCommandsBackgroundJobsWorker)
564
+ }
565
+
566
+ /**
567
+ * Runs cli commands background jobs runner.
568
+ * @param {import("../cli/base-command.js").default} command - Command.
569
+ * @returns {Promise<?>} - Resolves with the command result.
570
+ */
571
+ async cliCommandsBackgroundJobsRunner(command) {
572
+ return await this.forwardCommand(command, CliCommandsBackgroundJobsRunner)
573
+ }
574
+
575
+ /**
576
+ * Runs cli commands beacon.
577
+ * @param {import("../cli/base-command.js").default} command - Command.
578
+ * @returns {Promise<?>} - Resolves with the command result.
579
+ */
580
+ async cliCommandsBeacon(command) {
581
+ return await this.forwardCommand(command, CliCommandsBeacon)
582
+ }
583
+
584
+ /**
585
+ * Runs load beacon client.
586
+ * @returns {Promise<typeof import("../beacon/client.js").default>} - Beacon client class.
587
+ */
588
+ async loadBeaconClient() {
589
+ const {default: BeaconClient} = await import("../beacon/client.js")
590
+
591
+ return BeaconClient
592
+ }
593
+
594
+ /**
595
+ * Runs load in process beacon client.
596
+ * @returns {Promise<typeof import("../beacon/in-process-client.js").default>} - In-process client class.
597
+ */
598
+ async loadInProcessBeaconClient() {
599
+ const {default: InProcessBeaconClient} = await import("../beacon/in-process-client.js")
600
+
601
+ return InProcessBeaconClient
602
+ }
603
+
604
+ /**
605
+ * Runs cli commands db schema dump.
606
+ * @param {import("../cli/base-command.js").default} command - Command.
607
+ * @returns {Promise<?>} - Resolves with the command result.
608
+ */
609
+ async cliCommandsDbSchemaDump(command) {
610
+ return await this.forwardCommand(command, CliCommandsDbSchemaDump)
611
+ }
612
+
613
+ /**
614
+ * Runs cli commands db schema load.
615
+ * @param {import("../cli/base-command.js").default} command - Command.
616
+ * @returns {Promise<?>} - Resolves with the command result.
617
+ */
618
+ async cliCommandsDbSchemaLoad(command) {
619
+ return await this.forwardCommand(command, CliCommandsDbSchemaLoad)
620
+ }
621
+
622
+ /**
623
+ * Runs cli commands db seed.
624
+ * @param {import("../cli/base-command.js").default} command - Command.
625
+ * @returns {Promise<?>} - Resolves with the command result.
626
+ */
627
+ async cliCommandsDbSeed(command) {
628
+ return await this.forwardCommand(command, CliCommandsDbSeed)
629
+ }
630
+
631
+ /**
632
+ * Runs cli commands runner.
633
+ * @param {import("../cli/base-command.js").default} command - Command.
634
+ * @returns {Promise<?>} - Resolves with the command result.
635
+ */
636
+ async cliCommandsRunner(command) {
637
+ return await this.forwardCommand(command, CliCommandsRunner)
638
+ }
639
+
640
+ /**
641
+ * Runs cli commands run script.
642
+ * @param {import("../cli/base-command.js").default} command - Command.
643
+ * @returns {Promise<?>} - Resolves with the command result.
644
+ */
645
+ async cliCommandsRunScript(command) {
646
+ return await this.forwardCommand(command, CliCommandsRunScript)
647
+ }
648
+
649
+ /**
650
+ * Runs require command.
651
+ * @param {object} args - Options object.
652
+ * @param {string[]} args.commandParts - Command parts.
653
+ * @returns {Promise<typeof import ("../cli/base-command.js").default>} - Resolves with the require command.
654
+ */
655
+ async requireCommand({commandParts}) {
656
+ const commands = await this.findCommands()
657
+ const commandName = commandParts.join(":")
658
+ const command = commands.find((aCommand) => aCommand.name === commandName)
659
+
660
+ if (!command) {
661
+ const possibleCommands = commands.map(aCommand => aCommand.name)
662
+
663
+ throw new Error(`Unknown command: ${commandParts.join(":")} which should have been one of: ${possibleCommands.sort().join(", ")}`)
664
+ }
665
+
666
+ const commandClassImport = await import(toImportSpecifier(command.file))
667
+ const CommandClass = commandClassImport.default
668
+
669
+ return CommandClass
670
+ }
671
+
672
+ /**
673
+ * Runs find migrations.
674
+ * @returns {Promise<Array<import("./base.js").MigrationObjectType>>} - Resolves with the migrations.
675
+ */
676
+ async findMigrations() {
677
+ const migrationsPath = `${this.getConfiguration().getDirectory()}/src/database/migrations`
678
+ const glob = await fs.glob(`${migrationsPath}/**/*.js`)
679
+ let files = []
680
+
681
+ for await (const fullPath of glob) {
682
+ const file = await path.basename(fullPath)
683
+
684
+ const match = file.match(/^(\d{14})-(.+)\.js$/)
685
+
686
+ if (!match) continue
687
+
688
+ const date = parseInt(match[1])
689
+ const migrationName = match[2]
690
+ const migrationClassName = inflection.camelize(migrationName.replaceAll("-", "_"))
691
+
692
+ files.push({
693
+ file,
694
+ fullPath: `${migrationsPath}/${file}`,
695
+ date,
696
+ migrationClassName
697
+ })
698
+ }
699
+
700
+ files = files.sort((migration1, migration2) => migration1.date - migration2.date)
701
+
702
+ return files
703
+ }
704
+
705
+ /**
706
+ * Runs import application routes.
707
+ * @returns {Promise<import("../routes/index.js").default>} - Resolves with the import application routes.
708
+ */
709
+ async importApplicationRoutes() {
710
+ const routesImport = await import(toImportSpecifier(`${this.getConfiguration().getDirectory()}/src/config/routes.js`))
711
+
712
+ return routesImport.default
713
+ }
714
+
715
+ /**
716
+ * Runs get velocious path.
717
+ * @returns {Promise<string>} - Resolves with the velocious path.
718
+ */
719
+ async getVelociousPath() {
720
+ if (!this._velociousPath) {
721
+ const __filename = fileURLToPath(import.meta.url)
722
+ const __dirname = dirname(__filename)
723
+
724
+ this._velociousPath = await fs.realpath(`${__dirname}/../..`)
725
+ }
726
+
727
+ return this._velociousPath
728
+ }
729
+
730
+ /**
731
+ * Runs import test files.
732
+ * @param {string[]} testFiles - Test files.
733
+ * @returns {Promise<void>} - Resolves when complete.
734
+ */
735
+ async importTestFiles(testFiles) {
736
+ for (const testFile of testFiles) {
737
+ await import(toImportSpecifier(testFile))
738
+ }
739
+ }
740
+
741
+ /**
742
+ * Runs get default log directory.
743
+ * @param {object} args - Options object.
744
+ * @param {import("../configuration.js").default} args.configuration - Configuration instance.
745
+ * @returns {string} - The default log directory.
746
+ */
747
+ getDefaultLogDirectory({configuration}) {
748
+ return path.join(configuration.getDirectory(), "log")
749
+ }
750
+
751
+ /**
752
+ * Runs get log file path.
753
+ * @param {object} args - Options object.
754
+ * @param {import("../configuration.js").default} args.configuration - Configuration instance.
755
+ * @param {string | undefined} args.directory - Directory path.
756
+ * @param {string} args.environment - Environment.
757
+ * @returns {string | undefined} - The log file path.
758
+ */
759
+ getLogFilePath({configuration, directory, environment}) {
760
+ const actualDirectory = directory || configuration?.getDirectory?.()
761
+
762
+ if (!actualDirectory) return undefined
763
+
764
+ return path.join(actualDirectory, `${environment}.log`)
765
+ }
766
+
767
+ /**
768
+ * Runs write log to file.
769
+ * @param {object} args - Options object.
770
+ * @param {string} args.filePath - File path.
771
+ * @param {string} args.message - Message text.
772
+ * @returns {Promise<void>} - Resolves when complete.
773
+ */
774
+ async writeLogToFile({filePath, message}) {
775
+ await fs.mkdir(path.dirname(filePath), {recursive: true})
776
+ await fs.appendFile(filePath, `${message}\n`, "utf8")
777
+ }
778
+
779
+ async importTestingConfigPath() {
780
+ const testingConfigPath = this.getConfiguration().getTesting()
781
+
782
+ if (!testingConfigPath) return
783
+
784
+ const testingImport = await import(toImportSpecifier(testingConfigPath))
785
+ const testingDefault = testingImport.default
786
+
787
+ if (!testingDefault) throw new Error("Testing config must export a default function")
788
+ if (typeof testingDefault !== "function") throw new Error("Testing config default export isn't a function")
789
+
790
+ const result = await testingDefault()
791
+
792
+ if (typeof result === "function") {
793
+ await result()
794
+ }
795
+ }
796
+
797
+ /**
798
+ * Runs require migration.
799
+ * @param {string} filePath - File path.
800
+ * @returns {Promise<import("../database/migration/index.js").default>} - Resolves with the require migration.
801
+ */
802
+ async requireMigration(filePath) {
803
+ const migrationImport = await import(toImportSpecifier(filePath))
804
+ const migrationImportDefault = migrationImport.default
805
+
806
+ if (!migrationImportDefault) throw new Error("Migration file must export a default migration class")
807
+ if (typeof migrationImportDefault !== "function") throw new Error("Migration default export isn't a function (should be a class which is a function in JS)")
808
+
809
+ return migrationImportDefault
810
+ }
811
+
812
+ async getBasePath() {
813
+ const __filename = fileURLToPath(import.meta.url)
814
+ const basePath = await fs.realpath(`${dirname(__filename)}/../..`)
815
+
816
+ return basePath
817
+ }
818
+
819
+ /**
820
+ * Runs after migrations.
821
+ * @param {object} args - Options object.
822
+ * @param {Record<string, import("../database/drivers/base.js").default>} args.dbs - Dbs.
823
+ * @param {"migration" | "schemaDump"} [args.reason] - Why the structure write is being triggered.
824
+ * @returns {Promise<void>} - Resolves when complete.
825
+ */
826
+ async afterMigrations({dbs, reason = "migration"}) {
827
+ const configuration = this.getConfiguration()
828
+
829
+ if (!configuration.shouldWriteStructureSql({reason})) return
830
+
831
+ const dbDir = path.join(configuration.getDirectory(), "db")
832
+ const structureSqlByIdentifier = await this._structureSqlByIdentifier({dbs})
833
+
834
+ await fs.mkdir(dbDir, {recursive: true})
835
+
836
+ for (const identifier of Object.keys(structureSqlByIdentifier)) {
837
+ const structureSql = structureSqlByIdentifier[identifier]
838
+
839
+ if (!structureSql) continue
840
+
841
+ const filePath = path.join(dbDir, `structure-${identifier}.sql`)
842
+
843
+ await fs.writeFile(filePath, structureSql)
844
+ }
845
+ }
846
+
847
+ /**
848
+ * Runs structure sql by identifier.
849
+ * @param {object} args - Options object.
850
+ * @param {Record<string, import("../database/drivers/base.js").default>} args.dbs - Dbs.
851
+ * @returns {Promise<Record<string, string>>} - Resolves with SQL string.
852
+ */
853
+ async _structureSqlByIdentifier({dbs}) {
854
+ const sqlByIdentifier = /**
855
+ * Narrows the runtime value to the documented type.
856
+ @type {Record<string, string>} */ ({})
857
+
858
+ for (const identifier of Object.keys(dbs)) {
859
+ const db = dbs[identifier]
860
+
861
+ if (typeof db.structureSql !== "function") continue
862
+
863
+ const structureSql = await db.structureSql()
864
+
865
+ if (structureSql) {
866
+ sqlByIdentifier[identifier] = structureSql
867
+ }
868
+ }
869
+
870
+ return sqlByIdentifier
871
+ }
872
+
873
+ /**
874
+ * Registers frontend-model websocket channel publishers so lifecycle
875
+ * event hooks broadcast over the shared "frontend-models" channel.
876
+ * This is only implemented by the Node handler because the required
877
+ * modules (`frontend-model-controller`, `routes/resolver`) pull in
878
+ * server-only Node APIs that break browser bundlers.
879
+ * @param {import("../configuration.js").default} configuration - Configuration instance.
880
+ * @returns {Promise<void>} - Resolves when complete.
881
+ */
882
+ async initializeFrontendModelWebsocketPublishers(configuration) {
883
+ const {ensureFrontendModelWebsocketPublishersRegistered} = await import("../frontend-models/websocket-publishers.js")
884
+
885
+ await ensureFrontendModelWebsocketPublishersRegistered(configuration)
886
+ }
887
+ }