velocious 1.0.430 → 1.0.431

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (811) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/bin/velocious.js +39 -34
  3. package/build/index.js +1 -2
  4. package/build/src/application.js +214 -187
  5. package/build/src/authorization/ability.d.ts +24 -23
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +300 -252
  8. package/build/src/authorization/base-resource.d.ts +20 -26
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +136 -118
  11. package/build/src/background-jobs/client.js +47 -43
  12. package/build/src/background-jobs/cron-expression.js +166 -127
  13. package/build/src/background-jobs/forked-runner-child.js +47 -37
  14. package/build/src/background-jobs/job-record.js +10 -8
  15. package/build/src/background-jobs/job-registry.js +84 -72
  16. package/build/src/background-jobs/job-runner.js +81 -74
  17. package/build/src/background-jobs/job.js +72 -62
  18. package/build/src/background-jobs/json-socket.js +70 -65
  19. package/build/src/background-jobs/main.js +900 -841
  20. package/build/src/background-jobs/normalize-error.js +11 -12
  21. package/build/src/background-jobs/scheduler.js +247 -205
  22. package/build/src/background-jobs/socket-request.js +65 -60
  23. package/build/src/background-jobs/status-reporter.js +96 -86
  24. package/build/src/background-jobs/store.js +980 -862
  25. package/build/src/background-jobs/types.js +3 -2
  26. package/build/src/background-jobs/web/authorization.js +50 -38
  27. package/build/src/background-jobs/web/controller.js +268 -232
  28. package/build/src/background-jobs/web/index.js +40 -36
  29. package/build/src/background-jobs/web/path-matcher.js +48 -45
  30. package/build/src/background-jobs/web/registry.js +14 -9
  31. package/build/src/background-jobs/worker.js +639 -585
  32. package/build/src/beacon/client.js +293 -264
  33. package/build/src/beacon/in-process-broker.js +25 -20
  34. package/build/src/beacon/in-process-client.js +116 -104
  35. package/build/src/beacon/server.js +126 -110
  36. package/build/src/beacon/types.js +8 -2
  37. package/build/src/cli/base-command.js +57 -49
  38. package/build/src/cli/browser-cli.js +42 -37
  39. package/build/src/cli/commands/background-jobs-main.js +5 -5
  40. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  41. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  42. package/build/src/cli/commands/beacon.js +5 -5
  43. package/build/src/cli/commands/console.js +10 -10
  44. package/build/src/cli/commands/db/base-command.js +76 -71
  45. package/build/src/cli/commands/db/create.js +61 -53
  46. package/build/src/cli/commands/db/drop.js +71 -62
  47. package/build/src/cli/commands/db/migrate.js +15 -13
  48. package/build/src/cli/commands/db/reset.js +19 -16
  49. package/build/src/cli/commands/db/rollback.js +13 -12
  50. package/build/src/cli/commands/db/schema/dump.js +9 -9
  51. package/build/src/cli/commands/db/schema/load.js +9 -9
  52. package/build/src/cli/commands/db/seed.js +9 -9
  53. package/build/src/cli/commands/db/tenants/check.js +35 -32
  54. package/build/src/cli/commands/db/tenants/create.js +29 -26
  55. package/build/src/cli/commands/db/tenants/migrate.js +44 -40
  56. package/build/src/cli/commands/destroy/migration.js +5 -5
  57. package/build/src/cli/commands/generate/base-models.js +5 -5
  58. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  59. package/build/src/cli/commands/generate/migration.js +5 -5
  60. package/build/src/cli/commands/generate/model.js +5 -5
  61. package/build/src/cli/commands/init.js +9 -7
  62. package/build/src/cli/commands/routes.js +6 -6
  63. package/build/src/cli/commands/run-script.js +9 -9
  64. package/build/src/cli/commands/runner.js +9 -9
  65. package/build/src/cli/commands/server.js +6 -6
  66. package/build/src/cli/commands/test.js +7 -6
  67. package/build/src/cli/index.js +141 -127
  68. package/build/src/cli/tenant-database-command-helper.js +185 -154
  69. package/build/src/cli/use-browser-cli.js +20 -15
  70. package/build/src/configuration-resolver.js +54 -47
  71. package/build/src/configuration-types.d.ts +21 -2
  72. package/build/src/configuration-types.d.ts.map +1 -1
  73. package/build/src/configuration-types.js +60 -3
  74. package/build/src/configuration.js +2547 -2240
  75. package/build/src/controller.js +407 -363
  76. package/build/src/current-configuration.js +12 -9
  77. package/build/src/current.js +75 -70
  78. package/build/src/database/annotations-async-hooks.js +22 -16
  79. package/build/src/database/annotations.js +18 -12
  80. package/build/src/database/drivers/base-column.js +179 -155
  81. package/build/src/database/drivers/base-columns-index.js +78 -69
  82. package/build/src/database/drivers/base-foreign-key.js +101 -89
  83. package/build/src/database/drivers/base-table.js +149 -124
  84. package/build/src/database/drivers/base.js +1489 -1306
  85. package/build/src/database/drivers/mssql/column.js +50 -39
  86. package/build/src/database/drivers/mssql/columns-index.js +3 -2
  87. package/build/src/database/drivers/mssql/connect-connection.js +9 -11
  88. package/build/src/database/drivers/mssql/foreign-key.js +9 -8
  89. package/build/src/database/drivers/mssql/index.js +587 -507
  90. package/build/src/database/drivers/mssql/options.js +75 -68
  91. package/build/src/database/drivers/mssql/query-parser.js +3 -2
  92. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  93. package/build/src/database/drivers/mssql/sql/create-database.js +31 -24
  94. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  95. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  96. package/build/src/database/drivers/mssql/sql/delete.js +16 -14
  97. package/build/src/database/drivers/mssql/sql/drop-database.js +31 -24
  98. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  99. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  100. package/build/src/database/drivers/mssql/sql/update.js +28 -24
  101. package/build/src/database/drivers/mssql/sql/upsert.js +20 -18
  102. package/build/src/database/drivers/mssql/structure-sql.js +114 -102
  103. package/build/src/database/drivers/mssql/table.js +96 -81
  104. package/build/src/database/drivers/mysql/column.js +92 -75
  105. package/build/src/database/drivers/mysql/columns-index.js +19 -16
  106. package/build/src/database/drivers/mysql/foreign-key.js +9 -8
  107. package/build/src/database/drivers/mysql/index.js +457 -396
  108. package/build/src/database/drivers/mysql/options.js +30 -26
  109. package/build/src/database/drivers/mysql/query-parser.js +3 -2
  110. package/build/src/database/drivers/mysql/query.js +29 -26
  111. package/build/src/database/drivers/mysql/sql/alter-table.js +3 -2
  112. package/build/src/database/drivers/mysql/sql/create-database.js +28 -23
  113. package/build/src/database/drivers/mysql/sql/create-index.js +3 -2
  114. package/build/src/database/drivers/mysql/sql/create-table.js +3 -2
  115. package/build/src/database/drivers/mysql/sql/delete.js +17 -14
  116. package/build/src/database/drivers/mysql/sql/drop-database.js +3 -2
  117. package/build/src/database/drivers/mysql/sql/drop-table.js +3 -2
  118. package/build/src/database/drivers/mysql/sql/insert.js +3 -2
  119. package/build/src/database/drivers/mysql/sql/update.js +29 -24
  120. package/build/src/database/drivers/mysql/sql/upsert.js +10 -8
  121. package/build/src/database/drivers/mysql/structure-sql.js +88 -79
  122. package/build/src/database/drivers/mysql/table.js +98 -83
  123. package/build/src/database/drivers/pgsql/column.js +72 -56
  124. package/build/src/database/drivers/pgsql/columns-index.js +3 -2
  125. package/build/src/database/drivers/pgsql/foreign-key.js +9 -8
  126. package/build/src/database/drivers/pgsql/index.js +438 -377
  127. package/build/src/database/drivers/pgsql/options.js +28 -25
  128. package/build/src/database/drivers/pgsql/query-parser.js +3 -2
  129. package/build/src/database/drivers/pgsql/sql/alter-table.js +3 -2
  130. package/build/src/database/drivers/pgsql/sql/create-database.js +23 -19
  131. package/build/src/database/drivers/pgsql/sql/create-index.js +3 -2
  132. package/build/src/database/drivers/pgsql/sql/create-table.js +3 -2
  133. package/build/src/database/drivers/pgsql/sql/delete.js +17 -14
  134. package/build/src/database/drivers/pgsql/sql/drop-database.js +3 -2
  135. package/build/src/database/drivers/pgsql/sql/drop-table.js +3 -2
  136. package/build/src/database/drivers/pgsql/sql/insert.js +3 -2
  137. package/build/src/database/drivers/pgsql/sql/update.js +29 -24
  138. package/build/src/database/drivers/pgsql/sql/upsert.js +11 -9
  139. package/build/src/database/drivers/pgsql/structure-sql.js +120 -108
  140. package/build/src/database/drivers/pgsql/table.js +77 -60
  141. package/build/src/database/drivers/sqlite/base.js +478 -405
  142. package/build/src/database/drivers/sqlite/column.js +69 -54
  143. package/build/src/database/drivers/sqlite/columns-index.js +27 -22
  144. package/build/src/database/drivers/sqlite/connection-sql-js.js +42 -35
  145. package/build/src/database/drivers/sqlite/foreign-key.js +21 -18
  146. package/build/src/database/drivers/sqlite/index.js +373 -330
  147. package/build/src/database/drivers/sqlite/index.native.js +64 -55
  148. package/build/src/database/drivers/sqlite/index.web.js +87 -69
  149. package/build/src/database/drivers/sqlite/options.js +28 -25
  150. package/build/src/database/drivers/sqlite/query-parser.js +3 -2
  151. package/build/src/database/drivers/sqlite/query.js +24 -21
  152. package/build/src/database/drivers/sqlite/query.native.js +25 -20
  153. package/build/src/database/drivers/sqlite/query.web.js +37 -30
  154. package/build/src/database/drivers/sqlite/sql/alter-table.js +179 -159
  155. package/build/src/database/drivers/sqlite/sql/create-index.js +3 -2
  156. package/build/src/database/drivers/sqlite/sql/create-table.js +3 -2
  157. package/build/src/database/drivers/sqlite/sql/delete.js +22 -17
  158. package/build/src/database/drivers/sqlite/sql/drop-table.js +3 -2
  159. package/build/src/database/drivers/sqlite/sql/insert.js +3 -2
  160. package/build/src/database/drivers/sqlite/sql/update.js +29 -24
  161. package/build/src/database/drivers/sqlite/sql/upsert.js +11 -9
  162. package/build/src/database/drivers/sqlite/structure-sql.js +52 -49
  163. package/build/src/database/drivers/sqlite/table-rebuilder.js +75 -62
  164. package/build/src/database/drivers/sqlite/table.js +125 -102
  165. package/build/src/database/drivers/structure-sql/utils.js +17 -14
  166. package/build/src/database/handler.js +10 -9
  167. package/build/src/database/initializer-from-require-context.js +87 -76
  168. package/build/src/database/migration/index.js +395 -332
  169. package/build/src/database/migrator/files-finder.js +50 -40
  170. package/build/src/database/migrator/types.js +30 -2
  171. package/build/src/database/migrator.js +526 -454
  172. package/build/src/database/pool/async-tracked-multi-connection.js +1147 -997
  173. package/build/src/database/pool/base-methods-forward.js +43 -40
  174. package/build/src/database/pool/base.js +343 -298
  175. package/build/src/database/pool/single-multi-use.js +110 -93
  176. package/build/src/database/query/alter-table-base.js +99 -84
  177. package/build/src/database/query/base.js +46 -39
  178. package/build/src/database/query/create-database-base.js +30 -25
  179. package/build/src/database/query/create-index-base.js +94 -75
  180. package/build/src/database/query/create-table-base.js +193 -151
  181. package/build/src/database/query/delete-base.js +16 -14
  182. package/build/src/database/query/drop-database-base.js +28 -23
  183. package/build/src/database/query/drop-table-base.js +53 -42
  184. package/build/src/database/query/from-base.js +33 -30
  185. package/build/src/database/query/from-plain.js +13 -11
  186. package/build/src/database/query/from-table.js +15 -13
  187. package/build/src/database/query/index.js +472 -410
  188. package/build/src/database/query/insert-base.js +164 -143
  189. package/build/src/database/query/join-base.js +40 -35
  190. package/build/src/database/query/join-object.js +153 -128
  191. package/build/src/database/query/join-plain.js +15 -13
  192. package/build/src/database/query/join-tracker.js +90 -76
  193. package/build/src/database/query/model-class-query.js +1370 -1134
  194. package/build/src/database/query/order-base.js +30 -27
  195. package/build/src/database/query/order-column.js +53 -44
  196. package/build/src/database/query/order-plain.js +24 -20
  197. package/build/src/database/query/preloader/belongs-to.js +258 -210
  198. package/build/src/database/query/preloader/ensure-model-class-initialized.js +9 -8
  199. package/build/src/database/query/preloader/has-many.js +301 -240
  200. package/build/src/database/query/preloader/has-one.js +117 -91
  201. package/build/src/database/query/preloader/selection.js +129 -117
  202. package/build/src/database/query/preloader.js +185 -160
  203. package/build/src/database/query/query-data.js +201 -157
  204. package/build/src/database/query/select-base.js +27 -25
  205. package/build/src/database/query/select-plain.js +15 -13
  206. package/build/src/database/query/select-table-and-column.js +25 -21
  207. package/build/src/database/query/update-base.js +38 -35
  208. package/build/src/database/query/upsert-base.js +100 -93
  209. package/build/src/database/query/where-base.js +35 -32
  210. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  211. package/build/src/database/query/where-combinator.js +28 -26
  212. package/build/src/database/query/where-hash.js +68 -61
  213. package/build/src/database/query/where-model-class-hash.js +469 -414
  214. package/build/src/database/query/where-not.js +20 -18
  215. package/build/src/database/query/where-plain.js +17 -15
  216. package/build/src/database/query/with-count.js +159 -125
  217. package/build/src/database/query-parser/base-query-parser.js +37 -32
  218. package/build/src/database/query-parser/from-parser.js +45 -36
  219. package/build/src/database/query-parser/group-parser.js +50 -42
  220. package/build/src/database/query-parser/joins-parser.js +33 -28
  221. package/build/src/database/query-parser/limit-parser.js +70 -67
  222. package/build/src/database/query-parser/options.js +82 -75
  223. package/build/src/database/query-parser/order-parser.js +40 -36
  224. package/build/src/database/query-parser/select-parser.js +60 -49
  225. package/build/src/database/query-parser/where-parser.js +41 -36
  226. package/build/src/database/record/acts-as-list.js +273 -235
  227. package/build/src/database/record/attachments/download.js +45 -44
  228. package/build/src/database/record/attachments/handle.js +161 -141
  229. package/build/src/database/record/attachments/normalize-input.js +138 -128
  230. package/build/src/database/record/attachments/storage-drivers/filesystem.js +91 -77
  231. package/build/src/database/record/attachments/storage-drivers/native.js +121 -112
  232. package/build/src/database/record/attachments/storage-drivers/s3.js +208 -177
  233. package/build/src/database/record/attachments/store.d.ts +1 -1
  234. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  235. package/build/src/database/record/attachments/store.js +540 -468
  236. package/build/src/database/record/index.d.ts +17 -15
  237. package/build/src/database/record/index.d.ts.map +1 -1
  238. package/build/src/database/record/index.js +3894 -3361
  239. package/build/src/database/record/instance-relationships/base.js +268 -234
  240. package/build/src/database/record/instance-relationships/belongs-to.js +73 -58
  241. package/build/src/database/record/instance-relationships/has-many.js +264 -225
  242. package/build/src/database/record/instance-relationships/has-one.js +105 -85
  243. package/build/src/database/record/record-not-found-error.js +2 -3
  244. package/build/src/database/record/relationships/base.d.ts +2 -2
  245. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  246. package/build/src/database/record/relationships/base.js +167 -145
  247. package/build/src/database/record/relationships/belongs-to.js +51 -44
  248. package/build/src/database/record/relationships/has-many.js +40 -32
  249. package/build/src/database/record/relationships/has-one.js +40 -32
  250. package/build/src/database/record/state-machine.js +208 -156
  251. package/build/src/database/record/user-module.js +38 -32
  252. package/build/src/database/record/validators/base.js +24 -22
  253. package/build/src/database/record/validators/format.js +46 -36
  254. package/build/src/database/record/validators/presence.js +20 -18
  255. package/build/src/database/record/validators/uniqueness.js +117 -99
  256. package/build/src/database/table-data/index.js +231 -199
  257. package/build/src/database/table-data/table-column.js +382 -338
  258. package/build/src/database/table-data/table-foreign-key.js +66 -57
  259. package/build/src/database/table-data/table-index.js +36 -29
  260. package/build/src/database/table-data/table-reference.js +10 -10
  261. package/build/src/database/use-database.js +40 -32
  262. package/build/src/environment-handlers/base.js +544 -484
  263. package/build/src/environment-handlers/browser.js +294 -241
  264. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +19 -16
  265. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +21 -18
  266. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +29 -22
  267. package/build/src/environment-handlers/node/cli/commands/beacon.js +19 -16
  268. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +15 -14
  269. package/build/src/environment-handlers/node/cli/commands/console.js +120 -99
  270. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +39 -34
  271. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +63 -57
  272. package/build/src/environment-handlers/node/cli/commands/db/seed.js +63 -51
  273. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +40 -32
  274. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  275. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +353 -298
  276. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +844 -729
  277. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +38 -34
  278. package/build/src/environment-handlers/node/cli/commands/generate/model.js +38 -34
  279. package/build/src/environment-handlers/node/cli/commands/init.js +61 -56
  280. package/build/src/environment-handlers/node/cli/commands/routes.js +59 -51
  281. package/build/src/environment-handlers/node/cli/commands/run-script.js +68 -54
  282. package/build/src/environment-handlers/node/cli/commands/runner.js +74 -56
  283. package/build/src/environment-handlers/node/cli/commands/server.js +106 -93
  284. package/build/src/environment-handlers/node/cli/commands/test.js +113 -97
  285. package/build/src/environment-handlers/node.js +874 -753
  286. package/build/src/error-logger.js +21 -22
  287. package/build/src/frontend-model-controller.d.ts +6 -6
  288. package/build/src/frontend-model-controller.d.ts.map +1 -1
  289. package/build/src/frontend-model-controller.js +3288 -2788
  290. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  291. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  292. package/build/src/frontend-model-resource/base-resource.js +869 -759
  293. package/build/src/frontend-models/base.d.ts +19 -12
  294. package/build/src/frontend-models/base.d.ts.map +1 -1
  295. package/build/src/frontend-models/base.js +3602 -3114
  296. package/build/src/frontend-models/clear-pending-debounced-callback.js +8 -7
  297. package/build/src/frontend-models/event-hook-models.js +21 -16
  298. package/build/src/frontend-models/model-registry.js +11 -9
  299. package/build/src/frontend-models/outgoing-event-buffer.js +17 -10
  300. package/build/src/frontend-models/preloader.d.ts +6 -6
  301. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  302. package/build/src/frontend-models/preloader.js +149 -131
  303. package/build/src/frontend-models/query.d.ts.map +1 -1
  304. package/build/src/frontend-models/query.js +1855 -1560
  305. package/build/src/frontend-models/resource-config-validation.js +37 -27
  306. package/build/src/frontend-models/resource-definition.js +288 -234
  307. package/build/src/frontend-models/transport-serialization.js +266 -203
  308. package/build/src/frontend-models/use-created-event.js +7 -5
  309. package/build/src/frontend-models/use-destroyed-event.js +93 -80
  310. package/build/src/frontend-models/use-model-class-event.js +91 -79
  311. package/build/src/frontend-models/use-updated-event.js +97 -84
  312. package/build/src/frontend-models/websocket-channel.js +441 -381
  313. package/build/src/frontend-models/websocket-publishers.js +173 -140
  314. package/build/src/http-client/header.js +14 -13
  315. package/build/src/http-client/index.js +132 -116
  316. package/build/src/http-client/request.js +87 -71
  317. package/build/src/http-client/response.js +140 -122
  318. package/build/src/http-client/websocket-client.js +17 -15
  319. package/build/src/http-server/client/index.js +465 -409
  320. package/build/src/http-server/client/params-to-object.js +135 -124
  321. package/build/src/http-server/client/request-buffer/form-data-part.js +132 -111
  322. package/build/src/http-server/client/request-buffer/header.js +16 -15
  323. package/build/src/http-server/client/request-buffer/index.js +506 -446
  324. package/build/src/http-server/client/request-parser.js +186 -163
  325. package/build/src/http-server/client/request-runner.js +259 -226
  326. package/build/src/http-server/client/request-timing.js +151 -132
  327. package/build/src/http-server/client/request.js +108 -96
  328. package/build/src/http-server/client/response.js +235 -213
  329. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +29 -25
  330. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +29 -25
  331. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  332. package/build/src/http-server/client/websocket-request.js +137 -114
  333. package/build/src/http-server/client/websocket-session.js +1657 -1452
  334. package/build/src/http-server/cookie.js +236 -216
  335. package/build/src/http-server/development-reloader.js +221 -190
  336. package/build/src/http-server/index.js +525 -451
  337. package/build/src/http-server/remote-address.js +50 -38
  338. package/build/src/http-server/server-client.js +208 -181
  339. package/build/src/http-server/server-lock.js +167 -153
  340. package/build/src/http-server/websocket-channel-subscribers.js +93 -81
  341. package/build/src/http-server/websocket-channel.js +117 -104
  342. package/build/src/http-server/websocket-connection.js +104 -96
  343. package/build/src/http-server/websocket-event-log-store.js +404 -350
  344. package/build/src/http-server/websocket-events-host.js +164 -145
  345. package/build/src/http-server/websocket-events.js +47 -47
  346. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +14 -13
  347. package/build/src/http-server/worker-handler/in-process.js +141 -123
  348. package/build/src/http-server/worker-handler/index.js +349 -313
  349. package/build/src/http-server/worker-handler/worker-script.js +5 -4
  350. package/build/src/http-server/worker-handler/worker-thread.js +269 -240
  351. package/build/src/initializer.js +36 -31
  352. package/build/src/jobs/mail-delivery.js +15 -13
  353. package/build/src/logger/base-logger.js +26 -24
  354. package/build/src/logger/console-logger.js +23 -21
  355. package/build/src/logger/file-logger.js +31 -29
  356. package/build/src/logger/outputs/array-output.js +42 -37
  357. package/build/src/logger/outputs/console-output.js +24 -20
  358. package/build/src/logger/outputs/file-output.js +48 -43
  359. package/build/src/logger/outputs/stdout-output.js +48 -39
  360. package/build/src/logger.js +394 -338
  361. package/build/src/mailer/backends/smtp.js +163 -134
  362. package/build/src/mailer/base.js +251 -211
  363. package/build/src/mailer/delivery.js +64 -56
  364. package/build/src/mailer/index.js +22 -4
  365. package/build/src/mailer.js +13 -4
  366. package/build/src/plugins/sqljs-wasm-route-controller.js +52 -42
  367. package/build/src/plugins/sqljs-wasm-route.js +38 -28
  368. package/build/src/record-payload-values.js +28 -25
  369. package/build/src/routes/app-routes.js +14 -12
  370. package/build/src/routes/base-route.js +130 -112
  371. package/build/src/routes/basic-route.js +102 -83
  372. package/build/src/routes/built-in/debug/controller.js +10 -10
  373. package/build/src/routes/built-in/errors/controller.js +5 -5
  374. package/build/src/routes/get-route.js +63 -50
  375. package/build/src/routes/hooks/frontend-model-command-route-hook.js +80 -66
  376. package/build/src/routes/index.js +43 -36
  377. package/build/src/routes/namespace-route.js +47 -38
  378. package/build/src/routes/plugin-routes.js +124 -107
  379. package/build/src/routes/post-route.js +62 -51
  380. package/build/src/routes/resolver.js +494 -422
  381. package/build/src/routes/resource-route.js +143 -124
  382. package/build/src/routes/root-route.js +8 -7
  383. package/build/src/testing/base-expect.js +14 -13
  384. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +405 -329
  385. package/build/src/testing/browser-test-app.js +29 -23
  386. package/build/src/testing/expect-to-change.js +50 -41
  387. package/build/src/testing/expect-utils.js +184 -139
  388. package/build/src/testing/expect.js +731 -638
  389. package/build/src/testing/request-client.js +85 -70
  390. package/build/src/testing/test-files-finder.js +339 -285
  391. package/build/src/testing/test-filter-parser.js +155 -124
  392. package/build/src/testing/test-runner.js +1020 -883
  393. package/build/src/testing/test-suite-splitter.js +142 -114
  394. package/build/src/testing/test.js +256 -216
  395. package/build/src/utils/backtrace-cleaner-node.js +69 -62
  396. package/build/src/utils/backtrace-cleaner.js +216 -188
  397. package/build/src/utils/ensure-error.js +7 -7
  398. package/build/src/utils/event-emitter.js +6 -4
  399. package/build/src/utils/file-exists.js +10 -9
  400. package/build/src/utils/format-value.js +76 -67
  401. package/build/src/utils/model-scope.js +31 -27
  402. package/build/src/utils/nest-callbacks.js +13 -10
  403. package/build/src/utils/plain-object.js +6 -5
  404. package/build/src/utils/ransack.d.ts.map +1 -1
  405. package/build/src/utils/ransack.js +563 -449
  406. package/build/src/utils/rest-args-error.js +6 -5
  407. package/build/src/utils/singularize-model-name.js +11 -9
  408. package/build/src/utils/split-sql-statements.js +79 -68
  409. package/build/src/utils/to-import-specifier.js +30 -24
  410. package/build/src/utils/with-tracked-stack-async-hooks.js +74 -60
  411. package/build/src/utils/with-tracked-stack.js +18 -14
  412. package/build/src/velocious-error.js +30 -27
  413. package/index.js +1 -0
  414. package/package.json +10 -4
  415. package/scripts/clean-build.js +8 -0
  416. package/scripts/ensure-bin-executable.js +13 -0
  417. package/scripts/run-tests.js +37 -0
  418. package/scripts/test-browser.js +486 -0
  419. package/src/application.js +229 -0
  420. package/src/authorization/ability.js +329 -0
  421. package/src/authorization/base-resource.js +143 -0
  422. package/src/background-jobs/client.js +50 -0
  423. package/src/background-jobs/cron-expression.js +277 -0
  424. package/src/background-jobs/forked-runner-child.js +86 -0
  425. package/src/background-jobs/job-record.js +13 -0
  426. package/src/background-jobs/job-registry.js +92 -0
  427. package/src/background-jobs/job-runner.js +107 -0
  428. package/src/background-jobs/job.js +77 -0
  429. package/src/background-jobs/json-socket.js +78 -0
  430. package/src/background-jobs/main.js +926 -0
  431. package/src/background-jobs/normalize-error.js +26 -0
  432. package/src/background-jobs/scheduler.js +274 -0
  433. package/src/background-jobs/socket-request.js +68 -0
  434. package/src/background-jobs/status-reporter.js +101 -0
  435. package/src/background-jobs/store.js +994 -0
  436. package/src/background-jobs/types.js +70 -0
  437. package/src/background-jobs/web/authorization.js +89 -0
  438. package/src/background-jobs/web/controller.js +280 -0
  439. package/src/background-jobs/web/index.js +57 -0
  440. package/src/background-jobs/web/path-matcher.js +74 -0
  441. package/src/background-jobs/web/registry.js +49 -0
  442. package/src/background-jobs/worker.js +683 -0
  443. package/src/beacon/client.js +330 -0
  444. package/src/beacon/in-process-broker.js +71 -0
  445. package/src/beacon/in-process-client.js +139 -0
  446. package/src/beacon/server.js +148 -0
  447. package/src/beacon/types.js +55 -0
  448. package/src/cli/base-command.js +67 -0
  449. package/src/cli/browser-cli.js +45 -0
  450. package/src/cli/commands/background-jobs-main.js +7 -0
  451. package/src/cli/commands/background-jobs-runner.js +7 -0
  452. package/src/cli/commands/background-jobs-worker.js +7 -0
  453. package/src/cli/commands/beacon.js +7 -0
  454. package/src/cli/commands/console.js +12 -0
  455. package/src/cli/commands/db/base-command.js +82 -0
  456. package/src/cli/commands/db/create.js +64 -0
  457. package/src/cli/commands/db/drop.js +75 -0
  458. package/src/cli/commands/db/migrate.js +17 -0
  459. package/src/cli/commands/db/reset.js +22 -0
  460. package/src/cli/commands/db/rollback.js +15 -0
  461. package/src/cli/commands/db/schema/dump.js +12 -0
  462. package/src/cli/commands/db/schema/load.js +12 -0
  463. package/src/cli/commands/db/seed.js +12 -0
  464. package/src/cli/commands/db/tenants/check.js +38 -0
  465. package/src/cli/commands/db/tenants/create.js +33 -0
  466. package/src/cli/commands/db/tenants/migrate.js +49 -0
  467. package/src/cli/commands/destroy/migration.js +7 -0
  468. package/src/cli/commands/generate/base-models.js +7 -0
  469. package/src/cli/commands/generate/frontend-models.js +12 -0
  470. package/src/cli/commands/generate/migration.js +7 -0
  471. package/src/cli/commands/generate/model.js +7 -0
  472. package/src/cli/commands/init.js +11 -0
  473. package/src/cli/commands/routes.js +7 -0
  474. package/src/cli/commands/run-script.js +12 -0
  475. package/src/cli/commands/runner.js +12 -0
  476. package/src/cli/commands/server.js +7 -0
  477. package/src/cli/commands/test.js +9 -0
  478. package/src/cli/index.js +152 -0
  479. package/src/cli/tenant-database-command-helper.js +198 -0
  480. package/src/cli/use-browser-cli.js +30 -0
  481. package/src/configuration-resolver.js +65 -0
  482. package/src/configuration-types.js +429 -0
  483. package/src/configuration.js +2590 -0
  484. package/src/controller.js +421 -0
  485. package/src/current-configuration.js +31 -0
  486. package/src/current.js +80 -0
  487. package/src/database/annotations-async-hooks.js +47 -0
  488. package/src/database/annotations.js +40 -0
  489. package/src/database/drivers/base-column.js +182 -0
  490. package/src/database/drivers/base-columns-index.js +81 -0
  491. package/src/database/drivers/base-foreign-key.js +104 -0
  492. package/src/database/drivers/base-table.js +156 -0
  493. package/src/database/drivers/base.js +1609 -0
  494. package/src/database/drivers/mssql/column.js +74 -0
  495. package/src/database/drivers/mssql/columns-index.js +6 -0
  496. package/src/database/drivers/mssql/connect-connection.js +16 -0
  497. package/src/database/drivers/mssql/foreign-key.js +12 -0
  498. package/src/database/drivers/mssql/index.js +590 -0
  499. package/src/database/drivers/mssql/options.js +79 -0
  500. package/src/database/drivers/mssql/query-parser.js +6 -0
  501. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  502. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  503. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  504. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  505. package/src/database/drivers/mssql/sql/delete.js +19 -0
  506. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  507. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  508. package/src/database/drivers/mssql/sql/insert.js +4 -0
  509. package/src/database/drivers/mssql/sql/update.js +31 -0
  510. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  511. package/src/database/drivers/mssql/structure-sql.js +120 -0
  512. package/src/database/drivers/mssql/table.js +145 -0
  513. package/src/database/drivers/mysql/column.js +112 -0
  514. package/src/database/drivers/mysql/columns-index.js +22 -0
  515. package/src/database/drivers/mysql/foreign-key.js +12 -0
  516. package/src/database/drivers/mysql/index.js +473 -0
  517. package/src/database/drivers/mysql/options.js +34 -0
  518. package/src/database/drivers/mysql/query-parser.js +6 -0
  519. package/src/database/drivers/mysql/query.js +37 -0
  520. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  521. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  522. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  523. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  524. package/src/database/drivers/mysql/sql/delete.js +21 -0
  525. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  526. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  527. package/src/database/drivers/mysql/sql/insert.js +6 -0
  528. package/src/database/drivers/mysql/sql/update.js +33 -0
  529. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  530. package/src/database/drivers/mysql/structure-sql.js +93 -0
  531. package/src/database/drivers/mysql/table.js +121 -0
  532. package/src/database/drivers/pgsql/column.js +90 -0
  533. package/src/database/drivers/pgsql/columns-index.js +6 -0
  534. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  535. package/src/database/drivers/pgsql/index.js +441 -0
  536. package/src/database/drivers/pgsql/options.js +32 -0
  537. package/src/database/drivers/pgsql/query-parser.js +6 -0
  538. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  539. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  540. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  541. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  542. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  543. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  544. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  545. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  546. package/src/database/drivers/pgsql/sql/update.js +33 -0
  547. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  548. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  549. package/src/database/drivers/pgsql/table.js +135 -0
  550. package/src/database/drivers/sqlite/base.js +509 -0
  551. package/src/database/drivers/sqlite/column.js +75 -0
  552. package/src/database/drivers/sqlite/columns-index.js +30 -0
  553. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  554. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  555. package/src/database/drivers/sqlite/index.js +394 -0
  556. package/src/database/drivers/sqlite/index.native.js +72 -0
  557. package/src/database/drivers/sqlite/index.web.js +99 -0
  558. package/src/database/drivers/sqlite/options.js +32 -0
  559. package/src/database/drivers/sqlite/query-parser.js +6 -0
  560. package/src/database/drivers/sqlite/query.js +35 -0
  561. package/src/database/drivers/sqlite/query.native.js +35 -0
  562. package/src/database/drivers/sqlite/query.web.js +49 -0
  563. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  564. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  565. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  566. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  567. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  568. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  569. package/src/database/drivers/sqlite/sql/update.js +33 -0
  570. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  571. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  572. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  573. package/src/database/drivers/sqlite/table.js +131 -0
  574. package/src/database/drivers/structure-sql/utils.js +35 -0
  575. package/src/database/handler.js +13 -0
  576. package/src/database/initializer-from-require-context.js +101 -0
  577. package/src/database/migration/index.js +438 -0
  578. package/src/database/migrator/files-finder.js +55 -0
  579. package/src/database/migrator/types.js +31 -0
  580. package/src/database/migrator.js +557 -0
  581. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  582. package/src/database/pool/base-methods-forward.js +52 -0
  583. package/src/database/pool/base.js +380 -0
  584. package/src/database/pool/single-multi-use.js +118 -0
  585. package/src/database/query/alter-table-base.js +104 -0
  586. package/src/database/query/base.js +49 -0
  587. package/src/database/query/create-database-base.js +42 -0
  588. package/src/database/query/create-index-base.js +117 -0
  589. package/src/database/query/create-table-base.js +205 -0
  590. package/src/database/query/delete-base.js +19 -0
  591. package/src/database/query/drop-database-base.js +38 -0
  592. package/src/database/query/drop-table-base.js +58 -0
  593. package/src/database/query/from-base.js +36 -0
  594. package/src/database/query/from-plain.js +16 -0
  595. package/src/database/query/from-table.js +18 -0
  596. package/src/database/query/index.js +533 -0
  597. package/src/database/query/insert-base.js +172 -0
  598. package/src/database/query/join-base.js +43 -0
  599. package/src/database/query/join-object.js +167 -0
  600. package/src/database/query/join-plain.js +18 -0
  601. package/src/database/query/join-tracker.js +93 -0
  602. package/src/database/query/model-class-query.js +1577 -0
  603. package/src/database/query/order-base.js +33 -0
  604. package/src/database/query/order-column.js +77 -0
  605. package/src/database/query/order-plain.js +28 -0
  606. package/src/database/query/preloader/belongs-to.js +267 -0
  607. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  608. package/src/database/query/preloader/has-many.js +316 -0
  609. package/src/database/query/preloader/has-one.js +123 -0
  610. package/src/database/query/preloader/selection.js +152 -0
  611. package/src/database/query/preloader.js +201 -0
  612. package/src/database/query/query-data.js +305 -0
  613. package/src/database/query/select-base.js +30 -0
  614. package/src/database/query/select-plain.js +18 -0
  615. package/src/database/query/select-table-and-column.js +28 -0
  616. package/src/database/query/update-base.js +41 -0
  617. package/src/database/query/upsert-base.js +103 -0
  618. package/src/database/query/where-base.js +38 -0
  619. package/src/database/query/where-combinator.js +31 -0
  620. package/src/database/query/where-hash.js +77 -0
  621. package/src/database/query/where-model-class-hash.js +505 -0
  622. package/src/database/query/where-not.js +23 -0
  623. package/src/database/query/where-plain.js +20 -0
  624. package/src/database/query/with-count.js +219 -0
  625. package/src/database/query-parser/base-query-parser.js +40 -0
  626. package/src/database/query-parser/from-parser.js +49 -0
  627. package/src/database/query-parser/group-parser.js +55 -0
  628. package/src/database/query-parser/joins-parser.js +37 -0
  629. package/src/database/query-parser/limit-parser.js +77 -0
  630. package/src/database/query-parser/options.js +94 -0
  631. package/src/database/query-parser/order-parser.js +45 -0
  632. package/src/database/query-parser/select-parser.js +67 -0
  633. package/src/database/query-parser/where-parser.js +46 -0
  634. package/src/database/record/acts-as-list.js +374 -0
  635. package/src/database/record/attachments/download.js +49 -0
  636. package/src/database/record/attachments/handle.js +188 -0
  637. package/src/database/record/attachments/normalize-input.js +213 -0
  638. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  639. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  640. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  641. package/src/database/record/attachments/store.js +591 -0
  642. package/src/database/record/index.js +3970 -0
  643. package/src/database/record/instance-relationships/base.js +289 -0
  644. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  645. package/src/database/record/instance-relationships/has-many.js +284 -0
  646. package/src/database/record/instance-relationships/has-one.js +117 -0
  647. package/src/database/record/record-not-found-error.js +3 -0
  648. package/src/database/record/relationships/base.js +195 -0
  649. package/src/database/record/relationships/belongs-to.js +57 -0
  650. package/src/database/record/relationships/has-many.js +46 -0
  651. package/src/database/record/relationships/has-one.js +46 -0
  652. package/src/database/record/state-machine.js +278 -0
  653. package/src/database/record/user-module.js +43 -0
  654. package/src/database/record/validators/base.js +27 -0
  655. package/src/database/record/validators/format.js +50 -0
  656. package/src/database/record/validators/presence.js +24 -0
  657. package/src/database/record/validators/uniqueness.js +124 -0
  658. package/src/database/table-data/index.js +241 -0
  659. package/src/database/table-data/table-column.js +416 -0
  660. package/src/database/table-data/table-foreign-key.js +69 -0
  661. package/src/database/table-data/table-index.js +46 -0
  662. package/src/database/table-data/table-reference.js +13 -0
  663. package/src/database/use-database.js +48 -0
  664. package/src/environment-handlers/base.js +561 -0
  665. package/src/environment-handlers/browser.js +338 -0
  666. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  667. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  668. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  669. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  670. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  671. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  672. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  673. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  674. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  675. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  676. package/src/environment-handlers/node/cli/commands/generate/base-models.js +367 -0
  677. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  678. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  679. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  680. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  681. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  682. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  683. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  684. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  685. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  686. package/src/environment-handlers/node.js +887 -0
  687. package/src/error-logger.js +30 -0
  688. package/src/frontend-model-controller.js +3491 -0
  689. package/src/frontend-model-resource/base-resource.js +935 -0
  690. package/src/frontend-models/base.js +4004 -0
  691. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  692. package/src/frontend-models/event-hook-models.js +49 -0
  693. package/src/frontend-models/model-registry.js +28 -0
  694. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  695. package/src/frontend-models/preloader.js +169 -0
  696. package/src/frontend-models/query.js +2245 -0
  697. package/src/frontend-models/resource-config-validation.js +56 -0
  698. package/src/frontend-models/resource-definition.js +399 -0
  699. package/src/frontend-models/transport-serialization.js +369 -0
  700. package/src/frontend-models/use-created-event.js +21 -0
  701. package/src/frontend-models/use-destroyed-event.js +148 -0
  702. package/src/frontend-models/use-model-class-event.js +164 -0
  703. package/src/frontend-models/use-updated-event.js +152 -0
  704. package/src/frontend-models/websocket-channel.js +494 -0
  705. package/src/frontend-models/websocket-publishers.js +224 -0
  706. package/src/http-client/header.js +17 -0
  707. package/src/http-client/index.js +139 -0
  708. package/src/http-client/request.js +94 -0
  709. package/src/http-client/response.js +151 -0
  710. package/src/http-client/websocket-client.js +27 -0
  711. package/src/http-server/client/index.js +507 -0
  712. package/src/http-server/client/params-to-object.js +152 -0
  713. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  714. package/src/http-server/client/request-buffer/header.js +19 -0
  715. package/src/http-server/client/request-buffer/index.js +535 -0
  716. package/src/http-server/client/request-parser.js +195 -0
  717. package/src/http-server/client/request-runner.js +321 -0
  718. package/src/http-server/client/request-timing.js +171 -0
  719. package/src/http-server/client/request.js +114 -0
  720. package/src/http-server/client/response.js +251 -0
  721. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  722. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  723. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  724. package/src/http-server/client/websocket-request.js +147 -0
  725. package/src/http-server/client/websocket-session.js +1755 -0
  726. package/src/http-server/cookie.js +245 -0
  727. package/src/http-server/development-reloader.js +240 -0
  728. package/src/http-server/index.js +561 -0
  729. package/src/http-server/remote-address.js +77 -0
  730. package/src/http-server/server-client.js +222 -0
  731. package/src/http-server/server-lock.js +178 -0
  732. package/src/http-server/websocket-channel-subscribers.js +110 -0
  733. package/src/http-server/websocket-channel.js +137 -0
  734. package/src/http-server/websocket-connection.js +118 -0
  735. package/src/http-server/websocket-event-log-store.js +433 -0
  736. package/src/http-server/websocket-events-host.js +170 -0
  737. package/src/http-server/websocket-events.js +50 -0
  738. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  739. package/src/http-server/worker-handler/in-process.js +155 -0
  740. package/src/http-server/worker-handler/index.js +370 -0
  741. package/src/http-server/worker-handler/worker-script.js +6 -0
  742. package/src/http-server/worker-handler/worker-thread.js +286 -0
  743. package/src/initializer.js +39 -0
  744. package/src/jobs/.gitkeep +1 -0
  745. package/src/jobs/mail-delivery.js +22 -0
  746. package/src/logger/base-logger.js +34 -0
  747. package/src/logger/console-logger.js +28 -0
  748. package/src/logger/file-logger.js +36 -0
  749. package/src/logger/outputs/array-output.js +50 -0
  750. package/src/logger/outputs/console-output.js +32 -0
  751. package/src/logger/outputs/file-output.js +55 -0
  752. package/src/logger/outputs/stdout-output.js +64 -0
  753. package/src/logger.js +507 -0
  754. package/src/mailer/backends/smtp.js +197 -0
  755. package/src/mailer/base.js +337 -0
  756. package/src/mailer/delivery.js +70 -0
  757. package/src/mailer/index.js +24 -0
  758. package/src/mailer.js +15 -0
  759. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  760. package/src/plugins/sqljs-wasm-route.js +71 -0
  761. package/src/record-payload-values.js +83 -0
  762. package/src/routes/app-routes.js +17 -0
  763. package/src/routes/base-route.js +133 -0
  764. package/src/routes/basic-route.js +109 -0
  765. package/src/routes/built-in/debug/controller.js +12 -0
  766. package/src/routes/built-in/errors/controller.js +7 -0
  767. package/src/routes/built-in/errors/not-found.ejs +1 -0
  768. package/src/routes/get-route.js +75 -0
  769. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  770. package/src/routes/index.js +50 -0
  771. package/src/routes/namespace-route.js +51 -0
  772. package/src/routes/plugin-routes.js +141 -0
  773. package/src/routes/post-route.js +74 -0
  774. package/src/routes/resolver.js +535 -0
  775. package/src/routes/resource-route.js +154 -0
  776. package/src/routes/root-route.js +11 -0
  777. package/src/templates/configuration.js +61 -0
  778. package/src/templates/generate-migration.js +11 -0
  779. package/src/templates/generate-model.js +6 -0
  780. package/src/templates/routes.js +11 -0
  781. package/src/testing/base-expect.js +17 -0
  782. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  783. package/src/testing/browser-test-app.js +32 -0
  784. package/src/testing/expect-to-change.js +55 -0
  785. package/src/testing/expect-utils.js +269 -0
  786. package/src/testing/expect.js +763 -0
  787. package/src/testing/request-client.js +90 -0
  788. package/src/testing/test-files-finder.js +364 -0
  789. package/src/testing/test-filter-parser.js +198 -0
  790. package/src/testing/test-runner.js +1168 -0
  791. package/src/testing/test-suite-splitter.js +177 -0
  792. package/src/testing/test.js +370 -0
  793. package/src/types/external-modules.d.ts +57 -0
  794. package/src/utils/backtrace-cleaner-node.js +87 -0
  795. package/src/utils/backtrace-cleaner.js +266 -0
  796. package/src/utils/ensure-error.js +15 -0
  797. package/src/utils/event-emitter.js +8 -0
  798. package/src/utils/file-exists.js +18 -0
  799. package/src/utils/format-value.js +101 -0
  800. package/src/utils/model-scope.js +56 -0
  801. package/src/utils/nest-callbacks.js +22 -0
  802. package/src/utils/plain-object.js +14 -0
  803. package/src/utils/ransack.js +859 -0
  804. package/src/utils/rest-args-error.js +14 -0
  805. package/src/utils/singularize-model-name.js +18 -0
  806. package/src/utils/split-sql-statements.js +88 -0
  807. package/src/utils/to-import-specifier.js +53 -0
  808. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  809. package/src/utils/with-tracked-stack.js +38 -0
  810. package/src/velocious-error.js +34 -0
  811. package/tsconfig.json +16 -0
@@ -0,0 +1,152 @@
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
+ * FrontendModelClassUpdateEventPayload type.
18
+ @typedef {import("./use-model-class-event.js").FrontendModelCreateUpdateEventPayload} FrontendModelClassUpdateEventPayload */
19
+ /**
20
+ * Defines this typedef.
21
+ @typedef {{id: string, model: FrontendModelInstance}} FrontendModelInstanceUpdateEventPayload */
22
+ /**
23
+ * FrontendModelUpdateEventPayload type.
24
+ @typedef {FrontendModelClassUpdateEventPayload | FrontendModelInstanceUpdateEventPayload} FrontendModelUpdateEventPayload */
25
+ /**
26
+ * UseUpdatedEventOptions type.
27
+ @typedef {import("./use-model-class-event.js").UseModelClassEventOptions} UseUpdatedEventOptions */
28
+ /**
29
+ * FrontendModelUpdateEventCallback type.
30
+ @typedef {(payload: FrontendModelUpdateEventPayload) => void} FrontendModelUpdateEventCallback */
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) {
41
+ throw new Error(`Unknown options given to useUpdatedEvent: ${unknownOptionNames.join(", ")}`)
42
+ }
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 update events. Pass a model class for class-level
58
+ * update events, or a model / model array for instance-level update events.
59
+ * @param {FrontendModelClass | FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelClassOrModels - Model class, model, or models.
60
+ * @param {FrontendModelUpdateEventCallback} callback - Event callback.
61
+ * @param {UseUpdatedEventOptions} [options] - Hook options.
62
+ * @returns {void}
63
+ */
64
+ export default function useUpdatedEvent(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, "update", (payload) => {
73
+ callback(/**
74
+ * Narrows the runtime value to the documented type.
75
+ @type {FrontendModelClassUpdateEventPayload} */ (payload))
76
+ }, {active: active && Boolean(classModel), debounce, onConnected, ...projectionOptions})
77
+ useInstanceUpdatedEvent(instanceModels, callback, {active: active && !classModel, debounce, onConnected, ...projectionOptions})
78
+ }
79
+
80
+ /**
81
+ * Runs use instance updated event.
82
+ * @param {FrontendModelInstance | FrontendModelInstance[] | null | undefined} modelOrModels - Model or models.
83
+ * @param {FrontendModelUpdateEventCallback} callback - Event callback.
84
+ * @param {UseUpdatedEventOptions} options - Hook options.
85
+ * @returns {void}
86
+ */
87
+ function useInstanceUpdatedEvent(modelOrModels, callback, options) {
88
+ const {active = true, abilities, debounce = false, onConnected, preload, query, queryData, select, selectsExtra, withCount} = options
89
+ const projectionKey = JSON.stringify({abilities, preload, query: eventQueryDependencyPayload(query), queryData, select, selectsExtra, withCount})
90
+ const projectionOptionsRef = useRef({abilities, preload, query, queryData, select, selectsExtra, withCount})
91
+ const callbackRef = useRef(callback)
92
+ const activeRef = useRef(active)
93
+ projectionOptionsRef.current = {abilities, preload, query, queryData, select, selectsExtra, withCount}
94
+ callbackRef.current = callback
95
+ activeRef.current = active
96
+
97
+ const modelsKey = modelsDependencyKey(modelOrModels)
98
+ const eventCallback = useMemo(() => {
99
+ const wrappedCallback = (/**
100
+ * Narrows the runtime value to the documented type.
101
+ @type {FrontendModelInstanceUpdateEventPayload} */ payload) => {
102
+ if (activeRef.current) callbackRef.current(payload)
103
+ }
104
+
105
+ if (typeof debounce === "number") return debounceFunction(wrappedCallback, debounce)
106
+ if (debounce) return debounceFunction(wrappedCallback)
107
+
108
+ return wrappedCallback
109
+ }, [debounce])
110
+
111
+ useEffect(() => {
112
+ if (!active) return undefined
113
+
114
+ const models = modelsFromInput(modelOrModels)
115
+ if (models.length < 1) return undefined
116
+
117
+ let closed = false
118
+ /**
119
+ * Unsubscribe callbacks.
120
+ @type {Array<() => void>} */
121
+ const unsubscribeCallbacks = []
122
+ const subscriptionCallback = (/**
123
+ * Narrows the runtime value to the documented type.
124
+ @type {FrontendModelInstanceUpdateEventPayload} */ payload) => {
125
+ if (!closed) eventCallback(payload)
126
+ }
127
+
128
+ void (async () => {
129
+ for (const model of models) {
130
+ const unsubscribe = await model.onUpdate(subscriptionCallback, projectionOptionsRef.current)
131
+
132
+ if (closed) {
133
+ unsubscribe()
134
+ } else {
135
+ unsubscribeCallbacks.push(unsubscribe)
136
+ }
137
+ }
138
+
139
+ if (!closed && onConnected) onConnected()
140
+ })()
141
+
142
+ return () => {
143
+ closed = true
144
+
145
+ for (const unsubscribe of unsubscribeCallbacks) {
146
+ unsubscribe()
147
+ }
148
+
149
+ clearPendingDebouncedCallback(eventCallback)
150
+ }
151
+ }, [active, eventCallback, modelsKey, onConnected, projectionKey])
152
+ }
@@ -0,0 +1,494 @@
1
+ // @ts-check
2
+
3
+ import VelociousWebsocketChannel from "../http-server/websocket-channel.js"
4
+ import Response from "../http-server/client/response.js"
5
+ import {serializeFrontendModelTransportValue} from "./transport-serialization.js"
6
+
7
+ const EVENT_FILTER_KEYS = new Set(["joins", "key", "searches", "where"])
8
+
9
+ /**
10
+ * Defines this typedef.
11
+ * @typedef {{action?: string, id?: string | number, matchedEventFilterKeys?: string[], record?: import("./query.js").FrontendModelTransportValue, [key: string]: import("./query.js").FrontendModelTransportValue | string[] | undefined}} FrontendModelLifecycleBroadcastBody
12
+ */
13
+ /**
14
+ * Defines this typedef.
15
+ * @typedef {{headers?: () => Record<string, string | string[] | undefined>, remoteAddress?: () => string | undefined}} FrontendModelWebsocketUpgradeRequest
16
+ */
17
+ /**
18
+ * Defines this typedef.
19
+ * @typedef {{headers: () => Record<string, string | string[] | undefined>, header: (name: string) => string | string[] | undefined, metadata: (key?: string) => Record<string, import("./query.js").FrontendModelTransportValue> | import("./query.js").FrontendModelTransportValue | undefined, path: () => string, httpMethod: () => string, remoteAddress: () => string | undefined, origin: () => string | string[] | undefined}} FrontendModelWebsocketSyntheticRequest
20
+ */
21
+
22
+ /**
23
+ * Per-session channel subscription for frontend-model lifecycle events.
24
+ * Replaces the legacy `FrontendModelWebsocketChannel` (Phase 3).
25
+ *
26
+ * Auth model: subscribe-time only. `canSubscribe` resolves the caller's
27
+ * ability once, checks that at least one `allow` rule exists for
28
+ * `read` on the requested model class, and then delivers future
29
+ * lifecycle broadcasts for that model without re-authorizing per event.
30
+ * This matches the explicit design decision in Phase 3 to trade
31
+ * per-record visibility guarantees for massively cheaper broadcast fan-out.
32
+ * Subscriber-provided event filters can still narrow which create/update
33
+ * events are delivered, but they are matching predicates rather than
34
+ * per-record authorization checks.
35
+ *
36
+ * Wire: subscribe with `subscribeChannel("frontend-models", {params: {model: ModelName}})`.
37
+ * Backend publishes `{action, id, record}` via
38
+ * `configuration.broadcastToChannel("frontend-models", {model: ModelName}, body)`;
39
+ * `matches()` routes by model name.
40
+ */
41
+ export default class FrontendModelWebsocketChannel extends VelociousWebsocketChannel {
42
+ /**
43
+ * Ability.
44
+ @type {import("../authorization/ability.js").default | null} */
45
+ _ability = null
46
+
47
+ /**
48
+ * Runs can subscribe.
49
+ * @returns {Promise<boolean>} Whether the frontend-model subscription is authorized.
50
+ */
51
+ async canSubscribe() {
52
+ const modelName = this._modelName()
53
+
54
+ if (!modelName) return false
55
+ this._eventFilters()
56
+
57
+ const configuration = this.session.configuration
58
+ const modelClasses = configuration.getModelClasses?.() || {}
59
+ const ModelClass = modelClasses[modelName]
60
+
61
+ if (!ModelClass) return false
62
+
63
+ const ability = await configuration.resolveAbility?.({
64
+ params: {model: modelName},
65
+ request: /**
66
+ * Narrows the runtime value to the documented type.
67
+ @type {import("../http-server/client/request.js").default} */ (this._syntheticRequest()),
68
+ response: new Response({configuration})
69
+ })
70
+
71
+ if (!ability) return false
72
+ this._ability = ability
73
+
74
+ // Load resource-declared rules for this model class before checking,
75
+ // otherwise `rulesFor` returns empty for abilities whose resources
76
+ // register rules lazily via `abilities()`.
77
+ if (typeof ability.loadAbilitiesForModelClass === "function") {
78
+ ability.loadAbilitiesForModelClass(ModelClass)
79
+ }
80
+
81
+ const readRules = typeof ability.rulesFor === "function"
82
+ ? ability.rulesFor({action: "read", modelClass: ModelClass})
83
+ : []
84
+
85
+ return readRules.some((/**
86
+ * Narrows the runtime value to the documented type.
87
+ @type {{effect: string}} */ rule) => rule.effect === "allow")
88
+ }
89
+
90
+ /**
91
+ * Runs deliver broadcast.
92
+ * @param {FrontendModelLifecycleBroadcastBody} body - Broadcast body.
93
+ * @param {{eventId?: string}} [meta] - Optional event metadata.
94
+ * @returns {Promise<void>} Resolves after delivery.
95
+ */
96
+ async deliverBroadcast(body, meta) {
97
+ const configuration = this.session.configuration
98
+
99
+ if (configuration && typeof configuration.ensureConnections === "function") {
100
+ await configuration.ensureConnections({name: "Frontend model websocket broadcast"}, async () => {
101
+ await this._deliverBroadcast(body, meta)
102
+ })
103
+ return
104
+ }
105
+
106
+ await this._deliverBroadcast(body, meta)
107
+ }
108
+
109
+ /**
110
+ * Runs deliver broadcast.
111
+ * @param {FrontendModelLifecycleBroadcastBody} body - Broadcast body.
112
+ * @param {{eventId?: string}} [meta] - Optional event metadata.
113
+ * @returns {Promise<void>} Resolves after delivery.
114
+ */
115
+ async _deliverBroadcast(body, meta) {
116
+ const hasEventFilters = this._hasEventFilterParams()
117
+
118
+ if (!this._hasProjectionParams() && !hasEventFilters) {
119
+ this.sendMessage(body, meta)
120
+ return
121
+ }
122
+
123
+ if (!body || typeof body !== "object") {
124
+ if (!hasEventFilters || this._hasUnfilteredEventDelivery()) this.sendMessage(body, meta)
125
+ return
126
+ }
127
+
128
+ if (body.action === "destroy") {
129
+ if (!hasEventFilters || this._hasUnfilteredEventDelivery()) this.sendMessage(body, meta)
130
+ return
131
+ }
132
+
133
+ if (body.id === undefined || body.id === null) {
134
+ if (!hasEventFilters || this._hasUnfilteredEventDelivery()) this.sendMessage(body, meta)
135
+ return
136
+ }
137
+
138
+ const FrontendModelController = await this._frontendModelControllerClass()
139
+ const matchedEventFilterKeys = await this._matchedEventFilterKeysForEventId(body.id, FrontendModelController)
140
+
141
+ if (hasEventFilters && matchedEventFilterKeys.length === 0 && !this._hasUnfilteredEventDelivery()) {
142
+ return
143
+ }
144
+
145
+ /**
146
+ * Deliver body.
147
+ @type {FrontendModelLifecycleBroadcastBody} */
148
+ let deliverBody = body
149
+
150
+ if (this._hasProjectionParams()) {
151
+ const projectedRecord = await this._projectedRecordForEventId(body.id, FrontendModelController)
152
+
153
+ if (!projectedRecord) {
154
+ return
155
+ }
156
+
157
+ deliverBody = {
158
+ ...deliverBody,
159
+ record: /**
160
+ * Narrows the runtime value to the documented type.
161
+ @type {import("./query.js").FrontendModelTransportValue} */ (serializeFrontendModelTransportValue(projectedRecord))
162
+ }
163
+ }
164
+
165
+ if (hasEventFilters) {
166
+ deliverBody = {
167
+ ...deliverBody,
168
+ matchedEventFilterKeys
169
+ }
170
+ }
171
+
172
+ this.sendMessage(deliverBody, meta)
173
+ }
174
+
175
+ /**
176
+ * Runs matches.
177
+ * @param {Record<string, import("./query.js").FrontendModelTransportValue>} broadcastParams - Params from `broadcastToChannel`.
178
+ * @returns {boolean} Whether the broadcast matches this subscriber's model.
179
+ */
180
+ matches(broadcastParams) {
181
+ return broadcastParams?.model === this._modelName()
182
+ }
183
+
184
+ /**
185
+ * Runs debug snapshot.
186
+ * @returns {Record<string, ?>} Debug-safe subscription details.
187
+ */
188
+ debugSnapshot() {
189
+ const eventFilters = this._eventFilters()
190
+
191
+ return {
192
+ abilities: this.params.abilities !== undefined,
193
+ eventFilterCount: eventFilters.length,
194
+ model: this._modelName(),
195
+ preload: this.params.preload !== undefined,
196
+ queryData: this.params.queryData !== undefined,
197
+ select: this.params.select !== undefined,
198
+ selectsExtra: this.params.selectsExtra !== undefined,
199
+ unfilteredEventDelivery: this.params.unfilteredEventDelivery === true,
200
+ withCount: this.params.withCount !== undefined
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Runs model name.
206
+ * @returns {string | null} - Requested frontend-model name or null.
207
+ */
208
+ _modelName() {
209
+ return typeof this.params?.model === "string" && this.params.model.length > 0
210
+ ? this.params.model
211
+ : null
212
+ }
213
+
214
+ /**
215
+ * Runs has projection params.
216
+ * @returns {boolean} - Whether this subscription requested per-event record projection.
217
+ */
218
+ _hasProjectionParams() {
219
+ return this.params.select !== undefined
220
+ || this.params.selectsExtra !== undefined
221
+ || this.params.preload !== undefined
222
+ || this.params.withCount !== undefined
223
+ || this.params.abilities !== undefined
224
+ || this.params.queryData !== undefined
225
+ }
226
+
227
+ /**
228
+ * Runs has event filter params.
229
+ * @returns {boolean} - Whether this subscription requested event query filters.
230
+ */
231
+ _hasEventFilterParams() {
232
+ return this._eventFilters().length > 0
233
+ }
234
+
235
+ /**
236
+ * Runs has unfiltered event delivery.
237
+ * @returns {boolean} - Whether unfiltered callbacks should receive every event.
238
+ */
239
+ _hasUnfilteredEventDelivery() {
240
+ return this.params.unfilteredEventDelivery === true
241
+ }
242
+
243
+ /**
244
+ * Runs event filters.
245
+ * @returns {import("./query.js").FrontendModelEventFilterPayloadEntry[]} - Valid event filters.
246
+ */
247
+ _eventFilters() {
248
+ if (this.params.eventFilters === undefined) return []
249
+ if (!Array.isArray(this.params.eventFilters)) {
250
+ throw new Error("Frontend model eventFilters must be an array")
251
+ }
252
+
253
+ return this.params.eventFilters.map((entry) => {
254
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
255
+ throw new Error("Frontend model eventFilters entries must be objects")
256
+ }
257
+
258
+ const eventFilter = /**
259
+ * Narrows the runtime value to the documented type.
260
+ @type {Record<string, ?>} */ (entry)
261
+ const unknownKeys = Object.keys(eventFilter).filter((key) => !EVENT_FILTER_KEYS.has(key))
262
+
263
+ if (unknownKeys.length > 0) {
264
+ throw new Error(`Frontend model eventFilters entries cannot include ${unknownKeys.join(", ")}`)
265
+ }
266
+
267
+ if (typeof eventFilter.key !== "string" || eventFilter.key.length === 0) {
268
+ throw new Error("Frontend model eventFilters entries require a key")
269
+ }
270
+
271
+ /**
272
+ * Sanitized event filter.
273
+ @type {import("./query.js").FrontendModelEventFilterPayloadEntry} */
274
+ const sanitizedEventFilter = {key: eventFilter.key}
275
+
276
+ if (eventFilter.joins !== undefined) {
277
+ sanitizedEventFilter.joins = /**
278
+ * Narrows the runtime value to the documented type.
279
+ @type {Record<string, import("./query.js").FrontendModelTransportValue>} */ (eventFilter.joins)
280
+ }
281
+
282
+ if (eventFilter.searches !== undefined) {
283
+ sanitizedEventFilter.searches = /**
284
+ * Narrows the runtime value to the documented type.
285
+ @type {import("./query.js").FrontendModelSearch[]} */ (eventFilter.searches)
286
+ }
287
+
288
+ if (eventFilter.where !== undefined) {
289
+ sanitizedEventFilter.where = /**
290
+ * Narrows the runtime value to the documented type.
291
+ @type {Record<string, import("./query.js").FrontendModelTransportValue>} */ (eventFilter.where)
292
+ }
293
+
294
+ return sanitizedEventFilter
295
+ })
296
+ }
297
+
298
+ /**
299
+ * Runs frontend model controller class.
300
+ * @returns {Promise<typeof import("../frontend-model-controller.js").default>} - Frontend model controller class.
301
+ */
302
+ async _frontendModelControllerClass() {
303
+ const frontendModelControllerPath = "../frontend-model-controller.js"
304
+ const {default: FrontendModelController} = await import(frontendModelControllerPath)
305
+
306
+ return FrontendModelController
307
+ }
308
+
309
+ /**
310
+ * Runs frontend model controller.
311
+ * @param {typeof import("../frontend-model-controller.js").default} FrontendModelController - Server-side frontend-model controller class.
312
+ * @param {Record<string, ?>} [params] - Optional params override.
313
+ * @returns {import("../frontend-model-controller.js").default} - Synthetic controller used for resource serialization.
314
+ */
315
+ _frontendModelController(FrontendModelController, params = {}) {
316
+ const configuration = this.session.configuration
317
+ const controller = new FrontendModelController({
318
+ action: "websocketEvent",
319
+ configuration,
320
+ controller: "frontend-models",
321
+ params: {
322
+ abilities: this.params.abilities,
323
+ joins: this.params.joins,
324
+ model: this._modelName(),
325
+ preload: this.params.preload,
326
+ queryData: this.params.queryData,
327
+ searches: this.params.searches,
328
+ select: this.params.select,
329
+ selectsExtra: this.params.selectsExtra,
330
+ where: this.params.where,
331
+ ...params,
332
+ withCount: this.params.withCount
333
+ },
334
+ request: /**
335
+ * Narrows the runtime value to the documented type.
336
+ @type {import("../http-server/client/request.js").default} */ (this._syntheticRequest()),
337
+ response: new Response({configuration}),
338
+ viewPath: "/"
339
+ })
340
+
341
+ controller._frontendModelAbilityOverride = this._ability || undefined
342
+
343
+ return controller
344
+ }
345
+
346
+ /**
347
+ * Runs matched event filter keys for event id.
348
+ * @param {string | number} id - Event record id.
349
+ * @param {typeof import("../frontend-model-controller.js").default} FrontendModelController - Server-side frontend-model controller class.
350
+ * @returns {Promise<string[]>} - Event filter keys matched by the record.
351
+ */
352
+ async _matchedEventFilterKeysForEventId(id, FrontendModelController) {
353
+ /**
354
+ * Matched event filter keys.
355
+ @type {string[]} */
356
+ const matchedEventFilterKeys = []
357
+
358
+ for (const eventFilter of this._eventFilters()) {
359
+ const matches = await this._eventMatchesFilter({
360
+ FrontendModelController,
361
+ eventFilter,
362
+ id
363
+ })
364
+
365
+ if (matches) matchedEventFilterKeys.push(eventFilter.key)
366
+ }
367
+
368
+ return matchedEventFilterKeys
369
+ }
370
+
371
+ /**
372
+ * Runs event matches filter.
373
+ * @param {object} args - Filter args.
374
+ * @param {typeof import("../frontend-model-controller.js").default} args.FrontendModelController - Server-side frontend-model controller class.
375
+ * @param {import("./query.js").FrontendModelEventFilterPayloadEntry} args.eventFilter - Event filter payload.
376
+ * @param {string | number} args.id - Event record id.
377
+ * @returns {Promise<boolean>} Whether the record matches the filter.
378
+ */
379
+ async _eventMatchesFilter({FrontendModelController, eventFilter, id}) {
380
+ const controller = this._frontendModelController(FrontendModelController, {
381
+ joins: eventFilter.joins,
382
+ searches: eventFilter.searches,
383
+ where: eventFilter.where
384
+ })
385
+
386
+ await controller.ensureFrontendModelClassInitialized()
387
+
388
+ const ModelClass = controller.frontendModelClass()
389
+ const primaryKey = ModelClass.primaryKey()
390
+ const where = controller.frontendModelWhere()
391
+ const joins = controller.frontendModelJoins()
392
+ let query = ModelClass.where({[ModelClass.tableName()]: {[primaryKey]: id}})
393
+
394
+ if (where) controller.applyFrontendModelWhere({query, where})
395
+ if (joins) controller.applyFrontendModelJoins({joins, query})
396
+
397
+ for (const search of controller.frontendModelSearches()) {
398
+ controller.applyFrontendModelSearch({query, search})
399
+ }
400
+
401
+ return Boolean(await query.first())
402
+ }
403
+
404
+ /**
405
+ * Runs projected record for event id.
406
+ * @param {string | number} id - Event record id.
407
+ * @param {typeof import("../frontend-model-controller.js").default} FrontendModelController - Server-side frontend-model controller class.
408
+ * @returns {Promise<Record<string, import("./query.js").FrontendModelTransportValue> | null>} - Serialized projected record.
409
+ */
410
+ async _projectedRecordForEventId(id, FrontendModelController) {
411
+ const controller = this._frontendModelController(FrontendModelController)
412
+
413
+ await controller.ensureFrontendModelClassInitialized()
414
+
415
+ const ModelClass = controller.frontendModelClass()
416
+ const primaryKey = ModelClass.primaryKey()
417
+ let query = ModelClass.where({[ModelClass.tableName()]: {[primaryKey]: id}})
418
+ const preload = controller.frontendModelPreload()
419
+
420
+ if (preload) query = query.preload(preload)
421
+
422
+ for (const entry of controller.frontendModelWithCount()) {
423
+ /**
424
+ * Spec.
425
+ @type {Record<string, boolean | {relationship?: string, where?: Record<string, import("./query.js").FrontendModelTransportValue>}>} */
426
+ const spec = {}
427
+
428
+ spec[entry.attributeName] = {
429
+ relationship: entry.relationshipName,
430
+ where: entry.where ? /**
431
+ * Narrows the runtime value to the documented type.
432
+ @type {Record<string, import("./query.js").FrontendModelTransportValue>} */ (entry.where) : undefined
433
+ }
434
+ query.withCount(spec)
435
+ }
436
+
437
+ const queryData = controller.frontendModelQueryData()
438
+
439
+ if (queryData !== null) query.queryData(queryData)
440
+
441
+ query = controller.applyFrontendModelTranslatedAttributePreloads({query})
442
+
443
+ const model = await query.first()
444
+
445
+ if (!model) return null
446
+
447
+ if (this.params.abilities !== undefined) {
448
+ await controller.frontendModelComputeAbilities([model])
449
+ }
450
+
451
+ controller._frontendModelAbilityOverride = undefined
452
+
453
+ return await controller.frontendModelResourceInstance().serialize(model, "find")
454
+ }
455
+
456
+ /**
457
+ * Minimal Request-like stub used only for ability resolution. Avoids
458
+ * importing `WebsocketRequest` here because its `node:querystring`
459
+ * dependency would pull server-only code into browser bundles via
460
+ * the `configuration → logger → websocket-publishers` import chain.
461
+ * Header names are normalized to lowercase so `header("cookie")`
462
+ * finds a value regardless of whether the upgrade-request headers
463
+ * map uses `"Cookie"` or `"cookie"`. Session metadata stays separate
464
+ * from headers and is exposed through `metadata(...)` for ability
465
+ * resolvers that need websocket-delivered session data.
466
+ * @returns {FrontendModelWebsocketSyntheticRequest} Request-like object for ability resolution.
467
+ */
468
+ _syntheticRequest() {
469
+ const upgradeRequest = /**
470
+ * Narrows the runtime value to the documented type.
471
+ @type {FrontendModelWebsocketUpgradeRequest} */ (this.session.upgradeRequest)
472
+ const rawHeaders = typeof upgradeRequest?.headers === "function" ? upgradeRequest.headers() : {}
473
+ const metadata = typeof this.session.getMetadata === "function" ? this.session.getMetadata() : {}
474
+ const remoteAddress = typeof upgradeRequest?.remoteAddress === "function" ? upgradeRequest.remoteAddress() : undefined
475
+ /**
476
+ * Header map.
477
+ @type {Record<string, string | string[] | undefined>} */
478
+ const headerMap = {}
479
+
480
+ for (const key of Object.keys(rawHeaders || {})) {
481
+ headerMap[key.toLowerCase()] = rawHeaders[key]
482
+ }
483
+
484
+ return {
485
+ headers: () => headerMap,
486
+ header: (name) => headerMap[String(name).toLowerCase()],
487
+ metadata: (key) => key === undefined ? {...metadata} : metadata[key],
488
+ path: () => "/frontend-models",
489
+ httpMethod: () => "POST",
490
+ remoteAddress: () => remoteAddress,
491
+ origin: () => headerMap.origin
492
+ }
493
+ }
494
+ }