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,61 @@
1
+ import AsyncTrackedMultiConnection from "velocious/build/src/database/pool/async-tracked-multi-connection.js"
2
+ import Configuration from "velocious/build/src/configuration.js"
3
+ import fs from "fs/promises"
4
+ import InitializerFromRequireContext from "../../../../src/database/initializer-from-require-context.js"
5
+ import MysqlDriver from "velocious/build/src/database/drivers/mysql/index.js"
6
+ import path from "path"
7
+ import requireContext from "require-context"
8
+
9
+ export default new Configuration({
10
+ database: {
11
+ development: {
12
+ default: {
13
+ driver: MysqlDriver,
14
+ poolType: AsyncTrackedMultiConnection,
15
+ type: "mysql",
16
+ host: "mariadb",
17
+ username: "username",
18
+ password: "password",
19
+ database: "database_development"
20
+ }
21
+ },
22
+ production: {
23
+ default: {
24
+ driver: MysqlDriver,
25
+ poolType: AsyncTrackedMultiConnection,
26
+ type: "mysql",
27
+ host: "mariadb",
28
+ username: "username",
29
+ password: "password",
30
+ database: "database_production"
31
+ }
32
+ },
33
+ test: {
34
+ default: {
35
+ driver: MysqlDriver,
36
+ poolType: AsyncTrackedMultiConnection,
37
+ type: "mysql",
38
+ host: "mariadb",
39
+ username: "username",
40
+ password: "password",
41
+ database: "database_test"
42
+ }
43
+ }
44
+ },
45
+ cookieSecret: process.env.COOKIE_SECRET,
46
+ initializeModels: async ({configuration}) => {
47
+ const modelsPath = await fs.realpath(`${path.dirname(import.meta.dirname)}/../src/models`)
48
+ const requireContextModels = requireContext(modelsPath, true, /^(.+)\.js$/)
49
+ const initializerFromRequireContext = new InitializerFromRequireContext({requireContext: requireContextModels})
50
+
51
+ await configuration.ensureConnections({name: "Initialize models"}, async () => {
52
+ await initializerFromRequireContext.initialize({configuration})
53
+ })
54
+ },
55
+ locale: () => "en",
56
+ locales: ["de", "en"],
57
+ localeFallbacks: {
58
+ de: ["de", "en"],
59
+ en: ["en", "de"]
60
+ }
61
+ })
@@ -0,0 +1,11 @@
1
+ import Migration from "velocious/build/src/database/migration/index.js"
2
+
3
+ export default class __MIGRATION_NAME__ extends Migration {
4
+ async up() {
5
+ await this.execute("...")
6
+ }
7
+
8
+ async down() {
9
+ await this.execute("...")
10
+ }
11
+ }
@@ -0,0 +1,6 @@
1
+ import Record from "velocious/build/src/database/record/index.js"
2
+
3
+ class __MODEL_NAME__ extends Record {
4
+ }
5
+
6
+ export default __MODEL_NAME__
@@ -0,0 +1,11 @@
1
+ import Routes from "velocious/build/src/routes/index.js"
2
+
3
+ const routes = new Routes()
4
+
5
+ routes.draw((route) => {
6
+ route.resources("tasks", (route) => {
7
+ route.get("users")
8
+ })
9
+ })
10
+
11
+ export default {routes}
@@ -0,0 +1,17 @@
1
+ // @ts-check
2
+
3
+ export default class BaseExpect {
4
+ /**
5
+ * Runs run before.
6
+ * @abstract
7
+ * @returns {Promise<void>} - Resolves when complete.
8
+ */
9
+ async runBefore() { /* do nothing */ }
10
+
11
+ /**
12
+ * Runs run after.
13
+ * @abstract
14
+ * @returns {Promise<void>} - Resolves when complete.
15
+ */
16
+ async runAfter() { /* do nothing */ }
17
+ }
@@ -0,0 +1,520 @@
1
+ // @ts-check
2
+
3
+ import React from "react"
4
+ import {createRoot} from "react-dom/client"
5
+
6
+ import useDestroyedEvent from "../frontend-models/use-destroyed-event.js"
7
+ import useCreatedEvent from "../frontend-models/use-created-event.js"
8
+ import FrontendModelBase from "../frontend-models/base.js"
9
+ import useModelClassEvent from "../frontend-models/use-model-class-event.js"
10
+ import useUpdatedEvent from "../frontend-models/use-updated-event.js"
11
+ import wait from "awaitery/build/wait.js"
12
+
13
+ /**
14
+ * FrontendModelResourceConfig type.
15
+ @typedef {import("../frontend-models/base.js").FrontendModelResourceConfig} FrontendModelResourceConfig */
16
+ /**
17
+ * Defines this typedef.
18
+ @typedef {{id: string, model: FrontendModelBase}} FrontendModelHookTestCreateUpdatePayload */
19
+ /**
20
+ * Defines this typedef.
21
+ @typedef {{id: string}} FrontendModelHookTestDestroyPayload */
22
+ /**
23
+ * FakeSubscriptions type.
24
+ * @typedef {object} FakeSubscriptions
25
+ * @property {Set<(payload: FrontendModelHookTestCreateUpdatePayload) => void>} create - Create callbacks.
26
+ * @property {Set<(payload: FrontendModelHookTestDestroyPayload) => void>} destroy - Destroy callbacks.
27
+ * @property {{create: import("../frontend-models/query.js").FrontendModelEventOptionsObject[], destroy: import("../frontend-models/query.js").FrontendModelEventOptionsObject[], update: import("../frontend-models/query.js").FrontendModelEventOptionsObject[]}} options - Subscription options.
28
+ * @property {Set<(payload: FrontendModelHookTestCreateUpdatePayload) => void>} update - Update callbacks.
29
+ */
30
+
31
+ /**
32
+ * Runs flush effects.
33
+ * @returns {Promise<void>} - Resolves after React effects have run.
34
+ */
35
+ async function flushEffects() {
36
+ await Promise.resolve()
37
+ await new Promise((resolve) => setTimeout(resolve, 0))
38
+ }
39
+
40
+ /**
41
+ * Runs wait for.
42
+ * @param {() => boolean} callback - Predicate to wait for.
43
+ * @returns {Promise<void>} - Resolves when the predicate returns true.
44
+ */
45
+ async function waitFor(callback) {
46
+ const startedAt = Date.now()
47
+
48
+ while (!callback()) {
49
+ if (Date.now() - startedAt > 1000) return
50
+
51
+ await wait(10)
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Runs build fake subscriptions.
57
+ * @returns {FakeSubscriptions} - Empty fake subscription store.
58
+ */
59
+ function buildFakeSubscriptions() {
60
+ return {
61
+ create: new Set(),
62
+ destroy: new Set(),
63
+ options: {create: [], destroy: [], update: []},
64
+ update: new Set()
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Runs fake resource config.
70
+ * @param {string} modelName - Fake frontend model name.
71
+ * @returns {FrontendModelResourceConfig} - Minimal resource config for fake subclasses.
72
+ */
73
+ function fakeResourceConfig(modelName) {
74
+ return {
75
+ attributes: ["id"],
76
+ modelName,
77
+ primaryKey: "id"
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Runs render element.
83
+ * @param {React.ReactElement} element - Element to render.
84
+ * @returns {Promise<{rerender: (nextElement: React.ReactElement) => Promise<void>, unmount: () => Promise<void>}>} - Render controls.
85
+ */
86
+ async function renderElement(element) {
87
+ const container = document.createElement("div")
88
+ document.body.appendChild(container)
89
+ const root = createRoot(container)
90
+
91
+ root.render(element)
92
+ await flushEffects()
93
+
94
+ return {
95
+ rerender: async (nextElement) => {
96
+ root.render(nextElement)
97
+ await flushEffects()
98
+ },
99
+ unmount: async () => {
100
+ root.unmount()
101
+ container.remove()
102
+ await flushEffects()
103
+ }
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Runs build fake model class.
109
+ * @returns {{ModelClass: typeof FrontendModelBase, subscriptions: FakeSubscriptions}} - Fake model class setup.
110
+ */
111
+ function buildFakeModelClass() {
112
+ const subscriptions = buildFakeSubscriptions()
113
+
114
+ class FakeModelClass extends FrontendModelBase {
115
+ /**
116
+ * Runs resource config.
117
+ * @returns {FrontendModelResourceConfig} - Fake resource config.
118
+ */
119
+ static resourceConfig() {
120
+ return fakeResourceConfig("HookFakeClassModel")
121
+ }
122
+
123
+ /**
124
+ * Runs on create.
125
+ * @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
126
+ * @param {import("../frontend-models/query.js").FrontendModelEventOptionsObject} [options] - Event query or projection options.
127
+ * @returns {Promise<() => void>} - Unsubscribe callback.
128
+ */
129
+ static async onCreate(callback, options = {}) {
130
+ subscriptions.create.add(callback)
131
+ subscriptions.options.create.push(options)
132
+
133
+ return () => subscriptions.create.delete(callback)
134
+ }
135
+
136
+ /**
137
+ * Runs on destroy.
138
+ * @param {(payload: FrontendModelHookTestDestroyPayload) => void} callback - Event callback.
139
+ * @param {import("../frontend-models/query.js").FrontendModelEventOptionsObject} [options] - Event query or projection options.
140
+ * @returns {Promise<() => void>} - Unsubscribe callback.
141
+ */
142
+ static async onDestroy(callback, options = {}) {
143
+ subscriptions.destroy.add(callback)
144
+ subscriptions.options.destroy.push(options)
145
+
146
+ return () => subscriptions.destroy.delete(callback)
147
+ }
148
+
149
+ /**
150
+ * Runs on update.
151
+ * @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
152
+ * @param {import("../frontend-models/query.js").FrontendModelEventOptionsObject} [options] - Event query or projection options.
153
+ * @returns {Promise<() => void>} - Unsubscribe callback.
154
+ */
155
+ static async onUpdate(callback, options = {}) {
156
+ subscriptions.update.add(callback)
157
+ subscriptions.options.update.push(options)
158
+
159
+ return () => subscriptions.update.delete(callback)
160
+ }
161
+ }
162
+
163
+ return {ModelClass: FakeModelClass, subscriptions}
164
+ }
165
+
166
+ /**
167
+ * Runs emit event.
168
+ * @param {FakeSubscriptions} subscriptions - Callback sets.
169
+ * @param {"create" | "destroy" | "update"} eventName - Event name.
170
+ * @param {FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload} payload - Event payload.
171
+ * @returns {void}
172
+ */
173
+ function emitEvent(subscriptions, eventName, payload) {
174
+ if (eventName === "destroy") {
175
+ for (const callback of subscriptions.destroy) {
176
+ callback({id: payload.id})
177
+ }
178
+
179
+ return
180
+ }
181
+
182
+ if (!("model" in payload)) {
183
+ throw new Error(`Expected model payload for ${eventName}`)
184
+ }
185
+
186
+ for (const callback of subscriptions[eventName]) {
187
+ callback(payload)
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Runs build fake model.
193
+ * @param {string} id - Model id.
194
+ * @param {FakeSubscriptions} subscriptions - Callback sets.
195
+ * @returns {FrontendModelBase} - Fake model instance.
196
+ */
197
+ function buildFakeModel(id, subscriptions) {
198
+ class FakeModel extends FrontendModelBase {
199
+ /**
200
+ * Runs resource config.
201
+ * @returns {FrontendModelResourceConfig} - Fake resource config.
202
+ */
203
+ static resourceConfig() {
204
+ return fakeResourceConfig("HookFakeInstanceModel")
205
+ }
206
+
207
+ /**
208
+ * Runs on destroy.
209
+ * @param {(payload: FrontendModelHookTestDestroyPayload) => void} callback - Event callback.
210
+ * @param {import("../frontend-models/query.js").FrontendModelEventOptionsObject} [options] - Event query or projection options.
211
+ * @returns {Promise<() => void>} - Unsubscribe callback.
212
+ */
213
+ async onDestroy(callback, options = {}) {
214
+ subscriptions.destroy.add(callback)
215
+ subscriptions.options.destroy.push(options)
216
+
217
+ return () => subscriptions.destroy.delete(callback)
218
+ }
219
+
220
+ /**
221
+ * Runs on update.
222
+ * @param {(payload: FrontendModelHookTestCreateUpdatePayload) => void} callback - Event callback.
223
+ * @param {import("../frontend-models/query.js").FrontendModelEventOptionsObject} [options] - Event query or projection options.
224
+ * @returns {Promise<() => void>} - Unsubscribe callback.
225
+ */
226
+ async onUpdate(callback, options = {}) {
227
+ subscriptions.update.add(callback)
228
+ subscriptions.options.update.push(options)
229
+
230
+ return () => subscriptions.update.delete(callback)
231
+ }
232
+
233
+ /**
234
+ * Runs primary key value.
235
+ * @returns {string} - Primary key value.
236
+ */
237
+ primaryKeyValue() {
238
+ return id
239
+ }
240
+ }
241
+
242
+ return new FakeModel({id})
243
+ }
244
+
245
+ /**
246
+ * Runs class lifecycle scenario.
247
+ * @returns {Promise<Record<string, number>>} - Scenario result.
248
+ */
249
+ async function classLifecycleScenario() {
250
+ const {ModelClass, subscriptions} = buildFakeModelClass()
251
+ const eventModel = buildFakeModel("1", buildFakeSubscriptions())
252
+ /**
253
+ * Received events.
254
+ @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
255
+ const receivedEvents = []
256
+ let connectedCount = 0
257
+
258
+ /**
259
+ * Runs test component.
260
+ * @returns {React.ReactElement} - Test element.
261
+ */
262
+ function TestComponent() {
263
+ useModelClassEvent(ModelClass, ["create", "update"], (payload) => receivedEvents.push(payload), {
264
+ onConnected: () => { connectedCount += 1 }
265
+ })
266
+ useCreatedEvent(ModelClass, (payload) => receivedEvents.push(payload))
267
+
268
+ return React.createElement("div")
269
+ }
270
+
271
+ const controls = await renderElement(React.createElement(TestComponent))
272
+ await waitFor(() => subscriptions.create.size === 2 && subscriptions.update.size === 1)
273
+
274
+ const mountedCreateSubscriptions = subscriptions.create.size
275
+ const mountedUpdateSubscriptions = subscriptions.update.size
276
+ const mountedDestroySubscriptions = subscriptions.destroy.size
277
+ const mountedConnectedCount = connectedCount
278
+
279
+ emitEvent(subscriptions, "create", {id: "1", model: eventModel})
280
+ emitEvent(subscriptions, "update", {id: "1", model: eventModel})
281
+ emitEvent(subscriptions, "destroy", {id: "1"})
282
+
283
+ const receivedEventsAfterEmit = receivedEvents.length
284
+
285
+ await controls.unmount()
286
+
287
+ return {
288
+ mountedConnectedCount,
289
+ mountedCreateSubscriptions,
290
+ mountedDestroySubscriptions,
291
+ mountedUpdateSubscriptions,
292
+ receivedEventsAfterEmit,
293
+ unmountedCreateSubscriptions: subscriptions.create.size,
294
+ unmountedUpdateSubscriptions: subscriptions.update.size
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Runs instance lifecycle scenario.
300
+ * @returns {Promise<Record<string, number>>} - Scenario result.
301
+ */
302
+ async function instanceLifecycleScenario() {
303
+ const subscriptions = buildFakeSubscriptions()
304
+ const model = buildFakeModel("task-1", subscriptions)
305
+ /**
306
+ * Received events.
307
+ @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
308
+ const receivedEvents = []
309
+ let connectedCount = 0
310
+
311
+ /**
312
+ * Runs test component.
313
+ * @returns {React.ReactElement} - Test element.
314
+ */
315
+ function TestComponent() {
316
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload), {
317
+ onConnected: () => { connectedCount += 1 }
318
+ })
319
+ useDestroyedEvent([model], (payload) => receivedEvents.push(payload), {
320
+ onConnected: () => { connectedCount += 1 }
321
+ })
322
+
323
+ return React.createElement("div")
324
+ }
325
+
326
+ const controls = await renderElement(React.createElement(TestComponent))
327
+ await waitFor(() => subscriptions.update.size === 1 && subscriptions.destroy.size === 1)
328
+
329
+ const mountedConnectedCount = connectedCount
330
+ const mountedDestroySubscriptions = subscriptions.destroy.size
331
+ const mountedUpdateSubscriptions = subscriptions.update.size
332
+
333
+ emitEvent(subscriptions, "update", {id: "task-1", model})
334
+ emitEvent(subscriptions, "destroy", {id: "task-1"})
335
+
336
+ const receivedEventsAfterEmit = receivedEvents.length
337
+
338
+ await controls.unmount()
339
+
340
+ return {
341
+ mountedConnectedCount,
342
+ mountedDestroySubscriptions,
343
+ mountedUpdateSubscriptions,
344
+ receivedEventsAfterEmit,
345
+ unmountedDestroySubscriptions: subscriptions.destroy.size,
346
+ unmountedUpdateSubscriptions: subscriptions.update.size
347
+ }
348
+ }
349
+
350
+ /**
351
+ * Runs projection options scenario.
352
+ * @returns {Promise<Record<string, number>>} - Scenario result.
353
+ */
354
+ async function projectionOptionsScenario() {
355
+ const {ModelClass, subscriptions: classSubscriptions} = buildFakeModelClass()
356
+ const instanceSubscriptions = buildFakeSubscriptions()
357
+ const model = buildFakeModel("task-1", instanceSubscriptions)
358
+ const classQuery = ModelClass
359
+ .where({id: "task-1"})
360
+ .select(["id"])
361
+
362
+ /**
363
+ * Runs test component.
364
+ * @returns {React.ReactElement} - Test element.
365
+ */
366
+ function TestComponent() {
367
+ useCreatedEvent(ModelClass, () => {}, {
368
+ preload: "project",
369
+ query: classQuery,
370
+ select: {Task: ["id", "nameUppercase"]}
371
+ })
372
+ useUpdatedEvent(model, () => {}, {
373
+ select: ["id"],
374
+ withCount: "comments"
375
+ })
376
+ useDestroyedEvent(model, () => {}, {
377
+ preload: "project",
378
+ select: ["id"]
379
+ })
380
+
381
+ return React.createElement("div")
382
+ }
383
+
384
+ const controls = await renderElement(React.createElement(TestComponent))
385
+ await waitFor(() => classSubscriptions.create.size === 1 && instanceSubscriptions.update.size === 1 && instanceSubscriptions.destroy.size === 1)
386
+
387
+ const createOptions = classSubscriptions.options.create[0] || {}
388
+ const updateOptions = instanceSubscriptions.options.update[0] || {}
389
+ const destroyOptions = instanceSubscriptions.options.destroy[0] || {}
390
+
391
+ await controls.unmount()
392
+
393
+ return {
394
+ classCreatePreloadProject: createOptions.preload === "project" ? 1 : 0,
395
+ classCreateQueryPassed: createOptions.query === classQuery ? 1 : 0,
396
+ classCreateSelectCount: createOptions.select && typeof createOptions.select === "object" && !Array.isArray(createOptions.select) && Array.isArray(createOptions.select.Task) ? createOptions.select.Task.length : 0,
397
+ instanceDestroyPreloadProject: destroyOptions.preload === "project" ? 1 : 0,
398
+ instanceDestroySelectCount: Array.isArray(destroyOptions.select) ? destroyOptions.select.length : 0,
399
+ instanceUpdateSelectCount: Array.isArray(updateOptions.select) ? updateOptions.select.length : 0,
400
+ instanceUpdateWithCountComments: updateOptions.withCount === "comments" ? 1 : 0
401
+ }
402
+ }
403
+
404
+ /**
405
+ * Runs debounce unmount scenario.
406
+ * @returns {Promise<Record<string, number>>} - Scenario result.
407
+ */
408
+ async function debounceUnmountScenario() {
409
+ const {ModelClass, subscriptions: classSubscriptions} = buildFakeModelClass()
410
+ const instanceSubscriptions = buildFakeSubscriptions()
411
+ const model = buildFakeModel("task-1", instanceSubscriptions)
412
+ /**
413
+ * Received events.
414
+ @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
415
+ const receivedEvents = []
416
+
417
+ /**
418
+ * Runs test component.
419
+ * @returns {React.ReactElement} - Test element.
420
+ */
421
+ function TestComponent() {
422
+ useModelClassEvent(ModelClass, "update", (payload) => receivedEvents.push(payload), {debounce: 20})
423
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload), {debounce: 20})
424
+ useDestroyedEvent(model, (payload) => receivedEvents.push(payload), {debounce: 20})
425
+
426
+ return React.createElement("div")
427
+ }
428
+
429
+ const controls = await renderElement(React.createElement(TestComponent))
430
+ await waitFor(() => classSubscriptions.update.size === 1 && instanceSubscriptions.update.size === 1 && instanceSubscriptions.destroy.size === 1)
431
+
432
+ emitEvent(classSubscriptions, "update", {id: "task-1", model})
433
+ emitEvent(instanceSubscriptions, "update", {id: "task-1", model})
434
+ emitEvent(instanceSubscriptions, "destroy", {id: "task-1"})
435
+
436
+ await controls.unmount()
437
+ await wait(30)
438
+
439
+ return {receivedEventsAfterDebounceWindow: receivedEvents.length}
440
+ }
441
+
442
+ /**
443
+ * Runs resubscribe instance scenario.
444
+ * @returns {Promise<Record<string, number>>} - Scenario result.
445
+ */
446
+ async function resubscribeInstanceScenario() {
447
+ const firstSubscriptions = buildFakeSubscriptions()
448
+ const secondSubscriptions = buildFakeSubscriptions()
449
+ const firstModel = buildFakeModel("task-1", firstSubscriptions)
450
+ const secondModel = buildFakeModel("task-1", secondSubscriptions)
451
+ /**
452
+ * Received events.
453
+ @type {Array<FrontendModelHookTestCreateUpdatePayload | FrontendModelHookTestDestroyPayload>} */
454
+ const receivedEvents = []
455
+
456
+ /**
457
+ * Runs test component.
458
+ * @param {{model: import("../frontend-models/base.js").default}} props - Component props.
459
+ * @returns {React.ReactElement} - Test element.
460
+ */
461
+ function TestComponent({model}) {
462
+ useUpdatedEvent(model, (payload) => receivedEvents.push(payload))
463
+ useDestroyedEvent(model, (payload) => receivedEvents.push(payload))
464
+
465
+ return React.createElement("div")
466
+ }
467
+
468
+ const controls = await renderElement(React.createElement(TestComponent, {model: firstModel}))
469
+ await waitFor(() => firstSubscriptions.update.size === 1 && firstSubscriptions.destroy.size === 1)
470
+
471
+ const firstMountedDestroySubscriptions = firstSubscriptions.destroy.size
472
+ const firstMountedUpdateSubscriptions = firstSubscriptions.update.size
473
+
474
+ await controls.rerender(React.createElement(TestComponent, {model: secondModel}))
475
+ await waitFor(() => firstSubscriptions.update.size === 0 && firstSubscriptions.destroy.size === 0 && secondSubscriptions.update.size === 1 && secondSubscriptions.destroy.size === 1)
476
+
477
+ const firstAfterRerenderDestroySubscriptions = firstSubscriptions.destroy.size
478
+ const firstAfterRerenderUpdateSubscriptions = firstSubscriptions.update.size
479
+ const secondAfterRerenderDestroySubscriptions = secondSubscriptions.destroy.size
480
+ const secondAfterRerenderUpdateSubscriptions = secondSubscriptions.update.size
481
+
482
+ emitEvent(firstSubscriptions, "update", {id: "task-1", model: firstModel})
483
+ emitEvent(secondSubscriptions, "update", {id: "task-1", model: secondModel})
484
+ emitEvent(secondSubscriptions, "destroy", {id: "task-1"})
485
+
486
+ const receivedEventsAfterEmit = receivedEvents.length
487
+
488
+ await controls.unmount()
489
+
490
+ return {
491
+ firstAfterRerenderDestroySubscriptions,
492
+ firstAfterRerenderUpdateSubscriptions,
493
+ firstMountedDestroySubscriptions,
494
+ firstMountedUpdateSubscriptions,
495
+ receivedEventsAfterEmit,
496
+ secondAfterRerenderDestroySubscriptions,
497
+ secondAfterRerenderUpdateSubscriptions
498
+ }
499
+ }
500
+
501
+ const scenarios = {
502
+ classLifecycle: classLifecycleScenario,
503
+ debounceUnmount: debounceUnmountScenario,
504
+ instanceLifecycle: instanceLifecycleScenario,
505
+ projectionOptions: projectionOptionsScenario,
506
+ resubscribeInstance: resubscribeInstanceScenario
507
+ }
508
+
509
+ /**
510
+ * Runs run frontend model event hook scenario.
511
+ * @param {keyof typeof scenarios} scenarioName - Scenario name.
512
+ * @returns {Promise<Record<string, number>>} - Scenario result.
513
+ */
514
+ export default async function runFrontendModelEventHookScenario(scenarioName) {
515
+ const scenario = scenarios[scenarioName]
516
+
517
+ if (!scenario) throw new Error(`Unknown frontend model event hook scenario: ${scenarioName}`)
518
+
519
+ return await scenario()
520
+ }
@@ -0,0 +1,32 @@
1
+ // @ts-check
2
+
3
+ import SystemTestBrowserHelper from "system-testing/build/system-test-browser-helper.js"
4
+ import BrowserEnvironmentHandler from "../environment-handlers/browser.js"
5
+ import runFrontendModelEventHookScenario from "./browser-frontend-model-event-hook-scenarios.js"
6
+
7
+ const root = document.getElementById("root") || (() => {
8
+ const element = document.createElement("div")
9
+ element.id = "root"
10
+ document.body.appendChild(element)
11
+ return element
12
+ })()
13
+
14
+ const systemTestingComponent = document.createElement("div")
15
+ systemTestingComponent.setAttribute("data-testid", "systemTestingComponent")
16
+ systemTestingComponent.setAttribute("data-focussed", "true")
17
+
18
+ const blankText = document.createElement("div")
19
+ blankText.setAttribute("data-testid", "blankText")
20
+ blankText.textContent = "blank"
21
+
22
+ systemTestingComponent.appendChild(blankText)
23
+ root.appendChild(systemTestingComponent)
24
+
25
+ const systemTestBrowserHelper = new SystemTestBrowserHelper()
26
+ systemTestBrowserHelper.enableOnBrowser()
27
+
28
+ globalThis.velociousBrowserTest = {
29
+ BrowserEnvironmentHandler,
30
+ runFrontendModelEventHookScenario,
31
+ systemTestBrowserHelper
32
+ }