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,133 @@
1
+ // @ts-check
2
+
3
+ export default class VelociousBaseRoute {
4
+ /**
5
+ * Narrows the runtime value to the documented type.
6
+ @type {typeof import("./get-route.js").default} */
7
+ static GetRouteType
8
+
9
+ /**
10
+ * Narrows the runtime value to the documented type.
11
+ @type {typeof import("./namespace-route.js").default} */
12
+ static NameSpaceRouteType
13
+
14
+ /**
15
+ * Narrows the runtime value to the documented type.
16
+ @type {typeof import("./post-route.js").default} */
17
+ static PostRouteType
18
+
19
+ /**
20
+ * Narrows the runtime value to the documented type.
21
+ @type {typeof import("./resource-route.js").default} */
22
+ static ResourceRouteType
23
+
24
+ /**
25
+ * Runs register route get type.
26
+ * @param {typeof import("./get-route.js").default} RouteClass - Route class to register.
27
+ */
28
+ static registerRouteGetType(RouteClass) {
29
+ this.GetRouteType = RouteClass
30
+ }
31
+
32
+ /**
33
+ * Runs register route namespace type.
34
+ * @param {typeof import("./namespace-route.js").default} RouteClass - Route class to register.
35
+ */
36
+ static registerRouteNamespaceType(RouteClass) {
37
+ this.NameSpaceRouteType = RouteClass
38
+ }
39
+
40
+ /**
41
+ * Runs register route post type.
42
+ * @param {typeof import("./post-route.js").default} RouteClass - Route class to register.
43
+ */
44
+ static registerRoutePostType(RouteClass) {
45
+ this.PostRouteType = RouteClass
46
+ }
47
+
48
+ /**
49
+ * Runs register route resource type.
50
+ * @param {typeof import("./resource-route.js").default} RouteClass - Route class to register.
51
+ */
52
+ static registerRouteResourceType(RouteClass) {
53
+ this.ResourceRouteType = RouteClass
54
+ }
55
+
56
+ /**
57
+ * Routes.
58
+ @type {Array<VelociousBaseRoute>} */
59
+ routes = []
60
+
61
+ /**
62
+ * Mounts.
63
+ @type {Array<{mountable: {mountInto: (args: object) => void}, options: Record<string, ?>}>} */
64
+ mounts = []
65
+
66
+ constructor() {
67
+ // Nothing
68
+ }
69
+
70
+ /**
71
+ * Runs get mounts.
72
+ * @returns {Array<{mountable: {mountInto: (args: object) => void}, options: Record<string, ?>}>} - Mounts declared on this route.
73
+ */
74
+ getMounts() { return this.mounts }
75
+
76
+ /**
77
+ * Runs get.
78
+ * @abstract
79
+ * @param {string} name - Name.
80
+ */
81
+ get(name) { throw new Error("'get' not implemented") } // eslint-disable-line no-unused-vars
82
+
83
+ /**
84
+ * Runs get human paths.
85
+ * @abstract
86
+ * @returns {Array<{action: string | null, method: string, path: string}>} - Route definitions for this resource.
87
+ */
88
+ getHumanPaths() { throw new Error(`'getHumanPaths' not implemented for ${this.constructor.name}`) }
89
+
90
+ /**
91
+ * Runs get sub routes.
92
+ * @returns {Array<VelociousBaseRoute>} - The sub routes.
93
+ */
94
+ getSubRoutes() { return this.routes }
95
+
96
+ /**
97
+ * Runs match with path.
98
+ * @param {object} args - Options object.
99
+ * @param {Record<string, ?>} args.params - Parameters object.
100
+ * @param {string} args.path - Path.
101
+ * @param {import("../http-server/client/request.js").default | import("../http-server/client/websocket-request.js").default} args.request - Request object.
102
+ * @returns {{restPath: string} | undefined} - REST path metadata for this route.
103
+ */
104
+ matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
105
+ throw new Error(`No 'matchWithPath' implemented on ${this.constructor.name}`)
106
+ }
107
+
108
+ /**
109
+ * Runs namespace.
110
+ * @abstract
111
+ * @param {string} name - Name.
112
+ * @param {function(import("./namespace-route.js").default) : void} callback - Callback function.
113
+ * @returns {void} - No return value.
114
+ */
115
+ namespace(name, callback) { throw new Error("'namespace' not implemented") } // eslint-disable-line no-unused-vars
116
+
117
+ /**
118
+ * Runs post.
119
+ * @abstract
120
+ * @param {string} name - Name.
121
+ * @returns {void} - No return value.
122
+ */
123
+ post(name) { throw new Error("'post' not implemented") } // eslint-disable-line no-unused-vars
124
+
125
+ /**
126
+ * Runs resources.
127
+ * @abstract
128
+ * @param {string} name - Name.
129
+ * @param {function(import("./resource-route.js").default) : void} callback - Callback function.
130
+ * @returns {void} - No return value.
131
+ */
132
+ resources(name, callback) { throw new Error("'resources' not implemented") } // eslint-disable-line no-unused-vars
133
+ }
@@ -0,0 +1,109 @@
1
+ // @ts-check
2
+
3
+ import BaseRoute from "./base-route.js"
4
+
5
+ export default class VelociousBasicRoute extends BaseRoute {
6
+ /**
7
+ * Runs get.
8
+ * @param {string} name - Route name.
9
+ */
10
+ get(name) {
11
+ const GetRoute = VelociousBasicRoute.GetRouteType
12
+ const route = new GetRoute({name})
13
+
14
+ this.routes.push(route)
15
+ }
16
+
17
+ /**
18
+ * Runs match with path.
19
+ * @param {object} args - Options object.
20
+ * @param {Record<string, ?>} args.params - Parameters object.
21
+ * @param {string} args.path - Path.
22
+ * @param {import("../http-server/client/request.js").default | import("../http-server/client/websocket-request.js").default} args.request - Request object.
23
+ * @returns {{restPath: string} | undefined} - REST path metadata for this route.
24
+ */
25
+ matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
26
+ throw new Error(`No 'matchWithPath' implemented on ${this.constructor.name}`)
27
+ }
28
+
29
+ /**
30
+ * Mounts a sub-application (e.g. the background-jobs dashboard API) at a path
31
+ * prefix, similar to mounting Sidekiq::Web in a Rails routes file. The
32
+ * mountable's `mountInto({configuration, ...options})` is invoked when the
33
+ * configuration receives the routes.
34
+ * @param {{mountInto: (args: object) => void}} mountable - Mountable with a static `mountInto` method.
35
+ * @param {object} [options] - Mount options. Must include an `at` path prefix starting with "/".
36
+ * @returns {void} - No return value.
37
+ */
38
+ mount(mountable, options = {}) {
39
+ if (!mountable || typeof mountable.mountInto !== "function") {
40
+ throw new Error("mount expects a mountable with a 'mountInto' method")
41
+ }
42
+
43
+ const at = /**
44
+ * Narrows the runtime value to the documented type.
45
+ @type {Record<string, ?>} */ (options).at
46
+
47
+ if (typeof at !== "string" || !at.startsWith("/")) {
48
+ throw new Error(`mount requires an 'at' option starting with '/', got: ${String(at)}`)
49
+ }
50
+
51
+ this.mounts.push({mountable, options})
52
+ }
53
+
54
+ /**
55
+ * Runs namespace.
56
+ * @param {string} name - Name.
57
+ * @param {function(import("./namespace-route.js").default) : void} callback - Callback function.
58
+ * @returns {void} - No return value.
59
+ */
60
+ namespace(name, callback) {
61
+ const NamespaceRoute = VelociousBasicRoute.NameSpaceRouteType
62
+
63
+ if (!NamespaceRoute) throw new Error("No NamespaceRoute registered")
64
+
65
+ const route = new NamespaceRoute({name})
66
+
67
+ this.routes.push(route)
68
+
69
+ if (callback) {
70
+ callback(route)
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Runs post.
76
+ * @param {string} name - Name.
77
+ * @returns {void} - No return value.
78
+ */
79
+ post(name) {
80
+ const PostRoute = VelociousBasicRoute.PostRouteType
81
+
82
+ if (!PostRoute) throw new Error("No PostRoute registered")
83
+
84
+ const route = new PostRoute({name})
85
+
86
+ this.routes.push(route)
87
+ }
88
+
89
+ /**
90
+ * Runs resources.
91
+ * @param {string} name - Name.
92
+ * @param {function(import("./resource-route.js").default) : void} [callback] - Callback function.
93
+ * @returns {void} - No return value.
94
+ */
95
+ resources(name, callback) {
96
+ const ResourceRoute = VelociousBasicRoute.ResourceRouteType
97
+
98
+ if (!ResourceRoute) throw new Error("No ResourceRoute registered")
99
+
100
+ const route = new ResourceRoute({name})
101
+
102
+ this.routes.push(route)
103
+
104
+ if (callback) {
105
+ callback(route)
106
+ }
107
+ }
108
+ }
109
+
@@ -0,0 +1,12 @@
1
+ import Controller from "../../../controller.js"
2
+
3
+ export default class BuiltInDebugController extends Controller {
4
+ /**
5
+ * Runs show.
6
+ * @returns {Promise<void>} - Resolves when the debug snapshot has been rendered.
7
+ */
8
+ async show() {
9
+ this._response.setHeader("Content-Type", "application/json; charset=UTF-8")
10
+ this._response.setBody(`${JSON.stringify(await this.getConfiguration().getDebugSnapshot(), null, 2)}\n`)
11
+ }
12
+ }
@@ -0,0 +1,7 @@
1
+ import Controller from "../../../controller.js"
2
+
3
+ export default class BuiltInErrorsController extends Controller {
4
+ async notFound() {
5
+ this.render({status: "not-found"})
6
+ }
7
+ }
@@ -0,0 +1 @@
1
+ Path not found: <%= controller.getRequest().path() %>
@@ -0,0 +1,75 @@
1
+ // @ts-check
2
+
3
+ import escapeStringRegexp from "escape-string-regexp"
4
+
5
+ import BaseRoute from "./base-route.js"
6
+ import restArgsError from "../utils/rest-args-error.js"
7
+
8
+ /**
9
+ * Runs assign action and controller.
10
+ * @param {Record<string, ?>} params - Route params object.
11
+ * @param {string} name - Route name.
12
+ * @returns {void} - No return value.
13
+ */
14
+ function assignActionAndController(params, name) {
15
+ const segments = name.split("/").filter((segment) => segment.length > 0)
16
+
17
+ if (segments.length <= 1) {
18
+ params.action = name
19
+ return
20
+ }
21
+
22
+ const actionSegment = segments[segments.length - 1]
23
+ const controllerSuffix = segments.slice(0, -1).join("/")
24
+ const existingController = typeof params.controller === "string" && params.controller.length > 0 ? params.controller : null
25
+
26
+ params.action = actionSegment
27
+ params.controller = existingController ? `${existingController}/${controllerSuffix}` : controllerSuffix
28
+ }
29
+
30
+ class VelociousRouteGetRoute extends BaseRoute {
31
+ /**
32
+ * Runs constructor.
33
+ * @param {object} args - Options object.
34
+ * @param {string} args.name - Name.
35
+ */
36
+ constructor({name, ...restArgs}) {
37
+ super()
38
+ restArgsError(restArgs)
39
+ this.name = name
40
+ this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
41
+ }
42
+
43
+ getHumanPaths() {
44
+ return [
45
+ {method: "GET", action: this.name, path: this.name}
46
+ ]
47
+ }
48
+
49
+ /**
50
+ * Runs match with path.
51
+ * @param {object} args - Options object.
52
+ * @param {Record<string, ?>} args.params - Parameters object.
53
+ * @param {string} args.path - Path.
54
+ * @param {import("../http-server/client/request.js").default | import("../http-server/client/websocket-request.js").default} args.request - Request object.
55
+ * @returns {{restPath: string} | undefined} - REST path metadata for this route.
56
+ */
57
+ matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
58
+ const match = path.match(this.regExp)
59
+
60
+ if (match) {
61
+ const [_beginnigSlash, _matchedName, restPath] = match
62
+
63
+ // Prevent partial prefix matches (e.g., "params" matching "params-with-query")
64
+ if (restPath && !restPath.startsWith("/")) return
65
+
66
+ assignActionAndController(params, this.name)
67
+
68
+ return {restPath}
69
+ }
70
+ }
71
+ }
72
+
73
+ BaseRoute.registerRouteGetType(VelociousRouteGetRoute)
74
+
75
+ export default VelociousRouteGetRoute
@@ -0,0 +1,100 @@
1
+ // @ts-check
2
+
3
+ import {frontendModelActionForCommand, frontendModelCustomCommandForPath, frontendModelResourcePath, frontendModelResourcesForBackendProject} from "../../frontend-models/resource-definition.js"
4
+
5
+ const SHARED_FRONTEND_MODEL_API_PATH = "/frontend-models"
6
+ const FRONTEND_MODEL_CONTROLLER_PATH = new URL("../../frontend-model-controller.js", import.meta.url).href
7
+
8
+ /**
9
+ * Runs frontend model command route hook.
10
+ * @param {object} args - Hook args.
11
+ * @param {import("../../configuration.js").default} args.configuration - Configuration instance.
12
+ * @param {string} args.currentPath - Request path without query.
13
+ * @param {boolean} [args.hasMatchingCustomRoute] - Set when the request path matches an explicit custom route.
14
+ * @returns {Promise<import("../../configuration-types.js").RouteResolverHookResult | null>} - Route override or null.
15
+ */
16
+ export default async function frontendModelCommandRouteHook({configuration, currentPath, hasMatchingCustomRoute}) {
17
+ const normalizedCurrentPath = normalizePath(currentPath)
18
+
19
+ if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
20
+ return {
21
+ action: "frontend-api",
22
+ controller: "velocious/api",
23
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
24
+ }
25
+ }
26
+
27
+ // Don't intercept paths that match explicitly defined custom routes
28
+ if (hasMatchingCustomRoute) return null
29
+
30
+ const backendProjects = configuration.getBackendProjects?.() || []
31
+ const customCommandMatch = frontendModelCustomCommandForPath({
32
+ backendProjects,
33
+ currentPath: normalizedCurrentPath
34
+ })
35
+
36
+ if (customCommandMatch) {
37
+ /**
38
+ * Params.
39
+ @type {Record<string, ?>} */
40
+ const params = {
41
+ frontendModelCustomCommandMethodName: customCommandMatch.methodName,
42
+ frontendModelCustomCommandScope: customCommandMatch.scope,
43
+ model: customCommandMatch.modelName
44
+ }
45
+
46
+ if (customCommandMatch.memberId) {
47
+ params.id = customCommandMatch.memberId
48
+ }
49
+
50
+ return {
51
+ action: "frontend-custom-command",
52
+ controller: customCommandMatch.resourcePath.replace(/^\/+/, ""),
53
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH,
54
+ params
55
+ }
56
+ }
57
+
58
+ for (const backendProject of backendProjects) {
59
+ const resources = frontendModelResourcesForBackendProject(backendProject)
60
+
61
+ for (const modelName in resources) {
62
+ const resourceDefinition = resources[modelName]
63
+ const resourcePath = frontendModelResourcePath(modelName, resourceDefinition)
64
+ const normalizedResourcePath = normalizePath(resourcePath)
65
+ const expectedPrefix = `${normalizedResourcePath}/`
66
+
67
+ if (!normalizedCurrentPath.startsWith(expectedPrefix)) continue
68
+
69
+ const commandName = normalizedCurrentPath.slice(expectedPrefix.length)
70
+ if (commandName.includes("/")) continue
71
+
72
+ const action = frontendModelActionForCommand({commandName, modelName, resourceDefinition})
73
+ if (!action) continue
74
+ const controller = normalizedResourcePath.replace(/^\/+/, "")
75
+
76
+ return {
77
+ action: `frontend-${action}`,
78
+ controller,
79
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
80
+ }
81
+ }
82
+ }
83
+
84
+ return null
85
+ }
86
+
87
+ /**
88
+ * Runs normalize path.
89
+ * @param {string} path - Path value.
90
+ * @returns {string} - Normalized path with leading slash and no trailing slash.
91
+ */
92
+ function normalizePath(path) {
93
+ const withLeadingSlash = path.startsWith("/") ? path : `/${path}`
94
+
95
+ if (withLeadingSlash.length > 1) {
96
+ return withLeadingSlash.replace(/\/+$/, "")
97
+ }
98
+
99
+ return withLeadingSlash
100
+ }
@@ -0,0 +1,50 @@
1
+ // @ts-check
2
+
3
+ import GetRoute from "./get-route.js" // eslint-disable-line no-unused-vars
4
+ import NameSpaceRoute from "./namespace-route.js" // eslint-disable-line no-unused-vars
5
+ import PostRoute from "./post-route.js" // eslint-disable-line no-unused-vars
6
+ import RootRoute from "./root-route.js"
7
+ import ResourceRoute from "./resource-route.js" // eslint-disable-line no-unused-vars
8
+
9
+ export default class VelociousRoutes {
10
+ rootRoute = new RootRoute()
11
+
12
+ /**
13
+ * Runs draw.
14
+ * @param {function(import("./root-route.js").default) : void} callback - Callback function.
15
+ * @returns {void} - No return value.
16
+ */
17
+ draw(callback) {
18
+ callback(this.rootRoute)
19
+ }
20
+
21
+ /**
22
+ * Collects all `route.mount(...)` registrations across the route tree so the
23
+ * configuration can apply them when the routes are set.
24
+ * @returns {Array<{mountable: {mountInto: (args: object) => void}, options: Record<string, ?>}>} - Declared mounts.
25
+ */
26
+ getMounts() {
27
+ /**
28
+ * Collected.
29
+ @type {Array<{mountable: {mountInto: (args: object) => void}, options: Record<string, ?>}>} */
30
+ const collected = []
31
+
32
+ /**
33
+ * Visit.
34
+ * @param {import("./base-route.js").default} route - Route to visit.
35
+ */
36
+ const visit = (route) => {
37
+ if (typeof route.getMounts === "function") {
38
+ collected.push(...route.getMounts())
39
+ }
40
+
41
+ for (const subRoute of route.getSubRoutes()) {
42
+ visit(subRoute)
43
+ }
44
+ }
45
+
46
+ visit(this.rootRoute)
47
+
48
+ return collected
49
+ }
50
+ }
@@ -0,0 +1,51 @@
1
+ // @ts-check
2
+
3
+ import restArgsError from "../utils/rest-args-error.js"
4
+ import BaseRoute from "./base-route.js"
5
+ import BasicRoute from "./basic-route.js"
6
+ import escapeStringRegexp from "escape-string-regexp"
7
+
8
+ class VelociousRouteNamespaceRoute extends BasicRoute {
9
+ /**
10
+ * Runs constructor.
11
+ * @param {object} args - Options object.
12
+ * @param {string} args.name - Name.
13
+ */
14
+ constructor({name, ...restArgs}) {
15
+ super()
16
+ restArgsError(restArgs)
17
+ this.name = name
18
+ this.regExp = new RegExp(`^(${escapeStringRegexp(name)})(.*)$`)
19
+ }
20
+
21
+ getHumanPaths() {
22
+ return [
23
+ {method: "GET", action: null, path: this.name}
24
+ ]
25
+ }
26
+
27
+ /**
28
+ * Runs match with path.
29
+ * @param {object} args - Options object.
30
+ * @param {Record<string, ?>} args.params - Parameters object.
31
+ * @param {string} args.path - Path.
32
+ * @param {import("../http-server/client/request.js").default | import("../http-server/client/websocket-request.js").default} args.request - Request object.
33
+ * @returns {{restPath: string} | undefined} - REST path metadata for this route.
34
+ */
35
+ matchWithPath({params, path, request}) { // eslint-disable-line no-unused-vars
36
+ const match = path.match(this.regExp)
37
+
38
+ if (match) {
39
+ const [_beginnigSlash, _matchedName, restPath] = match
40
+
41
+ params.controller = this.name
42
+
43
+ return {restPath}
44
+ }
45
+ }
46
+ }
47
+
48
+ BaseRoute.registerRouteNamespaceType(VelociousRouteNamespaceRoute)
49
+
50
+ export default VelociousRouteNamespaceRoute
51
+
@@ -0,0 +1,141 @@
1
+ /**
2
+ * AddRouteOptions type.
3
+ * @typedef {object} AddRouteOptions
4
+ * @property {Record<string, ?>} [params] - Static params to merge for matched route.
5
+ * @property {[typeof import("../controller.js").default, string]} to - Controller class and action tuple.
6
+ * @property {string} [viewPath] - Optional view path for controllers using renderView().
7
+ */
8
+
9
+ /** Lightweight plugin route DSL for route-hook backed endpoints. */
10
+ export default class PluginRoutes {
11
+ /**
12
+ * Runs constructor.
13
+ * @param {object} args - Options object.
14
+ * @param {import("../configuration.js").default} args.configuration - Configuration instance.
15
+ */
16
+ constructor(args) {
17
+ const {configuration} = args
18
+
19
+ if (!configuration) throw new Error("No configuration given")
20
+
21
+ this.configuration = configuration
22
+ }
23
+
24
+ /**
25
+ * Runs get.
26
+ * @param {string} routePath - Route path.
27
+ * @param {AddRouteOptions} options - Route options.
28
+ * @returns {void} - No return value.
29
+ */
30
+ get(routePath, options) {
31
+ this.addRoute("GET", routePath, options)
32
+ }
33
+
34
+ /**
35
+ * Runs post.
36
+ * @param {string} routePath - Route path.
37
+ * @param {AddRouteOptions} options - Route options.
38
+ * @returns {void} - No return value.
39
+ */
40
+ post(routePath, options) {
41
+ this.addRoute("POST", routePath, options)
42
+ }
43
+
44
+ /**
45
+ * Runs add route.
46
+ * @param {"GET" | "POST"} method - HTTP method.
47
+ * @param {string} routePath - Route path.
48
+ * @param {AddRouteOptions} options - Route options.
49
+ * @returns {void} - No return value.
50
+ */
51
+ addRoute(method, routePath, options) {
52
+ if (typeof routePath !== "string" || !routePath.startsWith("/")) {
53
+ throw new Error(`Expected route path to be a string starting with '/', got: ${String(routePath)}`)
54
+ }
55
+
56
+ const to = options?.to
57
+ const staticParams = options?.params
58
+ const viewPath = options?.viewPath
59
+ const controllerClass = to?.[0]
60
+ const action = to?.[1]
61
+
62
+ if (typeof action !== "string" || action.length < 1) {
63
+ throw new Error(`Expected route action to be a non-empty string, got: ${String(action)}`)
64
+ }
65
+
66
+ if (typeof controllerClass !== "function") {
67
+ throw new Error(`Expected route controller class in 'to: [ControllerClass, action]', got: ${String(controllerClass)}`)
68
+ }
69
+
70
+ const controllerName = typeof controllerClass.name === "string" && controllerClass.name.length > 0
71
+ ? controllerClass.name
72
+ : "pluginController"
73
+
74
+ if (viewPath !== undefined && typeof viewPath !== "string") {
75
+ throw new Error(`Expected route viewPath to be a string when provided, got: ${String(viewPath)}`)
76
+ }
77
+
78
+ this.configuration.addRouteResolverHook(({currentPath, request}) => {
79
+ if (request.httpMethod() !== method) return null
80
+ const matchedParams = this.matchPath(routePath, currentPath)
81
+
82
+ if (!matchedParams) return null
83
+
84
+ return {
85
+ action,
86
+ controller: controllerName,
87
+ controllerClass,
88
+ params: {
89
+ ...(staticParams || {}),
90
+ ...matchedParams
91
+ },
92
+ viewPath: viewPath || `${this.configuration.getDirectory()}/src/routes`
93
+ }
94
+ })
95
+ }
96
+
97
+ /**
98
+ * Runs match path.
99
+ * @param {string} routePath - Route pattern.
100
+ * @param {string} currentPath - Current request path.
101
+ * @returns {Record<string, string> | null} - Matched params or null.
102
+ */
103
+ matchPath(routePath, currentPath) {
104
+ const routeSegments = routePath.replace(/^\/+|\/+$/g, "").split("/")
105
+ const currentSegments = currentPath.replace(/^\/+|\/+$/g, "").split("/")
106
+
107
+ if (routePath === "/") {
108
+ return currentPath === "/" ? {} : null
109
+ }
110
+
111
+ if (routeSegments.length !== currentSegments.length) return null
112
+
113
+ /**
114
+ * Params.
115
+ @type {Record<string, string>} */
116
+ const params = {}
117
+
118
+ for (let index = 0; index < routeSegments.length; index += 1) {
119
+ const routeSegment = routeSegments[index]
120
+ const currentSegment = currentSegments[index]
121
+
122
+ if (routeSegment.startsWith(":")) {
123
+ const key = routeSegment.slice(1)
124
+
125
+ if (!key) return null
126
+
127
+ try {
128
+ params[key] = decodeURIComponent(currentSegment)
129
+ } catch {
130
+ return null
131
+ }
132
+
133
+ continue
134
+ }
135
+
136
+ if (routeSegment !== currentSegment) return null
137
+ }
138
+
139
+ return params
140
+ }
141
+ }