velocious 1.0.430 → 1.0.432

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