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,337 @@
1
+ // @ts-check
2
+
3
+ import ejs from "ejs"
4
+ import {incorporate} from "incorporator"
5
+ import * as inflection from "inflection"
6
+ import configurationResolver from "../configuration-resolver.js"
7
+ import restArgsError from "../utils/rest-args-error.js"
8
+ import MailerDelivery from "./delivery.js"
9
+
10
+ /**
11
+ * Deliveries store.
12
+ @type {import("./index.js").MailerDeliveryPayload[]} */
13
+ const deliveriesStore = []
14
+ /**
15
+ * Delivery handler.
16
+ @type {((payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?) | null} */
17
+ let deliveryHandler = null
18
+
19
+ /**
20
+ * Runs view file name.
21
+ * @param {string} actionName - Mailer action name.
22
+ * @returns {string} - View file name.
23
+ */
24
+ function viewFileName(actionName) {
25
+ return inflection.dasherize(inflection.underscore(actionName))
26
+ }
27
+
28
+ /**
29
+ * Runs mailer directory name.
30
+ * @param {string} className - Mailer class name.
31
+ * @returns {string} - Mailer directory name.
32
+ */
33
+ function mailerDirectoryName(className) {
34
+ const baseName = className.replace(/Mailer$/, "")
35
+
36
+ return inflection.dasherize(inflection.underscore(baseName))
37
+ }
38
+
39
+ /**
40
+ * Runs the inferActionName helper.
41
+ * @param {typeof VelociousMailerBase} mailerClass - Mailer class.
42
+ * @param {string} stack - Error stack.
43
+ * @returns {string | null} - Inferred action name.
44
+ */
45
+ // fallow-ignore-next-line complexity
46
+ function inferActionName(mailerClass, stack) {
47
+ const prototype = mailerClass.prototype
48
+ let actionName = null
49
+
50
+ for (const line of stack.split("\n")) {
51
+ const match = line.match(/\bat (?:async )?(?:new )?[^\s.]+\.([^\s.]+) /)
52
+
53
+ if (!match) continue
54
+
55
+ const frameActionName = match[1]
56
+
57
+ if (frameActionName === "mail") continue
58
+ if (frameActionName.startsWith("_")) continue
59
+ if (frameActionName === "constructor") continue
60
+ if (Object.prototype.hasOwnProperty.call(VelociousMailerBase.prototype, frameActionName)) continue
61
+ if (typeof /**
62
+ * Narrows the runtime value to the documented type.
63
+ @type {Record<string, ?>} */ (/**
64
+ * Narrows the runtime value to the documented type.
65
+ @type {?} */ (prototype))[frameActionName] !== "function") continue
66
+
67
+ actionName = frameActionName
68
+ }
69
+
70
+ return actionName
71
+ }
72
+
73
+ /**
74
+ * Runs is testing environment.
75
+ * @returns {Promise<boolean>} - Whether the current environment is test.
76
+ */
77
+ async function isTestingEnvironment() {
78
+ const configuration = await configurationResolver()
79
+
80
+ return configuration.getEnvironment() === "test"
81
+ }
82
+
83
+ /**
84
+ * Base mailer with view rendering and delivery helpers.
85
+ */
86
+ export class VelociousMailerBase {
87
+ /**
88
+ * Runs constructor.
89
+ * @param {object} [args] - Constructor args.
90
+ * @param {import("../configuration.js").default} [args.configuration] - Configuration instance.
91
+ */
92
+ constructor({configuration} = {}) {
93
+ this._actionName = null
94
+ this._mailOptions = null
95
+ this._viewParams = {}
96
+ this._configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver()
97
+ }
98
+
99
+ /**
100
+ * Runs assign view.
101
+ * @param {Record<string, ?>} params - View params.
102
+ * @returns {void} - No return value.
103
+ */
104
+ assignView(params) {
105
+ this._viewParams = Object.assign(this._viewParams, params || {})
106
+ }
107
+
108
+ /**
109
+ * Runs mail.
110
+ * @param {object} args - Mail options.
111
+ * @param {?} args.to - Recipient.
112
+ * @param {string} args.subject - Subject line.
113
+ * @param {?} [args.from] - Sender.
114
+ * @param {?} [args.cc] - CC recipients.
115
+ * @param {?} [args.bcc] - BCC recipients.
116
+ * @param {?} [args.replyTo] - Reply-to address.
117
+ * @param {Record<string, string>} [args.headers] - Custom headers.
118
+ * @param {string} [args.actionName] - Mailer action name.
119
+ * @param {Promise<?> | ?} [args.actionPromise] - Action completion promise.
120
+ * @returns {MailerDelivery} - Delivery wrapper.
121
+ */
122
+ mail({to, subject, from, cc, bcc, replyTo, headers, actionName, actionPromise, ...restArgs}) {
123
+ restArgsError(restArgs)
124
+
125
+ const resolvedActionName = actionName || inferActionName(/**
126
+ * Narrows the runtime value to the documented type.
127
+ @type {typeof VelociousMailerBase} */ (this.constructor), new Error().stack || "")
128
+
129
+ if (!resolvedActionName) {
130
+ throw new Error(`Missing actionName for ${this.constructor.name}.mail()`)
131
+ }
132
+
133
+ this._actionName = resolvedActionName
134
+ this._mailOptions = {to, subject, from, cc, bcc, replyTo, headers}
135
+ const resolvedActionPromise = actionPromise === undefined ? Promise.resolve() : Promise.resolve(actionPromise)
136
+
137
+ return new MailerDelivery({
138
+ mailer: this,
139
+ actionPromise: resolvedActionPromise,
140
+ actionName: resolvedActionName
141
+ })
142
+ }
143
+
144
+ /**
145
+ * Runs get configuration.
146
+ * @returns {Promise<import("../configuration.js").default>} - Configuration instance.
147
+ */
148
+ async _getConfiguration() {
149
+ return await this._configurationPromise
150
+ }
151
+
152
+ /**
153
+ * Runs get action name.
154
+ * @returns {string} - Action name.
155
+ */
156
+ _getActionName() {
157
+ if (!this._actionName) {
158
+ throw new Error(`No mailer action set on ${this.constructor.name}`)
159
+ }
160
+
161
+ return this._actionName
162
+ }
163
+
164
+ /**
165
+ * Runs build payload sync.
166
+ * @param {string} html - Rendered HTML.
167
+ * @returns {import("./index.js").MailerDeliveryPayload} - Delivery payload.
168
+ */
169
+ _buildPayloadSync(html) {
170
+ const mailOptions = this._mailOptions
171
+
172
+ if (!mailOptions) {
173
+ throw new Error(`Missing mail() options for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions)}`)
174
+ }
175
+
176
+ if (!mailOptions.to) {
177
+ throw new Error(`Missing "to" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.to)}`)
178
+ }
179
+
180
+ if (!mailOptions.subject) {
181
+ throw new Error(`Missing "subject" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.subject)}`)
182
+ }
183
+
184
+ return {
185
+ to: mailOptions.to,
186
+ subject: mailOptions.subject,
187
+ from: mailOptions.from,
188
+ cc: mailOptions.cc,
189
+ bcc: mailOptions.bcc,
190
+ replyTo: mailOptions.replyTo,
191
+ headers: mailOptions.headers,
192
+ html,
193
+ mailer: this.constructor.name,
194
+ action: this._getActionName()
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Runs build payload.
200
+ * @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Delivery payload.
201
+ */
202
+ async _buildPayload() {
203
+ const html = await this._renderView()
204
+
205
+ return this._buildPayloadSync(html)
206
+ }
207
+
208
+ /**
209
+ * Runs render view.
210
+ * @returns {Promise<string>} - Rendered HTML.
211
+ */
212
+ async _renderView() {
213
+ const configuration = await this._getConfiguration()
214
+ const mailerDir = mailerDirectoryName(this.constructor.name)
215
+ const actionName = this._getActionName()
216
+ const fileName = viewFileName(actionName)
217
+ const viewPath = `${configuration.getDirectory()}/src/mailers/${mailerDir}/${fileName}.ejs`
218
+ const translate = (/**
219
+ * Narrows the runtime value to the documented type.
220
+ @type {string} */ msgID, /**
221
+ * Narrows the runtime value to the documented type.
222
+ @type {Record<string, ?> | undefined} */ args) => configuration.getTranslator()(msgID, args)
223
+ const viewParams = incorporate({mailer: this, _: translate}, this._viewParams)
224
+
225
+ return await new Promise((resolve, reject) => {
226
+ ejs.renderFile(viewPath, viewParams, {}, (err, str) => {
227
+ if (err) {
228
+ const errorCode = /**
229
+ * Narrows the runtime value to the documented type.
230
+ @type {{code?: string}} */ (err).code
231
+
232
+ if (errorCode === "ENOENT") {
233
+ reject(new Error(`Missing mailer view file: ${viewPath}`))
234
+ } else {
235
+ reject(err)
236
+ }
237
+ } else {
238
+ resolve(str)
239
+ }
240
+ })
241
+ })
242
+ }
243
+
244
+ /**
245
+ * Runs deliver payload.
246
+ * @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
247
+ * @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Handler result.
248
+ */
249
+ async _deliverPayload(payload) {
250
+ return await deliverPayload(payload)
251
+ }
252
+
253
+ /**
254
+ * Runs enqueue payload.
255
+ * @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
256
+ * @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
257
+ */
258
+ async _enqueuePayload(payload) {
259
+ return await enqueuePayload(payload)
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Runs the deliveries helper.
265
+ * @returns {import("./index.js").MailerDeliveryPayload[]} - Delivered payloads.
266
+ */
267
+ export function deliveries() {
268
+ return deliveriesStore.slice()
269
+ }
270
+
271
+ /**
272
+ * Runs the clearDeliveries helper.
273
+ * @returns {void} - No return value.
274
+ */
275
+ export function clearDeliveries() {
276
+ deliveriesStore.length = 0
277
+ }
278
+
279
+ /**
280
+ * Runs the setDeliveryHandler helper.
281
+ * @param {(payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?} handler - Delivery handler.
282
+ * @returns {void} - No return value.
283
+ */
284
+ export function setDeliveryHandler(handler) {
285
+ deliveryHandler = handler
286
+ }
287
+
288
+ /**
289
+ * Runs the getDeliveryHandler helper.
290
+ * @returns {((payload: import("./index.js").MailerDeliveryPayload) => Promise<?> | ?) | null} - Handler or null.
291
+ */
292
+ export function getDeliveryHandler() {
293
+ return deliveryHandler
294
+ }
295
+
296
+ /**
297
+ * Runs the deliverPayload helper.
298
+ * @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
299
+ * @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Handler result.
300
+ */
301
+ export async function deliverPayload(payload) {
302
+ if (await isTestingEnvironment()) {
303
+ deliveriesStore.push(payload)
304
+ return payload
305
+ }
306
+
307
+ const configuration = await configurationResolver()
308
+ const backend = configuration.getMailerBackend()
309
+
310
+ if (backend?.deliver) {
311
+ return await backend.deliver({payload, configuration})
312
+ }
313
+
314
+ const handler = deliveryHandler
315
+
316
+ if (!handler) {
317
+ throw new Error(`No mail delivery handler configured for "${payload.subject}" to "${payload.to}"`)
318
+ }
319
+
320
+ return await handler(payload)
321
+ }
322
+
323
+ /**
324
+ * Runs the enqueuePayload helper.
325
+ * @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
326
+ * @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
327
+ */
328
+ export async function enqueuePayload(payload) {
329
+ if (await isTestingEnvironment()) {
330
+ deliveriesStore.push(payload)
331
+ return payload
332
+ }
333
+
334
+ const {default: mailDeliveryJob} = await import("../jobs/mail-delivery.js")
335
+
336
+ return await mailDeliveryJob.performLater(payload)
337
+ }
@@ -0,0 +1,70 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * Represents a prepared mail delivery.
5
+ */
6
+ export default class MailerDelivery {
7
+ /**
8
+ * Narrows the runtime value to the documented type.
9
+ @type {import("./base.js").VelociousMailerBase} */
10
+ mailer
11
+ /**
12
+ * Narrows the runtime value to the documented type.
13
+ @type {Promise<?>} */
14
+ actionPromise
15
+ /**
16
+ * Narrows the runtime value to the documented type.
17
+ @type {string} */
18
+ actionName
19
+
20
+ /**
21
+ * Runs constructor.
22
+ * @param {object} args - Constructor args.
23
+ * @param {import("./base.js").VelociousMailerBase} args.mailer - Mailer instance.
24
+ * @param {Promise<?>} args.actionPromise - Action promise.
25
+ * @param {string} args.actionName - Action name.
26
+ */
27
+ constructor({mailer, actionPromise, actionName}) {
28
+ this.mailer = mailer
29
+ this.actionPromise = actionPromise
30
+ this.actionName = actionName
31
+ }
32
+
33
+ /**
34
+ * Runs build payload.
35
+ * @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Rendered mailer payload.
36
+ */
37
+ async buildPayload() {
38
+ await this.actionPromise
39
+
40
+ return /** Narrows the runtime value to the documented type. @type {import("./index.js").MailerDeliveryPayload} */ (await this.mailer._buildPayload())
41
+ }
42
+
43
+ /**
44
+ * Runs deliver now.
45
+ * @returns {Promise<import("./index.js").MailerDeliveryPayload | ?>} - Delivered payload or handler result.
46
+ */
47
+ async deliverNow() {
48
+ const payload = await this.buildPayload()
49
+
50
+ return await this.mailer._deliverPayload(payload)
51
+ }
52
+
53
+ /**
54
+ * Runs deliver later.
55
+ * @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
56
+ */
57
+ async deliverLater() {
58
+ const payload = await this.buildPayload()
59
+
60
+ return await this.mailer._enqueuePayload(payload)
61
+ }
62
+
63
+ /**
64
+ * Runs deliver laver.
65
+ * @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
66
+ */
67
+ async deliverLaver() {
68
+ return await this.deliverLater()
69
+ }
70
+ }
@@ -0,0 +1,24 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {{to: ?, subject: string, from?: ?, cc?: ?, bcc?: ?, replyTo?: ?, headers?: Record<string, string>, html: string, mailer: string, action: string}} MailerDeliveryPayload */
4
+
5
+ import {
6
+ clearDeliveries,
7
+ deliverPayload,
8
+ deliveries,
9
+ enqueuePayload,
10
+ getDeliveryHandler,
11
+ setDeliveryHandler,
12
+ VelociousMailerBase
13
+ } from "./base.js"
14
+
15
+ export {
16
+ VelociousMailerBase,
17
+ clearDeliveries,
18
+ deliverPayload,
19
+ deliveries,
20
+ enqueuePayload,
21
+ getDeliveryHandler,
22
+ setDeliveryHandler
23
+ }
24
+ export default VelociousMailerBase
package/src/mailer.js ADDED
@@ -0,0 +1,15 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {{to: ?, subject: string, from?: ?, cc?: ?, bcc?: ?, replyTo?: ?, headers?: Record<string, string>, html: string, mailer: string, action: string}} MailerDeliveryPayload */
4
+
5
+ export {
6
+ VelociousMailerBase,
7
+ clearDeliveries,
8
+ deliverPayload,
9
+ deliveries,
10
+ enqueuePayload,
11
+ getDeliveryHandler,
12
+ setDeliveryHandler
13
+ } from "./mailer/index.js"
14
+ export {default as SmtpMailerBackend} from "./mailer/backends/smtp.js"
15
+ export {default} from "./mailer/index.js"
@@ -0,0 +1,70 @@
1
+ import fs from "node:fs/promises"
2
+ import path from "node:path"
3
+
4
+ import Controller from "../controller.js"
5
+
6
+ /**
7
+ * Runs valid asset file name.
8
+ * @param {?} assetFileName - Asset file name.
9
+ * @returns {boolean} - Whether asset file name is safe.
10
+ */
11
+ function validAssetFileName(assetFileName) {
12
+ return typeof assetFileName === "string"
13
+ && assetFileName.length > 0
14
+ && !assetFileName.includes("/")
15
+ && !assetFileName.includes("\\")
16
+ && !assetFileName.includes("..")
17
+ }
18
+
19
+ /**
20
+ * Runs normalize sql js asset file name.
21
+ * @param {string} assetFileName - Requested sql.js asset file name.
22
+ * @returns {string} - Normalized sql.js asset file name.
23
+ */
24
+ function normalizeSqlJsAssetFileName(assetFileName) {
25
+ if (assetFileName === "sql-wasm-browser.wasm") {
26
+ return "sql-wasm.wasm"
27
+ }
28
+
29
+ return assetFileName
30
+ }
31
+
32
+ /** Serves sql.js assets from the backend for sqlite-web locateFile callbacks. */
33
+ export default class SqlJsWasmRouteController extends Controller {
34
+ /**
35
+ * Runs show.
36
+ * @returns {Promise<void>} - Resolves when complete.
37
+ */
38
+ async show() {
39
+ const {sqlJsAssetFileName, sqlJsDistDirectory} = this.params()
40
+
41
+ if (!validAssetFileName(sqlJsAssetFileName)) {
42
+ throw new Error(`Invalid sql.js asset file name: ${String(sqlJsAssetFileName)}`)
43
+ }
44
+
45
+ if (typeof sqlJsDistDirectory !== "string" || sqlJsDistDirectory.length < 1) {
46
+ throw new Error(`Expected sql.js dist directory path to be a string, got: ${String(sqlJsDistDirectory)}`)
47
+ }
48
+
49
+ const normalizedSqlJsAssetFileName = normalizeSqlJsAssetFileName(sqlJsAssetFileName)
50
+ const assetPath = path.join(sqlJsDistDirectory, normalizedSqlJsAssetFileName)
51
+
52
+ try {
53
+ await fs.access(assetPath)
54
+ } catch (error) {
55
+ const ensuredError = /**
56
+ * Narrows the runtime value to the documented type.
57
+ @type {{code?: string}} */ (error)
58
+
59
+ if (ensuredError.code === "ENOENT") {
60
+ await this.render({json: {errorMessage: "Not found", status: "error"}, status: "not-found"})
61
+ return
62
+ }
63
+
64
+ throw error
65
+ }
66
+
67
+ this.response().setHeader("Cache-Control", "public, max-age=3600")
68
+ this.sendFile(assetPath)
69
+ }
70
+ }
@@ -0,0 +1,71 @@
1
+ import {createRequire} from "node:module"
2
+ import path from "node:path"
3
+ import SqlJsWasmRouteController from "./sqljs-wasm-route-controller.js"
4
+
5
+ const require = createRequire(import.meta.url)
6
+ const sqlJsEntryPath = require.resolve("sql.js")
7
+ const sqlJsDistDirectory = path.dirname(sqlJsEntryPath)
8
+
9
+ /**
10
+ * InstallSqlJsWasmRouteArgs type.
11
+ * @typedef {object} InstallSqlJsWasmRouteArgs
12
+ * @property {import("../configuration.js").default} configuration - Velocious configuration instance.
13
+ * @property {string} [routePrefix] - Route prefix used for sql.js asset serving.
14
+ */
15
+
16
+ /**
17
+ * SqlJsLocateFileFromBackendArgs type.
18
+ * @typedef {object} SqlJsLocateFileFromBackendArgs
19
+ * @property {string} backendBaseUrl - Backend base URL (for example `https://api.example.com`).
20
+ * @property {string} [routePrefix] - Route prefix used for sql.js asset serving.
21
+ */
22
+
23
+ /**
24
+ * Runs normalize route prefix.
25
+ * @param {string} routePrefix - Route prefix input.
26
+ * @returns {string} - Normalized route prefix.
27
+ */
28
+ function normalizeRoutePrefix(routePrefix) {
29
+ if (!routePrefix.startsWith("/")) {
30
+ throw new Error(`Expected route prefix to start with '/', got: ${routePrefix}`)
31
+ }
32
+
33
+ if (routePrefix.length > 1 && routePrefix.endsWith("/")) {
34
+ return routePrefix.slice(0, -1)
35
+ }
36
+
37
+ return routePrefix
38
+ }
39
+
40
+ /**
41
+ * Installs a route-resolver hook that serves `sql.js/dist/*` files from the running Velocious backend.
42
+ * @param {InstallSqlJsWasmRouteArgs} args - Options object.
43
+ * @returns {void} - No return value.
44
+ */
45
+ export default function installSqlJsWasmRoute(args) {
46
+ const {configuration, routePrefix = "/velocious/sqljs"} = args
47
+
48
+ if (!configuration) throw new Error("No configuration given")
49
+
50
+ const normalizedRoutePrefix = normalizeRoutePrefix(routePrefix)
51
+
52
+ configuration.routes((routes) => {
53
+ routes.get(`${normalizedRoutePrefix}/:sqlJsAssetFileName`, {
54
+ params: {sqlJsDistDirectory},
55
+ to: [SqlJsWasmRouteController, "show"]
56
+ })
57
+ })
58
+ }
59
+
60
+ /**
61
+ * Creates a sqlite-web `locateFile(file)` callback pointing to a Velocious backend route.
62
+ * @param {SqlJsLocateFileFromBackendArgs} args - Options object.
63
+ * @returns {(file: string) => string} - sql.js locateFile callback.
64
+ */
65
+ export function sqlJsLocateFileFromBackend(args) {
66
+ const {backendBaseUrl, routePrefix = "/velocious/sqljs"} = args
67
+ const normalizedRoutePrefix = normalizeRoutePrefix(routePrefix)
68
+ const baseUrl = backendBaseUrl.replace(/\/+$/, "")
69
+
70
+ return (file) => `${baseUrl}${normalizedRoutePrefix}/${encodeURIComponent(file)}`
71
+ }
@@ -0,0 +1,83 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {{_associationCounts?: Map<string, number>, _computedAbilities?: Map<string, boolean>, _queryDataValues?: Map<string, ?>}} RecordPayloadValuesTarget
5
+ */
6
+
7
+ /**
8
+ * Read an association count attached to a record/frontend-model payload.
9
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding association count payload values.
10
+ * @param {string} attributeName - Association count attribute name.
11
+ * @returns {number} Attached count value, or 0 when it was not loaded.
12
+ */
13
+ export function readPayloadAssociationCount(target, attributeName) {
14
+ if (!target._associationCounts) return 0
15
+ if (!target._associationCounts.has(attributeName)) return 0
16
+
17
+ return /** @type {number} */ (target._associationCounts.get(attributeName))
18
+ }
19
+
20
+ /**
21
+ * Store an association count attached to a record/frontend-model payload.
22
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding association count payload values.
23
+ * @param {string} attributeName - Association count attribute name.
24
+ * @param {number} value - Count value.
25
+ * @returns {void}
26
+ */
27
+ export function setPayloadAssociationCount(target, attributeName, value) {
28
+ if (!target._associationCounts) target._associationCounts = new Map()
29
+
30
+ target._associationCounts.set(attributeName, value)
31
+ }
32
+
33
+ /**
34
+ * Read a computed ability attached to a record/frontend-model payload.
35
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding ability payload values.
36
+ * @param {string} action - Ability action name.
37
+ * @returns {boolean} Attached ability value, or false when it was not loaded.
38
+ */
39
+ export function readPayloadComputedAbility(target, action) {
40
+ if (!target._computedAbilities) return false
41
+ if (!target._computedAbilities.has(action)) return false
42
+
43
+ return Boolean(target._computedAbilities.get(action))
44
+ }
45
+
46
+ /**
47
+ * Store a computed ability attached to a record/frontend-model payload.
48
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding ability payload values.
49
+ * @param {string} action - Ability action name.
50
+ * @param {boolean} value - Whether the current ability permits the action on this record.
51
+ * @returns {void}
52
+ */
53
+ export function setPayloadComputedAbility(target, action, value) {
54
+ if (!target._computedAbilities) target._computedAbilities = new Map()
55
+
56
+ target._computedAbilities.set(action, Boolean(value))
57
+ }
58
+
59
+ /**
60
+ * Read a queryData value attached to a record/frontend-model payload.
61
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding queryData payload values.
62
+ * @param {string} name - queryData alias name.
63
+ * @returns {?} Attached queryData value, or null when it was not loaded.
64
+ */
65
+ export function readPayloadQueryData(target, name) {
66
+ if (!target._queryDataValues) return null
67
+ if (!target._queryDataValues.has(name)) return null
68
+
69
+ return target._queryDataValues.get(name)
70
+ }
71
+
72
+ /**
73
+ * Store a queryData value attached to a record/frontend-model payload.
74
+ * @param {RecordPayloadValuesTarget} target - Record-like object holding queryData payload values.
75
+ * @param {string} name - queryData alias name.
76
+ * @param {?} value - Attached queryData value.
77
+ * @returns {void}
78
+ */
79
+ export function setPayloadQueryData(target, name, value) {
80
+ if (!target._queryDataValues) target._queryDataValues = new Map()
81
+
82
+ target._queryDataValues.set(name, value)
83
+ }
@@ -0,0 +1,17 @@
1
+ // @ts-check
2
+
3
+ import {digg} from "diggerize"
4
+
5
+ export default class VelociousRoutesAppRoutes {
6
+ /**
7
+ * Runs get routes.
8
+ * @param {import("../configuration.js").default} configuration - Configuration instance.
9
+ * @returns {Promise<import("./index.js").default>} - Resolves with the routes.
10
+ */
11
+ static async getRoutes(configuration) {
12
+ // Every client need to make their own routes because they probably can't be shared across different worker threads
13
+ const routesImport = await configuration.getEnvironmentHandler().importApplicationRoutes()
14
+
15
+ return digg(routesImport, "routes")
16
+ }
17
+ }