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,859 @@
1
+ // @ts-check
2
+
3
+ import * as inflection from "inflection"
4
+ import {isPlainObject} from "is-plain-object"
5
+ import {resolveFrontendModelClass} from "../frontend-models/model-registry.js"
6
+
7
+ /**
8
+ * RansackPredicate type.
9
+ * @typedef {"cont" | "end" | "eq" | "gt" | "gteq" | "in" | "lt" | "lteq" | "not_eq" | "not_in" | "null" | "start"} RansackPredicate
10
+ */
11
+
12
+ /**
13
+ * RansackCombinator type.
14
+ * @typedef {"and" | "or"} RansackCombinator
15
+ */
16
+
17
+ /**
18
+ * RansackModelClass type.
19
+ * @typedef {typeof import("../database/record/index.js").default | typeof import("../frontend-models/base.js").default} RansackModelClass
20
+ */
21
+
22
+ /**
23
+ * RansackAttribute type.
24
+ * @typedef {object} RansackAttribute
25
+ * @property {string} attributeName - Resolved attribute name.
26
+ * @property {string[]} path - Resolved relationship path.
27
+ */
28
+
29
+ /**
30
+ * RansackCondition type.
31
+ * @typedef {object} RansackCondition
32
+ * @property {RansackAttribute[]} attributes - Resolved attributes to test.
33
+ * @property {RansackCombinator} combinator - How multiple attributes are combined.
34
+ * @property {RansackPredicate} predicate - Parsed Ransack predicate.
35
+ * @property {?} value - Normalized value.
36
+ */
37
+
38
+ /**
39
+ * RansackGroup type.
40
+ * @typedef {object} RansackGroup
41
+ * @property {RansackCombinator} combinator - How entries inside this group are combined.
42
+ * @property {RansackCondition[]} conditions - Conditions in this group.
43
+ * @property {RansackGroup[]} groupings - Nested groups.
44
+ */
45
+
46
+ const supportedPredicates = [
47
+ "not_in",
48
+ "not_eq",
49
+ "gteq",
50
+ "lteq",
51
+ "start",
52
+ "cont",
53
+ "null",
54
+ "end",
55
+ "eq",
56
+ "gt",
57
+ "lt",
58
+ "in"
59
+ ]
60
+
61
+ /**
62
+ * Runs the normalizeRansackParams helper.
63
+ * @param {RansackModelClass} modelClass - Model class.
64
+ * @param {Record<string, ?>} params - Ransack-style params hash.
65
+ * @returns {RansackCondition[]} - Normalized conditions.
66
+ */
67
+ export function normalizeRansackParams(modelClass, params) {
68
+ return normalizeRansackGroup(modelClass, params).conditions
69
+ }
70
+
71
+ /**
72
+ * Runs the normalizeRansackGroup helper.
73
+ * @param {RansackModelClass} modelClass - Model class.
74
+ * @param {Record<string, ?>} params - Ransack-style params hash.
75
+ * @returns {RansackGroup} - Normalized group.
76
+ */
77
+ export function normalizeRansackGroup(modelClass, params) {
78
+ if (!isPlainObject(params)) {
79
+ throw new Error(`ransack params must be a plain object, got: ${typeof params}`)
80
+ }
81
+
82
+ /**
83
+ * Normalized.
84
+ @type {RansackGroup} */
85
+ const normalized = {
86
+ combinator: normalizeRansackCombinator(params.m, "and"),
87
+ conditions: [],
88
+ groupings: []
89
+ }
90
+
91
+ for (const [key, rawValue] of Object.entries(params)) {
92
+ if (key === "m") {
93
+ continue
94
+ }
95
+
96
+ if (key === "c") {
97
+ normalized.conditions.push(...normalizeAdvancedRansackConditions({modelClass, value: rawValue}))
98
+ continue
99
+ }
100
+
101
+ if (key === "g") {
102
+ normalized.groupings.push(...normalizeAdvancedRansackGroups({modelClass, value: rawValue}))
103
+ continue
104
+ }
105
+
106
+ const condition = normalizeSimpleRansackCondition({key, modelClass, rawValue})
107
+ if (condition) normalized.conditions.push(condition)
108
+ }
109
+
110
+ return normalized
111
+ }
112
+
113
+ const SKIP_RANSACK_CONDITION = Symbol("skip-ransack-condition")
114
+
115
+ /**
116
+ * Runs normalize simple ransack condition.
117
+ * @param {object} args - Options.
118
+ * @param {string} args.key - Simple Ransack key.
119
+ * @param {RansackModelClass} args.modelClass - Model class.
120
+ * @param {?} args.rawValue - Raw condition value.
121
+ * @returns {RansackCondition | null} - Normalized condition, or null when skipped.
122
+ */
123
+ function normalizeSimpleRansackCondition({key, modelClass, rawValue}) {
124
+ const parsedKey = parseRansackKey(key)
125
+
126
+ if (!parsedKey) {
127
+ throw new Error(`Unsupported ransack predicate in key: ${key}`)
128
+ }
129
+
130
+ const value = normalizeRansackValue({
131
+ predicate: parsedKey.predicate,
132
+ value: rawValue
133
+ })
134
+
135
+ if (value === SKIP_RANSACK_CONDITION) return null
136
+
137
+ const attributes = resolveRansackAttributes({modelClass, value: parsedKey.pathValue})
138
+
139
+ return {
140
+ attributes,
141
+ combinator: attributes.length > 1 ? "or" : "and",
142
+ predicate: parsedKey.predicate,
143
+ value
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Runs normalize advanced ransack conditions.
149
+ * @param {object} args - Options.
150
+ * @param {RansackModelClass} args.modelClass - Model class.
151
+ * @param {?} args.value - Advanced conditions collection.
152
+ * @returns {RansackCondition[]} - Normalized conditions.
153
+ */
154
+ function normalizeAdvancedRansackConditions({modelClass, value}) {
155
+ /**
156
+ * Conditions.
157
+ @type {RansackCondition[]} */
158
+ const conditions = []
159
+
160
+ for (const entry of normalizeRansackCollection(value, "conditions")) {
161
+ if (!isPlainObject(entry)) {
162
+ throw new Error(`Ransack condition entries must be plain objects, got: ${typeof entry}`)
163
+ }
164
+
165
+ const predicateValue = entry.p
166
+
167
+ if (typeof predicateValue !== "string") {
168
+ throw new Error("Ransack condition predicate must be a string")
169
+ }
170
+
171
+ if (!supportedPredicates.includes(predicateValue)) {
172
+ throw new Error(`Unsupported ransack predicate in condition: ${predicateValue}`)
173
+ }
174
+
175
+ const predicate = /**
176
+ * Narrows the runtime value to the documented type.
177
+ @type {RansackPredicate} */ (predicateValue)
178
+ const rawValue = advancedRansackConditionValue({predicate, value: entry.v})
179
+ const normalizedValue = normalizeRansackValue({predicate, value: rawValue})
180
+
181
+ if (normalizedValue === SKIP_RANSACK_CONDITION) continue
182
+
183
+ const attributes = resolveRansackAttributesFromAdvancedValue({modelClass, value: entry.a})
184
+
185
+ conditions.push({
186
+ attributes,
187
+ combinator: normalizeRansackCombinator(entry.m, attributes.length > 1 ? "or" : "and"),
188
+ predicate,
189
+ value: normalizedValue
190
+ })
191
+ }
192
+
193
+ return conditions
194
+ }
195
+
196
+ /**
197
+ * Runs normalize advanced ransack groups.
198
+ * @param {object} args - Options.
199
+ * @param {RansackModelClass} args.modelClass - Model class.
200
+ * @param {?} args.value - Advanced groups collection.
201
+ * @returns {RansackGroup[]} - Normalized groups.
202
+ */
203
+ function normalizeAdvancedRansackGroups({modelClass, value}) {
204
+ /**
205
+ * Groupings.
206
+ @type {RansackGroup[]} */
207
+ const groupings = []
208
+
209
+ for (const entry of normalizeRansackCollection(value, "groupings")) {
210
+ if (!isPlainObject(entry)) {
211
+ throw new Error(`Ransack grouping entries must be plain objects, got: ${typeof entry}`)
212
+ }
213
+
214
+ groupings.push(normalizeRansackGroup(modelClass, entry))
215
+ }
216
+
217
+ return groupings
218
+ }
219
+
220
+ /**
221
+ * Runs normalize ransack combinator.
222
+ * @param {?} value - Candidate combinator.
223
+ * @param {RansackCombinator} defaultValue - Default combinator.
224
+ * @returns {RansackCombinator} - Normalized combinator.
225
+ */
226
+ function normalizeRansackCombinator(value, defaultValue) {
227
+ if (value === undefined || value === null || value === "") return defaultValue
228
+ if (value === "and" || value === "or") return value
229
+
230
+ throw new Error(`Invalid ransack combinator: ${String(value)}`)
231
+ }
232
+
233
+ /**
234
+ * Runs normalize ransack collection.
235
+ * @param {?} value - Candidate collection.
236
+ * @param {string} name - Collection name for errors.
237
+ * @returns {Array<?>} - Collection values in stable order.
238
+ */
239
+ function normalizeRansackCollection(value, name) {
240
+ if (value === undefined || value === null || value === "") return []
241
+ if (Array.isArray(value)) return value
242
+
243
+ if (isPlainObject(value)) {
244
+ return Object.keys(value)
245
+ .sort((left, right) => {
246
+ const leftNumber = Number(left)
247
+ const rightNumber = Number(right)
248
+
249
+ if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {
250
+ return leftNumber - rightNumber
251
+ }
252
+
253
+ return left.localeCompare(right)
254
+ })
255
+ .map((key) => value[key])
256
+ }
257
+
258
+ throw new Error(`Ransack ${name} must be an array or object, got: ${typeof value}`)
259
+ }
260
+
261
+ /**
262
+ * Runs advanced ransack condition value.
263
+ * @param {object} args - Options.
264
+ * @param {RansackPredicate} args.predicate - Parsed predicate.
265
+ * @param {?} args.value - Advanced condition value.
266
+ * @returns {?} - Value passed to predicate normalization.
267
+ */
268
+ function advancedRansackConditionValue({predicate, value}) {
269
+ if (predicate === "in" || predicate === "not_in") return value
270
+
271
+ if (Array.isArray(value)) {
272
+ return value.find((entry) => entry !== undefined && entry !== null && entry !== "")
273
+ }
274
+
275
+ return value
276
+ }
277
+
278
+ /**
279
+ * Runs resolve ransack attributes from advanced value.
280
+ * @param {object} args - Options.
281
+ * @param {RansackModelClass} args.modelClass - Model class.
282
+ * @param {?} args.value - Advanced attribute value.
283
+ * @returns {RansackAttribute[]} - Resolved attributes.
284
+ */
285
+ function resolveRansackAttributesFromAdvancedValue({modelClass, value}) {
286
+ const values = normalizeAdvancedAttributeValues(value)
287
+ /**
288
+ * Attributes.
289
+ @type {RansackAttribute[]} */
290
+ const attributes = []
291
+
292
+ for (const attributeValue of values) {
293
+ attributes.push(...resolveRansackAttributes({modelClass, value: attributeValue}))
294
+ }
295
+
296
+ if (attributes.length < 1) {
297
+ throw new Error("Ransack condition must include at least one attribute")
298
+ }
299
+
300
+ return attributes
301
+ }
302
+
303
+ /**
304
+ * Runs normalize advanced attribute values.
305
+ * @param {?} value - Advanced attribute value.
306
+ * @returns {string[]} - Attribute path strings.
307
+ */
308
+ function normalizeAdvancedAttributeValues(value) {
309
+ if (typeof value === "string") return [value]
310
+
311
+ if (Array.isArray(value)) {
312
+ return value.map((entry) => normalizeAdvancedAttributeValue(entry))
313
+ }
314
+
315
+ if (isPlainObject(value)) {
316
+ return normalizeRansackCollection(value, "attributes").map((entry) => normalizeAdvancedAttributeValue(entry))
317
+ }
318
+
319
+ throw new Error(`Ransack condition attributes must be strings, arrays, or objects, got: ${typeof value}`)
320
+ }
321
+
322
+ /**
323
+ * Runs normalize advanced attribute value.
324
+ * @param {?} value - Advanced attribute entry.
325
+ * @returns {string} - Attribute path string.
326
+ */
327
+ function normalizeAdvancedAttributeValue(value) {
328
+ if (typeof value === "string") return value
329
+
330
+ if (isPlainObject(value) && typeof value.name === "string") {
331
+ return value.name
332
+ }
333
+
334
+ throw new Error(`Ransack condition attribute entries must be strings or {name}, got: ${typeof value}`)
335
+ }
336
+
337
+ /**
338
+ * Runs resolve ransack attributes.
339
+ * @param {object} args - Options.
340
+ * @param {RansackModelClass} args.modelClass - Model class.
341
+ * @param {string} args.value - Attribute path value.
342
+ * @returns {RansackAttribute[]} - Resolved attributes.
343
+ */
344
+ function resolveRansackAttributes({modelClass, value}) {
345
+ return value.split("_or_").map((attributeValue) => {
346
+ const resolvedPath = resolveRansackPath({modelClass, value: attributeValue})
347
+ const targetModelClass = modelClassAtPath({modelClass, path: resolvedPath.path})
348
+ const attributeName = resolveAttributeName({modelClass: targetModelClass, value: resolvedPath.attributeValue})
349
+
350
+ if (!attributeName) {
351
+ throw new Error(`Unknown ransack attribute "${resolvedPath.attributeValue}" for ${targetModelClass.name}`)
352
+ }
353
+
354
+ return {
355
+ attributeName,
356
+ path: resolvedPath.path
357
+ }
358
+ })
359
+ }
360
+
361
+ /**
362
+ * Runs model class at path.
363
+ * @param {object} args - Options.
364
+ * @param {RansackModelClass} args.modelClass - Root model class.
365
+ * @param {string[]} args.path - Relationship path.
366
+ * @returns {RansackModelClass} - Target model class.
367
+ */
368
+ function modelClassAtPath({modelClass, path}) {
369
+ let currentModelClass = modelClass
370
+
371
+ for (const relationshipName of path) {
372
+ const relationship = relationshipEntries(currentModelClass)[relationshipName]
373
+
374
+ if (!relationship) {
375
+ throw new Error(`Unknown ransack relationship "${relationshipName}" for ${currentModelClass.name}`)
376
+ }
377
+
378
+ currentModelClass = relationship.targetModelClass
379
+ }
380
+
381
+ return currentModelClass
382
+ }
383
+
384
+ /**
385
+ * Runs resolve ransack path.
386
+ * @param {object} args - Options.
387
+ * @param {RansackModelClass} args.modelClass - Current model class.
388
+ * @param {string} args.value - Remaining path value.
389
+ * @returns {{attributeValue: string, path: string[]}} - Resolved relationship path and remaining attribute value.
390
+ */
391
+ function resolveRansackPath({modelClass, value}) {
392
+ /**
393
+ * Path.
394
+ @type {string[]} */
395
+ const path = []
396
+ let currentModelClass = modelClass
397
+ let remainingValue = value
398
+
399
+ while (true) {
400
+ if (resolveAttributeName({modelClass: currentModelClass, value: remainingValue})) {
401
+ break
402
+ }
403
+
404
+ const match = findRelationshipPrefix({
405
+ modelClass: currentModelClass,
406
+ value: remainingValue
407
+ })
408
+
409
+ if (!match) break
410
+
411
+ path.push(match.relationshipName)
412
+ currentModelClass = match.targetModelClass
413
+ remainingValue = match.remainingValue
414
+ }
415
+
416
+ if (remainingValue.length < 1) {
417
+ throw new Error(`Invalid ransack key path: ${value}`)
418
+ }
419
+
420
+ return {
421
+ attributeValue: remainingValue,
422
+ path
423
+ }
424
+ }
425
+
426
+ /**
427
+ * Runs find relationship prefix.
428
+ * @param {object} args - Options.
429
+ * @param {RansackModelClass} args.modelClass - Current model class.
430
+ * @param {string} args.value - Remaining value to match.
431
+ * @returns {{relationshipName: string, remainingValue: string, targetModelClass: RansackModelClass} | null} - Matching relationship prefix.
432
+ */
433
+ function findRelationshipPrefix({modelClass, value}) {
434
+ let bestMatch = null
435
+
436
+ for (const relationshipName of Object.keys(relationshipEntries(modelClass))) {
437
+ const relationship = relationshipEntries(modelClass)[relationshipName]
438
+
439
+ for (const candidate of relationshipCandidates(relationshipName)) {
440
+ const remainingValue = stripRelationshipCandidate(value, candidate)
441
+
442
+ if (remainingValue === null) continue
443
+ if (remainingValue.length < 1) continue
444
+ if (bestMatch && candidate.length <= bestMatch.candidateLength) continue
445
+
446
+ bestMatch = {
447
+ candidateLength: candidate.length,
448
+ relationshipName,
449
+ remainingValue,
450
+ targetModelClass: relationship.targetModelClass
451
+ }
452
+ }
453
+ }
454
+
455
+ if (!bestMatch) return null
456
+
457
+ return {
458
+ relationshipName: bestMatch.relationshipName,
459
+ remainingValue: bestMatch.remainingValue,
460
+ targetModelClass: bestMatch.targetModelClass
461
+ }
462
+ }
463
+
464
+ /**
465
+ * Returns the portion of `value` after `candidate` when `candidate`
466
+ * sits at a relationship-path boundary, or null when there's no
467
+ * boundary match. Two boundary forms are accepted:
468
+ * - snake: `<candidate>_` followed by the rest of the path (e.g.
469
+ * `task_project_id` against candidate `task` returns `project_id`).
470
+ * - camel: `<candidate>` immediately followed by an uppercase letter,
471
+ * which marks a new word in camelCase (e.g. `taskProjectId` against
472
+ * candidate `task` returns `projectId` with the leading `P`
473
+ * lowercased so the remainder stays in caller-form for the next
474
+ * attribute / relationship match).
475
+ * @param {string} value - Remaining ransack path.
476
+ * @param {string} candidate - Relationship name candidate.
477
+ * @returns {string | null} - Remainder after the candidate, or null.
478
+ */
479
+ function stripRelationshipCandidate(value, candidate) {
480
+ if (value.startsWith(`${candidate}_`)) {
481
+ return value.slice(candidate.length + 1)
482
+ }
483
+
484
+ if (value.length <= candidate.length) return null
485
+ if (!value.startsWith(candidate)) return null
486
+
487
+ const nextChar = value.charAt(candidate.length)
488
+
489
+ if (nextChar < "A" || nextChar > "Z") return null
490
+
491
+ return nextChar.toLowerCase() + value.slice(candidate.length + 1)
492
+ }
493
+
494
+ /**
495
+ * Runs relationship candidates.
496
+ * @param {string} relationshipName - Relationship name.
497
+ * @returns {string[]} - Candidate tokens for matching.
498
+ */
499
+ function relationshipCandidates(relationshipName) {
500
+ return uniqunize([relationshipName, inflection.underscore(relationshipName)])
501
+ }
502
+
503
+ /**
504
+ * Runs resolve attribute name.
505
+ * @param {object} args - Options.
506
+ * @param {RansackModelClass} args.modelClass - Model class.
507
+ * @param {string} args.value - Attribute candidate.
508
+ * @returns {string | undefined} - Resolved attribute name.
509
+ */
510
+ function resolveAttributeName({modelClass, value}) {
511
+ for (const [attributeName, columnName] of Object.entries(attributeEntries(modelClass))) {
512
+ if (matchesAttributeValue({attributeName, columnName, value})) {
513
+ return attributeName
514
+ }
515
+ }
516
+
517
+ return undefined
518
+ }
519
+
520
+ /**
521
+ * Runs relationship entries.
522
+ * @param {RansackModelClass} modelClass - Model class.
523
+ * @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
524
+ */
525
+ function relationshipEntries(modelClass) {
526
+ if (typeof /**
527
+ * Narrows the runtime value to the documented type.
528
+ @type {?} */ (modelClass).getRelationshipsMap === "function") {
529
+ return backendRelationshipEntries(modelClass)
530
+ }
531
+
532
+ if (typeof /**
533
+ * Narrows the runtime value to the documented type.
534
+ @type {?} */ (modelClass).relationshipDefinitions === "function" &&
535
+ typeof /**
536
+ * Narrows the runtime value to the documented type.
537
+ @type {?} */ (modelClass).relationshipModelClasses === "function") {
538
+ return frontendRelationshipEntries(modelClass)
539
+ }
540
+
541
+ return {}
542
+ }
543
+
544
+ /**
545
+ * Runs backend relationship entries.
546
+ * @param {RansackModelClass} modelClass - Backend model class.
547
+ * @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
548
+ */
549
+ function backendRelationshipEntries(modelClass) {
550
+ /**
551
+ * Entries.
552
+ @type {Record<string, {targetModelClass: RansackModelClass}>} */
553
+ const entries = {}
554
+ const relationshipsMap = /**
555
+ * Narrows the runtime value to the documented type.
556
+ @type {?} */ (modelClass).getRelationshipsMap()
557
+
558
+ for (const relationshipName of Object.keys(relationshipsMap)) {
559
+ const relationship = relationshipsMap[relationshipName]
560
+
561
+ if (typeof relationship.isPolymorphic === "function" && relationship.isPolymorphic()) continue
562
+
563
+ const targetModelClass = relationship.getTargetModelClass()
564
+
565
+ if (!targetModelClass) continue
566
+
567
+ entries[relationshipName] = {targetModelClass}
568
+ }
569
+
570
+ return entries
571
+ }
572
+
573
+ /**
574
+ * Runs frontend relationship entries.
575
+ * @param {RansackModelClass} modelClass - Frontend model class.
576
+ * @returns {Record<string, {targetModelClass: RansackModelClass}>} - Relationship entries keyed by name.
577
+ */
578
+ function frontendRelationshipEntries(modelClass) {
579
+ /**
580
+ * Entries.
581
+ @type {Record<string, {targetModelClass: RansackModelClass}>} */
582
+ const entries = {}
583
+ const definitions = /**
584
+ * Narrows the runtime value to the documented type.
585
+ @type {?} */ (modelClass).relationshipDefinitions()
586
+ const relationshipModelClasses = /**
587
+ * Narrows the runtime value to the documented type.
588
+ @type {?} */ (modelClass).relationshipModelClasses()
589
+
590
+ for (const relationshipName of Object.keys(definitions)) {
591
+ const targetModelClass = resolveFrontendModelClass(relationshipModelClasses[relationshipName])
592
+
593
+ if (!targetModelClass) continue
594
+
595
+ entries[relationshipName] = {targetModelClass}
596
+ }
597
+
598
+ return entries
599
+ }
600
+
601
+ /**
602
+ * Runs attribute entries.
603
+ * @param {RansackModelClass} modelClass - Model class.
604
+ * @returns {Record<string, string>} - Attribute-to-column entries keyed by attribute name.
605
+ */
606
+ function attributeEntries(modelClass) {
607
+ if (typeof /**
608
+ * Narrows the runtime value to the documented type.
609
+ @type {?} */ (modelClass).getAttributeNameToColumnNameMap === "function") {
610
+ return /** Narrows the runtime value to the documented type. @type {Record<string, string>} */ ((/**
611
+ * Narrows the runtime value to the documented type.
612
+ @type {?} */ (modelClass).getAttributeNameToColumnNameMap()))
613
+ }
614
+
615
+ const resourceConfig = typeof /**
616
+ * Narrows the runtime value to the documented type.
617
+ @type {?} */ (modelClass).resourceConfig === "function"
618
+ ? /**
619
+ * Narrows the runtime value to the documented type.
620
+ @type {?} */ (modelClass).resourceConfig()
621
+ : {}
622
+ const attributes = resourceConfig.attributes
623
+ /**
624
+ * Entries.
625
+ @type {Record<string, string>} */
626
+ const entries = {}
627
+
628
+ if (Array.isArray(attributes)) {
629
+ for (const attributeName of attributes) {
630
+ if (typeof attributeName !== "string") continue
631
+
632
+ entries[attributeName] = attributeName
633
+ }
634
+ } else if (isPlainObject(attributes)) {
635
+ for (const attributeName of Object.keys(attributes)) {
636
+ entries[attributeName] = attributeName
637
+ }
638
+ }
639
+
640
+ return entries
641
+ }
642
+
643
+ /**
644
+ * Runs matches attribute value.
645
+ * @param {object} args - Options.
646
+ * @param {string} args.attributeName - Attribute name.
647
+ * @param {string} args.columnName - Column name.
648
+ * @param {string} args.value - Candidate value.
649
+ * @returns {boolean} - Whether the candidate resolves to the attribute.
650
+ */
651
+ function matchesAttributeValue({attributeName, columnName, value}) {
652
+ return uniqunize([
653
+ attributeName,
654
+ columnName,
655
+ inflection.underscore(attributeName),
656
+ inflection.underscore(columnName)
657
+ ]).includes(value)
658
+ }
659
+
660
+ /**
661
+ * Runs parse ransack key.
662
+ * @param {string} key - Ransack key.
663
+ * @returns {{pathValue: string, predicate: RansackPredicate} | null} - Parsed key.
664
+ */
665
+ function parseRansackKey(key) {
666
+ for (const predicate of supportedPredicates) {
667
+ const suffix = `_${predicate}`
668
+ if (!key.endsWith(suffix)) continue
669
+
670
+ const pathValue = key.slice(0, key.length - suffix.length)
671
+
672
+ if (pathValue.length < 1) {
673
+ throw new Error(`Invalid ransack key: ${key}`)
674
+ }
675
+
676
+ return {
677
+ pathValue,
678
+ predicate: /**
679
+ * Narrows the runtime value to the documented type.
680
+ @type {RansackPredicate} */ (predicate)
681
+ }
682
+ }
683
+
684
+ for (const predicate of supportedPredicates) {
685
+ const camelSuffix = snakeToCamelSuffix(predicate)
686
+
687
+ if (!key.endsWith(camelSuffix)) continue
688
+
689
+ const pathValue = key.slice(0, key.length - camelSuffix.length)
690
+
691
+ if (pathValue.length < 1) {
692
+ throw new Error(`Invalid ransack key: ${key}`)
693
+ }
694
+
695
+ return {
696
+ pathValue,
697
+ predicate: /**
698
+ * Narrows the runtime value to the documented type.
699
+ @type {RansackPredicate} */ (predicate)
700
+ }
701
+ }
702
+
703
+ return null
704
+ }
705
+
706
+ /**
707
+ * Runs snake to camel suffix.
708
+ * @param {string} value - Snake-case predicate.
709
+ * @returns {string} - CamelCase predicate suffix used in ransack keys.
710
+ */
711
+ function snakeToCamelSuffix(value) {
712
+ const segments = value.split("_")
713
+
714
+ return segments.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("")
715
+ }
716
+
717
+ /**
718
+ * Runs normalize ransack value.
719
+ * @param {object} args - Options.
720
+ * @param {RansackPredicate} args.predicate - Parsed predicate.
721
+ * @param {?} args.value - Raw value.
722
+ * @returns {?} - Normalized value.
723
+ */
724
+ function normalizeRansackValue({predicate, value}) {
725
+ if (predicate === "null") {
726
+ return normalizeRansackNullValue(value)
727
+ }
728
+
729
+ if (predicate === "in" || predicate === "not_in") {
730
+ return normalizeRansackListValue(value)
731
+ }
732
+
733
+ if (ransackValueIsBlank(value)) return SKIP_RANSACK_CONDITION
734
+
735
+ return value
736
+ }
737
+
738
+ /**
739
+ * Runs normalize ransack null value.
740
+ * @param {?} value - Candidate null predicate value.
741
+ * @returns {boolean | typeof SKIP_RANSACK_CONDITION} - Normalized value.
742
+ */
743
+ function normalizeRansackNullValue(value) {
744
+ const booleanValue = normalizeRansackBoolean(value)
745
+
746
+ return booleanValue === null ? SKIP_RANSACK_CONDITION : booleanValue
747
+ }
748
+
749
+ /**
750
+ * Runs normalize ransack list value.
751
+ * @param {?} value - Candidate list predicate value.
752
+ * @returns {Array<?> | typeof SKIP_RANSACK_CONDITION} - Normalized value.
753
+ */
754
+ function normalizeRansackListValue(value) {
755
+ const normalizedArray = normalizeRansackArray(value)
756
+
757
+ return normalizedArray.length < 1 ? SKIP_RANSACK_CONDITION : normalizedArray
758
+ }
759
+
760
+ /**
761
+ * Ransack true values.
762
+ @type {Set<?>} */
763
+ const ransackTrueValues = new Set([true, 1, "1", "true"])
764
+ /**
765
+ * Ransack false values.
766
+ @type {Set<?>} */
767
+ const ransackFalseValues = new Set([false, 0, "0", "false"])
768
+
769
+ /**
770
+ * Runs normalize ransack boolean.
771
+ * @param {?} value - Candidate boolean.
772
+ * @returns {boolean | null} - Normalized boolean or null when blank.
773
+ */
774
+ function normalizeRansackBoolean(value) {
775
+ if (ransackTrueValues.has(value)) return true
776
+ if (ransackFalseValues.has(value)) return false
777
+ if (ransackValueIsBlank(value)) return null
778
+
779
+ throw new Error(`Invalid ransack boolean value: ${String(value)}`)
780
+ }
781
+
782
+ /**
783
+ * Runs ransack value is blank.
784
+ * @param {?} value - Candidate value.
785
+ * @returns {boolean} - Whether value should be ignored as blank.
786
+ */
787
+ function ransackValueIsBlank(value) {
788
+ return value === undefined || value === null || value === ""
789
+ }
790
+
791
+ /**
792
+ * Runs normalize ransack array.
793
+ * @param {?} value - Candidate array-ish value.
794
+ * @returns {Array<?>} - Normalized array values.
795
+ */
796
+ function normalizeRansackArray(value) {
797
+ if (Array.isArray(value)) {
798
+ return value.filter((entry) => entry !== undefined && entry !== null && entry !== "")
799
+ }
800
+
801
+ if (typeof value === "string") {
802
+ return value.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0)
803
+ }
804
+
805
+ if (value === undefined || value === null || value === "") return []
806
+
807
+ return [value]
808
+ }
809
+
810
+ /**
811
+ * RansackSort type.
812
+ * @typedef {object} RansackSort
813
+ * @property {string} attribute - Resolved attribute name.
814
+ * @property {"asc" | "desc"} direction - Sort direction.
815
+ */
816
+
817
+ /**
818
+ * Parses and validates a ransack `s` sort string against model attributes.
819
+ * @param {RansackModelClass} modelClass - Model class for attribute validation.
820
+ * @param {string} sortString - Ransack sort string (e.g., "name asc" or "name asc, createdAt desc").
821
+ * @returns {RansackSort[]} - Validated sort definitions.
822
+ */
823
+ export function parseRansackSort(modelClass, sortString) {
824
+ const segments = sortString.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0)
825
+
826
+ /**
827
+ * Sorts.
828
+ @type {RansackSort[]} */
829
+ const sorts = []
830
+
831
+ for (const segment of segments) {
832
+ const parts = segment.split(/\s+/)
833
+ const columnCandidate = parts[0]
834
+ const directionCandidate = parts.length > 1 ? parts[1].toLowerCase() : "asc"
835
+
836
+ if (directionCandidate !== "asc" && directionCandidate !== "desc") {
837
+ throw new Error(`Invalid ransack sort direction "${directionCandidate}" in: ${segment}`)
838
+ }
839
+
840
+ const resolvedAttribute = resolveAttributeName({modelClass, value: columnCandidate})
841
+
842
+ if (!resolvedAttribute) {
843
+ throw new Error(`Unknown ransack sort attribute "${columnCandidate}" for ${modelClass.name}`)
844
+ }
845
+
846
+ sorts.push({attribute: resolvedAttribute, direction: directionCandidate})
847
+ }
848
+
849
+ return sorts
850
+ }
851
+
852
+ /**
853
+ * Runs uniqunize.
854
+ * @param {string[]} values - Input values.
855
+ * @returns {string[]} - Unique values in original order.
856
+ */
857
+ function uniqunize(values) {
858
+ return Array.from(new Set(values))
859
+ }