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.
- package/bin/velocious.js +48 -0
- package/build/application.js +229 -0
- package/build/authorization/ability.js +329 -0
- package/build/authorization/base-resource.js +143 -0
- package/build/background-jobs/client.js +50 -0
- package/build/background-jobs/cron-expression.js +277 -0
- package/build/background-jobs/forked-runner-child.js +86 -0
- package/build/background-jobs/job-record.js +13 -0
- package/build/background-jobs/job-registry.js +92 -0
- package/build/background-jobs/job-runner.js +107 -0
- package/build/background-jobs/job.js +77 -0
- package/build/background-jobs/json-socket.js +78 -0
- package/build/background-jobs/main.js +926 -0
- package/build/background-jobs/normalize-error.js +26 -0
- package/build/background-jobs/scheduler.js +274 -0
- package/build/background-jobs/socket-request.js +68 -0
- package/build/background-jobs/status-reporter.js +101 -0
- package/build/background-jobs/store.js +994 -0
- package/build/background-jobs/types.js +70 -0
- package/build/background-jobs/web/authorization.js +89 -0
- package/build/background-jobs/web/controller.js +280 -0
- package/build/background-jobs/web/index.js +57 -0
- package/build/background-jobs/web/path-matcher.js +74 -0
- package/build/background-jobs/web/registry.js +49 -0
- package/build/background-jobs/worker.js +683 -0
- package/build/beacon/client.js +330 -0
- package/build/beacon/in-process-broker.js +71 -0
- package/build/beacon/in-process-client.js +139 -0
- package/build/beacon/server.js +148 -0
- package/build/beacon/types.js +55 -0
- package/build/bin/velocious.js +39 -34
- package/build/cli/base-command.js +67 -0
- package/build/cli/browser-cli.js +45 -0
- package/build/cli/commands/background-jobs-main.js +7 -0
- package/build/cli/commands/background-jobs-runner.js +7 -0
- package/build/cli/commands/background-jobs-worker.js +7 -0
- package/build/cli/commands/beacon.js +7 -0
- package/build/cli/commands/console.js +12 -0
- package/build/cli/commands/db/base-command.js +82 -0
- package/build/cli/commands/db/create.js +64 -0
- package/build/cli/commands/db/drop.js +75 -0
- package/build/cli/commands/db/migrate.js +17 -0
- package/build/cli/commands/db/reset.js +22 -0
- package/build/cli/commands/db/rollback.js +15 -0
- package/build/cli/commands/db/schema/dump.js +12 -0
- package/build/cli/commands/db/schema/load.js +12 -0
- package/build/cli/commands/db/seed.js +12 -0
- package/build/cli/commands/db/tenants/check.js +38 -0
- package/build/cli/commands/db/tenants/create.js +33 -0
- package/build/cli/commands/db/tenants/migrate.js +49 -0
- package/build/cli/commands/destroy/migration.js +7 -0
- package/build/cli/commands/generate/base-models.js +7 -0
- package/build/cli/commands/generate/frontend-models.js +12 -0
- package/build/cli/commands/generate/migration.js +7 -0
- package/build/cli/commands/generate/model.js +7 -0
- package/build/cli/commands/init.js +11 -0
- package/build/cli/commands/routes.js +7 -0
- package/build/cli/commands/run-script.js +12 -0
- package/build/cli/commands/runner.js +12 -0
- package/build/cli/commands/server.js +7 -0
- package/build/cli/commands/test.js +9 -0
- package/build/cli/index.js +152 -0
- package/build/cli/tenant-database-command-helper.js +198 -0
- package/build/cli/use-browser-cli.js +30 -0
- package/build/configuration-resolver.js +65 -0
- package/build/configuration-types.js +429 -0
- package/build/configuration.js +2590 -0
- package/build/controller.js +421 -0
- package/build/current-configuration.js +31 -0
- package/build/current.js +80 -0
- package/build/database/annotations-async-hooks.js +47 -0
- package/build/database/annotations.js +40 -0
- package/build/database/drivers/base-column.js +182 -0
- package/build/database/drivers/base-columns-index.js +81 -0
- package/build/database/drivers/base-foreign-key.js +104 -0
- package/build/database/drivers/base-table.js +156 -0
- package/build/database/drivers/base.js +1609 -0
- package/build/database/drivers/mssql/column.js +74 -0
- package/build/database/drivers/mssql/columns-index.js +6 -0
- package/build/database/drivers/mssql/connect-connection.js +16 -0
- package/build/database/drivers/mssql/foreign-key.js +12 -0
- package/build/database/drivers/mssql/index.js +590 -0
- package/build/database/drivers/mssql/options.js +79 -0
- package/build/database/drivers/mssql/query-parser.js +6 -0
- package/build/database/drivers/mssql/sql/alter-table.js +4 -0
- package/build/database/drivers/mssql/sql/create-database.js +36 -0
- package/build/database/drivers/mssql/sql/create-index.js +4 -0
- package/build/database/drivers/mssql/sql/create-table.js +4 -0
- package/build/database/drivers/mssql/sql/delete.js +19 -0
- package/build/database/drivers/mssql/sql/drop-database.js +36 -0
- package/build/database/drivers/mssql/sql/drop-table.js +4 -0
- package/build/database/drivers/mssql/sql/insert.js +4 -0
- package/build/database/drivers/mssql/sql/update.js +31 -0
- package/build/database/drivers/mssql/sql/upsert.js +23 -0
- package/build/database/drivers/mssql/structure-sql.js +120 -0
- package/build/database/drivers/mssql/table.js +145 -0
- package/build/database/drivers/mysql/column.js +112 -0
- package/build/database/drivers/mysql/columns-index.js +22 -0
- package/build/database/drivers/mysql/foreign-key.js +12 -0
- package/build/database/drivers/mysql/index.js +473 -0
- package/build/database/drivers/mysql/options.js +34 -0
- package/build/database/drivers/mysql/query-parser.js +6 -0
- package/build/database/drivers/mysql/query.js +37 -0
- package/build/database/drivers/mysql/sql/alter-table.js +6 -0
- package/build/database/drivers/mysql/sql/create-database.js +39 -0
- package/build/database/drivers/mysql/sql/create-index.js +6 -0
- package/build/database/drivers/mysql/sql/create-table.js +6 -0
- package/build/database/drivers/mysql/sql/delete.js +21 -0
- package/build/database/drivers/mysql/sql/drop-database.js +6 -0
- package/build/database/drivers/mysql/sql/drop-table.js +6 -0
- package/build/database/drivers/mysql/sql/insert.js +6 -0
- package/build/database/drivers/mysql/sql/update.js +33 -0
- package/build/database/drivers/mysql/sql/upsert.js +13 -0
- package/build/database/drivers/mysql/structure-sql.js +93 -0
- package/build/database/drivers/mysql/table.js +121 -0
- package/build/database/drivers/pgsql/column.js +90 -0
- package/build/database/drivers/pgsql/columns-index.js +6 -0
- package/build/database/drivers/pgsql/foreign-key.js +12 -0
- package/build/database/drivers/pgsql/index.js +441 -0
- package/build/database/drivers/pgsql/options.js +32 -0
- package/build/database/drivers/pgsql/query-parser.js +6 -0
- package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/build/database/drivers/pgsql/sql/create-database.js +38 -0
- package/build/database/drivers/pgsql/sql/create-index.js +6 -0
- package/build/database/drivers/pgsql/sql/create-table.js +6 -0
- package/build/database/drivers/pgsql/sql/delete.js +21 -0
- package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/build/database/drivers/pgsql/sql/insert.js +6 -0
- package/build/database/drivers/pgsql/sql/update.js +33 -0
- package/build/database/drivers/pgsql/sql/upsert.js +14 -0
- package/build/database/drivers/pgsql/structure-sql.js +126 -0
- package/build/database/drivers/pgsql/table.js +135 -0
- package/build/database/drivers/sqlite/base.js +509 -0
- package/build/database/drivers/sqlite/column.js +75 -0
- package/build/database/drivers/sqlite/columns-index.js +30 -0
- package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/build/database/drivers/sqlite/foreign-key.js +24 -0
- package/build/database/drivers/sqlite/index.js +394 -0
- package/build/database/drivers/sqlite/index.native.js +72 -0
- package/build/database/drivers/sqlite/index.web.js +99 -0
- package/build/database/drivers/sqlite/options.js +32 -0
- package/build/database/drivers/sqlite/query-parser.js +6 -0
- package/build/database/drivers/sqlite/query.js +35 -0
- package/build/database/drivers/sqlite/query.native.js +35 -0
- package/build/database/drivers/sqlite/query.web.js +49 -0
- package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/build/database/drivers/sqlite/sql/create-index.js +6 -0
- package/build/database/drivers/sqlite/sql/create-table.js +6 -0
- package/build/database/drivers/sqlite/sql/delete.js +26 -0
- package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/build/database/drivers/sqlite/sql/insert.js +6 -0
- package/build/database/drivers/sqlite/sql/update.js +33 -0
- package/build/database/drivers/sqlite/sql/upsert.js +14 -0
- package/build/database/drivers/sqlite/structure-sql.js +56 -0
- package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/build/database/drivers/sqlite/table.js +131 -0
- package/build/database/drivers/structure-sql/utils.js +35 -0
- package/build/database/handler.js +13 -0
- package/build/database/initializer-from-require-context.js +101 -0
- package/build/database/migration/index.js +438 -0
- package/build/database/migrator/files-finder.js +55 -0
- package/build/database/migrator/types.js +31 -0
- package/build/database/migrator.js +557 -0
- package/build/database/pool/async-tracked-multi-connection.js +1164 -0
- package/build/database/pool/base-methods-forward.js +52 -0
- package/build/database/pool/base.js +380 -0
- package/build/database/pool/single-multi-use.js +118 -0
- package/build/database/query/alter-table-base.js +104 -0
- package/build/database/query/base.js +49 -0
- package/build/database/query/create-database-base.js +42 -0
- package/build/database/query/create-index-base.js +117 -0
- package/build/database/query/create-table-base.js +205 -0
- package/build/database/query/delete-base.js +19 -0
- package/build/database/query/drop-database-base.js +38 -0
- package/build/database/query/drop-table-base.js +58 -0
- package/build/database/query/from-base.js +36 -0
- package/build/database/query/from-plain.js +16 -0
- package/build/database/query/from-table.js +18 -0
- package/build/database/query/index.js +533 -0
- package/build/database/query/insert-base.js +172 -0
- package/build/database/query/join-base.js +43 -0
- package/build/database/query/join-object.js +167 -0
- package/build/database/query/join-plain.js +18 -0
- package/build/database/query/join-tracker.js +93 -0
- package/build/database/query/model-class-query.js +1577 -0
- package/build/database/query/order-base.js +33 -0
- package/build/database/query/order-column.js +77 -0
- package/build/database/query/order-plain.js +28 -0
- package/build/database/query/preloader/belongs-to.js +267 -0
- package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/build/database/query/preloader/has-many.js +316 -0
- package/build/database/query/preloader/has-one.js +123 -0
- package/build/database/query/preloader/selection.js +152 -0
- package/build/database/query/preloader.js +201 -0
- package/build/database/query/query-data.js +305 -0
- package/build/database/query/select-base.js +30 -0
- package/build/database/query/select-plain.js +18 -0
- package/build/database/query/select-table-and-column.js +28 -0
- package/build/database/query/update-base.js +41 -0
- package/build/database/query/upsert-base.js +103 -0
- package/build/database/query/where-base.js +38 -0
- package/build/database/query/where-combinator.js +31 -0
- package/build/database/query/where-hash.js +77 -0
- package/build/database/query/where-model-class-hash.js +505 -0
- package/build/database/query/where-not.js +23 -0
- package/build/database/query/where-plain.js +20 -0
- package/build/database/query/with-count.js +219 -0
- package/build/database/query-parser/base-query-parser.js +40 -0
- package/build/database/query-parser/from-parser.js +49 -0
- package/build/database/query-parser/group-parser.js +55 -0
- package/build/database/query-parser/joins-parser.js +37 -0
- package/build/database/query-parser/limit-parser.js +77 -0
- package/build/database/query-parser/options.js +94 -0
- package/build/database/query-parser/order-parser.js +45 -0
- package/build/database/query-parser/select-parser.js +67 -0
- package/build/database/query-parser/where-parser.js +46 -0
- package/build/database/record/acts-as-list.js +374 -0
- package/build/database/record/attachments/download.js +49 -0
- package/build/database/record/attachments/handle.js +188 -0
- package/build/database/record/attachments/normalize-input.js +213 -0
- package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/build/database/record/attachments/storage-drivers/native.js +146 -0
- package/build/database/record/attachments/storage-drivers/s3.js +245 -0
- package/build/database/record/attachments/store.js +591 -0
- package/build/database/record/index.js +4094 -0
- package/build/database/record/instance-relationships/base.js +289 -0
- package/build/database/record/instance-relationships/belongs-to.js +84 -0
- package/build/database/record/instance-relationships/has-many.js +284 -0
- package/build/database/record/instance-relationships/has-one.js +117 -0
- package/build/database/record/record-not-found-error.js +3 -0
- package/build/database/record/relationships/base.js +195 -0
- package/build/database/record/relationships/belongs-to.js +57 -0
- package/build/database/record/relationships/has-many.js +46 -0
- package/build/database/record/relationships/has-one.js +46 -0
- package/build/database/record/state-machine.js +278 -0
- package/build/database/record/user-module.js +43 -0
- package/build/database/record/validators/base.js +27 -0
- package/build/database/record/validators/format.js +50 -0
- package/build/database/record/validators/presence.js +24 -0
- package/build/database/record/validators/uniqueness.js +124 -0
- package/build/database/table-data/index.js +241 -0
- package/build/database/table-data/table-column.js +416 -0
- package/build/database/table-data/table-foreign-key.js +69 -0
- package/build/database/table-data/table-index.js +46 -0
- package/build/database/table-data/table-reference.js +13 -0
- package/build/database/use-database.js +48 -0
- package/build/environment-handlers/base.js +561 -0
- package/build/environment-handlers/browser.js +338 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/build/environment-handlers/node/cli/commands/console.js +149 -0
- package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/build/environment-handlers/node/cli/commands/init.js +68 -0
- package/build/environment-handlers/node/cli/commands/routes.js +63 -0
- package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/build/environment-handlers/node/cli/commands/runner.js +84 -0
- package/build/environment-handlers/node/cli/commands/server.js +151 -0
- package/build/environment-handlers/node/cli/commands/test.js +118 -0
- package/build/environment-handlers/node.js +887 -0
- package/build/error-logger.js +30 -0
- package/build/frontend-model-controller.js +3491 -0
- package/build/frontend-model-resource/base-resource.js +935 -0
- package/build/frontend-models/base.js +4004 -0
- package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/build/frontend-models/event-hook-models.js +49 -0
- package/build/frontend-models/model-registry.js +28 -0
- package/build/frontend-models/outgoing-event-buffer.js +51 -0
- package/build/frontend-models/preloader.js +169 -0
- package/build/frontend-models/query.js +2245 -0
- package/build/frontend-models/resource-config-validation.js +56 -0
- package/build/frontend-models/resource-definition.js +399 -0
- package/build/frontend-models/transport-serialization.js +369 -0
- package/build/frontend-models/use-created-event.js +21 -0
- package/build/frontend-models/use-destroyed-event.js +148 -0
- package/build/frontend-models/use-model-class-event.js +164 -0
- package/build/frontend-models/use-updated-event.js +152 -0
- package/build/frontend-models/websocket-channel.js +494 -0
- package/build/frontend-models/websocket-publishers.js +224 -0
- package/build/http-client/header.js +17 -0
- package/build/http-client/index.js +139 -0
- package/build/http-client/request.js +94 -0
- package/build/http-client/response.js +151 -0
- package/build/http-client/websocket-client.js +27 -0
- package/build/http-server/client/index.js +507 -0
- package/build/http-server/client/params-to-object.js +152 -0
- package/build/http-server/client/request-buffer/form-data-part.js +139 -0
- package/build/http-server/client/request-buffer/header.js +19 -0
- package/build/http-server/client/request-buffer/index.js +535 -0
- package/build/http-server/client/request-parser.js +195 -0
- package/build/http-server/client/request-runner.js +321 -0
- package/build/http-server/client/request-timing.js +171 -0
- package/build/http-server/client/request.js +114 -0
- package/build/http-server/client/response.js +251 -0
- package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/build/http-server/client/websocket-request.js +147 -0
- package/build/http-server/client/websocket-session.js +1755 -0
- package/build/http-server/cookie.js +245 -0
- package/build/http-server/development-reloader.js +240 -0
- package/build/http-server/index.js +561 -0
- package/build/http-server/remote-address.js +77 -0
- package/build/http-server/server-client.js +222 -0
- package/build/http-server/server-lock.js +178 -0
- package/build/http-server/websocket-channel-subscribers.js +110 -0
- package/build/http-server/websocket-channel.js +137 -0
- package/build/http-server/websocket-connection.js +118 -0
- package/build/http-server/websocket-event-log-store.js +433 -0
- package/build/http-server/websocket-events-host.js +170 -0
- package/build/http-server/websocket-events.js +50 -0
- package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/build/http-server/worker-handler/in-process.js +155 -0
- package/build/http-server/worker-handler/index.js +370 -0
- package/build/http-server/worker-handler/worker-script.js +6 -0
- package/build/http-server/worker-handler/worker-thread.js +286 -0
- package/build/index.js +1 -2
- package/build/initializer.js +39 -0
- package/build/jobs/mail-delivery.js +22 -0
- package/build/logger/base-logger.js +34 -0
- package/build/logger/console-logger.js +28 -0
- package/build/logger/file-logger.js +36 -0
- package/build/logger/outputs/array-output.js +50 -0
- package/build/logger/outputs/console-output.js +32 -0
- package/build/logger/outputs/file-output.js +55 -0
- package/build/logger/outputs/stdout-output.js +64 -0
- package/build/logger.js +507 -0
- package/build/mailer/backends/smtp.js +197 -0
- package/build/mailer/base.js +337 -0
- package/build/mailer/delivery.js +70 -0
- package/build/mailer/index.js +24 -0
- package/build/mailer.js +15 -0
- package/build/plugins/sqljs-wasm-route-controller.js +70 -0
- package/build/plugins/sqljs-wasm-route.js +71 -0
- package/build/record-payload-values.js +83 -0
- package/build/routes/app-routes.js +17 -0
- package/build/routes/base-route.js +133 -0
- package/build/routes/basic-route.js +109 -0
- package/build/routes/built-in/debug/controller.js +12 -0
- package/build/routes/built-in/errors/controller.js +7 -0
- package/build/routes/get-route.js +75 -0
- package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/build/routes/index.js +50 -0
- package/build/routes/namespace-route.js +51 -0
- package/build/routes/plugin-routes.js +141 -0
- package/build/routes/post-route.js +74 -0
- package/build/routes/resolver.js +535 -0
- package/build/routes/resource-route.js +154 -0
- package/build/routes/root-route.js +11 -0
- package/build/src/authorization/ability.d.ts +24 -23
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +14 -13
- package/build/src/authorization/base-resource.d.ts +20 -26
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +13 -11
- package/build/src/configuration-types.d.ts +21 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +8 -2
- package/build/src/database/query/where-combinator.d.ts.map +1 -1
- package/build/src/database/query/where-combinator.js +1 -2
- package/build/src/database/record/acts-as-list.js +2 -2
- package/build/src/database/record/attachments/store.d.ts +1 -1
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +2 -2
- package/build/src/database/record/index.d.ts +82 -20
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +126 -13
- package/build/src/database/record/relationships/base.d.ts +2 -2
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +3 -3
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +59 -36
- package/build/src/frontend-model-controller.d.ts +6 -6
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +4 -4
- package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +22 -10
- package/build/src/frontend-models/base.d.ts +19 -12
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +79 -48
- package/build/src/frontend-models/preloader.d.ts +6 -6
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +5 -5
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +1 -4
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +1 -2
- package/build/templates/configuration.js +61 -0
- package/build/templates/generate-migration.js +11 -0
- package/build/templates/generate-model.js +6 -0
- package/build/templates/routes.js +11 -0
- package/build/testing/base-expect.js +17 -0
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/build/testing/browser-test-app.js +32 -0
- package/build/testing/expect-to-change.js +55 -0
- package/build/testing/expect-utils.js +269 -0
- package/build/testing/expect.js +763 -0
- package/build/testing/request-client.js +90 -0
- package/build/testing/test-files-finder.js +364 -0
- package/build/testing/test-filter-parser.js +198 -0
- package/build/testing/test-runner.js +1168 -0
- package/build/testing/test-suite-splitter.js +177 -0
- package/build/testing/test.js +370 -0
- package/build/utils/backtrace-cleaner-node.js +87 -0
- package/build/utils/backtrace-cleaner.js +266 -0
- package/build/utils/ensure-error.js +15 -0
- package/build/utils/event-emitter.js +8 -0
- package/build/utils/file-exists.js +18 -0
- package/build/utils/format-value.js +101 -0
- package/build/utils/model-scope.js +56 -0
- package/build/utils/nest-callbacks.js +22 -0
- package/build/utils/plain-object.js +14 -0
- package/build/utils/ransack.js +859 -0
- package/build/utils/rest-args-error.js +14 -0
- package/build/utils/singularize-model-name.js +18 -0
- package/build/utils/split-sql-statements.js +88 -0
- package/build/utils/to-import-specifier.js +53 -0
- package/build/utils/with-tracked-stack-async-hooks.js +103 -0
- package/build/utils/with-tracked-stack.js +38 -0
- package/build/velocious-error.js +34 -0
- package/index.js +1 -0
- package/package.json +10 -4
- package/scripts/clean-build.js +8 -0
- package/scripts/ensure-bin-executable.js +13 -0
- package/scripts/run-tests.js +37 -0
- package/scripts/test-browser.js +486 -0
- package/src/application.js +229 -0
- package/src/authorization/ability.js +329 -0
- package/src/authorization/base-resource.js +143 -0
- package/src/background-jobs/client.js +50 -0
- package/src/background-jobs/cron-expression.js +277 -0
- package/src/background-jobs/forked-runner-child.js +86 -0
- package/src/background-jobs/job-record.js +13 -0
- package/src/background-jobs/job-registry.js +92 -0
- package/src/background-jobs/job-runner.js +107 -0
- package/src/background-jobs/job.js +77 -0
- package/src/background-jobs/json-socket.js +78 -0
- package/src/background-jobs/main.js +926 -0
- package/src/background-jobs/normalize-error.js +26 -0
- package/src/background-jobs/scheduler.js +274 -0
- package/src/background-jobs/socket-request.js +68 -0
- package/src/background-jobs/status-reporter.js +101 -0
- package/src/background-jobs/store.js +994 -0
- package/src/background-jobs/types.js +70 -0
- package/src/background-jobs/web/authorization.js +89 -0
- package/src/background-jobs/web/controller.js +280 -0
- package/src/background-jobs/web/index.js +57 -0
- package/src/background-jobs/web/path-matcher.js +74 -0
- package/src/background-jobs/web/registry.js +49 -0
- package/src/background-jobs/worker.js +683 -0
- package/src/beacon/client.js +330 -0
- package/src/beacon/in-process-broker.js +71 -0
- package/src/beacon/in-process-client.js +139 -0
- package/src/beacon/server.js +148 -0
- package/src/beacon/types.js +55 -0
- package/src/cli/base-command.js +67 -0
- package/src/cli/browser-cli.js +45 -0
- package/src/cli/commands/background-jobs-main.js +7 -0
- package/src/cli/commands/background-jobs-runner.js +7 -0
- package/src/cli/commands/background-jobs-worker.js +7 -0
- package/src/cli/commands/beacon.js +7 -0
- package/src/cli/commands/console.js +12 -0
- package/src/cli/commands/db/base-command.js +82 -0
- package/src/cli/commands/db/create.js +64 -0
- package/src/cli/commands/db/drop.js +75 -0
- package/src/cli/commands/db/migrate.js +17 -0
- package/src/cli/commands/db/reset.js +22 -0
- package/src/cli/commands/db/rollback.js +15 -0
- package/src/cli/commands/db/schema/dump.js +12 -0
- package/src/cli/commands/db/schema/load.js +12 -0
- package/src/cli/commands/db/seed.js +12 -0
- package/src/cli/commands/db/tenants/check.js +38 -0
- package/src/cli/commands/db/tenants/create.js +33 -0
- package/src/cli/commands/db/tenants/migrate.js +49 -0
- package/src/cli/commands/destroy/migration.js +7 -0
- package/src/cli/commands/generate/base-models.js +7 -0
- package/src/cli/commands/generate/frontend-models.js +12 -0
- package/src/cli/commands/generate/migration.js +7 -0
- package/src/cli/commands/generate/model.js +7 -0
- package/src/cli/commands/init.js +11 -0
- package/src/cli/commands/routes.js +7 -0
- package/src/cli/commands/run-script.js +12 -0
- package/src/cli/commands/runner.js +12 -0
- package/src/cli/commands/server.js +7 -0
- package/src/cli/commands/test.js +9 -0
- package/src/cli/index.js +152 -0
- package/src/cli/tenant-database-command-helper.js +198 -0
- package/src/cli/use-browser-cli.js +30 -0
- package/src/configuration-resolver.js +65 -0
- package/src/configuration-types.js +429 -0
- package/src/configuration.js +2590 -0
- package/src/controller.js +421 -0
- package/src/current-configuration.js +31 -0
- package/src/current.js +80 -0
- package/src/database/annotations-async-hooks.js +47 -0
- package/src/database/annotations.js +40 -0
- package/src/database/drivers/base-column.js +182 -0
- package/src/database/drivers/base-columns-index.js +81 -0
- package/src/database/drivers/base-foreign-key.js +104 -0
- package/src/database/drivers/base-table.js +156 -0
- package/src/database/drivers/base.js +1609 -0
- package/src/database/drivers/mssql/column.js +74 -0
- package/src/database/drivers/mssql/columns-index.js +6 -0
- package/src/database/drivers/mssql/connect-connection.js +16 -0
- package/src/database/drivers/mssql/foreign-key.js +12 -0
- package/src/database/drivers/mssql/index.js +590 -0
- package/src/database/drivers/mssql/options.js +79 -0
- package/src/database/drivers/mssql/query-parser.js +6 -0
- package/src/database/drivers/mssql/sql/alter-table.js +4 -0
- package/src/database/drivers/mssql/sql/create-database.js +36 -0
- package/src/database/drivers/mssql/sql/create-index.js +4 -0
- package/src/database/drivers/mssql/sql/create-table.js +4 -0
- package/src/database/drivers/mssql/sql/delete.js +19 -0
- package/src/database/drivers/mssql/sql/drop-database.js +36 -0
- package/src/database/drivers/mssql/sql/drop-table.js +4 -0
- package/src/database/drivers/mssql/sql/insert.js +4 -0
- package/src/database/drivers/mssql/sql/update.js +31 -0
- package/src/database/drivers/mssql/sql/upsert.js +23 -0
- package/src/database/drivers/mssql/structure-sql.js +120 -0
- package/src/database/drivers/mssql/table.js +145 -0
- package/src/database/drivers/mysql/column.js +112 -0
- package/src/database/drivers/mysql/columns-index.js +22 -0
- package/src/database/drivers/mysql/foreign-key.js +12 -0
- package/src/database/drivers/mysql/index.js +473 -0
- package/src/database/drivers/mysql/options.js +34 -0
- package/src/database/drivers/mysql/query-parser.js +6 -0
- package/src/database/drivers/mysql/query.js +37 -0
- package/src/database/drivers/mysql/sql/alter-table.js +6 -0
- package/src/database/drivers/mysql/sql/create-database.js +39 -0
- package/src/database/drivers/mysql/sql/create-index.js +6 -0
- package/src/database/drivers/mysql/sql/create-table.js +6 -0
- package/src/database/drivers/mysql/sql/delete.js +21 -0
- package/src/database/drivers/mysql/sql/drop-database.js +6 -0
- package/src/database/drivers/mysql/sql/drop-table.js +6 -0
- package/src/database/drivers/mysql/sql/insert.js +6 -0
- package/src/database/drivers/mysql/sql/update.js +33 -0
- package/src/database/drivers/mysql/sql/upsert.js +13 -0
- package/src/database/drivers/mysql/structure-sql.js +93 -0
- package/src/database/drivers/mysql/table.js +121 -0
- package/src/database/drivers/pgsql/column.js +90 -0
- package/src/database/drivers/pgsql/columns-index.js +6 -0
- package/src/database/drivers/pgsql/foreign-key.js +12 -0
- package/src/database/drivers/pgsql/index.js +441 -0
- package/src/database/drivers/pgsql/options.js +32 -0
- package/src/database/drivers/pgsql/query-parser.js +6 -0
- package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/src/database/drivers/pgsql/sql/create-database.js +38 -0
- package/src/database/drivers/pgsql/sql/create-index.js +6 -0
- package/src/database/drivers/pgsql/sql/create-table.js +6 -0
- package/src/database/drivers/pgsql/sql/delete.js +21 -0
- package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/src/database/drivers/pgsql/sql/insert.js +6 -0
- package/src/database/drivers/pgsql/sql/update.js +33 -0
- package/src/database/drivers/pgsql/sql/upsert.js +14 -0
- package/src/database/drivers/pgsql/structure-sql.js +126 -0
- package/src/database/drivers/pgsql/table.js +135 -0
- package/src/database/drivers/sqlite/base.js +509 -0
- package/src/database/drivers/sqlite/column.js +75 -0
- package/src/database/drivers/sqlite/columns-index.js +30 -0
- package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/src/database/drivers/sqlite/foreign-key.js +24 -0
- package/src/database/drivers/sqlite/index.js +394 -0
- package/src/database/drivers/sqlite/index.native.js +72 -0
- package/src/database/drivers/sqlite/index.web.js +99 -0
- package/src/database/drivers/sqlite/options.js +32 -0
- package/src/database/drivers/sqlite/query-parser.js +6 -0
- package/src/database/drivers/sqlite/query.js +35 -0
- package/src/database/drivers/sqlite/query.native.js +35 -0
- package/src/database/drivers/sqlite/query.web.js +49 -0
- package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/src/database/drivers/sqlite/sql/create-index.js +6 -0
- package/src/database/drivers/sqlite/sql/create-table.js +6 -0
- package/src/database/drivers/sqlite/sql/delete.js +26 -0
- package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/src/database/drivers/sqlite/sql/insert.js +6 -0
- package/src/database/drivers/sqlite/sql/update.js +33 -0
- package/src/database/drivers/sqlite/sql/upsert.js +14 -0
- package/src/database/drivers/sqlite/structure-sql.js +56 -0
- package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/src/database/drivers/sqlite/table.js +131 -0
- package/src/database/drivers/structure-sql/utils.js +35 -0
- package/src/database/handler.js +13 -0
- package/src/database/initializer-from-require-context.js +101 -0
- package/src/database/migration/index.js +438 -0
- package/src/database/migrator/files-finder.js +55 -0
- package/src/database/migrator/types.js +31 -0
- package/src/database/migrator.js +557 -0
- package/src/database/pool/async-tracked-multi-connection.js +1164 -0
- package/src/database/pool/base-methods-forward.js +52 -0
- package/src/database/pool/base.js +380 -0
- package/src/database/pool/single-multi-use.js +118 -0
- package/src/database/query/alter-table-base.js +104 -0
- package/src/database/query/base.js +49 -0
- package/src/database/query/create-database-base.js +42 -0
- package/src/database/query/create-index-base.js +117 -0
- package/src/database/query/create-table-base.js +205 -0
- package/src/database/query/delete-base.js +19 -0
- package/src/database/query/drop-database-base.js +38 -0
- package/src/database/query/drop-table-base.js +58 -0
- package/src/database/query/from-base.js +36 -0
- package/src/database/query/from-plain.js +16 -0
- package/src/database/query/from-table.js +18 -0
- package/src/database/query/index.js +533 -0
- package/src/database/query/insert-base.js +172 -0
- package/src/database/query/join-base.js +43 -0
- package/src/database/query/join-object.js +167 -0
- package/src/database/query/join-plain.js +18 -0
- package/src/database/query/join-tracker.js +93 -0
- package/src/database/query/model-class-query.js +1577 -0
- package/src/database/query/order-base.js +33 -0
- package/src/database/query/order-column.js +77 -0
- package/src/database/query/order-plain.js +28 -0
- package/src/database/query/preloader/belongs-to.js +267 -0
- package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/src/database/query/preloader/has-many.js +316 -0
- package/src/database/query/preloader/has-one.js +123 -0
- package/src/database/query/preloader/selection.js +152 -0
- package/src/database/query/preloader.js +201 -0
- package/src/database/query/query-data.js +305 -0
- package/src/database/query/select-base.js +30 -0
- package/src/database/query/select-plain.js +18 -0
- package/src/database/query/select-table-and-column.js +28 -0
- package/src/database/query/update-base.js +41 -0
- package/src/database/query/upsert-base.js +103 -0
- package/src/database/query/where-base.js +38 -0
- package/src/database/query/where-combinator.js +31 -0
- package/src/database/query/where-hash.js +77 -0
- package/src/database/query/where-model-class-hash.js +505 -0
- package/src/database/query/where-not.js +23 -0
- package/src/database/query/where-plain.js +20 -0
- package/src/database/query/with-count.js +219 -0
- package/src/database/query-parser/base-query-parser.js +40 -0
- package/src/database/query-parser/from-parser.js +49 -0
- package/src/database/query-parser/group-parser.js +55 -0
- package/src/database/query-parser/joins-parser.js +37 -0
- package/src/database/query-parser/limit-parser.js +77 -0
- package/src/database/query-parser/options.js +94 -0
- package/src/database/query-parser/order-parser.js +45 -0
- package/src/database/query-parser/select-parser.js +67 -0
- package/src/database/query-parser/where-parser.js +46 -0
- package/src/database/record/acts-as-list.js +374 -0
- package/src/database/record/attachments/download.js +49 -0
- package/src/database/record/attachments/handle.js +188 -0
- package/src/database/record/attachments/normalize-input.js +213 -0
- package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/src/database/record/attachments/storage-drivers/native.js +146 -0
- package/src/database/record/attachments/storage-drivers/s3.js +245 -0
- package/src/database/record/attachments/store.js +591 -0
- package/src/database/record/index.js +4094 -0
- package/src/database/record/instance-relationships/base.js +289 -0
- package/src/database/record/instance-relationships/belongs-to.js +84 -0
- package/src/database/record/instance-relationships/has-many.js +284 -0
- package/src/database/record/instance-relationships/has-one.js +117 -0
- package/src/database/record/record-not-found-error.js +3 -0
- package/src/database/record/relationships/base.js +195 -0
- package/src/database/record/relationships/belongs-to.js +57 -0
- package/src/database/record/relationships/has-many.js +46 -0
- package/src/database/record/relationships/has-one.js +46 -0
- package/src/database/record/state-machine.js +278 -0
- package/src/database/record/user-module.js +43 -0
- package/src/database/record/validators/base.js +27 -0
- package/src/database/record/validators/format.js +50 -0
- package/src/database/record/validators/presence.js +24 -0
- package/src/database/record/validators/uniqueness.js +124 -0
- package/src/database/table-data/index.js +241 -0
- package/src/database/table-data/table-column.js +416 -0
- package/src/database/table-data/table-foreign-key.js +69 -0
- package/src/database/table-data/table-index.js +46 -0
- package/src/database/table-data/table-reference.js +13 -0
- package/src/database/use-database.js +48 -0
- package/src/environment-handlers/base.js +561 -0
- package/src/environment-handlers/browser.js +338 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/src/environment-handlers/node/cli/commands/console.js +149 -0
- package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/src/environment-handlers/node/cli/commands/init.js +68 -0
- package/src/environment-handlers/node/cli/commands/routes.js +63 -0
- package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/src/environment-handlers/node/cli/commands/runner.js +84 -0
- package/src/environment-handlers/node/cli/commands/server.js +151 -0
- package/src/environment-handlers/node/cli/commands/test.js +118 -0
- package/src/environment-handlers/node.js +887 -0
- package/src/error-logger.js +30 -0
- package/src/frontend-model-controller.js +3491 -0
- package/src/frontend-model-resource/base-resource.js +935 -0
- package/src/frontend-models/base.js +4004 -0
- package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/src/frontend-models/event-hook-models.js +49 -0
- package/src/frontend-models/model-registry.js +28 -0
- package/src/frontend-models/outgoing-event-buffer.js +51 -0
- package/src/frontend-models/preloader.js +169 -0
- package/src/frontend-models/query.js +2245 -0
- package/src/frontend-models/resource-config-validation.js +56 -0
- package/src/frontend-models/resource-definition.js +399 -0
- package/src/frontend-models/transport-serialization.js +369 -0
- package/src/frontend-models/use-created-event.js +21 -0
- package/src/frontend-models/use-destroyed-event.js +148 -0
- package/src/frontend-models/use-model-class-event.js +164 -0
- package/src/frontend-models/use-updated-event.js +152 -0
- package/src/frontend-models/websocket-channel.js +494 -0
- package/src/frontend-models/websocket-publishers.js +224 -0
- package/src/http-client/header.js +17 -0
- package/src/http-client/index.js +139 -0
- package/src/http-client/request.js +94 -0
- package/src/http-client/response.js +151 -0
- package/src/http-client/websocket-client.js +27 -0
- package/src/http-server/client/index.js +507 -0
- package/src/http-server/client/params-to-object.js +152 -0
- package/src/http-server/client/request-buffer/form-data-part.js +139 -0
- package/src/http-server/client/request-buffer/header.js +19 -0
- package/src/http-server/client/request-buffer/index.js +535 -0
- package/src/http-server/client/request-parser.js +195 -0
- package/src/http-server/client/request-runner.js +321 -0
- package/src/http-server/client/request-timing.js +171 -0
- package/src/http-server/client/request.js +114 -0
- package/src/http-server/client/response.js +251 -0
- package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/src/http-server/client/websocket-request.js +147 -0
- package/src/http-server/client/websocket-session.js +1755 -0
- package/src/http-server/cookie.js +245 -0
- package/src/http-server/development-reloader.js +240 -0
- package/src/http-server/index.js +561 -0
- package/src/http-server/remote-address.js +77 -0
- package/src/http-server/server-client.js +222 -0
- package/src/http-server/server-lock.js +178 -0
- package/src/http-server/websocket-channel-subscribers.js +110 -0
- package/src/http-server/websocket-channel.js +137 -0
- package/src/http-server/websocket-connection.js +118 -0
- package/src/http-server/websocket-event-log-store.js +433 -0
- package/src/http-server/websocket-events-host.js +170 -0
- package/src/http-server/websocket-events.js +50 -0
- package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/src/http-server/worker-handler/in-process.js +155 -0
- package/src/http-server/worker-handler/index.js +370 -0
- package/src/http-server/worker-handler/worker-script.js +6 -0
- package/src/http-server/worker-handler/worker-thread.js +286 -0
- package/src/initializer.js +39 -0
- package/src/jobs/.gitkeep +1 -0
- package/src/jobs/mail-delivery.js +22 -0
- package/src/logger/base-logger.js +34 -0
- package/src/logger/console-logger.js +28 -0
- package/src/logger/file-logger.js +36 -0
- package/src/logger/outputs/array-output.js +50 -0
- package/src/logger/outputs/console-output.js +32 -0
- package/src/logger/outputs/file-output.js +55 -0
- package/src/logger/outputs/stdout-output.js +64 -0
- package/src/logger.js +507 -0
- package/src/mailer/backends/smtp.js +197 -0
- package/src/mailer/base.js +337 -0
- package/src/mailer/delivery.js +70 -0
- package/src/mailer/index.js +24 -0
- package/src/mailer.js +15 -0
- package/src/plugins/sqljs-wasm-route-controller.js +70 -0
- package/src/plugins/sqljs-wasm-route.js +71 -0
- package/src/record-payload-values.js +83 -0
- package/src/routes/app-routes.js +17 -0
- package/src/routes/base-route.js +133 -0
- package/src/routes/basic-route.js +109 -0
- package/src/routes/built-in/debug/controller.js +12 -0
- package/src/routes/built-in/errors/controller.js +7 -0
- package/src/routes/built-in/errors/not-found.ejs +1 -0
- package/src/routes/get-route.js +75 -0
- package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/src/routes/index.js +50 -0
- package/src/routes/namespace-route.js +51 -0
- package/src/routes/plugin-routes.js +141 -0
- package/src/routes/post-route.js +74 -0
- package/src/routes/resolver.js +535 -0
- package/src/routes/resource-route.js +154 -0
- package/src/routes/root-route.js +11 -0
- package/src/templates/configuration.js +61 -0
- package/src/templates/generate-migration.js +11 -0
- package/src/templates/generate-model.js +6 -0
- package/src/templates/routes.js +11 -0
- package/src/testing/base-expect.js +17 -0
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/src/testing/browser-test-app.js +32 -0
- package/src/testing/expect-to-change.js +55 -0
- package/src/testing/expect-utils.js +269 -0
- package/src/testing/expect.js +763 -0
- package/src/testing/request-client.js +90 -0
- package/src/testing/test-files-finder.js +364 -0
- package/src/testing/test-filter-parser.js +198 -0
- package/src/testing/test-runner.js +1168 -0
- package/src/testing/test-suite-splitter.js +177 -0
- package/src/testing/test.js +370 -0
- package/src/types/external-modules.d.ts +57 -0
- package/src/utils/backtrace-cleaner-node.js +87 -0
- package/src/utils/backtrace-cleaner.js +266 -0
- package/src/utils/ensure-error.js +15 -0
- package/src/utils/event-emitter.js +8 -0
- package/src/utils/file-exists.js +18 -0
- package/src/utils/format-value.js +101 -0
- package/src/utils/model-scope.js +56 -0
- package/src/utils/nest-callbacks.js +22 -0
- package/src/utils/plain-object.js +14 -0
- package/src/utils/ransack.js +859 -0
- package/src/utils/rest-args-error.js +14 -0
- package/src/utils/singularize-model-name.js +18 -0
- package/src/utils/split-sql-statements.js +88 -0
- package/src/utils/to-import-specifier.js +53 -0
- package/src/utils/with-tracked-stack-async-hooks.js +103 -0
- package/src/utils/with-tracked-stack.js +38 -0
- package/src/velocious-error.js +34 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import ensureModelClassInitialized from "./ensure-model-class-initialized.js"
|
|
4
|
+
import PreloaderSelection from "./selection.js"
|
|
5
|
+
import restArgsError from "../../../utils/rest-args-error.js"
|
|
6
|
+
|
|
7
|
+
export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
8
|
+
/**
|
|
9
|
+
* Runs constructor.
|
|
10
|
+
* @param {object} args - Options object.
|
|
11
|
+
* @param {import("../../record/index.js").default[]} args.models - Model instances.
|
|
12
|
+
* @param {import("../../record/relationships/has-many.js").default} args.relationship - Relationship.
|
|
13
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
14
|
+
*/
|
|
15
|
+
constructor({models, relationship, selection, ...restArgs}) {
|
|
16
|
+
restArgsError(restArgs)
|
|
17
|
+
|
|
18
|
+
this.models = models
|
|
19
|
+
this.relationship = relationship
|
|
20
|
+
this.selection = selection || new PreloaderSelection()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Runs run.
|
|
25
|
+
* @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models.
|
|
26
|
+
*/
|
|
27
|
+
async run() {
|
|
28
|
+
if (this.relationship.through) {
|
|
29
|
+
return await this._runThrough()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return await this._runDirect()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Partitions `this.models` into those already satisfied by the current
|
|
37
|
+
* selection (skip) and those that still need loading. Satisfied models'
|
|
38
|
+
* already-loaded targets are collected so nested preloads keep working.
|
|
39
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
40
|
+
* @param {string[]} mappingColumns - Columns required for mapping (foreign key).
|
|
41
|
+
* @returns {{modelsToLoad: import("../../record/index.js").default[], satisfiedTargets: import("../../record/index.js").default[]}} - The partition.
|
|
42
|
+
*/
|
|
43
|
+
_partition(targetModelClass, mappingColumns) {
|
|
44
|
+
const relationshipName = this.relationship.getRelationshipName()
|
|
45
|
+
/**
|
|
46
|
+
* Models to load.
|
|
47
|
+
@type {import("../../record/index.js").default[]} */
|
|
48
|
+
const modelsToLoad = []
|
|
49
|
+
/**
|
|
50
|
+
* Satisfied targets.
|
|
51
|
+
@type {import("../../record/index.js").default[]} */
|
|
52
|
+
const satisfiedTargets = []
|
|
53
|
+
|
|
54
|
+
for (const model of this.models) {
|
|
55
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName)
|
|
56
|
+
|
|
57
|
+
if (this.selection.isSatisfied({instanceRelationship, targetModelClass, mappingColumns})) {
|
|
58
|
+
const loaded = instanceRelationship.getLoadedOrUndefined()
|
|
59
|
+
|
|
60
|
+
if (Array.isArray(loaded)) satisfiedTargets.push(...loaded)
|
|
61
|
+
} else {
|
|
62
|
+
modelsToLoad.push(model)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {modelsToLoad, satisfiedTargets}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Preload through a join table (e.g. hasMany("invoiceGroups", {through: "invoiceGroupLinks"})).
|
|
71
|
+
* @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models.
|
|
72
|
+
*/
|
|
73
|
+
async _runThrough() {
|
|
74
|
+
const primaryKey = this.relationship.getPrimaryKey()
|
|
75
|
+
|
|
76
|
+
if (!primaryKey) {
|
|
77
|
+
throw new Error(`${this.relationship.getModelClass().name}#${this.relationship.getRelationshipName()} doesn't have a primary key`)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const throughRelationshipName = /**
|
|
81
|
+
* Narrows the runtime value to the documented type.
|
|
82
|
+
@type {string} */ (this.relationship.through)
|
|
83
|
+
const parentModelClass = this.relationship.getModelClass()
|
|
84
|
+
const throughRelationship = parentModelClass.getRelationshipByName(throughRelationshipName)
|
|
85
|
+
const throughModelClass = throughRelationship.getTargetModelClass()
|
|
86
|
+
|
|
87
|
+
if (!throughModelClass) throw new Error(`Through relationship ${throughRelationshipName} has no target model class`)
|
|
88
|
+
|
|
89
|
+
const targetModelClass = this.relationship.getTargetModelClass()
|
|
90
|
+
|
|
91
|
+
if (!targetModelClass) throw new Error("No target model class could be gotten from relationship")
|
|
92
|
+
|
|
93
|
+
const targetForeignKey = this.relationship.getForeignKey()
|
|
94
|
+
const {modelsToLoad, satisfiedTargets} = this._partition(targetModelClass, [targetForeignKey])
|
|
95
|
+
|
|
96
|
+
if (modelsToLoad.length == 0) return satisfiedTargets
|
|
97
|
+
|
|
98
|
+
const configuration = this.relationship.getConfiguration()
|
|
99
|
+
|
|
100
|
+
await ensureModelClassInitialized(throughModelClass, configuration)
|
|
101
|
+
await ensureModelClassInitialized(targetModelClass, configuration)
|
|
102
|
+
|
|
103
|
+
const throughForeignKey = throughRelationship.getForeignKey()
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Models primary key values.
|
|
107
|
+
@type {Array<number | string>} */
|
|
108
|
+
const modelsPrimaryKeyValues = []
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Models by primary key value.
|
|
112
|
+
@type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
113
|
+
const modelsByPrimaryKeyValue = {}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Preload collections.
|
|
117
|
+
@type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
118
|
+
const preloadCollections = {}
|
|
119
|
+
|
|
120
|
+
for (const model of modelsToLoad) {
|
|
121
|
+
const primaryKeyValue = /**
|
|
122
|
+
* Narrows the runtime value to the documented type.
|
|
123
|
+
@type {string | number} */ (model.readColumn(primaryKey))
|
|
124
|
+
|
|
125
|
+
preloadCollections[primaryKeyValue] = []
|
|
126
|
+
|
|
127
|
+
if (!modelsPrimaryKeyValues.includes(primaryKeyValue)) modelsPrimaryKeyValues.push(primaryKeyValue)
|
|
128
|
+
if (!(primaryKeyValue in modelsByPrimaryKeyValue)) modelsByPrimaryKeyValue[primaryKeyValue] = []
|
|
129
|
+
|
|
130
|
+
modelsByPrimaryKeyValue[primaryKeyValue].push(model)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Step 1: Query the through table to build parent→target ID mapping
|
|
134
|
+
const throughModels = await throughModelClass
|
|
135
|
+
.where({[throughForeignKey]: modelsPrimaryKeyValues})
|
|
136
|
+
.toArray()
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Parent to target ids.
|
|
140
|
+
@type {Record<string | number, Array<string | number>>} */
|
|
141
|
+
const parentToTargetIds = {}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* All target ids.
|
|
145
|
+
@type {Set<string | number>} */
|
|
146
|
+
const allTargetIds = new Set()
|
|
147
|
+
|
|
148
|
+
for (const throughModel of throughModels) {
|
|
149
|
+
const parentId = /**
|
|
150
|
+
* Narrows the runtime value to the documented type.
|
|
151
|
+
@type {string | number} */ (throughModel.readColumn(throughForeignKey))
|
|
152
|
+
const throughId = /**
|
|
153
|
+
* Narrows the runtime value to the documented type.
|
|
154
|
+
@type {string | number} */ (throughModel.readColumn(throughModelClass.primaryKey()))
|
|
155
|
+
|
|
156
|
+
if (!(parentId in parentToTargetIds)) parentToTargetIds[parentId] = []
|
|
157
|
+
|
|
158
|
+
parentToTargetIds[parentId].push(throughId)
|
|
159
|
+
allTargetIds.add(throughId)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Step 2: Load target models by the foreign key that points to the through table
|
|
163
|
+
/**
|
|
164
|
+
* Target models.
|
|
165
|
+
@type {import("../../record/index.js").default[]} */
|
|
166
|
+
let targetModels = []
|
|
167
|
+
|
|
168
|
+
if (allTargetIds.size > 0) {
|
|
169
|
+
let query = targetModelClass.where({[targetForeignKey]: [...allTargetIds]})
|
|
170
|
+
|
|
171
|
+
query = this.relationship.applyScope(query)
|
|
172
|
+
query = this.selection.applyToQuery({query, targetModelClass, mappingColumns: [targetForeignKey]})
|
|
173
|
+
targetModels = await query.toArray()
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Step 3: Index target models by their foreign key (maps to through model ID)
|
|
177
|
+
/**
|
|
178
|
+
* Target models by foreign key.
|
|
179
|
+
@type {Record<string | number, Array<import("../../record/index.js").default>>} */
|
|
180
|
+
const targetModelsByForeignKey = {}
|
|
181
|
+
|
|
182
|
+
for (const targetModel of targetModels) {
|
|
183
|
+
const fkValue = /**
|
|
184
|
+
* Narrows the runtime value to the documented type.
|
|
185
|
+
@type {string | number} */ (targetModel.readColumn(targetForeignKey))
|
|
186
|
+
|
|
187
|
+
if (!(fkValue in targetModelsByForeignKey)) targetModelsByForeignKey[fkValue] = []
|
|
188
|
+
|
|
189
|
+
targetModelsByForeignKey[fkValue].push(targetModel)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Step 4: Map targets to parents via the through mapping
|
|
193
|
+
for (const parentId in parentToTargetIds) {
|
|
194
|
+
const throughIds = parentToTargetIds[parentId]
|
|
195
|
+
|
|
196
|
+
for (const throughId of throughIds) {
|
|
197
|
+
const matchingTargets = targetModelsByForeignKey[throughId] || []
|
|
198
|
+
|
|
199
|
+
for (const targetModel of matchingTargets) {
|
|
200
|
+
if (parentId in preloadCollections) {
|
|
201
|
+
preloadCollections[parentId].push(targetModel)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
for (const modelValue in preloadCollections) {
|
|
208
|
+
const preloadedCollection = preloadCollections[modelValue]
|
|
209
|
+
|
|
210
|
+
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
211
|
+
const modelRelationship = model.getRelationshipByName(this.relationship.getRelationshipName())
|
|
212
|
+
|
|
213
|
+
// Replace rather than append: `modelsToLoad` are exactly the records we
|
|
214
|
+
// intend to (re)load, so a forced re-preload must not duplicate entries.
|
|
215
|
+
modelRelationship.setLoaded(preloadedCollection)
|
|
216
|
+
modelRelationship.setPreloaded(true)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return [...satisfiedTargets, ...targetModels]
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Preload direct has-many relationships.
|
|
225
|
+
* @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models.
|
|
226
|
+
*/
|
|
227
|
+
async _runDirect() {
|
|
228
|
+
const foreignKey = this.relationship.getForeignKey()
|
|
229
|
+
const primaryKey = this.relationship.getPrimaryKey()
|
|
230
|
+
|
|
231
|
+
if (!primaryKey) {
|
|
232
|
+
throw new Error(`${this.relationship.getModelClass().name}#${this.relationship.getRelationshipName()} doesn't have a primary key`)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const targetModelClass = this.relationship.getTargetModelClass()
|
|
236
|
+
|
|
237
|
+
if (!targetModelClass) throw new Error("No target model class could be gotten from relationship")
|
|
238
|
+
|
|
239
|
+
const {modelsToLoad, satisfiedTargets} = this._partition(targetModelClass, [foreignKey])
|
|
240
|
+
|
|
241
|
+
if (modelsToLoad.length == 0) return satisfiedTargets
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Models primary key values.
|
|
245
|
+
@type {Array<number | string>} */
|
|
246
|
+
const modelsPrimaryKeyValues = []
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Models by primary key value.
|
|
250
|
+
@type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
251
|
+
const modelsByPrimaryKeyValue = {}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Preload collections.
|
|
255
|
+
@type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
256
|
+
const preloadCollections = {}
|
|
257
|
+
|
|
258
|
+
for (const model of modelsToLoad) {
|
|
259
|
+
const primaryKeyValue = /**
|
|
260
|
+
* Narrows the runtime value to the documented type.
|
|
261
|
+
@type {string | number} */ (model.readColumn(primaryKey))
|
|
262
|
+
|
|
263
|
+
preloadCollections[primaryKeyValue] = []
|
|
264
|
+
|
|
265
|
+
if (!modelsPrimaryKeyValues.includes(primaryKeyValue)) modelsPrimaryKeyValues.push(primaryKeyValue)
|
|
266
|
+
if (!(primaryKeyValue in modelsByPrimaryKeyValue)) modelsByPrimaryKeyValue[primaryKeyValue] = []
|
|
267
|
+
|
|
268
|
+
modelsByPrimaryKeyValue[primaryKeyValue].push(model)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Where args.
|
|
273
|
+
@type {Record<string, string | number | Array<string | number>>} */
|
|
274
|
+
const whereArgs = {}
|
|
275
|
+
|
|
276
|
+
whereArgs[foreignKey] = modelsPrimaryKeyValues
|
|
277
|
+
|
|
278
|
+
if (this.relationship.getPolymorphic()) {
|
|
279
|
+
const typeColumn = this.relationship.getPolymorphicTypeColumn()
|
|
280
|
+
|
|
281
|
+
whereArgs[typeColumn] = this.relationship.getModelClass().getModelName()
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
await ensureModelClassInitialized(targetModelClass, this.relationship.getConfiguration())
|
|
285
|
+
|
|
286
|
+
let query = targetModelClass.where(whereArgs)
|
|
287
|
+
|
|
288
|
+
query = this.relationship.applyScope(query)
|
|
289
|
+
query = this.selection.applyToQuery({query, targetModelClass, mappingColumns: [foreignKey]})
|
|
290
|
+
|
|
291
|
+
const targetModels = await query.toArray()
|
|
292
|
+
|
|
293
|
+
for (const targetModel of targetModels) {
|
|
294
|
+
const foreignKeyValue = /**
|
|
295
|
+
* Narrows the runtime value to the documented type.
|
|
296
|
+
@type {string | number} */ (targetModel.readColumn(foreignKey))
|
|
297
|
+
|
|
298
|
+
preloadCollections[foreignKeyValue].push(targetModel)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
for (const modelValue in preloadCollections) {
|
|
302
|
+
const preloadedCollection = preloadCollections[modelValue]
|
|
303
|
+
|
|
304
|
+
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
305
|
+
const modelRelationship = model.getRelationshipByName(this.relationship.getRelationshipName())
|
|
306
|
+
|
|
307
|
+
// Replace rather than append: `modelsToLoad` are exactly the records we
|
|
308
|
+
// intend to (re)load, so a forced re-preload must not duplicate entries.
|
|
309
|
+
modelRelationship.setLoaded(preloadedCollection)
|
|
310
|
+
modelRelationship.setPreloaded(true)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return [...satisfiedTargets, ...targetModels]
|
|
315
|
+
}
|
|
316
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import ensureModelClassInitialized from "./ensure-model-class-initialized.js"
|
|
4
|
+
import PreloaderSelection from "./selection.js"
|
|
5
|
+
import restArgsError from "../../../utils/rest-args-error.js"
|
|
6
|
+
|
|
7
|
+
export default class VelociousDatabaseQueryPreloaderHasOne {
|
|
8
|
+
/**
|
|
9
|
+
* Runs constructor.
|
|
10
|
+
* @param {object} args - Options object.
|
|
11
|
+
* @param {Array<import("../../record/index.js").default>} args.models - Model instances.
|
|
12
|
+
* @param {import("../../record/relationships/has-one.js").default} args.relationship - Relationship.
|
|
13
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
14
|
+
*/
|
|
15
|
+
constructor({models, relationship, selection, ...restArgs}) {
|
|
16
|
+
restArgsError(restArgs)
|
|
17
|
+
|
|
18
|
+
this.models = models
|
|
19
|
+
this.relationship = relationship
|
|
20
|
+
this.selection = selection || new PreloaderSelection()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async run() {
|
|
24
|
+
/**
|
|
25
|
+
* Models primary key values.
|
|
26
|
+
@type {Array<number | string>} */
|
|
27
|
+
const modelsPrimaryKeyValues = []
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Models by primary key value.
|
|
31
|
+
@type {Record<number | string, Array<import("../../record/index.js").default>>} */
|
|
32
|
+
const modelsByPrimaryKeyValue = {}
|
|
33
|
+
|
|
34
|
+
const foreignKey = this.relationship.getForeignKey()
|
|
35
|
+
const primaryKey = this.relationship.getPrimaryKey()
|
|
36
|
+
const relationshipName = this.relationship.getRelationshipName()
|
|
37
|
+
|
|
38
|
+
const targetModelClass = this.relationship.getTargetModelClass()
|
|
39
|
+
|
|
40
|
+
if (!targetModelClass) throw new Error("No target model class could be gotten from relationship")
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Preload collections.
|
|
44
|
+
@type {Record<number | string, import("../../record/index.js").default | undefined>} */
|
|
45
|
+
const preloadCollections = {}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Satisfied targets.
|
|
49
|
+
@type {import("../../record/index.js").default[]} */
|
|
50
|
+
const satisfiedTargets = []
|
|
51
|
+
|
|
52
|
+
for (const model of this.models) {
|
|
53
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName)
|
|
54
|
+
|
|
55
|
+
if (this.selection.isSatisfied({instanceRelationship, targetModelClass, mappingColumns: [foreignKey]})) {
|
|
56
|
+
const loaded = /**
|
|
57
|
+
* Narrows the runtime value to the documented type.
|
|
58
|
+
@type {import("../../record/index.js").default | undefined} */ (instanceRelationship.getLoadedOrUndefined())
|
|
59
|
+
|
|
60
|
+
if (loaded) satisfiedTargets.push(loaded)
|
|
61
|
+
continue
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const primaryKeyValue = /**
|
|
65
|
+
* Narrows the runtime value to the documented type.
|
|
66
|
+
@type {string | number} */ (model.readColumn(primaryKey))
|
|
67
|
+
|
|
68
|
+
preloadCollections[primaryKeyValue] = undefined
|
|
69
|
+
|
|
70
|
+
if (!modelsPrimaryKeyValues.includes(primaryKeyValue)) modelsPrimaryKeyValues.push(primaryKeyValue)
|
|
71
|
+
if (!(primaryKeyValue in modelsByPrimaryKeyValue)) modelsByPrimaryKeyValue[primaryKeyValue] = []
|
|
72
|
+
|
|
73
|
+
modelsByPrimaryKeyValue[primaryKeyValue].push(model)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (modelsPrimaryKeyValues.length == 0) return satisfiedTargets
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Where args.
|
|
80
|
+
@type {Record<string, string | number | Array<string | number>>} */
|
|
81
|
+
const whereArgs = {}
|
|
82
|
+
|
|
83
|
+
whereArgs[foreignKey] = modelsPrimaryKeyValues
|
|
84
|
+
|
|
85
|
+
if (this.relationship.getPolymorphic()) {
|
|
86
|
+
const typeColumn = this.relationship.getPolymorphicTypeColumn()
|
|
87
|
+
|
|
88
|
+
whereArgs[typeColumn] = this.relationship.getModelClass().getModelName()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
await ensureModelClassInitialized(targetModelClass, this.relationship.getConfiguration())
|
|
92
|
+
|
|
93
|
+
// Load target models to be preloaded on the given models
|
|
94
|
+
let query = targetModelClass.where(whereArgs)
|
|
95
|
+
|
|
96
|
+
query = this.relationship.applyScope(query)
|
|
97
|
+
query = this.selection.applyToQuery({query, targetModelClass, mappingColumns: [foreignKey]})
|
|
98
|
+
|
|
99
|
+
const targetModels = await query.toArray()
|
|
100
|
+
|
|
101
|
+
for (const targetModel of targetModels) {
|
|
102
|
+
const foreignKeyValue = /**
|
|
103
|
+
* Narrows the runtime value to the documented type.
|
|
104
|
+
@type {string | number} */ (targetModel.readColumn(foreignKey))
|
|
105
|
+
|
|
106
|
+
preloadCollections[foreignKeyValue] = targetModel
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Set the target preloaded models on the given models
|
|
110
|
+
for (const modelValue in preloadCollections) {
|
|
111
|
+
const preloadedModel = preloadCollections[modelValue]
|
|
112
|
+
|
|
113
|
+
for (const model of modelsByPrimaryKeyValue[modelValue]) {
|
|
114
|
+
const modelRelationship = model.getRelationshipByName(relationshipName)
|
|
115
|
+
|
|
116
|
+
modelRelationship.setPreloaded(true)
|
|
117
|
+
modelRelationship.setLoaded(preloadedModel)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return [...satisfiedTargets, ...targetModels]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
const IDENTIFIER_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Encapsulates the column selection and idempotency rules for preloading.
|
|
7
|
+
*
|
|
8
|
+
* Two per-target-model-name maps drive the behaviour, both keyed by the target
|
|
9
|
+
* model name (e.g. `"Account"`):
|
|
10
|
+
*
|
|
11
|
+
* - `preloadSelects` (from `.select({Account: ["id"]})`) narrows the columns
|
|
12
|
+
* loaded for that target to the listed attributes (plus the primary/foreign
|
|
13
|
+
* keys needed to map results back to their parents).
|
|
14
|
+
* - `preloadSelectsExtra` (from `.selectsExtra({Account: ["..."]})`) keeps the
|
|
15
|
+
* default `SELECT *` columns and loads the listed extra selects in addition.
|
|
16
|
+
*
|
|
17
|
+
* `force` re-loads relationships even when they are already preloaded.
|
|
18
|
+
*/
|
|
19
|
+
export default class VelociousDatabaseQueryPreloaderSelection {
|
|
20
|
+
/**
|
|
21
|
+
* Runs constructor.
|
|
22
|
+
* @param {object} [args] - Options object.
|
|
23
|
+
* @param {Record<string, string[]>} [args.preloadSelects] - Narrowing selects keyed by target model name.
|
|
24
|
+
* @param {Record<string, string[]>} [args.preloadSelectsExtra] - Extra selects keyed by target model name.
|
|
25
|
+
* @param {boolean} [args.force] - Whether to re-load already-preloaded relationships.
|
|
26
|
+
*/
|
|
27
|
+
constructor({preloadSelects = {}, preloadSelectsExtra = {}, force = false} = {}) {
|
|
28
|
+
this.preloadSelects = preloadSelects
|
|
29
|
+
this.preloadSelectsExtra = preloadSelectsExtra
|
|
30
|
+
this.force = force
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Runs get force.
|
|
35
|
+
* @returns {boolean} - Whether already-preloaded relationships should still be re-loaded.
|
|
36
|
+
*/
|
|
37
|
+
getForce() { return this.force }
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Runs narrowing for.
|
|
41
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
42
|
+
* @returns {string[] | undefined} - Narrowing select attributes for the class, if any.
|
|
43
|
+
*/
|
|
44
|
+
_narrowingFor(targetModelClass) {
|
|
45
|
+
return this.preloadSelects[targetModelClass.getModelName()]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Runs extra for.
|
|
50
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
51
|
+
* @returns {string[] | undefined} - Extra select attributes/expressions for the class, if any.
|
|
52
|
+
*/
|
|
53
|
+
_extraFor(targetModelClass) {
|
|
54
|
+
return this.preloadSelectsExtra[targetModelClass.getModelName()]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Apply the configured select clauses to a target query.
|
|
59
|
+
* @template {import("../model-class-query.js").default} T
|
|
60
|
+
* @param {object} args - Options object.
|
|
61
|
+
* @param {T} args.query - Target query to apply selects to.
|
|
62
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
63
|
+
* @param {string[]} args.mappingColumns - Columns that must always be loaded so results can be mapped back to parents (primary/foreign keys).
|
|
64
|
+
* @returns {T} - The query, with selects applied when a selection is configured.
|
|
65
|
+
*/
|
|
66
|
+
applyToQuery({query, targetModelClass, mappingColumns}) {
|
|
67
|
+
const narrowing = this._narrowingFor(targetModelClass)
|
|
68
|
+
const extra = this._extraFor(targetModelClass)
|
|
69
|
+
|
|
70
|
+
if (narrowing) {
|
|
71
|
+
const selects = [...new Set([...narrowing, ...mappingColumns, ...(extra || [])])]
|
|
72
|
+
|
|
73
|
+
return /** Narrows the runtime value to the documented type. @type {T} */ (query.select(selects))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (extra) {
|
|
77
|
+
const allColumns = `${query.driver.quoteTable(targetModelClass.tableName())}.*`
|
|
78
|
+
|
|
79
|
+
return /** Narrows the runtime value to the documented type. @type {T} */ (query.select([allColumns, ...extra]))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return query
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Whether an already-preloaded relationship's loaded target(s) satisfy the
|
|
87
|
+
* configured selection, so the relationship can be skipped. Returns false
|
|
88
|
+
* when `force` is set, when the relationship hasn't been preloaded, or when a
|
|
89
|
+
* required column is missing from a loaded target.
|
|
90
|
+
* @param {object} args - Options object.
|
|
91
|
+
* @param {import("../../record/instance-relationships/base.js").default} args.instanceRelationship - The source model's instance relationship.
|
|
92
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
93
|
+
* @param {string[]} args.mappingColumns - Primary/foreign key columns required for mapping.
|
|
94
|
+
* @returns {boolean} - Whether the relationship is already satisfied.
|
|
95
|
+
*/
|
|
96
|
+
isSatisfied({instanceRelationship, targetModelClass, mappingColumns}) {
|
|
97
|
+
if (this.force) return false
|
|
98
|
+
if (!instanceRelationship.getPreloaded()) return false
|
|
99
|
+
|
|
100
|
+
const required = this._requiredColumnsFor({targetModelClass, mappingColumns})
|
|
101
|
+
|
|
102
|
+
if (!required) return false
|
|
103
|
+
|
|
104
|
+
const loaded = instanceRelationship.getLoadedOrUndefined()
|
|
105
|
+
const targets = loaded === undefined ? [] : (Array.isArray(loaded) ? loaded : [loaded])
|
|
106
|
+
|
|
107
|
+
for (const target of targets) {
|
|
108
|
+
for (const column of required) {
|
|
109
|
+
if (!target.hasLoadedColumn(column)) return false
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return true
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The set of columns that must be present on a loaded target for it to count
|
|
118
|
+
* as satisfied. Returns null when satisfaction can't be verified (an extra
|
|
119
|
+
* select is a raw SQL expression whose resulting column can't be derived), in
|
|
120
|
+
* which case the relationship is always re-loaded.
|
|
121
|
+
* @param {object} args - Options object.
|
|
122
|
+
* @param {typeof import("../../record/index.js").default} args.targetModelClass - Target model class.
|
|
123
|
+
* @param {string[]} args.mappingColumns - Primary/foreign key columns required for mapping.
|
|
124
|
+
* @returns {string[] | null} - Required column names, or null when unverifiable.
|
|
125
|
+
*/
|
|
126
|
+
_requiredColumnsFor({targetModelClass, mappingColumns}) {
|
|
127
|
+
const attributeMap = targetModelClass.getAttributeNameToColumnNameMap()
|
|
128
|
+
const narrowing = this._narrowingFor(targetModelClass)
|
|
129
|
+
const extra = this._extraFor(targetModelClass)
|
|
130
|
+
/**
|
|
131
|
+
* Columns.
|
|
132
|
+
@type {string[]} */
|
|
133
|
+
const columns = []
|
|
134
|
+
|
|
135
|
+
if (narrowing) {
|
|
136
|
+
for (const attribute of narrowing) columns.push(attributeMap[attribute] || attribute)
|
|
137
|
+
for (const column of mappingColumns) columns.push(column)
|
|
138
|
+
} else {
|
|
139
|
+
for (const column of targetModelClass.getColumnNames()) columns.push(column)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (extra) {
|
|
143
|
+
for (const entry of extra) {
|
|
144
|
+
if (!IDENTIFIER_REGEX.test(entry)) return null
|
|
145
|
+
|
|
146
|
+
columns.push(attributeMap[entry] || entry)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return columns
|
|
151
|
+
}
|
|
152
|
+
}
|