velocious 1.0.430 → 1.0.432

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 (831) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/application.js +229 -0
  3. package/build/authorization/ability.js +329 -0
  4. package/build/authorization/base-resource.js +143 -0
  5. package/build/background-jobs/client.js +50 -0
  6. package/build/background-jobs/cron-expression.js +277 -0
  7. package/build/background-jobs/forked-runner-child.js +86 -0
  8. package/build/background-jobs/job-record.js +13 -0
  9. package/build/background-jobs/job-registry.js +92 -0
  10. package/build/background-jobs/job-runner.js +107 -0
  11. package/build/background-jobs/job.js +77 -0
  12. package/build/background-jobs/json-socket.js +78 -0
  13. package/build/background-jobs/main.js +926 -0
  14. package/build/background-jobs/normalize-error.js +26 -0
  15. package/build/background-jobs/scheduler.js +274 -0
  16. package/build/background-jobs/socket-request.js +68 -0
  17. package/build/background-jobs/status-reporter.js +101 -0
  18. package/build/background-jobs/store.js +994 -0
  19. package/build/background-jobs/types.js +70 -0
  20. package/build/background-jobs/web/authorization.js +89 -0
  21. package/build/background-jobs/web/controller.js +280 -0
  22. package/build/background-jobs/web/index.js +57 -0
  23. package/build/background-jobs/web/path-matcher.js +74 -0
  24. package/build/background-jobs/web/registry.js +49 -0
  25. package/build/background-jobs/worker.js +683 -0
  26. package/build/beacon/client.js +330 -0
  27. package/build/beacon/in-process-broker.js +71 -0
  28. package/build/beacon/in-process-client.js +139 -0
  29. package/build/beacon/server.js +148 -0
  30. package/build/beacon/types.js +55 -0
  31. package/build/bin/velocious.js +39 -34
  32. package/build/cli/base-command.js +67 -0
  33. package/build/cli/browser-cli.js +45 -0
  34. package/build/cli/commands/background-jobs-main.js +7 -0
  35. package/build/cli/commands/background-jobs-runner.js +7 -0
  36. package/build/cli/commands/background-jobs-worker.js +7 -0
  37. package/build/cli/commands/beacon.js +7 -0
  38. package/build/cli/commands/console.js +12 -0
  39. package/build/cli/commands/db/base-command.js +82 -0
  40. package/build/cli/commands/db/create.js +64 -0
  41. package/build/cli/commands/db/drop.js +75 -0
  42. package/build/cli/commands/db/migrate.js +17 -0
  43. package/build/cli/commands/db/reset.js +22 -0
  44. package/build/cli/commands/db/rollback.js +15 -0
  45. package/build/cli/commands/db/schema/dump.js +12 -0
  46. package/build/cli/commands/db/schema/load.js +12 -0
  47. package/build/cli/commands/db/seed.js +12 -0
  48. package/build/cli/commands/db/tenants/check.js +38 -0
  49. package/build/cli/commands/db/tenants/create.js +33 -0
  50. package/build/cli/commands/db/tenants/migrate.js +49 -0
  51. package/build/cli/commands/destroy/migration.js +7 -0
  52. package/build/cli/commands/generate/base-models.js +7 -0
  53. package/build/cli/commands/generate/frontend-models.js +12 -0
  54. package/build/cli/commands/generate/migration.js +7 -0
  55. package/build/cli/commands/generate/model.js +7 -0
  56. package/build/cli/commands/init.js +11 -0
  57. package/build/cli/commands/routes.js +7 -0
  58. package/build/cli/commands/run-script.js +12 -0
  59. package/build/cli/commands/runner.js +12 -0
  60. package/build/cli/commands/server.js +7 -0
  61. package/build/cli/commands/test.js +9 -0
  62. package/build/cli/index.js +152 -0
  63. package/build/cli/tenant-database-command-helper.js +198 -0
  64. package/build/cli/use-browser-cli.js +30 -0
  65. package/build/configuration-resolver.js +65 -0
  66. package/build/configuration-types.js +429 -0
  67. package/build/configuration.js +2590 -0
  68. package/build/controller.js +421 -0
  69. package/build/current-configuration.js +31 -0
  70. package/build/current.js +80 -0
  71. package/build/database/annotations-async-hooks.js +47 -0
  72. package/build/database/annotations.js +40 -0
  73. package/build/database/drivers/base-column.js +182 -0
  74. package/build/database/drivers/base-columns-index.js +81 -0
  75. package/build/database/drivers/base-foreign-key.js +104 -0
  76. package/build/database/drivers/base-table.js +156 -0
  77. package/build/database/drivers/base.js +1609 -0
  78. package/build/database/drivers/mssql/column.js +74 -0
  79. package/build/database/drivers/mssql/columns-index.js +6 -0
  80. package/build/database/drivers/mssql/connect-connection.js +16 -0
  81. package/build/database/drivers/mssql/foreign-key.js +12 -0
  82. package/build/database/drivers/mssql/index.js +590 -0
  83. package/build/database/drivers/mssql/options.js +79 -0
  84. package/build/database/drivers/mssql/query-parser.js +6 -0
  85. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  87. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  88. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  89. package/build/database/drivers/mssql/sql/delete.js +19 -0
  90. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  91. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  92. package/build/database/drivers/mssql/sql/insert.js +4 -0
  93. package/build/database/drivers/mssql/sql/update.js +31 -0
  94. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  95. package/build/database/drivers/mssql/structure-sql.js +120 -0
  96. package/build/database/drivers/mssql/table.js +145 -0
  97. package/build/database/drivers/mysql/column.js +112 -0
  98. package/build/database/drivers/mysql/columns-index.js +22 -0
  99. package/build/database/drivers/mysql/foreign-key.js +12 -0
  100. package/build/database/drivers/mysql/index.js +473 -0
  101. package/build/database/drivers/mysql/options.js +34 -0
  102. package/build/database/drivers/mysql/query-parser.js +6 -0
  103. package/build/database/drivers/mysql/query.js +37 -0
  104. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  106. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  107. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  108. package/build/database/drivers/mysql/sql/delete.js +21 -0
  109. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  110. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  111. package/build/database/drivers/mysql/sql/insert.js +6 -0
  112. package/build/database/drivers/mysql/sql/update.js +33 -0
  113. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  114. package/build/database/drivers/mysql/structure-sql.js +93 -0
  115. package/build/database/drivers/mysql/table.js +121 -0
  116. package/build/database/drivers/pgsql/column.js +90 -0
  117. package/build/database/drivers/pgsql/columns-index.js +6 -0
  118. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  119. package/build/database/drivers/pgsql/index.js +441 -0
  120. package/build/database/drivers/pgsql/options.js +32 -0
  121. package/build/database/drivers/pgsql/query-parser.js +6 -0
  122. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  124. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  125. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  126. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  127. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  128. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  129. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  130. package/build/database/drivers/pgsql/sql/update.js +33 -0
  131. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  132. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  133. package/build/database/drivers/pgsql/table.js +135 -0
  134. package/build/database/drivers/sqlite/base.js +509 -0
  135. package/build/database/drivers/sqlite/column.js +75 -0
  136. package/build/database/drivers/sqlite/columns-index.js +30 -0
  137. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  138. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  139. package/build/database/drivers/sqlite/index.js +394 -0
  140. package/build/database/drivers/sqlite/index.native.js +72 -0
  141. package/build/database/drivers/sqlite/index.web.js +99 -0
  142. package/build/database/drivers/sqlite/options.js +32 -0
  143. package/build/database/drivers/sqlite/query-parser.js +6 -0
  144. package/build/database/drivers/sqlite/query.js +35 -0
  145. package/build/database/drivers/sqlite/query.native.js +35 -0
  146. package/build/database/drivers/sqlite/query.web.js +49 -0
  147. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  148. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  149. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  151. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  152. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  153. package/build/database/drivers/sqlite/sql/update.js +33 -0
  154. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  155. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  156. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  157. package/build/database/drivers/sqlite/table.js +131 -0
  158. package/build/database/drivers/structure-sql/utils.js +35 -0
  159. package/build/database/handler.js +13 -0
  160. package/build/database/initializer-from-require-context.js +101 -0
  161. package/build/database/migration/index.js +438 -0
  162. package/build/database/migrator/files-finder.js +55 -0
  163. package/build/database/migrator/types.js +31 -0
  164. package/build/database/migrator.js +557 -0
  165. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  166. package/build/database/pool/base-methods-forward.js +52 -0
  167. package/build/database/pool/base.js +380 -0
  168. package/build/database/pool/single-multi-use.js +118 -0
  169. package/build/database/query/alter-table-base.js +104 -0
  170. package/build/database/query/base.js +49 -0
  171. package/build/database/query/create-database-base.js +42 -0
  172. package/build/database/query/create-index-base.js +117 -0
  173. package/build/database/query/create-table-base.js +205 -0
  174. package/build/database/query/delete-base.js +19 -0
  175. package/build/database/query/drop-database-base.js +38 -0
  176. package/build/database/query/drop-table-base.js +58 -0
  177. package/build/database/query/from-base.js +36 -0
  178. package/build/database/query/from-plain.js +16 -0
  179. package/build/database/query/from-table.js +18 -0
  180. package/build/database/query/index.js +533 -0
  181. package/build/database/query/insert-base.js +172 -0
  182. package/build/database/query/join-base.js +43 -0
  183. package/build/database/query/join-object.js +167 -0
  184. package/build/database/query/join-plain.js +18 -0
  185. package/build/database/query/join-tracker.js +93 -0
  186. package/build/database/query/model-class-query.js +1577 -0
  187. package/build/database/query/order-base.js +33 -0
  188. package/build/database/query/order-column.js +77 -0
  189. package/build/database/query/order-plain.js +28 -0
  190. package/build/database/query/preloader/belongs-to.js +267 -0
  191. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  192. package/build/database/query/preloader/has-many.js +316 -0
  193. package/build/database/query/preloader/has-one.js +123 -0
  194. package/build/database/query/preloader/selection.js +152 -0
  195. package/build/database/query/preloader.js +201 -0
  196. package/build/database/query/query-data.js +305 -0
  197. package/build/database/query/select-base.js +30 -0
  198. package/build/database/query/select-plain.js +18 -0
  199. package/build/database/query/select-table-and-column.js +28 -0
  200. package/build/database/query/update-base.js +41 -0
  201. package/build/database/query/upsert-base.js +103 -0
  202. package/build/database/query/where-base.js +38 -0
  203. package/build/database/query/where-combinator.js +31 -0
  204. package/build/database/query/where-hash.js +77 -0
  205. package/build/database/query/where-model-class-hash.js +505 -0
  206. package/build/database/query/where-not.js +23 -0
  207. package/build/database/query/where-plain.js +20 -0
  208. package/build/database/query/with-count.js +219 -0
  209. package/build/database/query-parser/base-query-parser.js +40 -0
  210. package/build/database/query-parser/from-parser.js +49 -0
  211. package/build/database/query-parser/group-parser.js +55 -0
  212. package/build/database/query-parser/joins-parser.js +37 -0
  213. package/build/database/query-parser/limit-parser.js +77 -0
  214. package/build/database/query-parser/options.js +94 -0
  215. package/build/database/query-parser/order-parser.js +45 -0
  216. package/build/database/query-parser/select-parser.js +67 -0
  217. package/build/database/query-parser/where-parser.js +46 -0
  218. package/build/database/record/acts-as-list.js +374 -0
  219. package/build/database/record/attachments/download.js +49 -0
  220. package/build/database/record/attachments/handle.js +188 -0
  221. package/build/database/record/attachments/normalize-input.js +213 -0
  222. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  223. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  224. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  225. package/build/database/record/attachments/store.js +591 -0
  226. package/build/database/record/index.js +4094 -0
  227. package/build/database/record/instance-relationships/base.js +289 -0
  228. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  229. package/build/database/record/instance-relationships/has-many.js +284 -0
  230. package/build/database/record/instance-relationships/has-one.js +117 -0
  231. package/build/database/record/record-not-found-error.js +3 -0
  232. package/build/database/record/relationships/base.js +195 -0
  233. package/build/database/record/relationships/belongs-to.js +57 -0
  234. package/build/database/record/relationships/has-many.js +46 -0
  235. package/build/database/record/relationships/has-one.js +46 -0
  236. package/build/database/record/state-machine.js +278 -0
  237. package/build/database/record/user-module.js +43 -0
  238. package/build/database/record/validators/base.js +27 -0
  239. package/build/database/record/validators/format.js +50 -0
  240. package/build/database/record/validators/presence.js +24 -0
  241. package/build/database/record/validators/uniqueness.js +124 -0
  242. package/build/database/table-data/index.js +241 -0
  243. package/build/database/table-data/table-column.js +416 -0
  244. package/build/database/table-data/table-foreign-key.js +69 -0
  245. package/build/database/table-data/table-index.js +46 -0
  246. package/build/database/table-data/table-reference.js +13 -0
  247. package/build/database/use-database.js +48 -0
  248. package/build/environment-handlers/base.js +561 -0
  249. package/build/environment-handlers/browser.js +338 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  251. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  252. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  253. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  254. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  255. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  256. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  257. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  258. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  259. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  260. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  261. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  262. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  263. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  264. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  265. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  266. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  267. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  268. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  269. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  270. package/build/environment-handlers/node.js +887 -0
  271. package/build/error-logger.js +30 -0
  272. package/build/frontend-model-controller.js +3491 -0
  273. package/build/frontend-model-resource/base-resource.js +935 -0
  274. package/build/frontend-models/base.js +4004 -0
  275. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  276. package/build/frontend-models/event-hook-models.js +49 -0
  277. package/build/frontend-models/model-registry.js +28 -0
  278. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  279. package/build/frontend-models/preloader.js +169 -0
  280. package/build/frontend-models/query.js +2245 -0
  281. package/build/frontend-models/resource-config-validation.js +56 -0
  282. package/build/frontend-models/resource-definition.js +399 -0
  283. package/build/frontend-models/transport-serialization.js +369 -0
  284. package/build/frontend-models/use-created-event.js +21 -0
  285. package/build/frontend-models/use-destroyed-event.js +148 -0
  286. package/build/frontend-models/use-model-class-event.js +164 -0
  287. package/build/frontend-models/use-updated-event.js +152 -0
  288. package/build/frontend-models/websocket-channel.js +494 -0
  289. package/build/frontend-models/websocket-publishers.js +224 -0
  290. package/build/http-client/header.js +17 -0
  291. package/build/http-client/index.js +139 -0
  292. package/build/http-client/request.js +94 -0
  293. package/build/http-client/response.js +151 -0
  294. package/build/http-client/websocket-client.js +27 -0
  295. package/build/http-server/client/index.js +507 -0
  296. package/build/http-server/client/params-to-object.js +152 -0
  297. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  298. package/build/http-server/client/request-buffer/header.js +19 -0
  299. package/build/http-server/client/request-buffer/index.js +535 -0
  300. package/build/http-server/client/request-parser.js +195 -0
  301. package/build/http-server/client/request-runner.js +321 -0
  302. package/build/http-server/client/request-timing.js +171 -0
  303. package/build/http-server/client/request.js +114 -0
  304. package/build/http-server/client/response.js +251 -0
  305. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  306. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  307. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  308. package/build/http-server/client/websocket-request.js +147 -0
  309. package/build/http-server/client/websocket-session.js +1755 -0
  310. package/build/http-server/cookie.js +245 -0
  311. package/build/http-server/development-reloader.js +240 -0
  312. package/build/http-server/index.js +561 -0
  313. package/build/http-server/remote-address.js +77 -0
  314. package/build/http-server/server-client.js +222 -0
  315. package/build/http-server/server-lock.js +178 -0
  316. package/build/http-server/websocket-channel-subscribers.js +110 -0
  317. package/build/http-server/websocket-channel.js +137 -0
  318. package/build/http-server/websocket-connection.js +118 -0
  319. package/build/http-server/websocket-event-log-store.js +433 -0
  320. package/build/http-server/websocket-events-host.js +170 -0
  321. package/build/http-server/websocket-events.js +50 -0
  322. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  323. package/build/http-server/worker-handler/in-process.js +155 -0
  324. package/build/http-server/worker-handler/index.js +370 -0
  325. package/build/http-server/worker-handler/worker-script.js +6 -0
  326. package/build/http-server/worker-handler/worker-thread.js +286 -0
  327. package/build/index.js +1 -2
  328. package/build/initializer.js +39 -0
  329. package/build/jobs/mail-delivery.js +22 -0
  330. package/build/logger/base-logger.js +34 -0
  331. package/build/logger/console-logger.js +28 -0
  332. package/build/logger/file-logger.js +36 -0
  333. package/build/logger/outputs/array-output.js +50 -0
  334. package/build/logger/outputs/console-output.js +32 -0
  335. package/build/logger/outputs/file-output.js +55 -0
  336. package/build/logger/outputs/stdout-output.js +64 -0
  337. package/build/logger.js +507 -0
  338. package/build/mailer/backends/smtp.js +197 -0
  339. package/build/mailer/base.js +337 -0
  340. package/build/mailer/delivery.js +70 -0
  341. package/build/mailer/index.js +24 -0
  342. package/build/mailer.js +15 -0
  343. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  344. package/build/plugins/sqljs-wasm-route.js +71 -0
  345. package/build/record-payload-values.js +83 -0
  346. package/build/routes/app-routes.js +17 -0
  347. package/build/routes/base-route.js +133 -0
  348. package/build/routes/basic-route.js +109 -0
  349. package/build/routes/built-in/debug/controller.js +12 -0
  350. package/build/routes/built-in/errors/controller.js +7 -0
  351. package/build/routes/get-route.js +75 -0
  352. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  353. package/build/routes/index.js +50 -0
  354. package/build/routes/namespace-route.js +51 -0
  355. package/build/routes/plugin-routes.js +141 -0
  356. package/build/routes/post-route.js +74 -0
  357. package/build/routes/resolver.js +535 -0
  358. package/build/routes/resource-route.js +154 -0
  359. package/build/routes/root-route.js +11 -0
  360. package/build/src/authorization/ability.d.ts +24 -23
  361. package/build/src/authorization/ability.d.ts.map +1 -1
  362. package/build/src/authorization/ability.js +14 -13
  363. package/build/src/authorization/base-resource.d.ts +20 -26
  364. package/build/src/authorization/base-resource.d.ts.map +1 -1
  365. package/build/src/authorization/base-resource.js +13 -11
  366. package/build/src/configuration-types.d.ts +21 -2
  367. package/build/src/configuration-types.d.ts.map +1 -1
  368. package/build/src/configuration-types.js +8 -2
  369. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  370. package/build/src/database/query/where-combinator.js +1 -2
  371. package/build/src/database/record/acts-as-list.js +2 -2
  372. package/build/src/database/record/attachments/store.d.ts +1 -1
  373. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  374. package/build/src/database/record/attachments/store.js +2 -2
  375. package/build/src/database/record/index.d.ts +82 -20
  376. package/build/src/database/record/index.d.ts.map +1 -1
  377. package/build/src/database/record/index.js +126 -13
  378. package/build/src/database/record/relationships/base.d.ts +2 -2
  379. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  380. package/build/src/database/record/relationships/base.js +3 -3
  381. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  382. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  383. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +59 -36
  384. package/build/src/frontend-model-controller.d.ts +6 -6
  385. package/build/src/frontend-model-controller.d.ts.map +1 -1
  386. package/build/src/frontend-model-controller.js +4 -4
  387. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  388. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  389. package/build/src/frontend-model-resource/base-resource.js +22 -10
  390. package/build/src/frontend-models/base.d.ts +19 -12
  391. package/build/src/frontend-models/base.d.ts.map +1 -1
  392. package/build/src/frontend-models/base.js +79 -48
  393. package/build/src/frontend-models/preloader.d.ts +6 -6
  394. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  395. package/build/src/frontend-models/preloader.js +5 -5
  396. package/build/src/frontend-models/query.d.ts.map +1 -1
  397. package/build/src/frontend-models/query.js +1 -4
  398. package/build/src/utils/ransack.d.ts.map +1 -1
  399. package/build/src/utils/ransack.js +1 -2
  400. package/build/templates/configuration.js +61 -0
  401. package/build/templates/generate-migration.js +11 -0
  402. package/build/templates/generate-model.js +6 -0
  403. package/build/templates/routes.js +11 -0
  404. package/build/testing/base-expect.js +17 -0
  405. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  406. package/build/testing/browser-test-app.js +32 -0
  407. package/build/testing/expect-to-change.js +55 -0
  408. package/build/testing/expect-utils.js +269 -0
  409. package/build/testing/expect.js +763 -0
  410. package/build/testing/request-client.js +90 -0
  411. package/build/testing/test-files-finder.js +364 -0
  412. package/build/testing/test-filter-parser.js +198 -0
  413. package/build/testing/test-runner.js +1168 -0
  414. package/build/testing/test-suite-splitter.js +177 -0
  415. package/build/testing/test.js +370 -0
  416. package/build/utils/backtrace-cleaner-node.js +87 -0
  417. package/build/utils/backtrace-cleaner.js +266 -0
  418. package/build/utils/ensure-error.js +15 -0
  419. package/build/utils/event-emitter.js +8 -0
  420. package/build/utils/file-exists.js +18 -0
  421. package/build/utils/format-value.js +101 -0
  422. package/build/utils/model-scope.js +56 -0
  423. package/build/utils/nest-callbacks.js +22 -0
  424. package/build/utils/plain-object.js +14 -0
  425. package/build/utils/ransack.js +859 -0
  426. package/build/utils/rest-args-error.js +14 -0
  427. package/build/utils/singularize-model-name.js +18 -0
  428. package/build/utils/split-sql-statements.js +88 -0
  429. package/build/utils/to-import-specifier.js +53 -0
  430. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  431. package/build/utils/with-tracked-stack.js +38 -0
  432. package/build/velocious-error.js +34 -0
  433. package/index.js +1 -0
  434. package/package.json +10 -4
  435. package/scripts/clean-build.js +8 -0
  436. package/scripts/ensure-bin-executable.js +13 -0
  437. package/scripts/run-tests.js +37 -0
  438. package/scripts/test-browser.js +486 -0
  439. package/src/application.js +229 -0
  440. package/src/authorization/ability.js +329 -0
  441. package/src/authorization/base-resource.js +143 -0
  442. package/src/background-jobs/client.js +50 -0
  443. package/src/background-jobs/cron-expression.js +277 -0
  444. package/src/background-jobs/forked-runner-child.js +86 -0
  445. package/src/background-jobs/job-record.js +13 -0
  446. package/src/background-jobs/job-registry.js +92 -0
  447. package/src/background-jobs/job-runner.js +107 -0
  448. package/src/background-jobs/job.js +77 -0
  449. package/src/background-jobs/json-socket.js +78 -0
  450. package/src/background-jobs/main.js +926 -0
  451. package/src/background-jobs/normalize-error.js +26 -0
  452. package/src/background-jobs/scheduler.js +274 -0
  453. package/src/background-jobs/socket-request.js +68 -0
  454. package/src/background-jobs/status-reporter.js +101 -0
  455. package/src/background-jobs/store.js +994 -0
  456. package/src/background-jobs/types.js +70 -0
  457. package/src/background-jobs/web/authorization.js +89 -0
  458. package/src/background-jobs/web/controller.js +280 -0
  459. package/src/background-jobs/web/index.js +57 -0
  460. package/src/background-jobs/web/path-matcher.js +74 -0
  461. package/src/background-jobs/web/registry.js +49 -0
  462. package/src/background-jobs/worker.js +683 -0
  463. package/src/beacon/client.js +330 -0
  464. package/src/beacon/in-process-broker.js +71 -0
  465. package/src/beacon/in-process-client.js +139 -0
  466. package/src/beacon/server.js +148 -0
  467. package/src/beacon/types.js +55 -0
  468. package/src/cli/base-command.js +67 -0
  469. package/src/cli/browser-cli.js +45 -0
  470. package/src/cli/commands/background-jobs-main.js +7 -0
  471. package/src/cli/commands/background-jobs-runner.js +7 -0
  472. package/src/cli/commands/background-jobs-worker.js +7 -0
  473. package/src/cli/commands/beacon.js +7 -0
  474. package/src/cli/commands/console.js +12 -0
  475. package/src/cli/commands/db/base-command.js +82 -0
  476. package/src/cli/commands/db/create.js +64 -0
  477. package/src/cli/commands/db/drop.js +75 -0
  478. package/src/cli/commands/db/migrate.js +17 -0
  479. package/src/cli/commands/db/reset.js +22 -0
  480. package/src/cli/commands/db/rollback.js +15 -0
  481. package/src/cli/commands/db/schema/dump.js +12 -0
  482. package/src/cli/commands/db/schema/load.js +12 -0
  483. package/src/cli/commands/db/seed.js +12 -0
  484. package/src/cli/commands/db/tenants/check.js +38 -0
  485. package/src/cli/commands/db/tenants/create.js +33 -0
  486. package/src/cli/commands/db/tenants/migrate.js +49 -0
  487. package/src/cli/commands/destroy/migration.js +7 -0
  488. package/src/cli/commands/generate/base-models.js +7 -0
  489. package/src/cli/commands/generate/frontend-models.js +12 -0
  490. package/src/cli/commands/generate/migration.js +7 -0
  491. package/src/cli/commands/generate/model.js +7 -0
  492. package/src/cli/commands/init.js +11 -0
  493. package/src/cli/commands/routes.js +7 -0
  494. package/src/cli/commands/run-script.js +12 -0
  495. package/src/cli/commands/runner.js +12 -0
  496. package/src/cli/commands/server.js +7 -0
  497. package/src/cli/commands/test.js +9 -0
  498. package/src/cli/index.js +152 -0
  499. package/src/cli/tenant-database-command-helper.js +198 -0
  500. package/src/cli/use-browser-cli.js +30 -0
  501. package/src/configuration-resolver.js +65 -0
  502. package/src/configuration-types.js +429 -0
  503. package/src/configuration.js +2590 -0
  504. package/src/controller.js +421 -0
  505. package/src/current-configuration.js +31 -0
  506. package/src/current.js +80 -0
  507. package/src/database/annotations-async-hooks.js +47 -0
  508. package/src/database/annotations.js +40 -0
  509. package/src/database/drivers/base-column.js +182 -0
  510. package/src/database/drivers/base-columns-index.js +81 -0
  511. package/src/database/drivers/base-foreign-key.js +104 -0
  512. package/src/database/drivers/base-table.js +156 -0
  513. package/src/database/drivers/base.js +1609 -0
  514. package/src/database/drivers/mssql/column.js +74 -0
  515. package/src/database/drivers/mssql/columns-index.js +6 -0
  516. package/src/database/drivers/mssql/connect-connection.js +16 -0
  517. package/src/database/drivers/mssql/foreign-key.js +12 -0
  518. package/src/database/drivers/mssql/index.js +590 -0
  519. package/src/database/drivers/mssql/options.js +79 -0
  520. package/src/database/drivers/mssql/query-parser.js +6 -0
  521. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  522. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  523. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  524. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  525. package/src/database/drivers/mssql/sql/delete.js +19 -0
  526. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  527. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  528. package/src/database/drivers/mssql/sql/insert.js +4 -0
  529. package/src/database/drivers/mssql/sql/update.js +31 -0
  530. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  531. package/src/database/drivers/mssql/structure-sql.js +120 -0
  532. package/src/database/drivers/mssql/table.js +145 -0
  533. package/src/database/drivers/mysql/column.js +112 -0
  534. package/src/database/drivers/mysql/columns-index.js +22 -0
  535. package/src/database/drivers/mysql/foreign-key.js +12 -0
  536. package/src/database/drivers/mysql/index.js +473 -0
  537. package/src/database/drivers/mysql/options.js +34 -0
  538. package/src/database/drivers/mysql/query-parser.js +6 -0
  539. package/src/database/drivers/mysql/query.js +37 -0
  540. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  541. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  542. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  543. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  544. package/src/database/drivers/mysql/sql/delete.js +21 -0
  545. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  546. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  547. package/src/database/drivers/mysql/sql/insert.js +6 -0
  548. package/src/database/drivers/mysql/sql/update.js +33 -0
  549. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  550. package/src/database/drivers/mysql/structure-sql.js +93 -0
  551. package/src/database/drivers/mysql/table.js +121 -0
  552. package/src/database/drivers/pgsql/column.js +90 -0
  553. package/src/database/drivers/pgsql/columns-index.js +6 -0
  554. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  555. package/src/database/drivers/pgsql/index.js +441 -0
  556. package/src/database/drivers/pgsql/options.js +32 -0
  557. package/src/database/drivers/pgsql/query-parser.js +6 -0
  558. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  559. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  560. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  561. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  562. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  563. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  564. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  565. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  566. package/src/database/drivers/pgsql/sql/update.js +33 -0
  567. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  568. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  569. package/src/database/drivers/pgsql/table.js +135 -0
  570. package/src/database/drivers/sqlite/base.js +509 -0
  571. package/src/database/drivers/sqlite/column.js +75 -0
  572. package/src/database/drivers/sqlite/columns-index.js +30 -0
  573. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  574. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  575. package/src/database/drivers/sqlite/index.js +394 -0
  576. package/src/database/drivers/sqlite/index.native.js +72 -0
  577. package/src/database/drivers/sqlite/index.web.js +99 -0
  578. package/src/database/drivers/sqlite/options.js +32 -0
  579. package/src/database/drivers/sqlite/query-parser.js +6 -0
  580. package/src/database/drivers/sqlite/query.js +35 -0
  581. package/src/database/drivers/sqlite/query.native.js +35 -0
  582. package/src/database/drivers/sqlite/query.web.js +49 -0
  583. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  584. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  585. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  586. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  587. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  588. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  589. package/src/database/drivers/sqlite/sql/update.js +33 -0
  590. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  591. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  592. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  593. package/src/database/drivers/sqlite/table.js +131 -0
  594. package/src/database/drivers/structure-sql/utils.js +35 -0
  595. package/src/database/handler.js +13 -0
  596. package/src/database/initializer-from-require-context.js +101 -0
  597. package/src/database/migration/index.js +438 -0
  598. package/src/database/migrator/files-finder.js +55 -0
  599. package/src/database/migrator/types.js +31 -0
  600. package/src/database/migrator.js +557 -0
  601. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  602. package/src/database/pool/base-methods-forward.js +52 -0
  603. package/src/database/pool/base.js +380 -0
  604. package/src/database/pool/single-multi-use.js +118 -0
  605. package/src/database/query/alter-table-base.js +104 -0
  606. package/src/database/query/base.js +49 -0
  607. package/src/database/query/create-database-base.js +42 -0
  608. package/src/database/query/create-index-base.js +117 -0
  609. package/src/database/query/create-table-base.js +205 -0
  610. package/src/database/query/delete-base.js +19 -0
  611. package/src/database/query/drop-database-base.js +38 -0
  612. package/src/database/query/drop-table-base.js +58 -0
  613. package/src/database/query/from-base.js +36 -0
  614. package/src/database/query/from-plain.js +16 -0
  615. package/src/database/query/from-table.js +18 -0
  616. package/src/database/query/index.js +533 -0
  617. package/src/database/query/insert-base.js +172 -0
  618. package/src/database/query/join-base.js +43 -0
  619. package/src/database/query/join-object.js +167 -0
  620. package/src/database/query/join-plain.js +18 -0
  621. package/src/database/query/join-tracker.js +93 -0
  622. package/src/database/query/model-class-query.js +1577 -0
  623. package/src/database/query/order-base.js +33 -0
  624. package/src/database/query/order-column.js +77 -0
  625. package/src/database/query/order-plain.js +28 -0
  626. package/src/database/query/preloader/belongs-to.js +267 -0
  627. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  628. package/src/database/query/preloader/has-many.js +316 -0
  629. package/src/database/query/preloader/has-one.js +123 -0
  630. package/src/database/query/preloader/selection.js +152 -0
  631. package/src/database/query/preloader.js +201 -0
  632. package/src/database/query/query-data.js +305 -0
  633. package/src/database/query/select-base.js +30 -0
  634. package/src/database/query/select-plain.js +18 -0
  635. package/src/database/query/select-table-and-column.js +28 -0
  636. package/src/database/query/update-base.js +41 -0
  637. package/src/database/query/upsert-base.js +103 -0
  638. package/src/database/query/where-base.js +38 -0
  639. package/src/database/query/where-combinator.js +31 -0
  640. package/src/database/query/where-hash.js +77 -0
  641. package/src/database/query/where-model-class-hash.js +505 -0
  642. package/src/database/query/where-not.js +23 -0
  643. package/src/database/query/where-plain.js +20 -0
  644. package/src/database/query/with-count.js +219 -0
  645. package/src/database/query-parser/base-query-parser.js +40 -0
  646. package/src/database/query-parser/from-parser.js +49 -0
  647. package/src/database/query-parser/group-parser.js +55 -0
  648. package/src/database/query-parser/joins-parser.js +37 -0
  649. package/src/database/query-parser/limit-parser.js +77 -0
  650. package/src/database/query-parser/options.js +94 -0
  651. package/src/database/query-parser/order-parser.js +45 -0
  652. package/src/database/query-parser/select-parser.js +67 -0
  653. package/src/database/query-parser/where-parser.js +46 -0
  654. package/src/database/record/acts-as-list.js +374 -0
  655. package/src/database/record/attachments/download.js +49 -0
  656. package/src/database/record/attachments/handle.js +188 -0
  657. package/src/database/record/attachments/normalize-input.js +213 -0
  658. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  659. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  660. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  661. package/src/database/record/attachments/store.js +591 -0
  662. package/src/database/record/index.js +4094 -0
  663. package/src/database/record/instance-relationships/base.js +289 -0
  664. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  665. package/src/database/record/instance-relationships/has-many.js +284 -0
  666. package/src/database/record/instance-relationships/has-one.js +117 -0
  667. package/src/database/record/record-not-found-error.js +3 -0
  668. package/src/database/record/relationships/base.js +195 -0
  669. package/src/database/record/relationships/belongs-to.js +57 -0
  670. package/src/database/record/relationships/has-many.js +46 -0
  671. package/src/database/record/relationships/has-one.js +46 -0
  672. package/src/database/record/state-machine.js +278 -0
  673. package/src/database/record/user-module.js +43 -0
  674. package/src/database/record/validators/base.js +27 -0
  675. package/src/database/record/validators/format.js +50 -0
  676. package/src/database/record/validators/presence.js +24 -0
  677. package/src/database/record/validators/uniqueness.js +124 -0
  678. package/src/database/table-data/index.js +241 -0
  679. package/src/database/table-data/table-column.js +416 -0
  680. package/src/database/table-data/table-foreign-key.js +69 -0
  681. package/src/database/table-data/table-index.js +46 -0
  682. package/src/database/table-data/table-reference.js +13 -0
  683. package/src/database/use-database.js +48 -0
  684. package/src/environment-handlers/base.js +561 -0
  685. package/src/environment-handlers/browser.js +338 -0
  686. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  687. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  688. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  689. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  690. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  691. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  692. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  693. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  694. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  695. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  696. package/src/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  697. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  698. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  699. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  700. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  701. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  702. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  703. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  704. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  705. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  706. package/src/environment-handlers/node.js +887 -0
  707. package/src/error-logger.js +30 -0
  708. package/src/frontend-model-controller.js +3491 -0
  709. package/src/frontend-model-resource/base-resource.js +935 -0
  710. package/src/frontend-models/base.js +4004 -0
  711. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  712. package/src/frontend-models/event-hook-models.js +49 -0
  713. package/src/frontend-models/model-registry.js +28 -0
  714. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  715. package/src/frontend-models/preloader.js +169 -0
  716. package/src/frontend-models/query.js +2245 -0
  717. package/src/frontend-models/resource-config-validation.js +56 -0
  718. package/src/frontend-models/resource-definition.js +399 -0
  719. package/src/frontend-models/transport-serialization.js +369 -0
  720. package/src/frontend-models/use-created-event.js +21 -0
  721. package/src/frontend-models/use-destroyed-event.js +148 -0
  722. package/src/frontend-models/use-model-class-event.js +164 -0
  723. package/src/frontend-models/use-updated-event.js +152 -0
  724. package/src/frontend-models/websocket-channel.js +494 -0
  725. package/src/frontend-models/websocket-publishers.js +224 -0
  726. package/src/http-client/header.js +17 -0
  727. package/src/http-client/index.js +139 -0
  728. package/src/http-client/request.js +94 -0
  729. package/src/http-client/response.js +151 -0
  730. package/src/http-client/websocket-client.js +27 -0
  731. package/src/http-server/client/index.js +507 -0
  732. package/src/http-server/client/params-to-object.js +152 -0
  733. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  734. package/src/http-server/client/request-buffer/header.js +19 -0
  735. package/src/http-server/client/request-buffer/index.js +535 -0
  736. package/src/http-server/client/request-parser.js +195 -0
  737. package/src/http-server/client/request-runner.js +321 -0
  738. package/src/http-server/client/request-timing.js +171 -0
  739. package/src/http-server/client/request.js +114 -0
  740. package/src/http-server/client/response.js +251 -0
  741. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  742. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  743. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  744. package/src/http-server/client/websocket-request.js +147 -0
  745. package/src/http-server/client/websocket-session.js +1755 -0
  746. package/src/http-server/cookie.js +245 -0
  747. package/src/http-server/development-reloader.js +240 -0
  748. package/src/http-server/index.js +561 -0
  749. package/src/http-server/remote-address.js +77 -0
  750. package/src/http-server/server-client.js +222 -0
  751. package/src/http-server/server-lock.js +178 -0
  752. package/src/http-server/websocket-channel-subscribers.js +110 -0
  753. package/src/http-server/websocket-channel.js +137 -0
  754. package/src/http-server/websocket-connection.js +118 -0
  755. package/src/http-server/websocket-event-log-store.js +433 -0
  756. package/src/http-server/websocket-events-host.js +170 -0
  757. package/src/http-server/websocket-events.js +50 -0
  758. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  759. package/src/http-server/worker-handler/in-process.js +155 -0
  760. package/src/http-server/worker-handler/index.js +370 -0
  761. package/src/http-server/worker-handler/worker-script.js +6 -0
  762. package/src/http-server/worker-handler/worker-thread.js +286 -0
  763. package/src/initializer.js +39 -0
  764. package/src/jobs/.gitkeep +1 -0
  765. package/src/jobs/mail-delivery.js +22 -0
  766. package/src/logger/base-logger.js +34 -0
  767. package/src/logger/console-logger.js +28 -0
  768. package/src/logger/file-logger.js +36 -0
  769. package/src/logger/outputs/array-output.js +50 -0
  770. package/src/logger/outputs/console-output.js +32 -0
  771. package/src/logger/outputs/file-output.js +55 -0
  772. package/src/logger/outputs/stdout-output.js +64 -0
  773. package/src/logger.js +507 -0
  774. package/src/mailer/backends/smtp.js +197 -0
  775. package/src/mailer/base.js +337 -0
  776. package/src/mailer/delivery.js +70 -0
  777. package/src/mailer/index.js +24 -0
  778. package/src/mailer.js +15 -0
  779. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  780. package/src/plugins/sqljs-wasm-route.js +71 -0
  781. package/src/record-payload-values.js +83 -0
  782. package/src/routes/app-routes.js +17 -0
  783. package/src/routes/base-route.js +133 -0
  784. package/src/routes/basic-route.js +109 -0
  785. package/src/routes/built-in/debug/controller.js +12 -0
  786. package/src/routes/built-in/errors/controller.js +7 -0
  787. package/src/routes/built-in/errors/not-found.ejs +1 -0
  788. package/src/routes/get-route.js +75 -0
  789. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  790. package/src/routes/index.js +50 -0
  791. package/src/routes/namespace-route.js +51 -0
  792. package/src/routes/plugin-routes.js +141 -0
  793. package/src/routes/post-route.js +74 -0
  794. package/src/routes/resolver.js +535 -0
  795. package/src/routes/resource-route.js +154 -0
  796. package/src/routes/root-route.js +11 -0
  797. package/src/templates/configuration.js +61 -0
  798. package/src/templates/generate-migration.js +11 -0
  799. package/src/templates/generate-model.js +6 -0
  800. package/src/templates/routes.js +11 -0
  801. package/src/testing/base-expect.js +17 -0
  802. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  803. package/src/testing/browser-test-app.js +32 -0
  804. package/src/testing/expect-to-change.js +55 -0
  805. package/src/testing/expect-utils.js +269 -0
  806. package/src/testing/expect.js +763 -0
  807. package/src/testing/request-client.js +90 -0
  808. package/src/testing/test-files-finder.js +364 -0
  809. package/src/testing/test-filter-parser.js +198 -0
  810. package/src/testing/test-runner.js +1168 -0
  811. package/src/testing/test-suite-splitter.js +177 -0
  812. package/src/testing/test.js +370 -0
  813. package/src/types/external-modules.d.ts +57 -0
  814. package/src/utils/backtrace-cleaner-node.js +87 -0
  815. package/src/utils/backtrace-cleaner.js +266 -0
  816. package/src/utils/ensure-error.js +15 -0
  817. package/src/utils/event-emitter.js +8 -0
  818. package/src/utils/file-exists.js +18 -0
  819. package/src/utils/format-value.js +101 -0
  820. package/src/utils/model-scope.js +56 -0
  821. package/src/utils/nest-callbacks.js +22 -0
  822. package/src/utils/plain-object.js +14 -0
  823. package/src/utils/ransack.js +859 -0
  824. package/src/utils/rest-args-error.js +14 -0
  825. package/src/utils/singularize-model-name.js +18 -0
  826. package/src/utils/split-sql-statements.js +88 -0
  827. package/src/utils/to-import-specifier.js +53 -0
  828. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  829. package/src/utils/with-tracked-stack.js +38 -0
  830. package/src/velocious-error.js +34 -0
  831. package/tsconfig.json +16 -0
@@ -0,0 +1,486 @@
1
+ // @ts-check
2
+
3
+ import fs from "node:fs/promises"
4
+ import path from "node:path"
5
+ import {pathToFileURL} from "node:url"
6
+ import {build} from "esbuild"
7
+ import initSqlJs from "sql.js"
8
+ import SystemTest from "system-testing/build/system-test.js"
9
+ import Application from "../src/application.js"
10
+ import Configuration from "../src/configuration.js"
11
+ import BrowserEnvironmentHandler from "../src/environment-handlers/browser.js"
12
+ import NodeEnvironmentHandler from "../src/environment-handlers/node.js"
13
+ import SqliteWebDriver from "../src/database/drivers/sqlite/index.web.js"
14
+ import SingleMultiUsePool from "../src/database/pool/single-multi-use.js"
15
+ import queryWeb from "../src/database/drivers/sqlite/query.web.js"
16
+ import Migrator from "../src/database/migrator.js"
17
+ import TestFilesFinder from "../src/testing/test-files-finder.js"
18
+ import TestRunner from "../src/testing/test-runner.js"
19
+ import {normalizeExamplePatterns, parseFilters} from "../src/testing/test-filter-parser.js"
20
+ import fileExists from "../src/utils/file-exists.js"
21
+ import dummyDirectory from "../spec/dummy/dummy-directory.js"
22
+
23
+ const rootDir = process.cwd()
24
+ const distDir = path.join(rootDir, "dist")
25
+ const entryFile = path.join(rootDir, "src/testing/browser-test-app.js")
26
+ const defaultBrowserPattern = /\.browser-(spec|test)\.(m|)js$/
27
+ const shared = {
28
+ sqlJsDatabase: null,
29
+ sqlJsConnection: null,
30
+ migrationsPrepared: false,
31
+ modelsPrepared: false
32
+ }
33
+
34
+ /**
35
+ * @returns {RegExp} - Browser test file regex.
36
+ */
37
+ function browserTestPattern() {
38
+ const customPattern = process.env.VELOCIOUS_BROWSER_TEST_PATTERN
39
+ return customPattern ? new RegExp(customPattern) : defaultBrowserPattern
40
+ }
41
+
42
+ /**
43
+ * @param {string} variableName - Environment variable name.
44
+ * @param {number} defaultValue - Default value when env is not set.
45
+ * @returns {number} - Parsed positive integer value.
46
+ */
47
+ function parsePositiveIntegerEnv(variableName, defaultValue) {
48
+ const rawValue = process.env[variableName]
49
+ const parsedValue = rawValue === undefined ? defaultValue : Number(rawValue)
50
+
51
+ if (!Number.isInteger(parsedValue) || parsedValue < 1) {
52
+ throw new Error(`${variableName} must be a positive integer. Got: ${String(rawValue)}`)
53
+ }
54
+
55
+ return parsedValue
56
+ }
57
+
58
+ /**
59
+ * @param {string} filePath - File path.
60
+ * @returns {boolean} - Whether file matches browser test pattern.
61
+ */
62
+ function isBrowserTestFile(filePath) {
63
+ return browserTestPattern().test(path.basename(filePath))
64
+ }
65
+
66
+ /**
67
+ * @returns {Promise<void>} - Resolves when the browser test app is built.
68
+ */
69
+ async function buildBrowserTestApp() {
70
+ await fs.rm(distDir, {recursive: true, force: true})
71
+ await fs.mkdir(distDir, {recursive: true})
72
+
73
+ await build({
74
+ entryPoints: [entryFile],
75
+ bundle: true,
76
+ define: {
77
+ "process.env.EXPO_PUBLIC_SYSTEM_TEST": JSON.stringify(process.env.EXPO_PUBLIC_SYSTEM_TEST || ""),
78
+ "process.env.EXPO_PUBLIC_SYSTEM_TEST_HOST": JSON.stringify(process.env.EXPO_PUBLIC_SYSTEM_TEST_HOST || "")
79
+ },
80
+ format: "esm",
81
+ outdir: distDir,
82
+ platform: "browser",
83
+ target: "es2020",
84
+ logLevel: "silent",
85
+ sourcemap: true
86
+ })
87
+
88
+ const html = `<!doctype html>
89
+ <html lang="en">
90
+ <head>
91
+ <meta charset="utf-8" />
92
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
93
+ <title>Velocious Browser Tests</title>
94
+ </head>
95
+ <body>
96
+ <div id="root"></div>
97
+ <script type="module" src="/browser-test-app.js"></script>
98
+ </body>
99
+ </html>
100
+ `
101
+
102
+ await fs.writeFile(path.join(distDir, "index.html"), html, "utf8")
103
+ }
104
+
105
+ /**
106
+ * @returns {Promise<import("sql.js").Database>} - The SQL.js database instance.
107
+ */
108
+ async function getSqlJsDatabase() {
109
+ if (shared.sqlJsDatabase) return shared.sqlJsDatabase
110
+
111
+ const SQL = await initSqlJs({
112
+ locateFile: (file) => path.join(rootDir, "node_modules/sql.js/dist", file)
113
+ })
114
+
115
+ shared.sqlJsDatabase = new SQL.Database()
116
+
117
+ return shared.sqlJsDatabase
118
+ }
119
+
120
+ /**
121
+ * @param {import("sql.js").Database} database - SQL.js database instance.
122
+ * @returns {{query: (sql: string) => Promise<Record<string, unknown>[]>, close: () => Promise<void>}} - Connection wrapper.
123
+ */
124
+ function createSqlJsConnection(database) {
125
+ return {
126
+ query: async (sql) => await queryWeb(database, sql),
127
+ close: async () => {
128
+ database.close()
129
+ }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * @param {import("../src/configuration.js").default} configuration - Configuration instance.
135
+ * @returns {Promise<void>} - Resolves when prepared.
136
+ */
137
+ async function runDummyMigrations(configuration) {
138
+ if (shared.migrationsPrepared) return
139
+
140
+ const nodeEnvironmentHandler = new NodeEnvironmentHandler()
141
+ nodeEnvironmentHandler.setConfiguration(configuration)
142
+
143
+ const migrator = new Migrator({configuration})
144
+
145
+ await configuration.ensureConnections(async () => {
146
+ await migrator.prepare()
147
+ const migrations = await nodeEnvironmentHandler.findMigrations()
148
+ await migrator.migrateFiles(migrations, async (filePath) => await nodeEnvironmentHandler.requireMigration(filePath))
149
+ })
150
+
151
+ shared.migrationsPrepared = true
152
+ }
153
+
154
+ /**
155
+ * @param {import("../src/configuration.js").default} configuration - Configuration instance.
156
+ * @returns {Promise<void>} - Resolves when models are initialized.
157
+ */
158
+ async function initializeDummyModels(configuration) {
159
+ if (shared.modelsPrepared) return
160
+
161
+ const modelsPath = path.join(dummyDirectory(), "src/models")
162
+ const modelFiles = await findFiles(modelsPath)
163
+
164
+ await configuration.ensureConnections(async (dbs) => {
165
+ const db = dbs.default
166
+
167
+ for (const modelFile of modelFiles) {
168
+ const modelImport = await import(pathToFileURL(modelFile).href)
169
+ const modelClass = modelImport.default
170
+
171
+ if (!modelClass?.initializeRecord) {
172
+ throw new Error(`Model wasn't exported from: ${modelFile}`)
173
+ }
174
+
175
+ if (typeof modelClass.getDatabaseIdentifier === "function" && modelClass.getDatabaseIdentifier() !== "default") {
176
+ continue
177
+ }
178
+
179
+ const tableName = modelClass.tableName()
180
+
181
+ if (!db || !await db.tableExists(tableName)) {
182
+ continue
183
+ }
184
+
185
+ await modelClass.initializeRecord({configuration})
186
+
187
+ if (await modelClass.hasTranslationsTable()) {
188
+ const translationClass = modelClass.getTranslationClass()
189
+ const translationTableName = translationClass.tableName()
190
+
191
+ if (db && await db.tableExists(translationTableName)) {
192
+ await translationClass.initializeRecord({configuration})
193
+ }
194
+ }
195
+ }
196
+ })
197
+
198
+ shared.modelsPrepared = true
199
+ }
200
+
201
+ /**
202
+ * @param {string} directory - Directory path.
203
+ * @returns {Promise<string[]>} - Resolved file paths.
204
+ */
205
+ async function findFiles(directory) {
206
+ const entries = await fs.readdir(directory, {withFileTypes: true})
207
+ const files = []
208
+
209
+ for (const entry of entries) {
210
+ const fullPath = path.join(directory, entry.name)
211
+
212
+ if (entry.isDirectory()) {
213
+ const nestedFiles = await findFiles(fullPath)
214
+ files.push(...nestedFiles)
215
+ } else if (entry.isFile() && entry.name.endsWith(".js")) {
216
+ files.push(fullPath)
217
+ }
218
+ }
219
+
220
+ return files
221
+ }
222
+
223
+ /**
224
+ * @returns {Promise<import("../src/configuration.js").default>} - The configuration.
225
+ */
226
+ async function resolveConfiguration({testFilesRequireContextCallback} = {}) {
227
+ const sqlJsDatabase = await getSqlJsDatabase()
228
+
229
+ if (!shared.sqlJsConnection) {
230
+ shared.sqlJsConnection = createSqlJsConnection(sqlJsDatabase)
231
+ }
232
+
233
+ const configuration = new Configuration({
234
+ database: {
235
+ test: {
236
+ default: {
237
+ driver: SqliteWebDriver,
238
+ poolType: SingleMultiUsePool,
239
+ type: "sqlite",
240
+ name: "browser-test-db",
241
+ migrations: true,
242
+ getConnection: () => shared.sqlJsConnection
243
+ }
244
+ }
245
+ },
246
+ debug: false,
247
+ directory: dummyDirectory(),
248
+ environment: "test",
249
+ environmentHandler: new BrowserEnvironmentHandler({
250
+ testFilesRequireContextCallback
251
+ }),
252
+ locale: () => "en",
253
+ localeFallbacks: {
254
+ de: ["de", "en"],
255
+ en: ["en", "de"]
256
+ },
257
+ locales: ["de", "en"]
258
+ })
259
+
260
+ configuration.setCurrent()
261
+
262
+ await runDummyMigrations(configuration)
263
+ await initializeDummyModels(configuration)
264
+
265
+ return configuration
266
+ }
267
+
268
+ /**
269
+ * @param {string[]} processArgs - Process args.
270
+ * @returns {Promise<{directory: string, testFiles: string[], lineFilters: Record<string, number[]>, includeTags: string[], excludeTags: string[], examplePatterns: RegExp[]}>} - Test data.
271
+ */
272
+ async function resolveTests(processArgs) {
273
+ const directory = process.env.VELOCIOUS_TEST_DIR
274
+ ? path.resolve(process.env.VELOCIOUS_TEST_DIR)
275
+ : rootDir
276
+ const directories = process.env.VELOCIOUS_TEST_DIR
277
+ ? [directory]
278
+ : [`${rootDir}/__tests__`, `${rootDir}/tests`, `${rootDir}/spec`]
279
+
280
+ const {includeTags, excludeTags, examplePatterns, filteredProcessArgs} = parseFilters(processArgs)
281
+ const testFilesFinder = new TestFilesFinder({
282
+ directory,
283
+ directories,
284
+ processArgs: filteredProcessArgs
285
+ })
286
+ const testFiles = await testFilesFinder.findTestFiles()
287
+ const browserTestFiles = testFiles.filter((file) => isBrowserTestFile(file))
288
+
289
+ if (browserTestFiles.length === 0) {
290
+ throw new Error("No browser tests matched. Use *.browser-test.js or *.browser-spec.js (override with VELOCIOUS_BROWSER_TEST_PATTERN).")
291
+ }
292
+
293
+ return {
294
+ directory,
295
+ testFiles: browserTestFiles,
296
+ lineFilters: testFilesFinder.getLineFiltersByFile(),
297
+ includeTags,
298
+ excludeTags,
299
+ examplePatterns: normalizeExamplePatterns(examplePatterns)
300
+ }
301
+ }
302
+
303
+ /**
304
+ * @param {string[]} testFiles - Test files to import.
305
+ * @returns {{(key: string): Promise<unknown> | unknown, keys: () => string[], id: string}} - Require context for test files.
306
+ */
307
+ function createTestFilesRequireContext(testFiles) {
308
+ const cachedImports = new Map()
309
+ const keys = [...testFiles]
310
+
311
+ const context = (key) => {
312
+ if (!cachedImports.has(key)) {
313
+ cachedImports.set(key, import(pathToFileURL(key).href))
314
+ }
315
+
316
+ return cachedImports.get(key)
317
+ }
318
+
319
+ context.keys = () => keys
320
+ context.id = "velocious-test-files"
321
+
322
+ return context
323
+ }
324
+
325
+ /**
326
+ * @param {import("../src/configuration.js").default} configuration - Configuration instance.
327
+ * @param {number} port - Backend server port.
328
+ * @returns {Promise<Application>} - Started backend app instance.
329
+ */
330
+ async function startBrowserBackendServer(configuration, port) {
331
+ const application = new Application({
332
+ configuration,
333
+ httpServer: {
334
+ host: "127.0.0.1",
335
+ port
336
+ },
337
+ type: "server"
338
+ })
339
+
340
+ try {
341
+ await application.initialize()
342
+ await application.startHttpServer()
343
+ } catch (error) {
344
+ try {
345
+ await application.stop()
346
+ } catch {
347
+ // no-op: preserve original startup error
348
+ }
349
+
350
+ throw error
351
+ }
352
+
353
+ return application
354
+ }
355
+
356
+ async function main() {
357
+ const processArgs = ["test:browser", ...process.argv.slice(2)]
358
+
359
+ process.env.VELOCIOUS_BROWSER_TESTS = "true"
360
+ process.env.VELOCIOUS_DISABLE_MSSQL = "1"
361
+ process.env.VELOCIOUS_SKIP_DUMMY_MODEL_INITIALIZATION = "1"
362
+ process.env.SYSTEM_TEST_HOST ||= "dist"
363
+ const browserBackendPort = parsePositiveIntegerEnv("VELOCIOUS_BROWSER_BACKEND_PORT", 4501)
364
+ const systemTestHttpHost = process.env.SYSTEM_TEST_HTTP_HOST || "127.0.0.1"
365
+ const systemTestHttpPort = parsePositiveIntegerEnv("SYSTEM_TEST_HTTP_PORT", 1984)
366
+ process.env.VELOCIOUS_BROWSER_BACKEND_PORT = String(browserBackendPort)
367
+ process.env.SYSTEM_TEST_HTTP_PORT = String(systemTestHttpPort)
368
+
369
+ await buildBrowserTestApp()
370
+
371
+ const {testFiles, lineFilters, includeTags, excludeTags, examplePatterns} = await resolveTests(processArgs)
372
+ const configuration = await resolveConfiguration({
373
+ testFilesRequireContextCallback: async () => createTestFilesRequireContext(testFiles)
374
+ })
375
+ const testRunner = new TestRunner({
376
+ configuration,
377
+ excludeTags,
378
+ includeTags,
379
+ testFiles,
380
+ lineFilters,
381
+ examplePatterns
382
+ })
383
+ /** @type {SystemTest | undefined} */
384
+ let systemTest
385
+ /** @type {Application | undefined} */
386
+ let backendApplication
387
+
388
+ try {
389
+ const backendConfiguration = await loadBrowserBackendConfiguration()
390
+ globalThis.__velocious_browser_test_backend_configuration = backendConfiguration
391
+ backendApplication = await startBrowserBackendServer(backendConfiguration, browserBackendPort)
392
+ systemTest = SystemTest.current({
393
+ debug: process.env.SYSTEM_TEST_DEBUG === "true",
394
+ httpHost: systemTestHttpHost,
395
+ httpPort: systemTestHttpPort
396
+ })
397
+ await systemTest.start()
398
+
399
+ await testRunner.prepare()
400
+
401
+ if (testRunner.getTestsCount() === 0) {
402
+ throw new Error(`${testRunner.getTestsCount()} tests was found in ${testFiles.length} file(s)`)
403
+ }
404
+
405
+ await testRunner.run()
406
+
407
+ const executedTests = testRunner.getExecutedTestsCount()
408
+ const hasLineFilters = Object.keys(testRunner.getLineFilters()).length > 0
409
+ const hasExampleFilters = examplePatterns.length > 0
410
+ const hasTagFilters = includeTags.length > 0 || excludeTags.length > 0
411
+
412
+ if ((hasTagFilters || hasLineFilters || hasExampleFilters) && executedTests === 0) {
413
+ console.error("\nNo tests matched the provided filters")
414
+ process.exitCode = 1
415
+ return
416
+ }
417
+
418
+ if (testRunner.isFailed()) {
419
+ await testRunner.persistFailedTestConsoleOutputsToAssets()
420
+ const failedTests = testRunner.getFailedTestDetails()
421
+
422
+ if (failedTests.length > 0) {
423
+ console.error("\nFailed tests:")
424
+
425
+ for (const failed of failedTests) {
426
+ const location = failed.filePath && failed.line
427
+ ? ` (${failed.filePath}:${failed.line})`
428
+ : ""
429
+ console.error(`- ${failed.fullDescription}${location}`)
430
+
431
+ if (failed.consoleLogPath) {
432
+ console.error(` Console log: ${failed.consoleLogPath}`)
433
+ }
434
+ }
435
+ }
436
+
437
+ console.error(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`)
438
+ process.exitCode = 1
439
+ } else if (testRunner.areAnyTestsFocussed()) {
440
+ console.error(`\nFocussed run with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`)
441
+ process.exitCode = 1
442
+ } else {
443
+ console.log(`\nTest run succeeded with ${testRunner.getSuccessfulTests()} successful tests`)
444
+ }
445
+ } finally {
446
+ if (systemTest) {
447
+ await systemTest.stop()
448
+ }
449
+
450
+ if (backendApplication) {
451
+ await backendApplication.stop()
452
+ }
453
+ }
454
+ }
455
+
456
+ /**
457
+ * @returns {Promise<import("../src/configuration.js").default>} - Backend configuration for browser tests.
458
+ */
459
+ async function loadBrowserBackendConfiguration() {
460
+ const dummyConfigurationPath = path.join(dummyDirectory(), "src/config/configuration.js")
461
+
462
+ if (!(await fileExists(dummyConfigurationPath))) {
463
+ throw new Error(`Missing dummy backend configuration for browser tests: ${dummyConfigurationPath}. Copy one of spec/dummy/src/config/configuration.*.js files to configuration.js before running browser tests.`)
464
+ }
465
+
466
+ const dummyConfigurationImport = await import(pathToFileURL(dummyConfigurationPath).href)
467
+ const backendConfiguration = dummyConfigurationImport.default
468
+
469
+ const nodeEnvironmentHandler = new NodeEnvironmentHandler()
470
+ nodeEnvironmentHandler.setConfiguration(backendConfiguration)
471
+
472
+ const migrator = new Migrator({configuration: backendConfiguration})
473
+
474
+ await backendConfiguration.ensureConnections(async () => {
475
+ await migrator.prepare()
476
+ const migrations = await nodeEnvironmentHandler.findMigrations()
477
+ await migrator.migrateFiles(migrations, async (filePath) => await nodeEnvironmentHandler.requireMigration(filePath))
478
+ })
479
+
480
+ return backendConfiguration
481
+ }
482
+
483
+ main().catch((error) => {
484
+ console.error(error)
485
+ process.exit(1)
486
+ })
@@ -0,0 +1,229 @@
1
+ // @ts-check
2
+
3
+ import AppRoutes from "./routes/app-routes.js"
4
+ import Logger from "./logger.js"
5
+ import HttpServer from "./http-server/index.js"
6
+ import HttpServerLock from "./http-server/server-lock.js"
7
+ import websocketEventsHost from "./http-server/websocket-events-host.js"
8
+ import restArgsError from "./utils/rest-args-error.js"
9
+
10
+ /**
11
+ * HttpServerConfiguration type.
12
+ @typedef {import("./configuration-types.js").HttpServerConfiguration} HttpServerConfiguration */
13
+
14
+ export default class VelociousApplication {
15
+ /**
16
+ * Runs constructor.
17
+ * @param {object} args - Options object.
18
+ * @param {import("./configuration.js").default} args.configuration - Configuration instance.
19
+ * @param {HttpServerConfiguration} [args.httpServer] - Http server.
20
+ * @param {string} args.type - Type identifier.
21
+ */
22
+ constructor({configuration, httpServer, type, ...restArgs}) {
23
+ restArgsError(restArgs)
24
+
25
+ if (!configuration) throw new Error("configuration is required")
26
+
27
+ this.configuration = configuration
28
+
29
+ /**
30
+ * Stores the http server configuration value.
31
+ @type {HttpServerConfiguration} */
32
+ this.httpServerConfiguration = httpServer ?? {}
33
+
34
+ this.logger = new Logger(this)
35
+ this._type = type
36
+ /**
37
+ * Stores the http server lock value.
38
+ @type {HttpServerLock | undefined} */
39
+ this.httpServerLock = undefined
40
+ }
41
+
42
+ /**
43
+ * Runs get type.
44
+ * @returns {string} - The type.
45
+ */
46
+ getType() { return this._type }
47
+
48
+ /**
49
+ * Runs initialize.
50
+ * @returns {Promise<void>} - Resolves when complete.
51
+ */
52
+ async initialize() {
53
+ const routes = await AppRoutes.getRoutes(this.configuration)
54
+
55
+ await this.configuration.initialize({type: this.getType()})
56
+
57
+ this.configuration.setRoutes(routes)
58
+
59
+ if (!this.configuration.isDatabasePoolInitialized()) {
60
+ await this.configuration.initializeDatabasePool()
61
+ }
62
+
63
+ }
64
+
65
+ /**
66
+ * Runs is active.
67
+ * @returns {boolean} - Whether active.
68
+ */
69
+ isActive() {
70
+ if (this.httpServer) {
71
+ return this.httpServer?.isActive()
72
+ }
73
+
74
+ return false
75
+ }
76
+
77
+ /**
78
+ * Runs run.
79
+ * @param {function() : void} callback - Callback function.
80
+ * @returns {Promise<void>} - Resolves when complete.
81
+ */
82
+ async run(callback) {
83
+ await this.startHttpServer()
84
+
85
+ try {
86
+ await callback()
87
+ } finally {
88
+ await this.stop()
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Runs start http server.
94
+ * @returns {Promise<void>} - Resolves when complete.
95
+ */
96
+ async startHttpServer() {
97
+ const {configuration} = this
98
+ const httpServerConfiguration = {
99
+ ...configuration.httpServer,
100
+ ...this.httpServerConfiguration
101
+ }
102
+ const port = httpServerConfiguration.port ?? 3006
103
+ const host = httpServerConfiguration.host
104
+
105
+ await this.logger.debug(`Starting server on port ${port}`)
106
+ await this.acquireHttpServerLock({configuration, host: host ?? "0.0.0.0", port})
107
+ await this.startLockedHttpServer({configuration, host, httpServerConfiguration, port})
108
+ }
109
+
110
+ /**
111
+ * Runs start locked http server.
112
+ * @param {object} args - HTTP server startup arguments.
113
+ * @param {import("./configuration.js").default} args.configuration - Configuration instance.
114
+ * @param {string} [args.host] - HTTP server host.
115
+ * @param {Record<string, ?>} args.httpServerConfiguration - Merged HTTP server configuration.
116
+ * @param {number} args.port - HTTP server port.
117
+ * @returns {Promise<void>} - Resolves after the HTTP server has started.
118
+ */
119
+ async startLockedHttpServer({configuration, host, httpServerConfiguration, port}) {
120
+ try {
121
+ if (!configuration.getWebsocketEvents()) {
122
+ configuration.setWebsocketEvents(/**
123
+ * Types the following value.
124
+ @type {?} */ (websocketEventsHost))
125
+ }
126
+
127
+ await configuration.connectBeacon({peerType: "server"})
128
+
129
+ this.httpServer = this.createHttpServer({
130
+ configuration,
131
+ host,
132
+ inProcess: httpServerConfiguration.inProcess,
133
+ maxWorkers: httpServerConfiguration.maxWorkers,
134
+ port,
135
+ workers: httpServerConfiguration.workers
136
+ })
137
+ this.httpServer.events.on("close", this.onHttpServerClose)
138
+ configuration._httpServerInstance = this.httpServer
139
+
140
+ await this.httpServer.start()
141
+ } catch (error) {
142
+ await this.releaseHttpServerLock()
143
+ configuration._httpServerInstance = undefined
144
+
145
+ throw error
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Runs acquire http server lock.
151
+ * @param {object} args - Lock acquisition arguments.
152
+ * @param {import("./configuration.js").default} args.configuration - Configuration instance.
153
+ * @param {string} args.host - HTTP server host.
154
+ * @param {number} args.port - HTTP server port.
155
+ * @returns {Promise<void>} - Resolves after acquiring the server lock when needed.
156
+ */
157
+ async acquireHttpServerLock({configuration, host, port}) {
158
+ if (this.getType() === "test-runner") return
159
+
160
+ const httpServerLock = new HttpServerLock({configuration, host, port})
161
+ await httpServerLock.acquire()
162
+ this.httpServerLock = httpServerLock
163
+ }
164
+
165
+ /**
166
+ * Runs create http server.
167
+ * @param {object} args - HTTP server arguments.
168
+ * @param {import("./configuration.js").default} args.configuration - Configuration instance.
169
+ * @param {string} [args.host] - Host.
170
+ * @param {boolean} [args.inProcess] - Run HTTP handlers in the main thread.
171
+ * @param {number} [args.maxWorkers] - Max workers.
172
+ * @param {number} args.port - Port.
173
+ * @param {number} [args.workers] - Worker count.
174
+ * @returns {HttpServer} - HTTP server instance.
175
+ */
176
+ createHttpServer({configuration, host, inProcess, maxWorkers, port, workers}) {
177
+ return new HttpServer({configuration, host, inProcess, maxWorkers, port, workers})
178
+ }
179
+
180
+ /**
181
+ * Runs stop.
182
+ * @returns {Promise<void>} - Resolves when complete.
183
+ */
184
+ async stop() {
185
+ await this.logger.debug("Stopping server")
186
+
187
+ try {
188
+ await this.httpServer?.stop()
189
+ this.configuration._httpServerInstance = undefined
190
+ await this.configuration.disconnectBeacon()
191
+ await this.configuration.closeDatabaseConnections()
192
+ } finally {
193
+ await this.releaseHttpServerLock()
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Runs release http server lock.
199
+ * @returns {Promise<void>} - Resolves after the HTTP server lock has been released.
200
+ */
201
+ async releaseHttpServerLock() {
202
+ const {httpServerLock} = this
203
+
204
+ this.httpServerLock = undefined
205
+ if (httpServerLock) await httpServerLock.release()
206
+ }
207
+
208
+ /**
209
+ * On http server close.
210
+ * @returns {void} - No return value.
211
+ */
212
+ onHttpServerClose = () => {
213
+ this.logger.debug("HTTP server closed")
214
+
215
+ if (this.waitResolve) {
216
+ this.waitResolve()
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Runs wait.
222
+ * @returns {Promise<void>} - Resolves when complete.
223
+ */
224
+ wait() {
225
+ return new Promise((resolve) => {
226
+ this.waitResolve = resolve
227
+ })
228
+ }
229
+ }