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,46 @@
1
+ // @ts-check
2
+
3
+ export default class VelocuiousDatabaseQueryParserWhereParser {
4
+ /**
5
+ * Runs constructor.
6
+ * @param {object} args - Options object.
7
+ * @param {boolean} args.pretty - Whether pretty.
8
+ * @param {import("../query/index.js").default} args.query - Query instance.
9
+ */
10
+ constructor({pretty, query}) {
11
+ this.pretty = pretty
12
+ this.query = query
13
+ }
14
+
15
+ toSql() {
16
+ const {pretty, query} = this
17
+ let sql = ""
18
+
19
+ if (query._wheres.length == 0) return sql
20
+
21
+ if (pretty) {
22
+ sql += "\n\n"
23
+ } else {
24
+ sql += " "
25
+ }
26
+
27
+ sql += "WHERE"
28
+
29
+ let count = 0
30
+
31
+ for (const where of query._wheres) {
32
+ if (count > 0) sql += " AND"
33
+
34
+ if (pretty) {
35
+ sql += "\n "
36
+ } else {
37
+ sql += " "
38
+ }
39
+
40
+ sql += where.toSql()
41
+ count++
42
+ }
43
+
44
+ return sql
45
+ }
46
+ }
@@ -0,0 +1,374 @@
1
+ // @ts-check
2
+
3
+ /** @file Registers gap-less positional list callbacks on a model class. */
4
+
5
+ /**
6
+ * Acts as list shifting.
7
+ * @type {symbol} - Guard flag set on the model instance during shift operations to prevent re-entrant lifecycle hooks.
8
+ */
9
+ const ACTS_AS_LIST_SHIFTING = Symbol("actsAsListShifting")
10
+
11
+ /**
12
+ * Runs set shifting flag.
13
+ * @param {import("./index.js").default} record - Model instance.
14
+ * @param {boolean} value - Flag value.
15
+ */
16
+ function setShiftingFlag(record, value) {
17
+ // @ts-ignore - Symbol indexing on Record instances
18
+ record[ACTS_AS_LIST_SHIFTING] = value
19
+ }
20
+
21
+ /**
22
+ * Runs is shifting.
23
+ * @param {import("./index.js").default} record - Model instance.
24
+ * @returns {boolean}
25
+ */
26
+ function isShifting(record) {
27
+ // @ts-ignore - Symbol indexing on Record instances
28
+ return Boolean(record[ACTS_AS_LIST_SHIFTING])
29
+ }
30
+
31
+ /**
32
+ * Registers gap-less positional list callbacks on a model class to maintain
33
+ * a gap-less positional list. When a record is inserted, updated, or
34
+ * destroyed, the surrounding positions are shifted so the list stays compact
35
+ * (1,2,3,...) and scoped within the given column.
36
+ *
37
+ * Callers must also ensure a UNIQUE index on (scopeColumn, positionColumn)
38
+ * exists in the database schema — use `Migration.addActsAsList()` for the
39
+ * corresponding schema setup.
40
+ * @param {typeof import("./index.js").default} modelClass - The model class.
41
+ * @param {string} positionColumn - camelCase name of the position attribute (e.g. "rowNumber").
42
+ * @param {object} options - Options.
43
+ * @param {string} options.scope - camelCase name of the scope attribute (e.g. "boardColumnId").
44
+ * @returns {void}
45
+ */
46
+ export default function registerActsAsListCallbacks(modelClass, positionColumn, {scope}) {
47
+ modelClass.beforeCreate(async (record) => {
48
+ if (isShifting(record)) return
49
+
50
+ const position = record.readAttribute(positionColumn)
51
+
52
+ if (position != null) {
53
+ await shiftPositionsUp({record, positionColumn, scope, fromPosition: position})
54
+ } else {
55
+ const nextPosition = await highestPositionInScope({record, positionColumn, scope})
56
+
57
+ record.setAttribute(positionColumn, nextPosition + 1)
58
+ }
59
+ })
60
+
61
+ modelClass.beforeUpdate(async (record) => {
62
+ if (isShifting(record)) return
63
+ if (!record.isPersisted()) return
64
+
65
+ const modelClass = /**
66
+ * Narrows the runtime value to the documented type.
67
+ @type {typeof import("./index.js").default} */ (record.constructor)
68
+ const posColumn = modelClass.getColumnNameForAttributeName(positionColumn)
69
+ const scopeCol = modelClass.getColumnNameForAttributeName(scope)
70
+ const rawAttributes = /**
71
+ * Narrows the runtime value to the documented type.
72
+ @type {Record<string, ?>} */ (record._attributes || {})
73
+ const changes = /**
74
+ * Narrows the runtime value to the documented type.
75
+ @type {Record<string, ?>} */ (record._changes || {})
76
+ const posChanged = posColumn in changes
77
+ const scopeChanged = scopeCol in changes
78
+
79
+ if (!posChanged && !scopeChanged) return
80
+
81
+ const oldPosition = posChanged ? /**
82
+ * Narrows the runtime value to the documented type.
83
+ @type {number} */ (rawAttributes[posColumn]) : /**
84
+ * Narrows the runtime value to the documented type.
85
+ @type {number} */ (record.readAttribute(positionColumn))
86
+ const newPosition = posChanged ? /**
87
+ * Narrows the runtime value to the documented type.
88
+ @type {number} */ (changes[posColumn]) : /**
89
+ * Narrows the runtime value to the documented type.
90
+ @type {number} */ (record.readAttribute(positionColumn))
91
+ const oldScopeValue = scopeChanged ? /**
92
+ * Narrows the runtime value to the documented type.
93
+ @type {number} */ (rawAttributes[scopeCol]) : /**
94
+ * Narrows the runtime value to the documented type.
95
+ @type {number} */ (record.readAttribute(scope))
96
+ const newScopeValue = scopeChanged ? /**
97
+ * Narrows the runtime value to the documented type.
98
+ @type {number} */ (changes[scopeCol]) : /**
99
+ * Narrows the runtime value to the documented type.
100
+ @type {number} */ (record.readAttribute(scope))
101
+
102
+ if (oldPosition == null || newPosition == null) return
103
+ if (newPosition === oldPosition && newScopeValue === oldScopeValue) return
104
+
105
+ // Move the record out of the way before shifting others to avoid
106
+ // intermediate UNIQUE constraint violations. Use the old scope value
107
+ // for the move-out-of-way because the record is still in the old scope.
108
+ await moveOutOfWay({record, positionColumn, scope, scopeValue: oldScopeValue})
109
+ setShiftingFlag(record, false)
110
+
111
+ if (scopeChanged && oldScopeValue !== newScopeValue) {
112
+ let targetPosition = newPosition
113
+
114
+ // When only the scope changes without a new position, append to the end
115
+ // of the new scope. There is no target-scope row to shift out of the way.
116
+ if (!posChanged) {
117
+ const highestNew = await highestPositionInScope({record, positionColumn, scope, scopeValue: newScopeValue})
118
+ const nextPos = highestNew + 1
119
+
120
+ record.setAttribute(positionColumn, nextPos)
121
+ await shiftPositionsDown({record, positionColumn, scope, scopeValue: oldScopeValue, fromPosition: oldPosition + 1})
122
+ return
123
+ }
124
+
125
+ await shiftPositionsDown({record, positionColumn, scope, scopeValue: oldScopeValue, fromPosition: oldPosition + 1})
126
+ await shiftPositionsUp({record, positionColumn, scope, scopeValue: newScopeValue, fromPosition: targetPosition})
127
+ return
128
+ }
129
+
130
+ if (newPosition < oldPosition) {
131
+ await shiftPositionsUp({record, positionColumn, scope, fromPosition: newPosition, toPosition: oldPosition})
132
+ } else if (newPosition > oldPosition) {
133
+ await shiftPositionsDown({record, positionColumn, scope, fromPosition: oldPosition + 1, toPosition: newPosition + 1})
134
+ }
135
+ })
136
+
137
+ modelClass.beforeDestroy(async (record) => {
138
+ const position = record.readAttribute(positionColumn)
139
+
140
+ if (position == null) return
141
+
142
+ await moveOutOfWay({record, positionColumn, scope})
143
+ setShiftingFlag(record, false)
144
+
145
+ await shiftPositionsDown({record, positionColumn, scope, fromPosition: position + 1})
146
+ })
147
+ }
148
+
149
+ /**
150
+ * Bumps positions UP by 1 in the range [fromPosition, toPosition) within the
151
+ * same scope. Updates in descending order to avoid intermediate UNIQUE
152
+ * constraint violations.
153
+ * @param {object} args - Arguments.
154
+ * @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
155
+ * @param {string} args.positionColumn - camelCase position attribute name.
156
+ * @param {string} args.scope - camelCase scope attribute name.
157
+ * @param {number} args.fromPosition - Starting position (inclusive).
158
+ * @param {number} [args.toPosition] - Ending position (exclusive).
159
+ * @param {string | number} [args.scopeValue] - Explicit scope value.
160
+ * @returns {Promise<void>}
161
+ */
162
+ async function shiftPositionsUp({record, positionColumn, scope, fromPosition, toPosition, scopeValue}) {
163
+ const modelClass = /**
164
+ * Narrows the runtime value to the documented type.
165
+ @type {typeof import("./index.js").default} */ (record.constructor)
166
+ const connection = modelClass.connection()
167
+ const tableName = modelClass._getTable().getName()
168
+ const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
169
+ const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
170
+
171
+ if (resolvedScopeValue == null) return
172
+
173
+ const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
174
+ const positionColumnSql = connection.quoteColumn(positionColumnName)
175
+ const scopeColumnSql = connection.quoteColumn(scopeColumnName)
176
+ const tableSql = connection.quoteTable(tableName)
177
+ const quotedScope = connection.quote(resolvedScopeValue)
178
+
179
+ // Load rows in descending order so we bump the highest first
180
+ let query = modelClass
181
+ .select(positionColumn)
182
+ .where({[scopeColumnName]: resolvedScopeValue})
183
+ .where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
184
+ .order(`${positionColumnSql} DESC`)
185
+
186
+ if (toPosition != null) {
187
+ query = query.where(`${positionColumnSql} < ${connection.quote(toPosition)}`)
188
+ }
189
+
190
+ const rows = await query.toArray()
191
+
192
+ setShiftingFlag(record, true)
193
+
194
+ try {
195
+ for (const row of rows) {
196
+ const currentPos = Number(row.readAttribute(positionColumn))
197
+
198
+ await connection.query(
199
+ `UPDATE ${tableSql} SET ${positionColumnSql} = ${positionColumnSql} + 1 WHERE ${scopeColumnSql} = ${quotedScope} AND ${positionColumnSql} = ${connection.quote(currentPos)}`
200
+ )
201
+ }
202
+ } finally {
203
+ setShiftingFlag(record, false)
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Bumps positions DOWN by 1 in the range [fromPosition, toPosition) within
209
+ * the same scope. Updates in ascending order to avoid intermediate UNIQUE
210
+ * constraint violations.
211
+ * @param {object} args - Arguments.
212
+ * @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
213
+ * @param {string} args.positionColumn - camelCase position attribute name.
214
+ * @param {string} args.scope - camelCase scope attribute name.
215
+ * @param {number} args.fromPosition - Starting position (inclusive).
216
+ * @param {number} [args.toPosition] - Ending position (exclusive).
217
+ * @param {string | number} [args.scopeValue] - Explicit scope value.
218
+ * @returns {Promise<void>}
219
+ */
220
+ async function shiftPositionsDown({record, positionColumn, scope, fromPosition, toPosition, scopeValue}) {
221
+ const modelClass = /**
222
+ * Narrows the runtime value to the documented type.
223
+ @type {typeof import("./index.js").default} */ (record.constructor)
224
+ const connection = modelClass.connection()
225
+ const tableName = modelClass._getTable().getName()
226
+ const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
227
+ const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
228
+
229
+ if (resolvedScopeValue == null) return
230
+
231
+ const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
232
+ const positionColumnSql = connection.quoteColumn(positionColumnName)
233
+ const scopeColumnSql = connection.quoteColumn(scopeColumnName)
234
+ const tableSql = connection.quoteTable(tableName)
235
+ const quotedScope = connection.quote(resolvedScopeValue)
236
+
237
+ // Load rows in ascending order so we shift the lowest gap first
238
+ let query = modelClass
239
+ .select(positionColumn)
240
+ .where({[scopeColumnName]: resolvedScopeValue})
241
+ .where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
242
+ .order({column: positionColumnName, direction: "ASC"})
243
+
244
+ if (toPosition != null) {
245
+ query = query.where(`${positionColumnSql} < ${connection.quote(toPosition)}`)
246
+ }
247
+
248
+ const rows = await query.toArray()
249
+
250
+ setShiftingFlag(record, true)
251
+
252
+ try {
253
+ for (const row of rows) {
254
+ const currentPos = Number(row.readAttribute(positionColumn))
255
+
256
+ await connection.query(
257
+ `UPDATE ${tableSql} SET ${positionColumnSql} = ${positionColumnSql} - 1 WHERE ${scopeColumnSql} = ${quotedScope} AND ${positionColumnSql} = ${connection.quote(currentPos)}`
258
+ )
259
+ }
260
+ } finally {
261
+ setShiftingFlag(record, false)
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Returns the highest current position value in the record's scope.
267
+ * @param {object} args - Arguments.
268
+ * @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
269
+ * @param {string} args.positionColumn - camelCase position attribute name.
270
+ * @param {string} args.scope - camelCase scope attribute name.
271
+ * @param {string | number} [args.scopeValue] - Explicit scope value.
272
+ * @returns {Promise<number>} - Highest position in scope, or 0 when scope is empty.
273
+ */
274
+ async function highestPositionInScope({record, positionColumn, scope, scopeValue}) {
275
+ const modelClass = /**
276
+ * Narrows the runtime value to the documented type.
277
+ @type {typeof import("./index.js").default} */ (record.constructor)
278
+ const connection = modelClass.connection()
279
+ const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
280
+ const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
281
+ const positionColumnSql = connection.quoteColumn(positionColumnName)
282
+ const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
283
+
284
+ if (resolvedScopeValue == null) return 0
285
+
286
+ const rows = await modelClass
287
+ .select(positionColumn)
288
+ .where({[scopeColumnName]: resolvedScopeValue})
289
+ .order(`${positionColumnSql} DESC`)
290
+ .limit(1)
291
+ .toArray()
292
+
293
+ if (rows.length === 0) return 0
294
+
295
+ return Number(rows[0].readAttribute(positionColumn)) || 0
296
+ }
297
+
298
+ /**
299
+ * Resolves a scope value from the attribute store first, then falls back
300
+ * to the loaded belongsTo relationship. This is needed during beforeCreate
301
+ * because the FK attribute may not be set until _createNewRecord flushes
302
+ * _belongsToChanges.
303
+ * @param {import("./index.js").default} record - Model instance.
304
+ * @param {string} scope - camelCase scope attribute name (e.g. "projectId").
305
+ * @returns {string | number | null}
306
+ */
307
+ function resolveScopeValue(record, scope) {
308
+ const attrValue = record.readAttribute(scope)
309
+
310
+ if (attrValue != null) return /** Narrows the runtime value to the documented type. @type {string | number} */ (attrValue)
311
+
312
+ const modelClass = /**
313
+ * Narrows the runtime value to the documented type.
314
+ @type {typeof import("./index.js").default} */ (record.constructor)
315
+ const relationships = modelClass.getRelationshipsMap()
316
+ const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
317
+
318
+ for (const relationshipName in relationships) {
319
+ const relationship = relationships[relationshipName]
320
+
321
+ if (relationship.getType?.() !== "belongsTo") continue
322
+
323
+ const foreignKey = relationship.getForeignKey()
324
+
325
+ if (foreignKey !== scopeColumnName) continue
326
+
327
+ const instanceRelationship = record.getRelationshipByName(relationshipName)
328
+ const loaded = instanceRelationship.loaded()
329
+
330
+ if (loaded && !Array.isArray(loaded) && typeof loaded.id === "function") {
331
+ return loaded.id()
332
+ }
333
+ }
334
+
335
+ return null
336
+ }
337
+
338
+ /**
339
+ * Moves the record to a temporary position outside the normal range so
340
+ * that surrounding position shifts do not hit unique constraint violations.
341
+ * @param {object} args - Arguments.
342
+ * @param {import("./index.js").default} args.record - Model instance.
343
+ * @param {string} args.positionColumn - camelCase position attribute.
344
+ * @param {string} args.scope - camelCase scope attribute.
345
+ * @param {string | number | null} [args.scopeValue] - Explicit scope value (defaults to resolveScopeValue).
346
+ * @returns {Promise<void>}
347
+ */
348
+ async function moveOutOfWay({record, positionColumn, scope, scopeValue}) {
349
+ const modelClass = /**
350
+ * Narrows the runtime value to the documented type.
351
+ @type {typeof import("./index.js").default} */ (record.constructor)
352
+ const connection = modelClass.connection()
353
+ const tableName = modelClass._getTable().getName()
354
+ const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
355
+
356
+ if (resolvedScopeValue == null) return
357
+
358
+ const highest = await highestPositionInScope({record, positionColumn, scope, scopeValue: resolvedScopeValue})
359
+ const tempPosition = highest + 10000
360
+ const positionColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(positionColumn))
361
+ const scopeColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(scope))
362
+ const tableSql = connection.quoteTable(tableName)
363
+ const pkSql = connection.quoteColumn("id")
364
+
365
+ setShiftingFlag(record, true)
366
+
367
+ try {
368
+ await connection.query(
369
+ `UPDATE ${tableSql} SET ${positionColumnSql} = ${connection.quote(tempPosition)} WHERE ${scopeColumnSql} = ${connection.quote(resolvedScopeValue)} AND ${pkSql} = ${connection.quote(record.id())}`
370
+ )
371
+ } finally {
372
+ // Don't clear the flag here — the caller will do that after shifts
373
+ }
374
+ }
@@ -0,0 +1,49 @@
1
+ // @ts-check
2
+
3
+ /** Downloaded attachment payload wrapper. */
4
+ export default class RecordAttachmentDownload {
5
+ /**
6
+ * Runs constructor.
7
+ * @param {object} args - Options.
8
+ * @param {string} args.id - Attachment id.
9
+ * @param {string} args.filename - Filename.
10
+ * @param {string | null} args.contentType - Content type.
11
+ * @param {number} args.byteSize - File size in bytes.
12
+ * @param {Buffer} args.content - File content.
13
+ * @param {string | null} [args.url] - Resolvable URL.
14
+ */
15
+ constructor({byteSize, content, contentType, filename, id, url = null}) {
16
+ this.values = {byteSize, content, contentType, filename, id, url}
17
+ }
18
+
19
+ /**
20
+ * Runs byte size.
21
+ * @returns {number} - File size in bytes.
22
+ */
23
+ byteSize() { return this.values.byteSize }
24
+ /**
25
+ * Runs content.
26
+ * @returns {Buffer} - File content.
27
+ */
28
+ content() { return this.values.content }
29
+ /**
30
+ * Runs content type.
31
+ * @returns {string | null} - Content type.
32
+ */
33
+ contentType() { return this.values.contentType }
34
+ /**
35
+ * Runs filename.
36
+ * @returns {string} - Filename.
37
+ */
38
+ filename() { return this.values.filename }
39
+ /**
40
+ * Runs id.
41
+ * @returns {string} - Attachment id.
42
+ */
43
+ id() { return this.values.id }
44
+ /**
45
+ * Runs url.
46
+ * @returns {string | null} - Resolvable attachment URL.
47
+ */
48
+ url() { return this.values.url }
49
+ }
@@ -0,0 +1,188 @@
1
+ // @ts-check
2
+
3
+ import RecordAttachmentDownload from "./download.js"
4
+ import {recordAttachmentsStoreForModel} from "./store.js"
5
+
6
+ /**
7
+ * Runs download from row.
8
+ * @param {object} args - Options.
9
+ * @param {Record<string, ?>} args.row - Raw row.
10
+ * @param {Buffer} args.content - Attachment bytes.
11
+ * @param {string | null} args.url - Attachment URL.
12
+ * @returns {RecordAttachmentDownload} - Download payload.
13
+ */
14
+ function downloadFromRow({content, row, url}) {
15
+ const byteSize = Number(row.byte_size)
16
+
17
+ return new RecordAttachmentDownload({
18
+ byteSize: Number.isFinite(byteSize) ? byteSize : content.length,
19
+ content,
20
+ contentType: row.content_type || null,
21
+ filename: row.filename || "attachment.bin",
22
+ id: row.id,
23
+ url
24
+ })
25
+ }
26
+
27
+ /**
28
+ * Runs is array.
29
+ * @param {?} value - Candidate value.
30
+ * @returns {value is Array<?>} - Whether value is an array.
31
+ */
32
+ function isArray(value) {
33
+ return Array.isArray(value)
34
+ }
35
+
36
+ /**
37
+ * Attachment helper bound to one model + attachment name.
38
+ */
39
+ export default class RecordAttachmentHandle {
40
+ /**
41
+ * Pending inputs.
42
+ @type {Array<?>} */
43
+ pendingInputs = []
44
+
45
+ /**
46
+ * Runs constructor.
47
+ * @param {object} args - Options.
48
+ * @param {import("../index.js").default} args.model - Model instance.
49
+ * @param {string} args.name - Attachment name.
50
+ * @param {"hasOne" | "hasMany"} args.type - Attachment type.
51
+ */
52
+ constructor({model, name, type}) {
53
+ this.model = model
54
+ this.name = name
55
+ this.type = type
56
+ }
57
+
58
+ /**
59
+ * Runs has pending attachments.
60
+ * @returns {boolean} - Whether there are pending attachment writes.
61
+ */
62
+ hasPendingAttachments() {
63
+ return this.pendingInputs.length > 0
64
+ }
65
+
66
+ /**
67
+ * Runs queue attach.
68
+ * @param {?} input - Attachment input.
69
+ * @returns {void} - Queues attachment write for next save.
70
+ */
71
+ queueAttach(input) {
72
+ if (this.type === "hasOne") {
73
+ if (isArray(input)) {
74
+ const lastInput = input[input.length - 1]
75
+
76
+ this.pendingInputs = typeof lastInput === "undefined" ? [] : [lastInput]
77
+ } else {
78
+ this.pendingInputs = [input]
79
+ }
80
+
81
+ return
82
+ }
83
+
84
+ if (isArray(input)) {
85
+ for (const inputEntry of input) {
86
+ this.pendingInputs.push(inputEntry)
87
+ }
88
+ } else {
89
+ this.pendingInputs.push(input)
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Runs attach.
95
+ * @param {?} input - Attachment input.
96
+ * @returns {Promise<void>} - Resolves when attached.
97
+ */
98
+ async attach(input) {
99
+ this.queueAttach(input)
100
+ await this.flushPendingAttachments()
101
+ }
102
+
103
+ /**
104
+ * Runs flush pending attachments.
105
+ * @returns {Promise<void>} - Resolves when pending attachments are flushed.
106
+ */
107
+ async flushPendingAttachments() {
108
+ if (!this.model.isPersisted()) return
109
+ if (this.pendingInputs.length < 1) return
110
+
111
+ const store = recordAttachmentsStoreForModel(this.model)
112
+ const pendingInputs = this.pendingInputs
113
+
114
+ this.pendingInputs = []
115
+
116
+ for (const [index, input] of pendingInputs.entries()) {
117
+ await store.attach({
118
+ input,
119
+ model: this.model,
120
+ name: this.name,
121
+ replace: this.type === "hasOne" && index === 0
122
+ })
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Runs download.
128
+ * @param {string} [id] - Optional attachment id for has-many attachments.
129
+ * @returns {Promise<RecordAttachmentDownload | null>} - Downloaded attachment.
130
+ */
131
+ async download(id) {
132
+ if (!this.model.isPersisted()) return null
133
+
134
+ const store = recordAttachmentsStoreForModel(this.model)
135
+ const row = await store.findOne({id, model: this.model, name: this.name})
136
+
137
+ if (!row) return null
138
+
139
+ const [content, url] = await Promise.all([
140
+ store.readAttachmentRow({model: this.model, name: this.name, row}),
141
+ store.attachmentRowUrl({model: this.model, name: this.name, row})
142
+ ])
143
+
144
+ return downloadFromRow({content, row, url})
145
+ }
146
+
147
+ /**
148
+ * Runs download all.
149
+ * @returns {Promise<Array<RecordAttachmentDownload>>} - Downloaded attachments.
150
+ */
151
+ async downloadAll() {
152
+ if (!this.model.isPersisted()) return []
153
+
154
+ const store = recordAttachmentsStoreForModel(this.model)
155
+ const rows = await store.findMany({model: this.model, name: this.name})
156
+ /**
157
+ * Downloads.
158
+ @type {RecordAttachmentDownload[]} */
159
+ const downloads = []
160
+
161
+ for (const row of rows) {
162
+ const [content, url] = await Promise.all([
163
+ store.readAttachmentRow({model: this.model, name: this.name, row}),
164
+ store.attachmentRowUrl({model: this.model, name: this.name, row})
165
+ ])
166
+
167
+ downloads.push(downloadFromRow({content, row, url}))
168
+ }
169
+
170
+ return downloads
171
+ }
172
+
173
+ /**
174
+ * Runs url.
175
+ * @param {string} [id] - Optional attachment id for has-many attachments.
176
+ * @returns {Promise<string | null>} - Resolvable attachment URL.
177
+ */
178
+ async url(id) {
179
+ if (!this.model.isPersisted()) return null
180
+
181
+ const store = recordAttachmentsStoreForModel(this.model)
182
+ const row = await store.findOne({id, model: this.model, name: this.name})
183
+
184
+ if (!row) return null
185
+
186
+ return await store.attachmentRowUrl({model: this.model, name: this.name, row})
187
+ }
188
+ }