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,369 @@
1
+ // @ts-check
2
+
3
+ import {resolveFrontendModelClass} from "./model-registry.js"
4
+ import isPlainObject from "../utils/plain-object.js"
5
+
6
+ const TYPE_KEY = "__velocious_type"
7
+ const TYPE_DATE = "date"
8
+ const TYPE_UNDEFINED = "undefined"
9
+ const TYPE_BIGINT = "bigint"
10
+ const TYPE_NUMBER = "number"
11
+ const TYPE_FRONTEND_MODEL = "frontend_model"
12
+ const NUMBER_NAN = "NaN"
13
+ const NUMBER_POSITIVE_INFINITY = "Infinity"
14
+ const NUMBER_NEGATIVE_INFINITY = "-Infinity"
15
+ const PRELOADED_RELATIONSHIPS_KEY = "__preloadedRelationships"
16
+
17
+ /**
18
+ * Assign a key to a plain object without triggering the `__proto__` setter.
19
+ * Uses `Object.defineProperty` so that keys like `__proto__` are stored as
20
+ * own data properties instead of mutating the object's prototype chain. This
21
+ * lets callers receive a regular `{}` object (with `Object.prototype` and a
22
+ * normal `constructor.name`) while still preventing prototype pollution.
23
+ * @param {Record<string, ?>} target - Target object.
24
+ * @param {string} key - Property key.
25
+ * @param {?} value - Property value.
26
+ * @returns {void}
27
+ */
28
+ export function assignSafeProperty(target, key, value) {
29
+ Object.defineProperty(target, key, {
30
+ value,
31
+ writable: true,
32
+ enumerable: true,
33
+ configurable: true
34
+ })
35
+ }
36
+
37
+ /**
38
+ * Runs is undefined marker.
39
+ * @param {?} value - Candidate value.
40
+ * @returns {boolean} - Whether value is encoded undefined marker.
41
+ */
42
+ function isUndefinedMarker(value) {
43
+ if (!isPlainObject(value)) return false
44
+
45
+ const keys = Object.keys(value)
46
+
47
+ return keys.length === 1 && Object.prototype.hasOwnProperty.call(value, TYPE_KEY) && value[TYPE_KEY] === TYPE_UNDEFINED
48
+ }
49
+
50
+ /**
51
+ * Check whether a value is a typed marker object with a string `value` field.
52
+ * @param {?} value - Candidate marker.
53
+ * @param {string} markerType - Expected marker type value.
54
+ * @param {(stringValue: string) => boolean} valueMatches - Additional string value predicate.
55
+ * @returns {boolean} - Whether value matches the marker shape.
56
+ */
57
+ function isStringValueMarker(value, markerType, valueMatches) {
58
+ if (!isPlainObject(value)) return false
59
+
60
+ const keys = Object.keys(value)
61
+
62
+ return (
63
+ keys.length === 2
64
+ && Object.prototype.hasOwnProperty.call(value, TYPE_KEY)
65
+ && Object.prototype.hasOwnProperty.call(value, "value")
66
+ && value[TYPE_KEY] === markerType
67
+ && typeof value.value === "string"
68
+ && valueMatches(value.value)
69
+ )
70
+ }
71
+
72
+ /**
73
+ * Runs is date marker.
74
+ * @param {?} value - Candidate value.
75
+ * @returns {boolean} - Whether value is encoded date marker.
76
+ */
77
+ function isDateMarker(value) {
78
+ return isStringValueMarker(value, TYPE_DATE, () => true)
79
+ }
80
+
81
+ /**
82
+ * Runs is big int marker.
83
+ * @param {?} value - Candidate value.
84
+ * @returns {boolean} - Whether value is encoded bigint marker.
85
+ */
86
+ function isBigIntMarker(value) {
87
+ return isStringValueMarker(value, TYPE_BIGINT, (stringValue) => /^-?\d+$/.test(stringValue))
88
+ }
89
+
90
+ /**
91
+ * Runs is non finite number marker.
92
+ * @param {?} value - Candidate value.
93
+ * @returns {boolean} - Whether value is encoded non-finite number marker.
94
+ */
95
+ function isNonFiniteNumberMarker(value) {
96
+ if (!isPlainObject(value)) return false
97
+
98
+ const keys = Object.keys(value)
99
+ const markerValue = value.value
100
+
101
+ return (
102
+ keys.length === 2
103
+ && Object.prototype.hasOwnProperty.call(value, TYPE_KEY)
104
+ && Object.prototype.hasOwnProperty.call(value, "value")
105
+ && value[TYPE_KEY] === TYPE_NUMBER
106
+ && (markerValue === NUMBER_NAN || markerValue === NUMBER_POSITIVE_INFINITY || markerValue === NUMBER_NEGATIVE_INFINITY)
107
+ )
108
+ }
109
+
110
+ /**
111
+ * Runs is frontend model marker.
112
+ * @param {?} value - Candidate value.
113
+ * @returns {value is {__velocious_type: "frontend_model", attributes: Record<string, ?>, modelName: string, preloadedRelationships?: Record<string, ?>}} - Whether value is encoded frontend-model marker.
114
+ */
115
+ function isFrontendModelMarker(value) {
116
+ if (!isPlainObject(value)) return false
117
+
118
+ const modelName = value.modelName
119
+ const attributes = value.attributes
120
+ const preloadedRelationships = value.preloadedRelationships
121
+
122
+ return (
123
+ Object.prototype.hasOwnProperty.call(value, TYPE_KEY)
124
+ && value[TYPE_KEY] === TYPE_FRONTEND_MODEL
125
+ && typeof modelName === "string"
126
+ && modelName.length > 0
127
+ && isPlainObject(attributes)
128
+ && (preloadedRelationships === undefined || isPlainObject(preloadedRelationships))
129
+ )
130
+ }
131
+
132
+ /**
133
+ * Runs the isBackendModelInstance helper.
134
+ * @param {?} value - Candidate value.
135
+ * @returns {value is {attributes: () => Record<string, ?>, constructor: {getModelName?: () => string, name?: string}, getModelClass: () => {getRelationshipsMap: () => Record<string, ?>}, getRelationshipByName: (relationshipName: string) => {getPreloaded: () => boolean, loaded: () => ?}}} - Whether value looks like a backend model instance.
136
+ */
137
+ export function isBackendModelInstance(value) {
138
+ if (!value || typeof value !== "object") return false
139
+
140
+ const candidate = /**
141
+ * Narrows the runtime value to the documented type.
142
+ @type {Record<string, ?>} */ (value)
143
+
144
+ return (
145
+ typeof candidate.attributes === "function"
146
+ && typeof candidate.getModelClass === "function"
147
+ && typeof candidate.getRelationshipByName === "function"
148
+ )
149
+ }
150
+
151
+ /**
152
+ * Runs serialize frontend model transport value internal.
153
+ * @param {?} value - Value to serialize.
154
+ * @param {WeakSet<object>} seenModels - Models already visited in the current recursion path.
155
+ * @returns {?} - Serialized value with transport markers.
156
+ */
157
+ function serializeFrontendModelTransportValueInternal(value, seenModels) {
158
+ if (value === undefined) {
159
+ return {[TYPE_KEY]: TYPE_UNDEFINED}
160
+ }
161
+
162
+ if (value instanceof Date) {
163
+ return {
164
+ [TYPE_KEY]: TYPE_DATE,
165
+ value: value.toISOString()
166
+ }
167
+ }
168
+
169
+ if (typeof value === "bigint") {
170
+ return {
171
+ [TYPE_KEY]: TYPE_BIGINT,
172
+ value: value.toString()
173
+ }
174
+ }
175
+
176
+ if (typeof value === "number" && !Number.isFinite(value)) {
177
+ const markerValue = Number.isNaN(value)
178
+ ? NUMBER_NAN
179
+ : (value > 0 ? NUMBER_POSITIVE_INFINITY : NUMBER_NEGATIVE_INFINITY)
180
+
181
+ return {
182
+ [TYPE_KEY]: TYPE_NUMBER,
183
+ value: markerValue
184
+ }
185
+ }
186
+
187
+ if (Array.isArray(value)) {
188
+ return value.map((entry) => serializeFrontendModelTransportValueInternal(entry, seenModels))
189
+ }
190
+
191
+ if (isBackendModelInstance(value)) {
192
+ const modelAttributes = value.attributes()
193
+ const modelClass = value.constructor
194
+ const modelName = typeof modelClass.getModelName === "function" ? modelClass.getModelName() : modelClass.name
195
+
196
+ /**
197
+ * Serialized model.
198
+ @type {Record<string, ?>} */
199
+ const serializedModel = {
200
+ [TYPE_KEY]: TYPE_FRONTEND_MODEL,
201
+ attributes: /**
202
+ * Narrows the runtime value to the documented type.
203
+ @type {Record<string, ?>} */ (serializeFrontendModelTransportValueInternal(modelAttributes, seenModels)),
204
+ modelName
205
+ }
206
+
207
+ if (seenModels.has(value)) {
208
+ return serializedModel
209
+ }
210
+
211
+ seenModels.add(value)
212
+
213
+ /**
214
+ * Preloaded relationships.
215
+ @type {Record<string, ?>} */
216
+ const preloadedRelationships = {}
217
+ const relationshipsMap = value.getModelClass().getRelationshipsMap()
218
+
219
+ for (const relationshipName of Object.keys(relationshipsMap)) {
220
+ const relationship = value.getRelationshipByName(relationshipName)
221
+
222
+ if (!relationship.getPreloaded()) continue
223
+
224
+ const loadedRelationship = relationship.loaded()
225
+
226
+ assignSafeProperty(preloadedRelationships, relationshipName, serializeFrontendModelTransportValueInternal(
227
+ loadedRelationship == undefined ? null : loadedRelationship,
228
+ seenModels
229
+ ))
230
+ }
231
+
232
+ seenModels.delete(value)
233
+
234
+ if (Object.keys(preloadedRelationships).length > 0) {
235
+ serializedModel.preloadedRelationships = preloadedRelationships
236
+ }
237
+
238
+ return serializedModel
239
+ }
240
+
241
+ if (isPlainObject(value)) {
242
+ /**
243
+ * Serialized.
244
+ @type {Record<string, ?>} */
245
+ const serialized = {}
246
+
247
+ for (const [key, nestedValue] of Object.entries(value)) {
248
+ assignSafeProperty(serialized, key, serializeFrontendModelTransportValueInternal(nestedValue, seenModels))
249
+ }
250
+
251
+ return serialized
252
+ }
253
+
254
+ return value
255
+ }
256
+
257
+ /**
258
+ * Runs deserialize frontend model marker.
259
+ * @param {{attributes: Record<string, ?>, modelName: string, preloadedRelationships?: Record<string, ?>}} marker - Encoded frontend-model marker.
260
+ * @returns {?} - Hydrated frontend model or plain object fallback.
261
+ */
262
+ function deserializeFrontendModelMarker(marker) {
263
+ const attributes = /**
264
+ * Narrows the runtime value to the documented type.
265
+ @type {Record<string, ?>} */ (deserializeFrontendModelTransportValue(marker.attributes))
266
+ const preloadedRelationships = isPlainObject(marker.preloadedRelationships)
267
+ ? /**
268
+ * Narrows the runtime value to the documented type.
269
+ @type {Record<string, ?>} */ (deserializeFrontendModelTransportValue(marker.preloadedRelationships))
270
+ : {}
271
+ const modelClass = resolveFrontendModelClass(marker.modelName)
272
+
273
+ if (!modelClass || typeof modelClass.instantiateFromResponse !== "function") {
274
+ if (Object.keys(preloadedRelationships).length < 1) {
275
+ return attributes
276
+ }
277
+
278
+ return {
279
+ ...attributes,
280
+ [PRELOADED_RELATIONSHIPS_KEY]: preloadedRelationships
281
+ }
282
+ }
283
+
284
+ // Route hydration through `instantiateFromResponse` so
285
+ // `__abilities` / `__queryData` / `__associationCounts` /
286
+ // `__preloadedRelationships` baked into the marker's attributes blob (e.g.
287
+ // by `resource.serialize` in custom-command auto-serialization) get
288
+ // extracted and applied. Legacy markers that used a separate top-level
289
+ // `preloadedRelationships` field merge them under the standard key first
290
+ // so `modelDataFromResponse` picks them up.
291
+ const responseAttributes = Object.keys(preloadedRelationships).length > 0
292
+ ? {
293
+ ...attributes,
294
+ [PRELOADED_RELATIONSHIPS_KEY]: preloadedRelationships
295
+ }
296
+ : attributes
297
+
298
+ return modelClass.instantiateFromResponse(responseAttributes)
299
+ }
300
+
301
+ /**
302
+ * Runs the serializeFrontendModelTransportValue helper.
303
+ * @param {?} value - Value to serialize.
304
+ * @returns {?} - Serialized value with transport markers.
305
+ */
306
+ export function serializeFrontendModelTransportValue(value) {
307
+ return serializeFrontendModelTransportValueInternal(value, new WeakSet())
308
+ }
309
+
310
+ /**
311
+ * Runs the deserializeFrontendModelTransportValue helper.
312
+ * @param {?} value - Value to deserialize.
313
+ * @returns {?} - Deserialized value with transport markers restored.
314
+ */
315
+ export function deserializeFrontendModelTransportValue(value) {
316
+ if (isUndefinedMarker(value)) {
317
+ return undefined
318
+ }
319
+
320
+ if (isDateMarker(value)) {
321
+ const dateValue = /**
322
+ * Narrows the runtime value to the documented type.
323
+ @type {{value: string}} */ (value).value
324
+
325
+ return new Date(dateValue)
326
+ }
327
+
328
+ if (isBigIntMarker(value)) {
329
+ const bigintValue = /**
330
+ * Narrows the runtime value to the documented type.
331
+ @type {{value: string}} */ (value).value
332
+
333
+ return BigInt(bigintValue)
334
+ }
335
+
336
+ if (isNonFiniteNumberMarker(value)) {
337
+ const numberValue = /**
338
+ * Narrows the runtime value to the documented type.
339
+ @type {{value: string}} */ (value).value
340
+
341
+ if (numberValue === NUMBER_NAN) return Number.NaN
342
+ if (numberValue === NUMBER_POSITIVE_INFINITY) return Number.POSITIVE_INFINITY
343
+
344
+ return Number.NEGATIVE_INFINITY
345
+ }
346
+
347
+ if (isFrontendModelMarker(value)) {
348
+ return deserializeFrontendModelMarker(value)
349
+ }
350
+
351
+ if (Array.isArray(value)) {
352
+ return value.map((entry) => deserializeFrontendModelTransportValue(entry))
353
+ }
354
+
355
+ if (isPlainObject(value)) {
356
+ /**
357
+ * Deserialized.
358
+ @type {Record<string, ?>} */
359
+ const deserialized = {}
360
+
361
+ for (const [key, nestedValue] of Object.entries(value)) {
362
+ assignSafeProperty(deserialized, key, deserializeFrontendModelTransportValue(nestedValue))
363
+ }
364
+
365
+ return deserialized
366
+ }
367
+
368
+ return value
369
+ }
@@ -0,0 +1,21 @@
1
+ // @ts-check
2
+
3
+ import useModelClassEvent from "./use-model-class-event.js"
4
+
5
+ /** @typedef {typeof import("./base.js").default} FrontendModelClass */
6
+ /** @typedef {import("./use-model-class-event.js").FrontendModelCreateUpdateEventPayload} FrontendModelCreateEventPayload */
7
+ /** @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseCreatedEventOptions */
8
+ /** @typedef {(payload: FrontendModelCreateEventPayload) => void} FrontendModelCreateEventCallback */
9
+
10
+ /**
11
+ * React hook for frontend-model class create events.
12
+ * @param {FrontendModelClass | null | undefined} modelClass - Frontend model class.
13
+ * @param {FrontendModelCreateEventCallback} callback - Event callback.
14
+ * @param {UseCreatedEventOptions} [options] - Hook options.
15
+ * @returns {void}
16
+ */
17
+ export default function useCreatedEvent(modelClass, callback, options = {}) {
18
+ useModelClassEvent(modelClass, "create", (payload) => {
19
+ callback(/** @type {FrontendModelCreateEventPayload} */ (payload))
20
+ }, options)
21
+ }
@@ -0,0 +1,148 @@
1
+ // @ts-check
2
+
3
+ import debounceFunction from "debounce"
4
+ import {useEffect, useMemo, useRef} from "react"
5
+
6
+ import clearPendingDebouncedCallback from "./clear-pending-debounced-callback.js"
7
+ import {modelsDependencyKey, modelsFromInput} from "./event-hook-models.js"
8
+ import useModelClassEvent from "./use-model-class-event.js"
9
+
10
+ /**
11
+ * FrontendModelClass type.
12
+ @typedef {typeof import("./base.js").default} FrontendModelClass */
13
+ /**
14
+ * FrontendModelInstance type.
15
+ @typedef {import("./base.js").default} FrontendModelInstance */
16
+ /**
17
+ * FrontendModelClassDestroyEventPayload type.
18
+ @typedef {import("./use-model-class-event.js").FrontendModelDestroyEventPayload} FrontendModelClassDestroyEventPayload */
19
+ /**
20
+ * Defines this typedef.
21
+ @typedef {{id: string}} FrontendModelInstanceDestroyEventPayload */
22
+ /**
23
+ * FrontendModelDestroyEventPayload type.
24
+ @typedef {FrontendModelClassDestroyEventPayload | FrontendModelInstanceDestroyEventPayload} FrontendModelDestroyEventPayload */
25
+ /**
26
+ * UseDestroyedEventOptions type.
27
+ @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseDestroyedEventOptions */
28
+ /**
29
+ * FrontendModelDestroyEventCallback type.
30
+ @typedef {(payload: FrontendModelDestroyEventPayload) => void} FrontendModelDestroyEventCallback */
31
+
32
+ /**
33
+ * Runs assert no unknown options.
34
+ * @param {Record<string, import("./query.js").FrontendModelTransportValue | (() => void) | undefined>} restOptions - Unknown options object.
35
+ * @returns {void}
36
+ */
37
+ function assertNoUnknownOptions(restOptions) {
38
+ const unknownOptionNames = Object.keys(restOptions)
39
+
40
+ if (unknownOptionNames.length === 0) return
41
+
42
+ throw new Error(`Unknown options given to useDestroyedEvent: ${unknownOptionNames.join(", ")}`)
43
+ }
44
+
45
+ /**
46
+ * Runs event query dependency payload.
47
+ * @param {import("./query.js").default<FrontendModelClass> | undefined} query - Event query option.
48
+ * @returns {import("./query.js").FrontendModelEventOptionsPayload | null} Stable dependency payload.
49
+ */
50
+ function eventQueryDependencyPayload(query) {
51
+ if (!query) return null
52
+
53
+ return query.eventOptionsPayload()
54
+ }
55
+
56
+ /**
57
+ * React hook for frontend-model destroy events. Pass a model class for class-level
58
+ * destroy events, or a model / model array for instance-level destroy events.
59
+ * @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
60
+ * @param {FrontendModelDestroyEventCallback} callback - Event callback.
61
+ * @param {UseDestroyedEventOptions} [options] - Hook options.
62
+ * @returns {void}
63
+ */
64
+ export default function useDestroyedEvent(modelClassOrModels, callback, options = {}) {
65
+ const {active = true, abilities, debounce = false, onConnected, preload, query, queryData, select, selectsExtra, withCount, ...restOptions} = options
66
+ assertNoUnknownOptions(restOptions)
67
+
68
+ const classModel = typeof modelClassOrModels === "function" ? modelClassOrModels : null
69
+ const instanceModels = typeof modelClassOrModels === "function" ? null : modelClassOrModels
70
+ const projectionOptions = {abilities, preload, query, queryData, select, selectsExtra, withCount}
71
+
72
+ useModelClassEvent(classModel, "destroy", callback, {active: active && Boolean(classModel), debounce, onConnected, ...projectionOptions})
73
+ useInstanceDestroyedEvent(instanceModels, callback, {active: active && !classModel, debounce, onConnected, ...projectionOptions})
74
+ }
75
+
76
+ /**
77
+ * Runs use instance destroyed event.
78
+ * @param {FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelOrModels - Model or models.
79
+ * @param {FrontendModelDestroyEventCallback} callback - Event callback.
80
+ * @param {UseDestroyedEventOptions} options - Hook options.
81
+ * @returns {void}
82
+ */
83
+ function useInstanceDestroyedEvent(modelOrModels, callback, options) {
84
+ const {active = true, abilities, debounce = false, onConnected, preload, query, queryData, select, selectsExtra, withCount} = options
85
+ const projectionKey = JSON.stringify({abilities, preload, query: eventQueryDependencyPayload(query), queryData, select, selectsExtra, withCount})
86
+ const projectionOptionsRef = useRef({abilities, preload, query, queryData, select, selectsExtra, withCount})
87
+ const callbackRef = useRef(callback)
88
+ const activeRef = useRef(active)
89
+ projectionOptionsRef.current = {abilities, preload, query, queryData, select, selectsExtra, withCount}
90
+ callbackRef.current = callback
91
+ activeRef.current = active
92
+
93
+ const modelsKey = modelsDependencyKey(modelOrModels)
94
+ const eventCallback = useMemo(() => {
95
+ const wrappedCallback = (/**
96
+ * Narrows the runtime value to the documented type.
97
+ @type {FrontendModelInstanceDestroyEventPayload} */ payload) => {
98
+ if (activeRef.current) callbackRef.current(payload)
99
+ }
100
+
101
+ if (typeof debounce === "number") return debounceFunction(wrappedCallback, debounce)
102
+ if (debounce) return debounceFunction(wrappedCallback)
103
+
104
+ return wrappedCallback
105
+ }, [debounce])
106
+
107
+ useEffect(() => {
108
+ if (!active) return undefined
109
+
110
+ const models = modelsFromInput(modelOrModels)
111
+ if (models.length < 1) return undefined
112
+
113
+ let closed = false
114
+ /**
115
+ * Unsubscribe callbacks.
116
+ @type {Array<() => void>} */
117
+ const unsubscribeCallbacks = []
118
+ const subscriptionCallback = (/**
119
+ * Narrows the runtime value to the documented type.
120
+ @type {FrontendModelInstanceDestroyEventPayload} */ payload) => {
121
+ if (!closed) eventCallback(payload)
122
+ }
123
+
124
+ void (async () => {
125
+ for (const model of models) {
126
+ const unsubscribe = await model.onDestroy(subscriptionCallback, projectionOptionsRef.current)
127
+
128
+ if (closed) {
129
+ unsubscribe()
130
+ } else {
131
+ unsubscribeCallbacks.push(unsubscribe)
132
+ }
133
+ }
134
+
135
+ if (!closed && onConnected) onConnected()
136
+ })()
137
+
138
+ return () => {
139
+ closed = true
140
+
141
+ for (const unsubscribe of unsubscribeCallbacks) {
142
+ unsubscribe()
143
+ }
144
+
145
+ clearPendingDebouncedCallback(eventCallback)
146
+ }
147
+ }, [active, eventCallback, modelsKey, onConnected, projectionKey])
148
+ }
@@ -0,0 +1,164 @@
1
+ // @ts-check
2
+
3
+ import debounceFunction from "debounce"
4
+ import {useEffect, useMemo, useRef} from "react"
5
+
6
+ import clearPendingDebouncedCallback from "./clear-pending-debounced-callback.js"
7
+
8
+ /**
9
+ * FrontendModelClass type.
10
+ @typedef {typeof import("./base.js").default} FrontendModelClass */
11
+ /**
12
+ * FrontendModelInstance type.
13
+ @typedef {InstanceType<FrontendModelClass>} FrontendModelInstance */
14
+ /**
15
+ * FrontendModelClassEventName type.
16
+ @typedef {"create" | "update" | "destroy"} FrontendModelClassEventName */
17
+ /**
18
+ * Defines this typedef.
19
+ @typedef {{id: string, model: FrontendModelInstance}} FrontendModelCreateUpdateEventPayload */
20
+ /**
21
+ * Defines this typedef.
22
+ @typedef {{id: string}} FrontendModelDestroyEventPayload */
23
+ /**
24
+ * FrontendModelClassEventPayload type.
25
+ @typedef {FrontendModelCreateUpdateEventPayload | FrontendModelDestroyEventPayload} FrontendModelClassEventPayload */
26
+ /**
27
+ * FrontendModelClassEventCallback type.
28
+ @typedef {(payload: FrontendModelClassEventPayload) => void} FrontendModelClassEventCallback */
29
+ /**
30
+ * Defines this typedef.
31
+ @typedef {{active?: boolean, debounce?: boolean | number, onConnected?: () => void} & import("./query.js").FrontendModelEventOptionsObject} UseModelClassEventOptions */
32
+
33
+ /**
34
+ * Runs assert no unknown options.
35
+ * @param {Record<string, import("./query.js").FrontendModelTransportValue | (() => void) | undefined>} restOptions - Unknown options object.
36
+ * @returns {void}
37
+ */
38
+ function assertNoUnknownOptions(restOptions) {
39
+ const unknownOptionNames = Object.keys(restOptions)
40
+
41
+ if (unknownOptionNames.length > 0) {
42
+ throw new Error(`Unknown options given to useModelClassEvent: ${unknownOptionNames.join(", ")}`)
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Runs event query dependency payload.
48
+ * @param {import("./query.js").default<FrontendModelClass> | undefined} query - Event query option.
49
+ * @returns {import("./query.js").FrontendModelEventOptionsPayload | null} Stable dependency payload.
50
+ */
51
+ function eventQueryDependencyPayload(query) {
52
+ if (!query) return null
53
+
54
+ return query.eventOptionsPayload()
55
+ }
56
+
57
+ /**
58
+ * Runs normalize event names.
59
+ * @param {FrontendModelClassEventName | FrontendModelClassEventName[]} eventOrEvents - Event name or names.
60
+ * @returns {FrontendModelClassEventName[]} - Normalized event names.
61
+ */
62
+ function normalizeEventNames(eventOrEvents) {
63
+ return Array.isArray(eventOrEvents) ? eventOrEvents : [eventOrEvents]
64
+ }
65
+
66
+ /**
67
+ * Runs event names dependency key.
68
+ * @param {FrontendModelClassEventName[]} eventNames - Event names.
69
+ * @returns {string} - Stable dependency key.
70
+ */
71
+ function eventNamesDependencyKey(eventNames) {
72
+ return eventNames.join("|")
73
+ }
74
+
75
+ /**
76
+ * Runs subscribe to model class event.
77
+ * @param {FrontendModelClass} modelClass - Frontend model class.
78
+ * @param {FrontendModelClassEventName} eventName - Event name.
79
+ * @param {FrontendModelClassEventCallback} callback - Event callback.
80
+ * @param {import("./query.js").FrontendModelEventOptionsObject} options - Event query or record projection options.
81
+ * @returns {Promise<() => void>} - Unsubscribe callback.
82
+ */
83
+ async function subscribeToModelClassEvent(modelClass, eventName, callback, options) {
84
+ if (eventName === "create") return await modelClass.onCreate(callback, options)
85
+ if (eventName === "update") return await modelClass.onUpdate(callback, options)
86
+ if (eventName === "destroy") return await modelClass.onDestroy(callback, options)
87
+
88
+ throw new Error(`Unsupported frontend model class event: ${eventName}`)
89
+ }
90
+
91
+ /**
92
+ * React hook for frontend-model class lifecycle events.
93
+ * @param {FrontendModelClass | null | undefined} modelClass - Frontend model class.
94
+ * @param {FrontendModelClassEventName | FrontendModelClassEventName[]} eventOrEvents - Event name or names.
95
+ * @param {FrontendModelClassEventCallback} callback - Event callback.
96
+ * @param {UseModelClassEventOptions} [options] - Hook options.
97
+ * @returns {void}
98
+ */
99
+ export default function useModelClassEvent(modelClass, eventOrEvents, callback, options = {}) {
100
+ const {active = true, abilities, debounce = false, onConnected, preload, query, queryData, select, selectsExtra, withCount, ...restOptions} = options
101
+ assertNoUnknownOptions(restOptions)
102
+
103
+ const projectionKey = JSON.stringify({abilities, preload, query: eventQueryDependencyPayload(query), queryData, select, selectsExtra, withCount})
104
+ const projectionOptionsRef = useRef({abilities, preload, query, queryData, select, selectsExtra, withCount})
105
+ const callbackRef = useRef(callback)
106
+ const activeRef = useRef(active)
107
+ projectionOptionsRef.current = {abilities, preload, query, queryData, select, selectsExtra, withCount}
108
+ callbackRef.current = callback
109
+ activeRef.current = active
110
+
111
+ const eventNames = normalizeEventNames(eventOrEvents)
112
+ const eventsKey = eventNamesDependencyKey(eventNames)
113
+ const eventCallback = useMemo(() => {
114
+ const wrappedCallback = (/**
115
+ * Narrows the runtime value to the documented type.
116
+ @type {FrontendModelClassEventPayload} */ payload) => {
117
+ if (activeRef.current) callbackRef.current(payload)
118
+ }
119
+
120
+ if (typeof debounce === "number") return debounceFunction(wrappedCallback, debounce)
121
+ if (debounce) return debounceFunction(wrappedCallback)
122
+
123
+ return wrappedCallback
124
+ }, [debounce])
125
+
126
+ useEffect(() => {
127
+ if (!active || !modelClass) return undefined
128
+
129
+ let closed = false
130
+ /**
131
+ * Unsubscribe callbacks.
132
+ @type {Array<() => void>} */
133
+ const unsubscribeCallbacks = []
134
+ const subscriptionCallback = (/**
135
+ * Narrows the runtime value to the documented type.
136
+ @type {FrontendModelClassEventPayload} */ payload) => {
137
+ if (!closed) eventCallback(payload)
138
+ }
139
+
140
+ void (async () => {
141
+ for (const eventName of eventNames) {
142
+ const unsubscribe = await subscribeToModelClassEvent(modelClass, eventName, subscriptionCallback, projectionOptionsRef.current)
143
+
144
+ if (closed) {
145
+ unsubscribe()
146
+ } else {
147
+ unsubscribeCallbacks.push(unsubscribe)
148
+ }
149
+ }
150
+
151
+ if (!closed && onConnected) onConnected()
152
+ })()
153
+
154
+ return () => {
155
+ closed = true
156
+
157
+ for (const unsubscribe of unsubscribeCallbacks) {
158
+ unsubscribe()
159
+ }
160
+
161
+ clearPendingDebouncedCallback(eventCallback)
162
+ }
163
+ }, [active, eventsKey, eventCallback, modelClass, onConnected, projectionKey])
164
+ }