velocious 1.0.431 → 1.0.433

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