velocious 1.0.431 → 1.0.433

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 (794) hide show
  1. package/build/application.js +229 -0
  2. package/build/authorization/ability.js +329 -0
  3. package/build/authorization/base-resource.js +143 -0
  4. package/build/background-jobs/client.js +50 -0
  5. package/build/background-jobs/cron-expression.js +277 -0
  6. package/build/background-jobs/forked-runner-child.js +86 -0
  7. package/build/background-jobs/job-record.js +13 -0
  8. package/build/background-jobs/job-registry.js +92 -0
  9. package/build/background-jobs/job-runner.js +107 -0
  10. package/build/background-jobs/job.js +77 -0
  11. package/build/background-jobs/json-socket.js +78 -0
  12. package/build/background-jobs/main.js +926 -0
  13. package/build/background-jobs/normalize-error.js +26 -0
  14. package/build/background-jobs/scheduler.js +274 -0
  15. package/build/background-jobs/socket-request.js +68 -0
  16. package/build/background-jobs/status-reporter.js +101 -0
  17. package/build/background-jobs/store.js +994 -0
  18. package/build/background-jobs/types.js +70 -0
  19. package/build/background-jobs/web/authorization.js +89 -0
  20. package/build/background-jobs/web/controller.js +280 -0
  21. package/build/background-jobs/web/index.js +57 -0
  22. package/build/background-jobs/web/path-matcher.js +74 -0
  23. package/build/background-jobs/web/registry.js +49 -0
  24. package/build/background-jobs/worker.js +683 -0
  25. package/build/beacon/client.js +330 -0
  26. package/build/beacon/in-process-broker.js +71 -0
  27. package/build/beacon/in-process-client.js +139 -0
  28. package/build/beacon/server.js +148 -0
  29. package/build/beacon/types.js +55 -0
  30. package/build/cli/base-command.js +67 -0
  31. package/build/cli/browser-cli.js +45 -0
  32. package/build/cli/commands/background-jobs-main.js +7 -0
  33. package/build/cli/commands/background-jobs-runner.js +7 -0
  34. package/build/cli/commands/background-jobs-worker.js +7 -0
  35. package/build/cli/commands/beacon.js +7 -0
  36. package/build/cli/commands/console.js +12 -0
  37. package/build/cli/commands/db/base-command.js +82 -0
  38. package/build/cli/commands/db/create.js +64 -0
  39. package/build/cli/commands/db/drop.js +75 -0
  40. package/build/cli/commands/db/migrate.js +17 -0
  41. package/build/cli/commands/db/reset.js +22 -0
  42. package/build/cli/commands/db/rollback.js +15 -0
  43. package/build/cli/commands/db/schema/dump.js +12 -0
  44. package/build/cli/commands/db/schema/load.js +12 -0
  45. package/build/cli/commands/db/seed.js +12 -0
  46. package/build/cli/commands/db/tenants/check.js +38 -0
  47. package/build/cli/commands/db/tenants/create.js +33 -0
  48. package/build/cli/commands/db/tenants/migrate.js +49 -0
  49. package/build/cli/commands/destroy/migration.js +7 -0
  50. package/build/cli/commands/generate/base-models.js +7 -0
  51. package/build/cli/commands/generate/frontend-models.js +12 -0
  52. package/build/cli/commands/generate/migration.js +7 -0
  53. package/build/cli/commands/generate/model.js +7 -0
  54. package/build/cli/commands/init.js +11 -0
  55. package/build/cli/commands/routes.js +7 -0
  56. package/build/cli/commands/run-script.js +12 -0
  57. package/build/cli/commands/runner.js +12 -0
  58. package/build/cli/commands/server.js +7 -0
  59. package/build/cli/commands/test.js +9 -0
  60. package/build/cli/index.js +152 -0
  61. package/build/cli/tenant-database-command-helper.js +198 -0
  62. package/build/cli/use-browser-cli.js +30 -0
  63. package/build/configuration-resolver.js +65 -0
  64. package/build/configuration-types.js +429 -0
  65. package/build/configuration.js +2590 -0
  66. package/build/controller.js +421 -0
  67. package/build/current-configuration.js +31 -0
  68. package/build/current.js +80 -0
  69. package/build/database/annotations-async-hooks.js +47 -0
  70. package/build/database/annotations.js +40 -0
  71. package/build/database/drivers/base-column.js +182 -0
  72. package/build/database/drivers/base-columns-index.js +81 -0
  73. package/build/database/drivers/base-foreign-key.js +104 -0
  74. package/build/database/drivers/base-table.js +156 -0
  75. package/build/database/drivers/base.js +1609 -0
  76. package/build/database/drivers/mssql/column.js +74 -0
  77. package/build/database/drivers/mssql/columns-index.js +6 -0
  78. package/build/database/drivers/mssql/connect-connection.js +16 -0
  79. package/build/database/drivers/mssql/foreign-key.js +12 -0
  80. package/build/database/drivers/mssql/index.js +590 -0
  81. package/build/database/drivers/mssql/options.js +79 -0
  82. package/build/database/drivers/mssql/query-parser.js +6 -0
  83. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  84. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  85. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  87. package/build/database/drivers/mssql/sql/delete.js +19 -0
  88. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  89. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  90. package/build/database/drivers/mssql/sql/insert.js +4 -0
  91. package/build/database/drivers/mssql/sql/update.js +31 -0
  92. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  93. package/build/database/drivers/mssql/structure-sql.js +120 -0
  94. package/build/database/drivers/mssql/table.js +145 -0
  95. package/build/database/drivers/mysql/column.js +112 -0
  96. package/build/database/drivers/mysql/columns-index.js +22 -0
  97. package/build/database/drivers/mysql/foreign-key.js +12 -0
  98. package/build/database/drivers/mysql/index.js +473 -0
  99. package/build/database/drivers/mysql/options.js +34 -0
  100. package/build/database/drivers/mysql/query-parser.js +6 -0
  101. package/build/database/drivers/mysql/query.js +37 -0
  102. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  103. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  104. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  106. package/build/database/drivers/mysql/sql/delete.js +21 -0
  107. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  108. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  109. package/build/database/drivers/mysql/sql/insert.js +6 -0
  110. package/build/database/drivers/mysql/sql/update.js +33 -0
  111. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  112. package/build/database/drivers/mysql/structure-sql.js +93 -0
  113. package/build/database/drivers/mysql/table.js +121 -0
  114. package/build/database/drivers/pgsql/column.js +90 -0
  115. package/build/database/drivers/pgsql/columns-index.js +6 -0
  116. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  117. package/build/database/drivers/pgsql/index.js +441 -0
  118. package/build/database/drivers/pgsql/options.js +32 -0
  119. package/build/database/drivers/pgsql/query-parser.js +6 -0
  120. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  121. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  122. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  124. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  125. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  126. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  127. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  128. package/build/database/drivers/pgsql/sql/update.js +33 -0
  129. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  130. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  131. package/build/database/drivers/pgsql/table.js +135 -0
  132. package/build/database/drivers/sqlite/base.js +509 -0
  133. package/build/database/drivers/sqlite/column.js +75 -0
  134. package/build/database/drivers/sqlite/columns-index.js +30 -0
  135. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  136. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  137. package/build/database/drivers/sqlite/index.js +394 -0
  138. package/build/database/drivers/sqlite/index.native.js +72 -0
  139. package/build/database/drivers/sqlite/index.web.js +99 -0
  140. package/build/database/drivers/sqlite/options.js +32 -0
  141. package/build/database/drivers/sqlite/query-parser.js +6 -0
  142. package/build/database/drivers/sqlite/query.js +35 -0
  143. package/build/database/drivers/sqlite/query.native.js +35 -0
  144. package/build/database/drivers/sqlite/query.web.js +49 -0
  145. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  146. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  147. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  148. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  149. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  151. package/build/database/drivers/sqlite/sql/update.js +33 -0
  152. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  153. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  154. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  155. package/build/database/drivers/sqlite/table.js +131 -0
  156. package/build/database/drivers/structure-sql/utils.js +35 -0
  157. package/build/database/handler.js +13 -0
  158. package/build/database/initializer-from-require-context.js +101 -0
  159. package/build/database/migration/index.js +438 -0
  160. package/build/database/migrator/files-finder.js +55 -0
  161. package/build/database/migrator/types.js +31 -0
  162. package/build/database/migrator.js +557 -0
  163. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  164. package/build/database/pool/base-methods-forward.js +52 -0
  165. package/build/database/pool/base.js +380 -0
  166. package/build/database/pool/single-multi-use.js +118 -0
  167. package/build/database/query/alter-table-base.js +104 -0
  168. package/build/database/query/base.js +49 -0
  169. package/build/database/query/create-database-base.js +42 -0
  170. package/build/database/query/create-index-base.js +117 -0
  171. package/build/database/query/create-table-base.js +205 -0
  172. package/build/database/query/delete-base.js +19 -0
  173. package/build/database/query/drop-database-base.js +38 -0
  174. package/build/database/query/drop-table-base.js +58 -0
  175. package/build/database/query/from-base.js +36 -0
  176. package/build/database/query/from-plain.js +16 -0
  177. package/build/database/query/from-table.js +18 -0
  178. package/build/database/query/index.js +533 -0
  179. package/build/database/query/insert-base.js +172 -0
  180. package/build/database/query/join-base.js +43 -0
  181. package/build/database/query/join-object.js +167 -0
  182. package/build/database/query/join-plain.js +18 -0
  183. package/build/database/query/join-tracker.js +93 -0
  184. package/build/database/query/model-class-query.js +1577 -0
  185. package/build/database/query/order-base.js +33 -0
  186. package/build/database/query/order-column.js +77 -0
  187. package/build/database/query/order-plain.js +28 -0
  188. package/build/database/query/preloader/belongs-to.js +267 -0
  189. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  190. package/build/database/query/preloader/has-many.js +316 -0
  191. package/build/database/query/preloader/has-one.js +123 -0
  192. package/build/database/query/preloader/selection.js +152 -0
  193. package/build/database/query/preloader.js +201 -0
  194. package/build/database/query/query-data.js +305 -0
  195. package/build/database/query/select-base.js +30 -0
  196. package/build/database/query/select-plain.js +18 -0
  197. package/build/database/query/select-table-and-column.js +28 -0
  198. package/build/database/query/update-base.js +41 -0
  199. package/build/database/query/upsert-base.js +103 -0
  200. package/build/database/query/where-base.js +38 -0
  201. package/build/database/query/where-combinator.js +31 -0
  202. package/build/database/query/where-hash.js +77 -0
  203. package/build/database/query/where-model-class-hash.js +505 -0
  204. package/build/database/query/where-not.js +23 -0
  205. package/build/database/query/where-plain.js +20 -0
  206. package/build/database/query/with-count.js +219 -0
  207. package/build/database/query-parser/base-query-parser.js +40 -0
  208. package/build/database/query-parser/from-parser.js +49 -0
  209. package/build/database/query-parser/group-parser.js +55 -0
  210. package/build/database/query-parser/joins-parser.js +37 -0
  211. package/build/database/query-parser/limit-parser.js +77 -0
  212. package/build/database/query-parser/options.js +94 -0
  213. package/build/database/query-parser/order-parser.js +45 -0
  214. package/build/database/query-parser/select-parser.js +67 -0
  215. package/build/database/query-parser/where-parser.js +46 -0
  216. package/build/database/record/acts-as-list.js +374 -0
  217. package/build/database/record/attachments/download.js +49 -0
  218. package/build/database/record/attachments/handle.js +188 -0
  219. package/build/database/record/attachments/normalize-input.js +213 -0
  220. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  221. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  222. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  223. package/build/database/record/attachments/store.js +591 -0
  224. package/build/database/record/index.js +4119 -0
  225. package/build/database/record/instance-relationships/base.js +289 -0
  226. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  227. package/build/database/record/instance-relationships/has-many.js +284 -0
  228. package/build/database/record/instance-relationships/has-one.js +117 -0
  229. package/build/database/record/record-not-found-error.js +3 -0
  230. package/build/database/record/relationships/base.js +195 -0
  231. package/build/database/record/relationships/belongs-to.js +57 -0
  232. package/build/database/record/relationships/has-many.js +46 -0
  233. package/build/database/record/relationships/has-one.js +46 -0
  234. package/build/database/record/state-machine.js +278 -0
  235. package/build/database/record/user-module.js +43 -0
  236. package/build/database/record/validators/base.js +27 -0
  237. package/build/database/record/validators/format.js +50 -0
  238. package/build/database/record/validators/presence.js +24 -0
  239. package/build/database/record/validators/uniqueness.js +124 -0
  240. package/build/database/table-data/index.js +241 -0
  241. package/build/database/table-data/table-column.js +416 -0
  242. package/build/database/table-data/table-foreign-key.js +69 -0
  243. package/build/database/table-data/table-index.js +46 -0
  244. package/build/database/table-data/table-reference.js +13 -0
  245. package/build/database/use-database.js +48 -0
  246. package/build/environment-handlers/base.js +561 -0
  247. package/build/environment-handlers/browser.js +338 -0
  248. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  249. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  251. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  252. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  253. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  254. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  255. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  256. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  257. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  258. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  259. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  260. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  261. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  262. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  263. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  264. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  265. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  266. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  267. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  268. package/build/environment-handlers/node.js +887 -0
  269. package/build/error-logger.js +30 -0
  270. package/build/frontend-model-controller.js +3491 -0
  271. package/build/frontend-model-resource/base-resource.js +939 -0
  272. package/build/frontend-models/base.js +4004 -0
  273. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  274. package/build/frontend-models/event-hook-models.js +49 -0
  275. package/build/frontend-models/model-registry.js +28 -0
  276. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  277. package/build/frontend-models/preloader.js +169 -0
  278. package/build/frontend-models/query.js +2245 -0
  279. package/build/frontend-models/resource-config-validation.js +56 -0
  280. package/build/frontend-models/resource-definition.js +399 -0
  281. package/build/frontend-models/transport-serialization.js +369 -0
  282. package/build/frontend-models/use-created-event.js +21 -0
  283. package/build/frontend-models/use-destroyed-event.js +148 -0
  284. package/build/frontend-models/use-model-class-event.js +164 -0
  285. package/build/frontend-models/use-updated-event.js +152 -0
  286. package/build/frontend-models/websocket-channel.js +494 -0
  287. package/build/frontend-models/websocket-publishers.js +224 -0
  288. package/build/http-client/header.js +17 -0
  289. package/build/http-client/index.js +139 -0
  290. package/build/http-client/request.js +94 -0
  291. package/build/http-client/response.js +151 -0
  292. package/build/http-client/websocket-client.js +27 -0
  293. package/build/http-server/client/index.js +507 -0
  294. package/build/http-server/client/params-to-object.js +152 -0
  295. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  296. package/build/http-server/client/request-buffer/header.js +19 -0
  297. package/build/http-server/client/request-buffer/index.js +535 -0
  298. package/build/http-server/client/request-parser.js +195 -0
  299. package/build/http-server/client/request-runner.js +321 -0
  300. package/build/http-server/client/request-timing.js +171 -0
  301. package/build/http-server/client/request.js +114 -0
  302. package/build/http-server/client/response.js +251 -0
  303. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  304. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  305. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  306. package/build/http-server/client/websocket-request.js +147 -0
  307. package/build/http-server/client/websocket-session.js +1755 -0
  308. package/build/http-server/cookie.js +245 -0
  309. package/build/http-server/development-reloader.js +240 -0
  310. package/build/http-server/index.js +561 -0
  311. package/build/http-server/remote-address.js +77 -0
  312. package/build/http-server/server-client.js +222 -0
  313. package/build/http-server/server-lock.js +178 -0
  314. package/build/http-server/websocket-channel-subscribers.js +110 -0
  315. package/build/http-server/websocket-channel.js +137 -0
  316. package/build/http-server/websocket-connection.js +118 -0
  317. package/build/http-server/websocket-event-log-store.js +433 -0
  318. package/build/http-server/websocket-events-host.js +170 -0
  319. package/build/http-server/websocket-events.js +50 -0
  320. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  321. package/build/http-server/worker-handler/in-process.js +155 -0
  322. package/build/http-server/worker-handler/index.js +370 -0
  323. package/build/http-server/worker-handler/worker-script.js +6 -0
  324. package/build/http-server/worker-handler/worker-thread.js +286 -0
  325. package/build/initializer.js +39 -0
  326. package/build/jobs/mail-delivery.js +22 -0
  327. package/build/logger/base-logger.js +34 -0
  328. package/build/logger/console-logger.js +28 -0
  329. package/build/logger/file-logger.js +36 -0
  330. package/build/logger/outputs/array-output.js +50 -0
  331. package/build/logger/outputs/console-output.js +32 -0
  332. package/build/logger/outputs/file-output.js +55 -0
  333. package/build/logger/outputs/stdout-output.js +64 -0
  334. package/build/logger.js +507 -0
  335. package/build/mailer/backends/smtp.js +197 -0
  336. package/build/mailer/base.js +337 -0
  337. package/build/mailer/delivery.js +70 -0
  338. package/build/mailer/index.js +24 -0
  339. package/build/mailer.js +15 -0
  340. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  341. package/build/plugins/sqljs-wasm-route.js +71 -0
  342. package/build/record-payload-values.js +83 -0
  343. package/build/routes/app-routes.js +17 -0
  344. package/build/routes/base-route.js +133 -0
  345. package/build/routes/basic-route.js +109 -0
  346. package/build/routes/built-in/debug/controller.js +12 -0
  347. package/build/routes/built-in/errors/controller.js +7 -0
  348. package/build/routes/get-route.js +75 -0
  349. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  350. package/build/routes/index.js +50 -0
  351. package/build/routes/namespace-route.js +51 -0
  352. package/build/routes/plugin-routes.js +141 -0
  353. package/build/routes/post-route.js +74 -0
  354. package/build/routes/resolver.js +535 -0
  355. package/build/routes/resource-route.js +154 -0
  356. package/build/routes/root-route.js +11 -0
  357. package/build/src/application.js +187 -214
  358. package/build/src/authorization/ability.js +250 -297
  359. package/build/src/authorization/base-resource.js +120 -136
  360. package/build/src/background-jobs/client.js +43 -47
  361. package/build/src/background-jobs/cron-expression.js +127 -166
  362. package/build/src/background-jobs/forked-runner-child.js +37 -47
  363. package/build/src/background-jobs/job-record.js +8 -10
  364. package/build/src/background-jobs/job-registry.js +72 -84
  365. package/build/src/background-jobs/job-runner.js +74 -81
  366. package/build/src/background-jobs/job.js +62 -72
  367. package/build/src/background-jobs/json-socket.js +65 -70
  368. package/build/src/background-jobs/main.js +841 -900
  369. package/build/src/background-jobs/normalize-error.js +12 -11
  370. package/build/src/background-jobs/scheduler.js +205 -247
  371. package/build/src/background-jobs/socket-request.js +60 -65
  372. package/build/src/background-jobs/status-reporter.js +86 -96
  373. package/build/src/background-jobs/store.js +862 -980
  374. package/build/src/background-jobs/types.js +2 -3
  375. package/build/src/background-jobs/web/authorization.js +38 -50
  376. package/build/src/background-jobs/web/controller.js +232 -268
  377. package/build/src/background-jobs/web/index.js +36 -40
  378. package/build/src/background-jobs/web/path-matcher.js +45 -48
  379. package/build/src/background-jobs/web/registry.js +9 -14
  380. package/build/src/background-jobs/worker.js +585 -639
  381. package/build/src/beacon/client.js +264 -293
  382. package/build/src/beacon/in-process-broker.js +20 -25
  383. package/build/src/beacon/in-process-client.js +104 -116
  384. package/build/src/beacon/server.js +110 -126
  385. package/build/src/beacon/types.js +2 -8
  386. package/build/src/cli/base-command.js +49 -57
  387. package/build/src/cli/browser-cli.js +37 -42
  388. package/build/src/cli/commands/background-jobs-main.js +5 -5
  389. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  390. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  391. package/build/src/cli/commands/beacon.js +5 -5
  392. package/build/src/cli/commands/console.js +10 -10
  393. package/build/src/cli/commands/db/base-command.js +71 -76
  394. package/build/src/cli/commands/db/create.js +53 -61
  395. package/build/src/cli/commands/db/drop.js +62 -71
  396. package/build/src/cli/commands/db/migrate.js +13 -15
  397. package/build/src/cli/commands/db/reset.js +16 -19
  398. package/build/src/cli/commands/db/rollback.js +12 -13
  399. package/build/src/cli/commands/db/schema/dump.js +9 -9
  400. package/build/src/cli/commands/db/schema/load.js +9 -9
  401. package/build/src/cli/commands/db/seed.js +9 -9
  402. package/build/src/cli/commands/db/tenants/check.js +32 -35
  403. package/build/src/cli/commands/db/tenants/create.js +26 -29
  404. package/build/src/cli/commands/db/tenants/migrate.js +40 -44
  405. package/build/src/cli/commands/destroy/migration.js +5 -5
  406. package/build/src/cli/commands/generate/base-models.js +5 -5
  407. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  408. package/build/src/cli/commands/generate/migration.js +5 -5
  409. package/build/src/cli/commands/generate/model.js +5 -5
  410. package/build/src/cli/commands/init.js +7 -9
  411. package/build/src/cli/commands/routes.js +6 -6
  412. package/build/src/cli/commands/run-script.js +9 -9
  413. package/build/src/cli/commands/runner.js +9 -9
  414. package/build/src/cli/commands/server.js +6 -6
  415. package/build/src/cli/commands/test.js +6 -7
  416. package/build/src/cli/index.js +127 -141
  417. package/build/src/cli/tenant-database-command-helper.js +154 -185
  418. package/build/src/cli/use-browser-cli.js +15 -20
  419. package/build/src/configuration-resolver.js +47 -54
  420. package/build/src/configuration-types.d.ts +5 -3
  421. package/build/src/configuration-types.d.ts.map +1 -1
  422. package/build/src/configuration-types.js +3 -54
  423. package/build/src/configuration.js +2240 -2547
  424. package/build/src/controller.js +363 -407
  425. package/build/src/current-configuration.js +9 -12
  426. package/build/src/current.js +70 -75
  427. package/build/src/database/annotations-async-hooks.js +16 -22
  428. package/build/src/database/annotations.js +12 -18
  429. package/build/src/database/drivers/base-column.js +155 -179
  430. package/build/src/database/drivers/base-columns-index.js +69 -78
  431. package/build/src/database/drivers/base-foreign-key.js +89 -101
  432. package/build/src/database/drivers/base-table.js +124 -149
  433. package/build/src/database/drivers/base.js +1306 -1489
  434. package/build/src/database/drivers/mssql/column.js +39 -50
  435. package/build/src/database/drivers/mssql/columns-index.js +2 -3
  436. package/build/src/database/drivers/mssql/connect-connection.js +11 -9
  437. package/build/src/database/drivers/mssql/foreign-key.js +8 -9
  438. package/build/src/database/drivers/mssql/index.js +507 -587
  439. package/build/src/database/drivers/mssql/options.js +68 -75
  440. package/build/src/database/drivers/mssql/query-parser.js +2 -3
  441. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  442. package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
  443. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  444. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  445. package/build/src/database/drivers/mssql/sql/delete.js +14 -16
  446. package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
  447. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  448. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  449. package/build/src/database/drivers/mssql/sql/update.js +24 -28
  450. package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
  451. package/build/src/database/drivers/mssql/structure-sql.js +102 -114
  452. package/build/src/database/drivers/mssql/table.js +81 -96
  453. package/build/src/database/drivers/mysql/column.js +75 -92
  454. package/build/src/database/drivers/mysql/columns-index.js +16 -19
  455. package/build/src/database/drivers/mysql/foreign-key.js +8 -9
  456. package/build/src/database/drivers/mysql/index.js +396 -457
  457. package/build/src/database/drivers/mysql/options.js +26 -30
  458. package/build/src/database/drivers/mysql/query-parser.js +2 -3
  459. package/build/src/database/drivers/mysql/query.js +26 -29
  460. package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
  461. package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
  462. package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
  463. package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
  464. package/build/src/database/drivers/mysql/sql/delete.js +14 -17
  465. package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
  466. package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
  467. package/build/src/database/drivers/mysql/sql/insert.js +2 -3
  468. package/build/src/database/drivers/mysql/sql/update.js +24 -29
  469. package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
  470. package/build/src/database/drivers/mysql/structure-sql.js +79 -88
  471. package/build/src/database/drivers/mysql/table.js +83 -98
  472. package/build/src/database/drivers/pgsql/column.js +56 -72
  473. package/build/src/database/drivers/pgsql/columns-index.js +2 -3
  474. package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
  475. package/build/src/database/drivers/pgsql/index.js +377 -438
  476. package/build/src/database/drivers/pgsql/options.js +25 -28
  477. package/build/src/database/drivers/pgsql/query-parser.js +2 -3
  478. package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
  479. package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
  480. package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
  481. package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
  482. package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
  483. package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
  484. package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
  485. package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
  486. package/build/src/database/drivers/pgsql/sql/update.js +24 -29
  487. package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
  488. package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
  489. package/build/src/database/drivers/pgsql/table.js +60 -77
  490. package/build/src/database/drivers/sqlite/base.js +405 -478
  491. package/build/src/database/drivers/sqlite/column.js +54 -69
  492. package/build/src/database/drivers/sqlite/columns-index.js +22 -27
  493. package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
  494. package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
  495. package/build/src/database/drivers/sqlite/index.js +330 -373
  496. package/build/src/database/drivers/sqlite/index.native.js +55 -64
  497. package/build/src/database/drivers/sqlite/index.web.js +69 -87
  498. package/build/src/database/drivers/sqlite/options.js +25 -28
  499. package/build/src/database/drivers/sqlite/query-parser.js +2 -3
  500. package/build/src/database/drivers/sqlite/query.js +21 -24
  501. package/build/src/database/drivers/sqlite/query.native.js +20 -25
  502. package/build/src/database/drivers/sqlite/query.web.js +30 -37
  503. package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
  504. package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
  505. package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
  506. package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
  507. package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
  508. package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
  509. package/build/src/database/drivers/sqlite/sql/update.js +24 -29
  510. package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
  511. package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
  512. package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
  513. package/build/src/database/drivers/sqlite/table.js +102 -125
  514. package/build/src/database/drivers/structure-sql/utils.js +14 -17
  515. package/build/src/database/handler.js +9 -10
  516. package/build/src/database/initializer-from-require-context.js +76 -87
  517. package/build/src/database/migration/index.js +332 -395
  518. package/build/src/database/migrator/files-finder.js +40 -50
  519. package/build/src/database/migrator/types.js +2 -30
  520. package/build/src/database/migrator.js +454 -526
  521. package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
  522. package/build/src/database/pool/base-methods-forward.js +40 -43
  523. package/build/src/database/pool/base.js +298 -343
  524. package/build/src/database/pool/single-multi-use.js +93 -110
  525. package/build/src/database/query/alter-table-base.js +84 -99
  526. package/build/src/database/query/base.js +39 -46
  527. package/build/src/database/query/create-database-base.js +25 -30
  528. package/build/src/database/query/create-index-base.js +75 -94
  529. package/build/src/database/query/create-table-base.js +151 -193
  530. package/build/src/database/query/delete-base.js +14 -16
  531. package/build/src/database/query/drop-database-base.js +23 -28
  532. package/build/src/database/query/drop-table-base.js +42 -53
  533. package/build/src/database/query/from-base.js +30 -33
  534. package/build/src/database/query/from-plain.js +11 -13
  535. package/build/src/database/query/from-table.js +13 -15
  536. package/build/src/database/query/index.js +410 -472
  537. package/build/src/database/query/insert-base.js +143 -164
  538. package/build/src/database/query/join-base.js +35 -40
  539. package/build/src/database/query/join-object.js +128 -153
  540. package/build/src/database/query/join-plain.js +13 -15
  541. package/build/src/database/query/join-tracker.js +76 -90
  542. package/build/src/database/query/model-class-query.js +1134 -1370
  543. package/build/src/database/query/order-base.js +27 -30
  544. package/build/src/database/query/order-column.js +44 -53
  545. package/build/src/database/query/order-plain.js +20 -24
  546. package/build/src/database/query/preloader/belongs-to.js +210 -258
  547. package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
  548. package/build/src/database/query/preloader/has-many.js +240 -301
  549. package/build/src/database/query/preloader/has-one.js +91 -117
  550. package/build/src/database/query/preloader/selection.js +117 -129
  551. package/build/src/database/query/preloader.js +160 -185
  552. package/build/src/database/query/query-data.js +157 -201
  553. package/build/src/database/query/select-base.js +25 -27
  554. package/build/src/database/query/select-plain.js +13 -15
  555. package/build/src/database/query/select-table-and-column.js +21 -25
  556. package/build/src/database/query/update-base.js +35 -38
  557. package/build/src/database/query/upsert-base.js +93 -100
  558. package/build/src/database/query/where-base.js +32 -35
  559. package/build/src/database/query/where-combinator.js +25 -28
  560. package/build/src/database/query/where-hash.js +61 -68
  561. package/build/src/database/query/where-model-class-hash.js +414 -469
  562. package/build/src/database/query/where-not.js +18 -20
  563. package/build/src/database/query/where-plain.js +15 -17
  564. package/build/src/database/query/with-count.js +125 -159
  565. package/build/src/database/query-parser/base-query-parser.js +32 -37
  566. package/build/src/database/query-parser/from-parser.js +36 -45
  567. package/build/src/database/query-parser/group-parser.js +42 -50
  568. package/build/src/database/query-parser/joins-parser.js +28 -33
  569. package/build/src/database/query-parser/limit-parser.js +67 -70
  570. package/build/src/database/query-parser/options.js +75 -82
  571. package/build/src/database/query-parser/order-parser.js +36 -40
  572. package/build/src/database/query-parser/select-parser.js +49 -60
  573. package/build/src/database/query-parser/where-parser.js +36 -41
  574. package/build/src/database/record/acts-as-list.js +235 -273
  575. package/build/src/database/record/attachments/download.js +44 -45
  576. package/build/src/database/record/attachments/handle.js +141 -161
  577. package/build/src/database/record/attachments/normalize-input.js +128 -138
  578. package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
  579. package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
  580. package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
  581. package/build/src/database/record/attachments/store.js +467 -539
  582. package/build/src/database/record/index.d.ts +109 -25
  583. package/build/src/database/record/index.d.ts.map +1 -1
  584. package/build/src/database/record/index.js +3502 -3898
  585. package/build/src/database/record/instance-relationships/base.js +234 -268
  586. package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
  587. package/build/src/database/record/instance-relationships/has-many.js +225 -264
  588. package/build/src/database/record/instance-relationships/has-one.js +85 -105
  589. package/build/src/database/record/record-not-found-error.js +3 -2
  590. package/build/src/database/record/relationships/base.js +144 -166
  591. package/build/src/database/record/relationships/belongs-to.js +44 -51
  592. package/build/src/database/record/relationships/has-many.js +32 -40
  593. package/build/src/database/record/relationships/has-one.js +32 -40
  594. package/build/src/database/record/state-machine.js +156 -208
  595. package/build/src/database/record/user-module.js +32 -38
  596. package/build/src/database/record/validators/base.js +22 -24
  597. package/build/src/database/record/validators/format.js +36 -46
  598. package/build/src/database/record/validators/presence.js +18 -20
  599. package/build/src/database/record/validators/uniqueness.js +99 -117
  600. package/build/src/database/table-data/index.js +199 -231
  601. package/build/src/database/table-data/table-column.js +338 -382
  602. package/build/src/database/table-data/table-foreign-key.js +57 -66
  603. package/build/src/database/table-data/table-index.js +29 -36
  604. package/build/src/database/table-data/table-reference.js +10 -10
  605. package/build/src/database/use-database.js +32 -40
  606. package/build/src/environment-handlers/base.js +484 -544
  607. package/build/src/environment-handlers/browser.js +241 -294
  608. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
  609. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
  610. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
  611. package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
  612. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
  613. package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
  614. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
  615. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
  616. package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
  617. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
  618. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  619. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  620. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +326 -358
  621. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
  622. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  623. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
  624. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
  625. package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
  626. package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
  627. package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
  628. package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
  629. package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
  630. package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
  631. package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
  632. package/build/src/environment-handlers/node.js +753 -874
  633. package/build/src/error-logger.js +22 -21
  634. package/build/src/frontend-model-controller.js +2791 -3291
  635. package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
  636. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  637. package/build/src/frontend-model-resource/base-resource.js +770 -865
  638. package/build/src/frontend-models/base.js +3136 -3593
  639. package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
  640. package/build/src/frontend-models/event-hook-models.js +16 -21
  641. package/build/src/frontend-models/model-registry.js +9 -11
  642. package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
  643. package/build/src/frontend-models/preloader.js +131 -149
  644. package/build/src/frontend-models/query.js +1557 -1855
  645. package/build/src/frontend-models/resource-config-validation.js +27 -37
  646. package/build/src/frontend-models/resource-definition.d.ts +6 -7
  647. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  648. package/build/src/frontend-models/resource-definition.js +237 -291
  649. package/build/src/frontend-models/transport-serialization.js +203 -266
  650. package/build/src/frontend-models/use-created-event.js +5 -7
  651. package/build/src/frontend-models/use-destroyed-event.js +80 -93
  652. package/build/src/frontend-models/use-model-class-event.js +79 -91
  653. package/build/src/frontend-models/use-updated-event.js +84 -97
  654. package/build/src/frontend-models/websocket-channel.js +381 -441
  655. package/build/src/frontend-models/websocket-publishers.js +142 -175
  656. package/build/src/http-client/header.js +13 -14
  657. package/build/src/http-client/index.js +116 -132
  658. package/build/src/http-client/request.js +71 -87
  659. package/build/src/http-client/response.js +122 -140
  660. package/build/src/http-client/websocket-client.js +15 -17
  661. package/build/src/http-server/client/index.js +409 -465
  662. package/build/src/http-server/client/params-to-object.js +124 -135
  663. package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
  664. package/build/src/http-server/client/request-buffer/header.js +15 -16
  665. package/build/src/http-server/client/request-buffer/index.js +446 -506
  666. package/build/src/http-server/client/request-parser.js +163 -186
  667. package/build/src/http-server/client/request-runner.js +226 -259
  668. package/build/src/http-server/client/request-timing.js +132 -151
  669. package/build/src/http-server/client/request.js +96 -108
  670. package/build/src/http-server/client/response.js +213 -235
  671. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
  672. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
  673. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  674. package/build/src/http-server/client/websocket-request.js +114 -137
  675. package/build/src/http-server/client/websocket-session.js +1452 -1657
  676. package/build/src/http-server/cookie.js +216 -236
  677. package/build/src/http-server/development-reloader.js +190 -221
  678. package/build/src/http-server/index.js +451 -525
  679. package/build/src/http-server/remote-address.js +38 -50
  680. package/build/src/http-server/server-client.js +181 -208
  681. package/build/src/http-server/server-lock.js +153 -167
  682. package/build/src/http-server/websocket-channel-subscribers.js +81 -93
  683. package/build/src/http-server/websocket-channel.js +104 -117
  684. package/build/src/http-server/websocket-connection.js +96 -104
  685. package/build/src/http-server/websocket-event-log-store.js +350 -404
  686. package/build/src/http-server/websocket-events-host.js +145 -164
  687. package/build/src/http-server/websocket-events.js +47 -47
  688. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
  689. package/build/src/http-server/worker-handler/in-process.js +123 -141
  690. package/build/src/http-server/worker-handler/index.js +313 -349
  691. package/build/src/http-server/worker-handler/worker-script.js +4 -5
  692. package/build/src/http-server/worker-handler/worker-thread.js +240 -269
  693. package/build/src/initializer.js +31 -36
  694. package/build/src/jobs/mail-delivery.js +13 -15
  695. package/build/src/logger/base-logger.js +24 -26
  696. package/build/src/logger/console-logger.js +21 -23
  697. package/build/src/logger/file-logger.js +29 -31
  698. package/build/src/logger/outputs/array-output.js +37 -42
  699. package/build/src/logger/outputs/console-output.js +20 -24
  700. package/build/src/logger/outputs/file-output.js +43 -48
  701. package/build/src/logger/outputs/stdout-output.js +39 -48
  702. package/build/src/logger.js +338 -394
  703. package/build/src/mailer/backends/smtp.js +134 -163
  704. package/build/src/mailer/base.js +211 -251
  705. package/build/src/mailer/delivery.js +56 -64
  706. package/build/src/mailer/index.js +4 -22
  707. package/build/src/mailer.js +4 -13
  708. package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
  709. package/build/src/plugins/sqljs-wasm-route.js +28 -38
  710. package/build/src/record-payload-values.js +25 -28
  711. package/build/src/routes/app-routes.js +12 -14
  712. package/build/src/routes/base-route.js +112 -130
  713. package/build/src/routes/basic-route.js +83 -102
  714. package/build/src/routes/built-in/debug/controller.js +10 -10
  715. package/build/src/routes/built-in/errors/controller.js +5 -5
  716. package/build/src/routes/get-route.js +50 -63
  717. package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
  718. package/build/src/routes/index.js +36 -43
  719. package/build/src/routes/namespace-route.js +38 -47
  720. package/build/src/routes/plugin-routes.js +107 -124
  721. package/build/src/routes/post-route.js +51 -62
  722. package/build/src/routes/resolver.js +422 -494
  723. package/build/src/routes/resource-route.js +124 -143
  724. package/build/src/routes/root-route.js +7 -8
  725. package/build/src/testing/base-expect.js +13 -14
  726. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
  727. package/build/src/testing/browser-test-app.js +23 -29
  728. package/build/src/testing/expect-to-change.js +41 -50
  729. package/build/src/testing/expect-utils.js +139 -184
  730. package/build/src/testing/expect.js +638 -731
  731. package/build/src/testing/request-client.js +70 -85
  732. package/build/src/testing/test-files-finder.js +285 -339
  733. package/build/src/testing/test-filter-parser.js +124 -155
  734. package/build/src/testing/test-runner.js +883 -1020
  735. package/build/src/testing/test-suite-splitter.js +114 -142
  736. package/build/src/testing/test.js +216 -256
  737. package/build/src/utils/backtrace-cleaner-node.js +62 -69
  738. package/build/src/utils/backtrace-cleaner.js +188 -216
  739. package/build/src/utils/ensure-error.js +7 -7
  740. package/build/src/utils/event-emitter.js +4 -6
  741. package/build/src/utils/file-exists.js +9 -10
  742. package/build/src/utils/format-value.js +67 -76
  743. package/build/src/utils/model-scope.js +27 -31
  744. package/build/src/utils/nest-callbacks.js +10 -13
  745. package/build/src/utils/plain-object.js +5 -6
  746. package/build/src/utils/ransack.js +448 -563
  747. package/build/src/utils/rest-args-error.js +5 -6
  748. package/build/src/utils/singularize-model-name.js +9 -11
  749. package/build/src/utils/split-sql-statements.js +68 -79
  750. package/build/src/utils/to-import-specifier.js +24 -30
  751. package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
  752. package/build/src/utils/with-tracked-stack.js +14 -18
  753. package/build/src/velocious-error.js +27 -30
  754. package/build/templates/configuration.js +61 -0
  755. package/build/templates/generate-migration.js +11 -0
  756. package/build/templates/generate-model.js +6 -0
  757. package/build/templates/routes.js +11 -0
  758. package/build/testing/base-expect.js +17 -0
  759. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  760. package/build/testing/browser-test-app.js +32 -0
  761. package/build/testing/expect-to-change.js +55 -0
  762. package/build/testing/expect-utils.js +269 -0
  763. package/build/testing/expect.js +763 -0
  764. package/build/testing/request-client.js +90 -0
  765. package/build/testing/test-files-finder.js +364 -0
  766. package/build/testing/test-filter-parser.js +198 -0
  767. package/build/testing/test-runner.js +1168 -0
  768. package/build/testing/test-suite-splitter.js +177 -0
  769. package/build/testing/test.js +370 -0
  770. package/build/utils/backtrace-cleaner-node.js +87 -0
  771. package/build/utils/backtrace-cleaner.js +266 -0
  772. package/build/utils/ensure-error.js +15 -0
  773. package/build/utils/event-emitter.js +8 -0
  774. package/build/utils/file-exists.js +18 -0
  775. package/build/utils/format-value.js +101 -0
  776. package/build/utils/model-scope.js +56 -0
  777. package/build/utils/nest-callbacks.js +22 -0
  778. package/build/utils/plain-object.js +14 -0
  779. package/build/utils/ransack.js +859 -0
  780. package/build/utils/rest-args-error.js +14 -0
  781. package/build/utils/singularize-model-name.js +18 -0
  782. package/build/utils/split-sql-statements.js +88 -0
  783. package/build/utils/to-import-specifier.js +53 -0
  784. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  785. package/build/utils/with-tracked-stack.js +38 -0
  786. package/build/velocious-error.js +34 -0
  787. package/package.json +3 -3
  788. package/src/configuration-types.js +1 -1
  789. package/src/database/record/index.js +174 -25
  790. package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
  791. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
  792. package/src/frontend-model-resource/base-resource.js +6 -2
  793. package/src/frontend-models/resource-definition.js +3 -3
  794. package/src/frontend-models/websocket-publishers.js +6 -6
@@ -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
+ }