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,289 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BelongsToPreloader from "../../query/preloader/belongs-to.js"
|
|
4
|
+
import HasManyPreloader from "../../query/preloader/has-many.js"
|
|
5
|
+
import HasOnePreloader from "../../query/preloader/has-one.js"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* InstanceRelationshipsBaseArgs type.
|
|
9
|
+
* @template {typeof import("../index.js").default} [MC=typeof import("../index.js").default]
|
|
10
|
+
* @template {typeof import("../index.js").default} [TMC=typeof import("../index.js").default]
|
|
11
|
+
* @typedef {object} InstanceRelationshipsBaseArgs
|
|
12
|
+
* @property {InstanceType<MC>} model - Parent model instance.
|
|
13
|
+
* @property {import("../relationships/base.js").default} relationship - Relationship metadata definition.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A generic query over some model type.
|
|
18
|
+
* @template {typeof import("../index.js").default} [MC=typeof import("../index.js").default]
|
|
19
|
+
* @template {typeof import("../index.js").default} [TMC=typeof import("../index.js").default]
|
|
20
|
+
*/
|
|
21
|
+
export default class VelociousDatabaseRecordBaseInstanceRelationship {
|
|
22
|
+
/**
|
|
23
|
+
* Auto save.
|
|
24
|
+
@type {boolean | undefined} */
|
|
25
|
+
_autoSave = undefined
|
|
26
|
+
/**
|
|
27
|
+
* Preloaded.
|
|
28
|
+
@type {boolean | undefined} */
|
|
29
|
+
_preloaded = undefined
|
|
30
|
+
/**
|
|
31
|
+
* Loaded.
|
|
32
|
+
@type {InstanceType<TMC> | Array<InstanceType<TMC>> | undefined} */
|
|
33
|
+
_loaded = undefined
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Runs constructor.
|
|
37
|
+
* @param {InstanceRelationshipsBaseArgs<MC, TMC>} args - Options object.
|
|
38
|
+
*/
|
|
39
|
+
constructor({model, relationship}) {
|
|
40
|
+
this._dirty = false
|
|
41
|
+
this.model = model
|
|
42
|
+
this.relationship = relationship
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Runs add to loaded.
|
|
47
|
+
* @abstract
|
|
48
|
+
* @param {InstanceType<TMC>[] | InstanceType<TMC>} models - Model instances.
|
|
49
|
+
* @returns {void} - No return value.
|
|
50
|
+
*/
|
|
51
|
+
addToLoaded(models) { // eslint-disable-line no-unused-vars
|
|
52
|
+
throw new Error("addToLoaded not implemented")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Runs build.
|
|
57
|
+
* @abstract
|
|
58
|
+
* @param {Record<string, ?>} attributes - Attributes.
|
|
59
|
+
* @returns {InstanceType<TMC>} - The build.
|
|
60
|
+
*/
|
|
61
|
+
build(attributes) { // eslint-disable-line no-unused-vars
|
|
62
|
+
throw new Error("'build' not implemented")
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Runs get auto save.
|
|
67
|
+
* @returns {boolean | undefined} Whether the relationship should be auto-saved before saving the parent model
|
|
68
|
+
*/
|
|
69
|
+
getAutoSave() { return this._autoSave }
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Runs set auto save.
|
|
73
|
+
* @param {boolean} newAutoSaveValue Whether the relationship should be auto-saved before saving the parent model
|
|
74
|
+
* @returns {void} - No return value.
|
|
75
|
+
*/
|
|
76
|
+
setAutoSave(newAutoSaveValue) { this._autoSave = newAutoSaveValue }
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Runs set dirty.
|
|
80
|
+
* @param {boolean} newValue Whether the relationship is dirty (has been modified)
|
|
81
|
+
* @returns {void} - No return value.
|
|
82
|
+
*/
|
|
83
|
+
setDirty(newValue) { this._dirty = newValue }
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Runs get dirty.
|
|
87
|
+
* @returns {boolean} Whether the relationship is dirty (has been modified)
|
|
88
|
+
*/
|
|
89
|
+
getDirty() { return this._dirty }
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Runs load.
|
|
93
|
+
* @abstract
|
|
94
|
+
* @returns {Promise<InstanceType<TMC> | Array<InstanceType<TMC>> | undefined>} - Resolves with loaded relationship value.
|
|
95
|
+
*/
|
|
96
|
+
load() {
|
|
97
|
+
throw new Error("'load' not implemented")
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Loads the relationship if not already loaded. When the parent record was
|
|
102
|
+
* loaded as part of a batch (cohort) and autoload is enabled, siblings in
|
|
103
|
+
* the cohort that share this relationship and have not preloaded it yet
|
|
104
|
+
* are batched into a single query via the existing preloader path.
|
|
105
|
+
* @returns {Promise<InstanceType<TMC> | Array<InstanceType<TMC>> | undefined>} - Resolves with loaded relationship value.
|
|
106
|
+
*/
|
|
107
|
+
async autoloadOrLoad() {
|
|
108
|
+
if (this._loaded !== undefined) return this._loaded
|
|
109
|
+
|
|
110
|
+
const batched = await this._tryCohortPreload()
|
|
111
|
+
|
|
112
|
+
if (!batched) await this.load()
|
|
113
|
+
|
|
114
|
+
return this._loaded
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Attempts to batch-load this relationship across cohort siblings via the
|
|
119
|
+
* existing preloader path. Returns true when a batch ran (self is always
|
|
120
|
+
* included because callers reset their own `_preloaded` state before
|
|
121
|
+
* calling), false when autoload is off, there is no cohort, or no batch
|
|
122
|
+
* candidates remain. Siblings that have already preloaded this relationship
|
|
123
|
+
* are skipped so their cached value is preserved.
|
|
124
|
+
* @returns {Promise<boolean>} - Whether a cohort batch preload ran.
|
|
125
|
+
*/
|
|
126
|
+
async _tryCohortPreload() {
|
|
127
|
+
const relationshipDef = this.getRelationship()
|
|
128
|
+
const configuration = relationshipDef.getConfiguration()
|
|
129
|
+
const cohort = /**
|
|
130
|
+
* Narrows the runtime value to the documented type.
|
|
131
|
+
@type {Array<import("../index.js").default> | undefined} */ (/**
|
|
132
|
+
* Narrows the runtime value to the documented type.
|
|
133
|
+
@type {?} */ (this.model)._loadCohort)
|
|
134
|
+
|
|
135
|
+
if (!configuration.getAutoload() || !relationshipDef.getAutoload() || !cohort || cohort.length <= 1) {
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const relationshipName = relationshipDef.getRelationshipName()
|
|
140
|
+
const OwnerModelClass = /**
|
|
141
|
+
* Narrows the runtime value to the documented type.
|
|
142
|
+
@type {?} */ (this.model).constructor
|
|
143
|
+
/**
|
|
144
|
+
* Batch.
|
|
145
|
+
@type {Array<import("../index.js").default>} */
|
|
146
|
+
const batch = []
|
|
147
|
+
|
|
148
|
+
// Exact same class, persisted, no existing in-memory relationship state.
|
|
149
|
+
// Skip siblings where `_loaded` is already set — they may have been
|
|
150
|
+
// preloaded (preserve cache) OR locally manipulated via `build...` /
|
|
151
|
+
// `set...` (preserve unsaved edits). Either way the preloader would
|
|
152
|
+
// overwrite that state.
|
|
153
|
+
for (const sibling of cohort) {
|
|
154
|
+
if (sibling.constructor !== OwnerModelClass) continue
|
|
155
|
+
if (!sibling.isPersisted()) continue
|
|
156
|
+
|
|
157
|
+
const siblingInstanceRelationship = sibling.getRelationshipByName(relationshipName)
|
|
158
|
+
|
|
159
|
+
if (siblingInstanceRelationship.getLoadedOrUndefined() !== undefined) continue
|
|
160
|
+
|
|
161
|
+
batch.push(sibling)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (batch.length === 0) return false
|
|
165
|
+
|
|
166
|
+
const type = relationshipDef.getType()
|
|
167
|
+
|
|
168
|
+
if (type == "belongsTo") {
|
|
169
|
+
const belongsToRelationship = /**
|
|
170
|
+
* Narrows the runtime value to the documented type.
|
|
171
|
+
@type {import("../relationships/belongs-to.js").default} */ (relationshipDef)
|
|
172
|
+
const preloader = new BelongsToPreloader({models: batch, relationship: belongsToRelationship})
|
|
173
|
+
|
|
174
|
+
await preloader.run()
|
|
175
|
+
} else if (type == "hasMany") {
|
|
176
|
+
const hasManyRelationship = /**
|
|
177
|
+
* Narrows the runtime value to the documented type.
|
|
178
|
+
@type {import("../relationships/has-many.js").default} */ (relationshipDef)
|
|
179
|
+
const preloader = new HasManyPreloader({models: batch, relationship: hasManyRelationship})
|
|
180
|
+
|
|
181
|
+
await preloader.run()
|
|
182
|
+
} else if (type == "hasOne") {
|
|
183
|
+
const hasOneRelationship = /**
|
|
184
|
+
* Narrows the runtime value to the documented type.
|
|
185
|
+
@type {import("../relationships/has-one.js").default} */ (relationshipDef)
|
|
186
|
+
const preloader = new HasOnePreloader({models: batch, relationship: hasOneRelationship})
|
|
187
|
+
|
|
188
|
+
await preloader.run()
|
|
189
|
+
} else {
|
|
190
|
+
throw new Error(`Unknown relationship type: ${type}`)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return true
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Runs is loaded.
|
|
198
|
+
* @returns {boolean} Whether the relationship has been preloaded
|
|
199
|
+
*/
|
|
200
|
+
isLoaded() { return Boolean(this._loaded) }
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Runs loaded.
|
|
204
|
+
* @returns {InstanceType<TMC> | Array<InstanceType<TMC>> | undefined} The loaded model or models (depending on relationship type)
|
|
205
|
+
*/
|
|
206
|
+
loaded() {
|
|
207
|
+
if (!this._preloaded && this.model.isPersisted()) {
|
|
208
|
+
throw new Error(`${this.model.constructor.name}#${this.relationship.getRelationshipName()} hasn't been preloaded`)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return this._loaded
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Runs set loaded.
|
|
216
|
+
* @param {InstanceType<TMC> | Array<InstanceType<TMC>> | undefined} model - Related model(s) to mark as loaded.
|
|
217
|
+
*/
|
|
218
|
+
setLoaded(model) { this._loaded = model }
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Runs get loaded or undefined.
|
|
222
|
+
* @returns {InstanceType<TMC> | InstanceType<TMC>[] | undefined} - The loaded or undefined.
|
|
223
|
+
*/
|
|
224
|
+
getLoadedOrUndefined() { return this._loaded }
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Runs get preloaded.
|
|
228
|
+
* @returns {boolean} The loaded model or models (depending on relationship type)
|
|
229
|
+
*/
|
|
230
|
+
getPreloaded() { return this._preloaded || false }
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Runs set preloaded.
|
|
234
|
+
* @param {boolean} isPreloaded - Whether the relationship is preloaded.
|
|
235
|
+
*/
|
|
236
|
+
setPreloaded(isPreloaded) { this._preloaded = isPreloaded }
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Runs get foreign key.
|
|
240
|
+
* @returns {string} The foreign key for this relationship
|
|
241
|
+
*/
|
|
242
|
+
getForeignKey() { return this.getRelationship().getForeignKey() }
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Runs get model.
|
|
246
|
+
* @returns {InstanceType<MC>} - The model.
|
|
247
|
+
*/
|
|
248
|
+
getModel() { return this.model }
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Runs get primary key.
|
|
252
|
+
* @returns {string} The primary key for this relationship's model
|
|
253
|
+
*/
|
|
254
|
+
getPrimaryKey() { return this.getRelationship().getPrimaryKey() }
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Runs get relationship.
|
|
258
|
+
* @returns {import("../relationships/base.js").default} The relationship object that this instance relationship is based on
|
|
259
|
+
*/
|
|
260
|
+
getRelationship() { return this.relationship }
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Runs apply scope.
|
|
264
|
+
* @template T
|
|
265
|
+
* @param {T} query - Query instance.
|
|
266
|
+
* @returns {T} - Scoped query.
|
|
267
|
+
*/
|
|
268
|
+
applyScope(query) {
|
|
269
|
+
return this.getRelationship().applyScope(query)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Runs get target model class.
|
|
274
|
+
* @returns {TMC | undefined} The model class that this instance relationship
|
|
275
|
+
*/
|
|
276
|
+
getTargetModelClass() {
|
|
277
|
+
const TargetModelClass = /**
|
|
278
|
+
* Narrows the runtime value to the documented type.
|
|
279
|
+
@type {TMC} */ (this.getRelationship().getTargetModelClass())
|
|
280
|
+
|
|
281
|
+
return TargetModelClass
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Runs get type.
|
|
286
|
+
* @returns {string} The type of relationship (e.g. "has_many", "belongs_to", etc.)
|
|
287
|
+
*/
|
|
288
|
+
getType() { return this.getRelationship().getType() }
|
|
289
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseInstanceRelationship from "./base.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A generic query over some model type.
|
|
7
|
+
* @template {typeof import("../index.js").default} MC
|
|
8
|
+
* @template {typeof import("../index.js").default} TMC
|
|
9
|
+
* @augments {BaseInstanceRelationship<MC, TMC>}
|
|
10
|
+
*/
|
|
11
|
+
export default class VelociousDatabaseRecordBelongsToInstanceRelationship extends BaseInstanceRelationship {
|
|
12
|
+
/**
|
|
13
|
+
* Runs constructor.
|
|
14
|
+
* @param {import("./base.js").InstanceRelationshipsBaseArgs<MC, TMC>} args - Options object.
|
|
15
|
+
*/
|
|
16
|
+
constructor(args) {
|
|
17
|
+
super(args)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Runs build.
|
|
22
|
+
* @param {Record<string, ?>} data - Data payload.
|
|
23
|
+
* @returns {InstanceType<TMC>} - The build.
|
|
24
|
+
*/
|
|
25
|
+
build(data) {
|
|
26
|
+
const TargetModelClass = /**
|
|
27
|
+
* Narrows the runtime value to the documented type.
|
|
28
|
+
@type {TMC} */ (this.getTargetModelClass())
|
|
29
|
+
|
|
30
|
+
if (!TargetModelClass) throw new Error("Can't build a new record without a target model")
|
|
31
|
+
|
|
32
|
+
const newInstance = /**
|
|
33
|
+
* Narrows the runtime value to the documented type.
|
|
34
|
+
@type {InstanceType<TMC>} */ (new TargetModelClass(data))
|
|
35
|
+
|
|
36
|
+
this._loaded = newInstance
|
|
37
|
+
|
|
38
|
+
return newInstance
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
getLoadedOrUndefined() { return this._loaded }
|
|
42
|
+
|
|
43
|
+
async load() {
|
|
44
|
+
// Force-reload: discard the cached value and fetch fresh. When the parent
|
|
45
|
+
// record was loaded as part of a batch, batch the belongs-to lookup across
|
|
46
|
+
// cohort siblings that have not preloaded this relationship yet.
|
|
47
|
+
this._preloaded = false
|
|
48
|
+
this._loaded = undefined
|
|
49
|
+
|
|
50
|
+
const batched = await this._tryCohortPreload()
|
|
51
|
+
|
|
52
|
+
if (batched) return this.loaded()
|
|
53
|
+
|
|
54
|
+
const foreignKey = this.getForeignKey()
|
|
55
|
+
const foreignModelID = this.getModel().readColumn(foreignKey)
|
|
56
|
+
const TargetModelClass = this.getTargetModelClass()
|
|
57
|
+
|
|
58
|
+
if (!TargetModelClass) throw new Error("Can't load without a target model")
|
|
59
|
+
|
|
60
|
+
const primaryKey = TargetModelClass.primaryKey()
|
|
61
|
+
/**
|
|
62
|
+
* Where args.
|
|
63
|
+
@type {Record<string, string | number | null | undefined>} */
|
|
64
|
+
const whereArgs = {}
|
|
65
|
+
|
|
66
|
+
whereArgs[primaryKey] = foreignModelID
|
|
67
|
+
|
|
68
|
+
let query = TargetModelClass.where(whereArgs)
|
|
69
|
+
|
|
70
|
+
query = this.applyScope(query)
|
|
71
|
+
|
|
72
|
+
const foreignModel = await query.first()
|
|
73
|
+
|
|
74
|
+
if (foreignModel) {
|
|
75
|
+
this.setLoaded(foreignModel)
|
|
76
|
+
} else {
|
|
77
|
+
this.setLoaded(undefined)
|
|
78
|
+
}
|
|
79
|
+
this.setDirty(false)
|
|
80
|
+
this.setPreloaded(true)
|
|
81
|
+
|
|
82
|
+
return this.loaded()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseInstanceRelationship from "./base.js"
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A generic query over some model type.
|
|
7
|
+
* @template {typeof import("../index.js").default} MC
|
|
8
|
+
* @template {typeof import("../index.js").default} TMC
|
|
9
|
+
* @augments {BaseInstanceRelationship<MC, TMC>}
|
|
10
|
+
*/
|
|
11
|
+
export default class VelociousDatabaseRecordHasManyInstanceRelationship extends BaseInstanceRelationship {
|
|
12
|
+
/**
|
|
13
|
+
* Runs constructor.
|
|
14
|
+
* @param {import("./base.js").InstanceRelationshipsBaseArgs<MC, TMC>} args - Options object.
|
|
15
|
+
*/
|
|
16
|
+
constructor(args) {
|
|
17
|
+
super(args)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Runs build.
|
|
22
|
+
* @param {Record<string, ?>} data - Data payload.
|
|
23
|
+
* @returns {InstanceType<TMC>} - The build.
|
|
24
|
+
*/
|
|
25
|
+
build(data) {
|
|
26
|
+
// Spawn new model of the targeted class
|
|
27
|
+
const targetModelClass = this.getTargetModelClass()
|
|
28
|
+
|
|
29
|
+
if (!targetModelClass) throw new Error("Can't build a new record without a taget model class")
|
|
30
|
+
|
|
31
|
+
const newInstance = /**
|
|
32
|
+
* Narrows the runtime value to the documented type.
|
|
33
|
+
@type {InstanceType<TMC>} */ (new targetModelClass(data))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// Add it to the loaded models of this relationship
|
|
37
|
+
if (this._loaded === undefined) {
|
|
38
|
+
this._loaded = [newInstance]
|
|
39
|
+
} else if (Array.isArray(this._loaded)) {
|
|
40
|
+
this._loaded.push(newInstance)
|
|
41
|
+
} else {
|
|
42
|
+
throw new Error(`Loaded had an unexpected type: ${typeof this._loaded}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// Set loaded on the models inversed relationship
|
|
47
|
+
const inverseOf = this.getRelationship().getInverseOf()
|
|
48
|
+
|
|
49
|
+
if (inverseOf) {
|
|
50
|
+
const inverseInstanceRelationship = newInstance.getRelationshipByName(inverseOf)
|
|
51
|
+
|
|
52
|
+
inverseInstanceRelationship.setAutoSave(false)
|
|
53
|
+
inverseInstanceRelationship.setLoaded(this.getModel())
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
// Assign the foreign key to the new model
|
|
58
|
+
const parentModel = this.getModel()
|
|
59
|
+
|
|
60
|
+
if (parentModel.isPersisted()) {
|
|
61
|
+
const foreignKeyName = this.getForeignKey()
|
|
62
|
+
const columnNameMap = targetModelClass.getColumnNameToAttributeNameMap()
|
|
63
|
+
const foreignKeyAttributeName = columnNameMap[foreignKeyName]
|
|
64
|
+
if (!foreignKeyAttributeName) throw new Error(`Unknown foreign key attribute name for ${foreignKeyName}`)
|
|
65
|
+
const primaryKeyName = this.getPrimaryKey()
|
|
66
|
+
const foreignKeyValue = parentModel.readColumn(primaryKeyName)
|
|
67
|
+
/**
|
|
68
|
+
* Assign data.
|
|
69
|
+
@type {Record<string, ?>} */
|
|
70
|
+
const assignData = {}
|
|
71
|
+
|
|
72
|
+
assignData[foreignKeyAttributeName] = foreignKeyValue
|
|
73
|
+
|
|
74
|
+
newInstance.assign(assignData)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
// Return the new contructed model
|
|
79
|
+
return newInstance
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Runs create.
|
|
84
|
+
* @param {Record<string, ?>} data - Data payload.
|
|
85
|
+
* @returns {Promise<InstanceType<TMC>>} - Resolves with the create.
|
|
86
|
+
*/
|
|
87
|
+
async create(data) {
|
|
88
|
+
const model = this.build(data)
|
|
89
|
+
|
|
90
|
+
await model.save()
|
|
91
|
+
|
|
92
|
+
return model
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Runs load.
|
|
97
|
+
* @returns {Promise<InstanceType<TMC>[]>} - Resolves with loaded models.
|
|
98
|
+
*/
|
|
99
|
+
async load() {
|
|
100
|
+
// Force-reload: discard the cached value and fetch fresh. When the parent
|
|
101
|
+
// record was loaded as part of a batch, route through the cohort preloader
|
|
102
|
+
// so siblings that have not preloaded this relationship get batched too.
|
|
103
|
+
// The scoped query path (`instance.query().where(...).load()`) bypasses
|
|
104
|
+
// this and stays a single-record load by design.
|
|
105
|
+
this._preloaded = false
|
|
106
|
+
this._loaded = undefined
|
|
107
|
+
|
|
108
|
+
const batched = await this._tryCohortPreload()
|
|
109
|
+
|
|
110
|
+
if (batched) {
|
|
111
|
+
return /** Narrows the runtime value to the documented type. @type {InstanceType<TMC>[]} */ (Array.isArray(this._loaded) ? this._loaded : [])
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const foreignModels = /**
|
|
115
|
+
* Narrows the runtime value to the documented type.
|
|
116
|
+
@type {InstanceType<TMC>[]} */ (await this.query().load())
|
|
117
|
+
|
|
118
|
+
this.setLoaded(foreignModels)
|
|
119
|
+
this.setDirty(false)
|
|
120
|
+
this.setPreloaded(true)
|
|
121
|
+
|
|
122
|
+
return foreignModels
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Runs to array.
|
|
127
|
+
* @returns {Promise<InstanceType<TMC>[]>} - Resolves with the array.
|
|
128
|
+
*/
|
|
129
|
+
async toArray() {
|
|
130
|
+
const loadedValue = await this.autoloadOrLoad()
|
|
131
|
+
|
|
132
|
+
if (loadedValue === undefined) return []
|
|
133
|
+
|
|
134
|
+
return Array.isArray(loadedValue) ? loadedValue : [loadedValue]
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Runs size.
|
|
139
|
+
* @returns {Promise<number>} - Resolves with the relationship size, using loaded records when available.
|
|
140
|
+
*/
|
|
141
|
+
async size() {
|
|
142
|
+
const loadedValue = this.getLoadedOrUndefined()
|
|
143
|
+
|
|
144
|
+
if (loadedValue !== undefined) {
|
|
145
|
+
if (!Array.isArray(loadedValue)) throw new Error(`Loaded had an unexpected type: ${typeof loadedValue}`)
|
|
146
|
+
|
|
147
|
+
return loadedValue.length
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (this.getModel().isNewRecord()) return 0
|
|
151
|
+
|
|
152
|
+
return await this.query().count()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Runs preload.
|
|
157
|
+
* @param {import("../../query/index.js").NestedPreloadRecord} preloads - Preload map for related records.
|
|
158
|
+
* @returns {import("../../query/model-class-query.js").default<TMC>} - The preload.
|
|
159
|
+
*/
|
|
160
|
+
preload(preloads) {
|
|
161
|
+
return this.query().clone().preload(preloads)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Runs find.
|
|
166
|
+
* @param {string | number} modelID - Related model identifier.
|
|
167
|
+
* @returns {Promise<InstanceType<TMC>>} - Resolves with the find.
|
|
168
|
+
*/
|
|
169
|
+
async find(modelID) {
|
|
170
|
+
return /** Narrows the runtime value to the documented type. @type {Promise<InstanceType<TMC>>} */ (this.query().find(modelID))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Runs query.
|
|
175
|
+
* @returns {import("../../query/model-class-query.js").default<TMC>} - The query.
|
|
176
|
+
*/
|
|
177
|
+
query() {
|
|
178
|
+
if (!this.getModel().isPersisted()) throw new Error("Cannot build a query for an unpersisted parent model")
|
|
179
|
+
|
|
180
|
+
const TargetModelClass = this.getTargetModelClass()
|
|
181
|
+
|
|
182
|
+
if (!TargetModelClass) throw new Error("Cannot load without a target model class")
|
|
183
|
+
|
|
184
|
+
const throughRelationshipName = this.getRelationship().through
|
|
185
|
+
|
|
186
|
+
if (throughRelationshipName) {
|
|
187
|
+
const parentModelClass = this.getModel().getModelClass()
|
|
188
|
+
const throughRelationship = parentModelClass.getRelationshipByName(throughRelationshipName)
|
|
189
|
+
const throughModelClass = throughRelationship.getTargetModelClass()
|
|
190
|
+
|
|
191
|
+
if (!throughModelClass) throw new Error(`Through relationship ${throughRelationshipName} has no target model class`)
|
|
192
|
+
|
|
193
|
+
const throughForeignKey = throughRelationship.getForeignKey()
|
|
194
|
+
const throughPrimaryKey = throughRelationship.getPrimaryKey()
|
|
195
|
+
const targetForeignKey = this.getForeignKey()
|
|
196
|
+
const targetTable = TargetModelClass.tableName()
|
|
197
|
+
const throughTable = throughModelClass.tableName()
|
|
198
|
+
const driver = TargetModelClass.connection()
|
|
199
|
+
const parentPrimaryKey = this.getPrimaryKey()
|
|
200
|
+
const parentId = /**
|
|
201
|
+
* Narrows the runtime value to the documented type.
|
|
202
|
+
@type {string | number} */ (this.getModel().readColumn(parentPrimaryKey))
|
|
203
|
+
const joinSql = `LEFT JOIN ${driver.quoteTable(throughTable)} ON ${driver.quoteTable(throughTable)}.${driver.quoteColumn(throughPrimaryKey)} = ${driver.quoteTable(targetTable)}.${driver.quoteColumn(targetForeignKey)}`
|
|
204
|
+
const whereSql = `${driver.quoteTable(throughTable)}.${driver.quoteColumn(throughForeignKey)} = ${driver.options().quote(parentId)}`
|
|
205
|
+
|
|
206
|
+
const query = TargetModelClass.joins(joinSql).where(whereSql)
|
|
207
|
+
|
|
208
|
+
return this.applyScope(query)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const foreignKey = this.getForeignKey()
|
|
212
|
+
const primaryKey = this.getPrimaryKey()
|
|
213
|
+
const primaryModelID = /**
|
|
214
|
+
* Narrows the runtime value to the documented type.
|
|
215
|
+
@type {string | number} */ (this.getModel().readColumn(primaryKey))
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Where args.
|
|
219
|
+
@type {Record<string, string | number>} */
|
|
220
|
+
const whereArgs = {}
|
|
221
|
+
|
|
222
|
+
whereArgs[foreignKey] = primaryModelID
|
|
223
|
+
|
|
224
|
+
const query = TargetModelClass.where(whereArgs)
|
|
225
|
+
|
|
226
|
+
return this.applyScope(query)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Runs loaded.
|
|
231
|
+
* @returns {Array<InstanceType<TMC>>} The loaded model or models (depending on relationship type)
|
|
232
|
+
*/
|
|
233
|
+
loaded() {
|
|
234
|
+
if (!this._preloaded && this.model.isPersisted()) {
|
|
235
|
+
throw new Error(`${this.model.constructor.name}#${this.relationship.getRelationshipName()} hasn't been preloaded`)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (this._loaded === undefined && this.model.isNewRecord()) {
|
|
239
|
+
return []
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return Array.isArray(this._loaded) ? this._loaded : []
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Runs add to loaded.
|
|
247
|
+
* @param {InstanceType<TMC>[] | InstanceType<TMC>} models - Model instances.
|
|
248
|
+
* @returns {void} - No return value.
|
|
249
|
+
*/
|
|
250
|
+
addToLoaded(models) {
|
|
251
|
+
if (!models) {
|
|
252
|
+
throw new Error("Need to give something")
|
|
253
|
+
} else if (Array.isArray(models)) {
|
|
254
|
+
for (const model of models) {
|
|
255
|
+
if (this._loaded === undefined) {
|
|
256
|
+
this._loaded = [model]
|
|
257
|
+
} else if (Array.isArray(this._loaded)) {
|
|
258
|
+
this._loaded.push(model)
|
|
259
|
+
} else {
|
|
260
|
+
throw new Error(`Unexpected loaded type: ${typeof this._loaded}`)
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
if (this._loaded === undefined) {
|
|
265
|
+
this._loaded = [models]
|
|
266
|
+
} else if (Array.isArray(this._loaded)) {
|
|
267
|
+
this._loaded.push(models)
|
|
268
|
+
} else {
|
|
269
|
+
throw new Error(`Unexpected loaded type: ${typeof this._loaded}`)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Runs set loaded.
|
|
276
|
+
* @param {InstanceType<TMC>[]} models - Model instances.
|
|
277
|
+
* @returns {void} - No return value.
|
|
278
|
+
*/
|
|
279
|
+
setLoaded(models) {
|
|
280
|
+
if (!Array.isArray(models)) throw new Error(`Argument given to setLoaded wasn't an array: ${typeof models}`)
|
|
281
|
+
|
|
282
|
+
this._loaded = models
|
|
283
|
+
}
|
|
284
|
+
}
|