velocious 1.0.431 → 1.0.433
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +4119 -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 +939 -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/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/application.js +187 -214
- package/build/src/authorization/ability.js +250 -297
- package/build/src/authorization/base-resource.js +120 -136
- package/build/src/background-jobs/client.js +43 -47
- package/build/src/background-jobs/cron-expression.js +127 -166
- package/build/src/background-jobs/forked-runner-child.js +37 -47
- package/build/src/background-jobs/job-record.js +8 -10
- package/build/src/background-jobs/job-registry.js +72 -84
- package/build/src/background-jobs/job-runner.js +74 -81
- package/build/src/background-jobs/job.js +62 -72
- package/build/src/background-jobs/json-socket.js +65 -70
- package/build/src/background-jobs/main.js +841 -900
- package/build/src/background-jobs/normalize-error.js +12 -11
- package/build/src/background-jobs/scheduler.js +205 -247
- package/build/src/background-jobs/socket-request.js +60 -65
- package/build/src/background-jobs/status-reporter.js +86 -96
- package/build/src/background-jobs/store.js +862 -980
- package/build/src/background-jobs/types.js +2 -3
- package/build/src/background-jobs/web/authorization.js +38 -50
- package/build/src/background-jobs/web/controller.js +232 -268
- package/build/src/background-jobs/web/index.js +36 -40
- package/build/src/background-jobs/web/path-matcher.js +45 -48
- package/build/src/background-jobs/web/registry.js +9 -14
- package/build/src/background-jobs/worker.js +585 -639
- package/build/src/beacon/client.js +264 -293
- package/build/src/beacon/in-process-broker.js +20 -25
- package/build/src/beacon/in-process-client.js +104 -116
- package/build/src/beacon/server.js +110 -126
- package/build/src/beacon/types.js +2 -8
- package/build/src/cli/base-command.js +49 -57
- package/build/src/cli/browser-cli.js +37 -42
- package/build/src/cli/commands/background-jobs-main.js +5 -5
- package/build/src/cli/commands/background-jobs-runner.js +5 -5
- package/build/src/cli/commands/background-jobs-worker.js +5 -5
- package/build/src/cli/commands/beacon.js +5 -5
- package/build/src/cli/commands/console.js +10 -10
- package/build/src/cli/commands/db/base-command.js +71 -76
- package/build/src/cli/commands/db/create.js +53 -61
- package/build/src/cli/commands/db/drop.js +62 -71
- package/build/src/cli/commands/db/migrate.js +13 -15
- package/build/src/cli/commands/db/reset.js +16 -19
- package/build/src/cli/commands/db/rollback.js +12 -13
- package/build/src/cli/commands/db/schema/dump.js +9 -9
- package/build/src/cli/commands/db/schema/load.js +9 -9
- package/build/src/cli/commands/db/seed.js +9 -9
- package/build/src/cli/commands/db/tenants/check.js +32 -35
- package/build/src/cli/commands/db/tenants/create.js +26 -29
- package/build/src/cli/commands/db/tenants/migrate.js +40 -44
- package/build/src/cli/commands/destroy/migration.js +5 -5
- package/build/src/cli/commands/generate/base-models.js +5 -5
- package/build/src/cli/commands/generate/frontend-models.js +9 -9
- package/build/src/cli/commands/generate/migration.js +5 -5
- package/build/src/cli/commands/generate/model.js +5 -5
- package/build/src/cli/commands/init.js +7 -9
- package/build/src/cli/commands/routes.js +6 -6
- package/build/src/cli/commands/run-script.js +9 -9
- package/build/src/cli/commands/runner.js +9 -9
- package/build/src/cli/commands/server.js +6 -6
- package/build/src/cli/commands/test.js +6 -7
- package/build/src/cli/index.js +127 -141
- package/build/src/cli/tenant-database-command-helper.js +154 -185
- package/build/src/cli/use-browser-cli.js +15 -20
- package/build/src/configuration-resolver.js +47 -54
- package/build/src/configuration-types.d.ts +5 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +3 -54
- package/build/src/configuration.js +2240 -2547
- package/build/src/controller.js +363 -407
- package/build/src/current-configuration.js +9 -12
- package/build/src/current.js +70 -75
- package/build/src/database/annotations-async-hooks.js +16 -22
- package/build/src/database/annotations.js +12 -18
- package/build/src/database/drivers/base-column.js +155 -179
- package/build/src/database/drivers/base-columns-index.js +69 -78
- package/build/src/database/drivers/base-foreign-key.js +89 -101
- package/build/src/database/drivers/base-table.js +124 -149
- package/build/src/database/drivers/base.js +1306 -1489
- package/build/src/database/drivers/mssql/column.js +39 -50
- package/build/src/database/drivers/mssql/columns-index.js +2 -3
- package/build/src/database/drivers/mssql/connect-connection.js +11 -9
- package/build/src/database/drivers/mssql/foreign-key.js +8 -9
- package/build/src/database/drivers/mssql/index.js +507 -587
- package/build/src/database/drivers/mssql/options.js +68 -75
- package/build/src/database/drivers/mssql/query-parser.js +2 -3
- package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
- package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
- package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/delete.js +14 -16
- package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
- package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
- package/build/src/database/drivers/mssql/sql/insert.js +2 -2
- package/build/src/database/drivers/mssql/sql/update.js +24 -28
- package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
- package/build/src/database/drivers/mssql/structure-sql.js +102 -114
- package/build/src/database/drivers/mssql/table.js +81 -96
- package/build/src/database/drivers/mysql/column.js +75 -92
- package/build/src/database/drivers/mysql/columns-index.js +16 -19
- package/build/src/database/drivers/mysql/foreign-key.js +8 -9
- package/build/src/database/drivers/mysql/index.js +396 -457
- package/build/src/database/drivers/mysql/options.js +26 -30
- package/build/src/database/drivers/mysql/query-parser.js +2 -3
- package/build/src/database/drivers/mysql/query.js +26 -29
- package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
- package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
- package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/delete.js +14 -17
- package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
- package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
- package/build/src/database/drivers/mysql/sql/insert.js +2 -3
- package/build/src/database/drivers/mysql/sql/update.js +24 -29
- package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
- package/build/src/database/drivers/mysql/structure-sql.js +79 -88
- package/build/src/database/drivers/mysql/table.js +83 -98
- package/build/src/database/drivers/pgsql/column.js +56 -72
- package/build/src/database/drivers/pgsql/columns-index.js +2 -3
- package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
- package/build/src/database/drivers/pgsql/index.js +377 -438
- package/build/src/database/drivers/pgsql/options.js +25 -28
- package/build/src/database/drivers/pgsql/query-parser.js +2 -3
- package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
- package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
- package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
- package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
- package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
- package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
- package/build/src/database/drivers/pgsql/sql/update.js +24 -29
- package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
- package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
- package/build/src/database/drivers/pgsql/table.js +60 -77
- package/build/src/database/drivers/sqlite/base.js +405 -478
- package/build/src/database/drivers/sqlite/column.js +54 -69
- package/build/src/database/drivers/sqlite/columns-index.js +22 -27
- package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
- package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
- package/build/src/database/drivers/sqlite/index.js +330 -373
- package/build/src/database/drivers/sqlite/index.native.js +55 -64
- package/build/src/database/drivers/sqlite/index.web.js +69 -87
- package/build/src/database/drivers/sqlite/options.js +25 -28
- package/build/src/database/drivers/sqlite/query-parser.js +2 -3
- package/build/src/database/drivers/sqlite/query.js +21 -24
- package/build/src/database/drivers/sqlite/query.native.js +20 -25
- package/build/src/database/drivers/sqlite/query.web.js +30 -37
- package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
- package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
- package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
- package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
- package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
- package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
- package/build/src/database/drivers/sqlite/sql/update.js +24 -29
- package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
- package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
- package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
- package/build/src/database/drivers/sqlite/table.js +102 -125
- package/build/src/database/drivers/structure-sql/utils.js +14 -17
- package/build/src/database/handler.js +9 -10
- package/build/src/database/initializer-from-require-context.js +76 -87
- package/build/src/database/migration/index.js +332 -395
- package/build/src/database/migrator/files-finder.js +40 -50
- package/build/src/database/migrator/types.js +2 -30
- package/build/src/database/migrator.js +454 -526
- package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
- package/build/src/database/pool/base-methods-forward.js +40 -43
- package/build/src/database/pool/base.js +298 -343
- package/build/src/database/pool/single-multi-use.js +93 -110
- package/build/src/database/query/alter-table-base.js +84 -99
- package/build/src/database/query/base.js +39 -46
- package/build/src/database/query/create-database-base.js +25 -30
- package/build/src/database/query/create-index-base.js +75 -94
- package/build/src/database/query/create-table-base.js +151 -193
- package/build/src/database/query/delete-base.js +14 -16
- package/build/src/database/query/drop-database-base.js +23 -28
- package/build/src/database/query/drop-table-base.js +42 -53
- package/build/src/database/query/from-base.js +30 -33
- package/build/src/database/query/from-plain.js +11 -13
- package/build/src/database/query/from-table.js +13 -15
- package/build/src/database/query/index.js +410 -472
- package/build/src/database/query/insert-base.js +143 -164
- package/build/src/database/query/join-base.js +35 -40
- package/build/src/database/query/join-object.js +128 -153
- package/build/src/database/query/join-plain.js +13 -15
- package/build/src/database/query/join-tracker.js +76 -90
- package/build/src/database/query/model-class-query.js +1134 -1370
- package/build/src/database/query/order-base.js +27 -30
- package/build/src/database/query/order-column.js +44 -53
- package/build/src/database/query/order-plain.js +20 -24
- package/build/src/database/query/preloader/belongs-to.js +210 -258
- package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
- package/build/src/database/query/preloader/has-many.js +240 -301
- package/build/src/database/query/preloader/has-one.js +91 -117
- package/build/src/database/query/preloader/selection.js +117 -129
- package/build/src/database/query/preloader.js +160 -185
- package/build/src/database/query/query-data.js +157 -201
- package/build/src/database/query/select-base.js +25 -27
- package/build/src/database/query/select-plain.js +13 -15
- package/build/src/database/query/select-table-and-column.js +21 -25
- package/build/src/database/query/update-base.js +35 -38
- package/build/src/database/query/upsert-base.js +93 -100
- package/build/src/database/query/where-base.js +32 -35
- package/build/src/database/query/where-combinator.js +25 -28
- package/build/src/database/query/where-hash.js +61 -68
- package/build/src/database/query/where-model-class-hash.js +414 -469
- package/build/src/database/query/where-not.js +18 -20
- package/build/src/database/query/where-plain.js +15 -17
- package/build/src/database/query/with-count.js +125 -159
- package/build/src/database/query-parser/base-query-parser.js +32 -37
- package/build/src/database/query-parser/from-parser.js +36 -45
- package/build/src/database/query-parser/group-parser.js +42 -50
- package/build/src/database/query-parser/joins-parser.js +28 -33
- package/build/src/database/query-parser/limit-parser.js +67 -70
- package/build/src/database/query-parser/options.js +75 -82
- package/build/src/database/query-parser/order-parser.js +36 -40
- package/build/src/database/query-parser/select-parser.js +49 -60
- package/build/src/database/query-parser/where-parser.js +36 -41
- package/build/src/database/record/acts-as-list.js +235 -273
- package/build/src/database/record/attachments/download.js +44 -45
- package/build/src/database/record/attachments/handle.js +141 -161
- package/build/src/database/record/attachments/normalize-input.js +128 -138
- package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
- package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
- package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
- package/build/src/database/record/attachments/store.js +467 -539
- package/build/src/database/record/index.d.ts +109 -25
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +3502 -3898
- package/build/src/database/record/instance-relationships/base.js +234 -268
- package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
- package/build/src/database/record/instance-relationships/has-many.js +225 -264
- package/build/src/database/record/instance-relationships/has-one.js +85 -105
- package/build/src/database/record/record-not-found-error.js +3 -2
- package/build/src/database/record/relationships/base.js +144 -166
- package/build/src/database/record/relationships/belongs-to.js +44 -51
- package/build/src/database/record/relationships/has-many.js +32 -40
- package/build/src/database/record/relationships/has-one.js +32 -40
- package/build/src/database/record/state-machine.js +156 -208
- package/build/src/database/record/user-module.js +32 -38
- package/build/src/database/record/validators/base.js +22 -24
- package/build/src/database/record/validators/format.js +36 -46
- package/build/src/database/record/validators/presence.js +18 -20
- package/build/src/database/record/validators/uniqueness.js +99 -117
- package/build/src/database/table-data/index.js +199 -231
- package/build/src/database/table-data/table-column.js +338 -382
- package/build/src/database/table-data/table-foreign-key.js +57 -66
- package/build/src/database/table-data/table-index.js +29 -36
- package/build/src/database/table-data/table-reference.js +10 -10
- package/build/src/database/use-database.js +32 -40
- package/build/src/environment-handlers/base.js +484 -544
- package/build/src/environment-handlers/browser.js +241 -294
- package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
- package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
- package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
- package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
- package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
- package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
- package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
- 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 +326 -358
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
- package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
- package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
- package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
- package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
- package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
- package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
- package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
- package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
- package/build/src/environment-handlers/node.js +753 -874
- package/build/src/error-logger.js +22 -21
- package/build/src/frontend-model-controller.js +2791 -3291
- package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +770 -865
- package/build/src/frontend-models/base.js +3136 -3593
- package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
- package/build/src/frontend-models/event-hook-models.js +16 -21
- package/build/src/frontend-models/model-registry.js +9 -11
- package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
- package/build/src/frontend-models/preloader.js +131 -149
- package/build/src/frontend-models/query.js +1557 -1855
- package/build/src/frontend-models/resource-config-validation.js +27 -37
- package/build/src/frontend-models/resource-definition.d.ts +6 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +237 -291
- package/build/src/frontend-models/transport-serialization.js +203 -266
- package/build/src/frontend-models/use-created-event.js +5 -7
- package/build/src/frontend-models/use-destroyed-event.js +80 -93
- package/build/src/frontend-models/use-model-class-event.js +79 -91
- package/build/src/frontend-models/use-updated-event.js +84 -97
- package/build/src/frontend-models/websocket-channel.js +381 -441
- package/build/src/frontend-models/websocket-publishers.js +142 -175
- package/build/src/http-client/header.js +13 -14
- package/build/src/http-client/index.js +116 -132
- package/build/src/http-client/request.js +71 -87
- package/build/src/http-client/response.js +122 -140
- package/build/src/http-client/websocket-client.js +15 -17
- package/build/src/http-server/client/index.js +409 -465
- package/build/src/http-server/client/params-to-object.js +124 -135
- package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
- package/build/src/http-server/client/request-buffer/header.js +15 -16
- package/build/src/http-server/client/request-buffer/index.js +446 -506
- package/build/src/http-server/client/request-parser.js +163 -186
- package/build/src/http-server/client/request-runner.js +226 -259
- package/build/src/http-server/client/request-timing.js +132 -151
- package/build/src/http-server/client/request.js +96 -108
- package/build/src/http-server/client/response.js +213 -235
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
- package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
- package/build/src/http-server/client/websocket-request.js +114 -137
- package/build/src/http-server/client/websocket-session.js +1452 -1657
- package/build/src/http-server/cookie.js +216 -236
- package/build/src/http-server/development-reloader.js +190 -221
- package/build/src/http-server/index.js +451 -525
- package/build/src/http-server/remote-address.js +38 -50
- package/build/src/http-server/server-client.js +181 -208
- package/build/src/http-server/server-lock.js +153 -167
- package/build/src/http-server/websocket-channel-subscribers.js +81 -93
- package/build/src/http-server/websocket-channel.js +104 -117
- package/build/src/http-server/websocket-connection.js +96 -104
- package/build/src/http-server/websocket-event-log-store.js +350 -404
- package/build/src/http-server/websocket-events-host.js +145 -164
- package/build/src/http-server/websocket-events.js +47 -47
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
- package/build/src/http-server/worker-handler/in-process.js +123 -141
- package/build/src/http-server/worker-handler/index.js +313 -349
- package/build/src/http-server/worker-handler/worker-script.js +4 -5
- package/build/src/http-server/worker-handler/worker-thread.js +240 -269
- package/build/src/initializer.js +31 -36
- package/build/src/jobs/mail-delivery.js +13 -15
- package/build/src/logger/base-logger.js +24 -26
- package/build/src/logger/console-logger.js +21 -23
- package/build/src/logger/file-logger.js +29 -31
- package/build/src/logger/outputs/array-output.js +37 -42
- package/build/src/logger/outputs/console-output.js +20 -24
- package/build/src/logger/outputs/file-output.js +43 -48
- package/build/src/logger/outputs/stdout-output.js +39 -48
- package/build/src/logger.js +338 -394
- package/build/src/mailer/backends/smtp.js +134 -163
- package/build/src/mailer/base.js +211 -251
- package/build/src/mailer/delivery.js +56 -64
- package/build/src/mailer/index.js +4 -22
- package/build/src/mailer.js +4 -13
- package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
- package/build/src/plugins/sqljs-wasm-route.js +28 -38
- package/build/src/record-payload-values.js +25 -28
- package/build/src/routes/app-routes.js +12 -14
- package/build/src/routes/base-route.js +112 -130
- package/build/src/routes/basic-route.js +83 -102
- package/build/src/routes/built-in/debug/controller.js +10 -10
- package/build/src/routes/built-in/errors/controller.js +5 -5
- package/build/src/routes/get-route.js +50 -63
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
- package/build/src/routes/index.js +36 -43
- package/build/src/routes/namespace-route.js +38 -47
- package/build/src/routes/plugin-routes.js +107 -124
- package/build/src/routes/post-route.js +51 -62
- package/build/src/routes/resolver.js +422 -494
- package/build/src/routes/resource-route.js +124 -143
- package/build/src/routes/root-route.js +7 -8
- package/build/src/testing/base-expect.js +13 -14
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
- package/build/src/testing/browser-test-app.js +23 -29
- package/build/src/testing/expect-to-change.js +41 -50
- package/build/src/testing/expect-utils.js +139 -184
- package/build/src/testing/expect.js +638 -731
- package/build/src/testing/request-client.js +70 -85
- package/build/src/testing/test-files-finder.js +285 -339
- package/build/src/testing/test-filter-parser.js +124 -155
- package/build/src/testing/test-runner.js +883 -1020
- package/build/src/testing/test-suite-splitter.js +114 -142
- package/build/src/testing/test.js +216 -256
- package/build/src/utils/backtrace-cleaner-node.js +62 -69
- package/build/src/utils/backtrace-cleaner.js +188 -216
- package/build/src/utils/ensure-error.js +7 -7
- package/build/src/utils/event-emitter.js +4 -6
- package/build/src/utils/file-exists.js +9 -10
- package/build/src/utils/format-value.js +67 -76
- package/build/src/utils/model-scope.js +27 -31
- package/build/src/utils/nest-callbacks.js +10 -13
- package/build/src/utils/plain-object.js +5 -6
- package/build/src/utils/ransack.js +448 -563
- package/build/src/utils/rest-args-error.js +5 -6
- package/build/src/utils/singularize-model-name.js +9 -11
- package/build/src/utils/split-sql-statements.js +68 -79
- package/build/src/utils/to-import-specifier.js +24 -30
- package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
- package/build/src/utils/with-tracked-stack.js +14 -18
- package/build/src/velocious-error.js +27 -30
- 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/package.json +3 -3
- package/src/configuration-types.js +1 -1
- package/src/database/record/index.js +174 -25
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
- package/src/frontend-model-resource/base-resource.js +6 -2
- package/src/frontend-models/resource-definition.js +3 -3
- package/src/frontend-models/websocket-publishers.js +6 -6
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
export default class VelocuiousDatabaseQueryParserWhereParser {
|
|
4
|
+
/**
|
|
5
|
+
* Runs constructor.
|
|
6
|
+
* @param {object} args - Options object.
|
|
7
|
+
* @param {boolean} args.pretty - Whether pretty.
|
|
8
|
+
* @param {import("../query/index.js").default} args.query - Query instance.
|
|
9
|
+
*/
|
|
10
|
+
constructor({pretty, query}) {
|
|
11
|
+
this.pretty = pretty
|
|
12
|
+
this.query = query
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
toSql() {
|
|
16
|
+
const {pretty, query} = this
|
|
17
|
+
let sql = ""
|
|
18
|
+
|
|
19
|
+
if (query._wheres.length == 0) return sql
|
|
20
|
+
|
|
21
|
+
if (pretty) {
|
|
22
|
+
sql += "\n\n"
|
|
23
|
+
} else {
|
|
24
|
+
sql += " "
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
sql += "WHERE"
|
|
28
|
+
|
|
29
|
+
let count = 0
|
|
30
|
+
|
|
31
|
+
for (const where of query._wheres) {
|
|
32
|
+
if (count > 0) sql += " AND"
|
|
33
|
+
|
|
34
|
+
if (pretty) {
|
|
35
|
+
sql += "\n "
|
|
36
|
+
} else {
|
|
37
|
+
sql += " "
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
sql += where.toSql()
|
|
41
|
+
count++
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return sql
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** @file Registers gap-less positional list callbacks on a model class. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Acts as list shifting.
|
|
7
|
+
* @type {symbol} - Guard flag set on the model instance during shift operations to prevent re-entrant lifecycle hooks.
|
|
8
|
+
*/
|
|
9
|
+
const ACTS_AS_LIST_SHIFTING = Symbol("actsAsListShifting")
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Runs set shifting flag.
|
|
13
|
+
* @param {import("./index.js").default} record - Model instance.
|
|
14
|
+
* @param {boolean} value - Flag value.
|
|
15
|
+
*/
|
|
16
|
+
function setShiftingFlag(record, value) {
|
|
17
|
+
// @ts-ignore - Symbol indexing on Record instances
|
|
18
|
+
record[ACTS_AS_LIST_SHIFTING] = value
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Runs is shifting.
|
|
23
|
+
* @param {import("./index.js").default} record - Model instance.
|
|
24
|
+
* @returns {boolean}
|
|
25
|
+
*/
|
|
26
|
+
function isShifting(record) {
|
|
27
|
+
// @ts-ignore - Symbol indexing on Record instances
|
|
28
|
+
return Boolean(record[ACTS_AS_LIST_SHIFTING])
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Registers gap-less positional list callbacks on a model class to maintain
|
|
33
|
+
* a gap-less positional list. When a record is inserted, updated, or
|
|
34
|
+
* destroyed, the surrounding positions are shifted so the list stays compact
|
|
35
|
+
* (1,2,3,...) and scoped within the given column.
|
|
36
|
+
*
|
|
37
|
+
* Callers must also ensure a UNIQUE index on (scopeColumn, positionColumn)
|
|
38
|
+
* exists in the database schema — use `Migration.addActsAsList()` for the
|
|
39
|
+
* corresponding schema setup.
|
|
40
|
+
* @param {typeof import("./index.js").default} modelClass - The model class.
|
|
41
|
+
* @param {string} positionColumn - camelCase name of the position attribute (e.g. "rowNumber").
|
|
42
|
+
* @param {object} options - Options.
|
|
43
|
+
* @param {string} options.scope - camelCase name of the scope attribute (e.g. "boardColumnId").
|
|
44
|
+
* @returns {void}
|
|
45
|
+
*/
|
|
46
|
+
export default function registerActsAsListCallbacks(modelClass, positionColumn, {scope}) {
|
|
47
|
+
modelClass.beforeCreate(async (record) => {
|
|
48
|
+
if (isShifting(record)) return
|
|
49
|
+
|
|
50
|
+
const position = record.readAttribute(positionColumn)
|
|
51
|
+
|
|
52
|
+
if (position != null) {
|
|
53
|
+
await shiftPositionsUp({record, positionColumn, scope, fromPosition: position})
|
|
54
|
+
} else {
|
|
55
|
+
const nextPosition = await highestPositionInScope({record, positionColumn, scope})
|
|
56
|
+
|
|
57
|
+
record.setAttribute(positionColumn, nextPosition + 1)
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
modelClass.beforeUpdate(async (record) => {
|
|
62
|
+
if (isShifting(record)) return
|
|
63
|
+
if (!record.isPersisted()) return
|
|
64
|
+
|
|
65
|
+
const modelClass = /**
|
|
66
|
+
* Narrows the runtime value to the documented type.
|
|
67
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
68
|
+
const posColumn = modelClass.getColumnNameForAttributeName(positionColumn)
|
|
69
|
+
const scopeCol = modelClass.getColumnNameForAttributeName(scope)
|
|
70
|
+
const rawAttributes = /**
|
|
71
|
+
* Narrows the runtime value to the documented type.
|
|
72
|
+
@type {Record<string, ?>} */ (record._attributes || {})
|
|
73
|
+
const changes = /**
|
|
74
|
+
* Narrows the runtime value to the documented type.
|
|
75
|
+
@type {Record<string, ?>} */ (record._changes || {})
|
|
76
|
+
const posChanged = posColumn in changes
|
|
77
|
+
const scopeChanged = scopeCol in changes
|
|
78
|
+
|
|
79
|
+
if (!posChanged && !scopeChanged) return
|
|
80
|
+
|
|
81
|
+
const oldPosition = posChanged ? /**
|
|
82
|
+
* Narrows the runtime value to the documented type.
|
|
83
|
+
@type {number} */ (rawAttributes[posColumn]) : /**
|
|
84
|
+
* Narrows the runtime value to the documented type.
|
|
85
|
+
@type {number} */ (record.readAttribute(positionColumn))
|
|
86
|
+
const newPosition = posChanged ? /**
|
|
87
|
+
* Narrows the runtime value to the documented type.
|
|
88
|
+
@type {number} */ (changes[posColumn]) : /**
|
|
89
|
+
* Narrows the runtime value to the documented type.
|
|
90
|
+
@type {number} */ (record.readAttribute(positionColumn))
|
|
91
|
+
const oldScopeValue = scopeChanged ? /**
|
|
92
|
+
* Narrows the runtime value to the documented type.
|
|
93
|
+
@type {number} */ (rawAttributes[scopeCol]) : /**
|
|
94
|
+
* Narrows the runtime value to the documented type.
|
|
95
|
+
@type {number} */ (record.readAttribute(scope))
|
|
96
|
+
const newScopeValue = scopeChanged ? /**
|
|
97
|
+
* Narrows the runtime value to the documented type.
|
|
98
|
+
@type {number} */ (changes[scopeCol]) : /**
|
|
99
|
+
* Narrows the runtime value to the documented type.
|
|
100
|
+
@type {number} */ (record.readAttribute(scope))
|
|
101
|
+
|
|
102
|
+
if (oldPosition == null || newPosition == null) return
|
|
103
|
+
if (newPosition === oldPosition && newScopeValue === oldScopeValue) return
|
|
104
|
+
|
|
105
|
+
// Move the record out of the way before shifting others to avoid
|
|
106
|
+
// intermediate UNIQUE constraint violations. Use the old scope value
|
|
107
|
+
// for the move-out-of-way because the record is still in the old scope.
|
|
108
|
+
await moveOutOfWay({record, positionColumn, scope, scopeValue: oldScopeValue})
|
|
109
|
+
setShiftingFlag(record, false)
|
|
110
|
+
|
|
111
|
+
if (scopeChanged && oldScopeValue !== newScopeValue) {
|
|
112
|
+
let targetPosition = newPosition
|
|
113
|
+
|
|
114
|
+
// When only the scope changes without a new position, append to the end
|
|
115
|
+
// of the new scope. There is no target-scope row to shift out of the way.
|
|
116
|
+
if (!posChanged) {
|
|
117
|
+
const highestNew = await highestPositionInScope({record, positionColumn, scope, scopeValue: newScopeValue})
|
|
118
|
+
const nextPos = highestNew + 1
|
|
119
|
+
|
|
120
|
+
record.setAttribute(positionColumn, nextPos)
|
|
121
|
+
await shiftPositionsDown({record, positionColumn, scope, scopeValue: oldScopeValue, fromPosition: oldPosition + 1})
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
await shiftPositionsDown({record, positionColumn, scope, scopeValue: oldScopeValue, fromPosition: oldPosition + 1})
|
|
126
|
+
await shiftPositionsUp({record, positionColumn, scope, scopeValue: newScopeValue, fromPosition: targetPosition})
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (newPosition < oldPosition) {
|
|
131
|
+
await shiftPositionsUp({record, positionColumn, scope, fromPosition: newPosition, toPosition: oldPosition})
|
|
132
|
+
} else if (newPosition > oldPosition) {
|
|
133
|
+
await shiftPositionsDown({record, positionColumn, scope, fromPosition: oldPosition + 1, toPosition: newPosition + 1})
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
modelClass.beforeDestroy(async (record) => {
|
|
138
|
+
const position = record.readAttribute(positionColumn)
|
|
139
|
+
|
|
140
|
+
if (position == null) return
|
|
141
|
+
|
|
142
|
+
await moveOutOfWay({record, positionColumn, scope})
|
|
143
|
+
setShiftingFlag(record, false)
|
|
144
|
+
|
|
145
|
+
await shiftPositionsDown({record, positionColumn, scope, fromPosition: position + 1})
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Bumps positions UP by 1 in the range [fromPosition, toPosition) within the
|
|
151
|
+
* same scope. Updates in descending order to avoid intermediate UNIQUE
|
|
152
|
+
* constraint violations.
|
|
153
|
+
* @param {object} args - Arguments.
|
|
154
|
+
* @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
|
|
155
|
+
* @param {string} args.positionColumn - camelCase position attribute name.
|
|
156
|
+
* @param {string} args.scope - camelCase scope attribute name.
|
|
157
|
+
* @param {number} args.fromPosition - Starting position (inclusive).
|
|
158
|
+
* @param {number} [args.toPosition] - Ending position (exclusive).
|
|
159
|
+
* @param {string | number} [args.scopeValue] - Explicit scope value.
|
|
160
|
+
* @returns {Promise<void>}
|
|
161
|
+
*/
|
|
162
|
+
async function shiftPositionsUp({record, positionColumn, scope, fromPosition, toPosition, scopeValue}) {
|
|
163
|
+
const modelClass = /**
|
|
164
|
+
* Narrows the runtime value to the documented type.
|
|
165
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
166
|
+
const connection = modelClass.connection()
|
|
167
|
+
const tableName = modelClass._getTable().getName()
|
|
168
|
+
const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
|
|
169
|
+
const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
|
|
170
|
+
|
|
171
|
+
if (resolvedScopeValue == null) return
|
|
172
|
+
|
|
173
|
+
const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
|
|
174
|
+
const positionColumnSql = connection.quoteColumn(positionColumnName)
|
|
175
|
+
const scopeColumnSql = connection.quoteColumn(scopeColumnName)
|
|
176
|
+
const tableSql = connection.quoteTable(tableName)
|
|
177
|
+
const quotedScope = connection.quote(resolvedScopeValue)
|
|
178
|
+
|
|
179
|
+
// Load rows in descending order so we bump the highest first
|
|
180
|
+
let query = modelClass
|
|
181
|
+
.select(positionColumn)
|
|
182
|
+
.where({[scopeColumnName]: resolvedScopeValue})
|
|
183
|
+
.where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
|
|
184
|
+
.order(`${positionColumnSql} DESC`)
|
|
185
|
+
|
|
186
|
+
if (toPosition != null) {
|
|
187
|
+
query = query.where(`${positionColumnSql} < ${connection.quote(toPosition)}`)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const rows = await query.toArray()
|
|
191
|
+
|
|
192
|
+
setShiftingFlag(record, true)
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
for (const row of rows) {
|
|
196
|
+
const currentPos = Number(row.readAttribute(positionColumn))
|
|
197
|
+
|
|
198
|
+
await connection.query(
|
|
199
|
+
`UPDATE ${tableSql} SET ${positionColumnSql} = ${positionColumnSql} + 1 WHERE ${scopeColumnSql} = ${quotedScope} AND ${positionColumnSql} = ${connection.quote(currentPos)}`
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
} finally {
|
|
203
|
+
setShiftingFlag(record, false)
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Bumps positions DOWN by 1 in the range [fromPosition, toPosition) within
|
|
209
|
+
* the same scope. Updates in ascending order to avoid intermediate UNIQUE
|
|
210
|
+
* constraint violations.
|
|
211
|
+
* @param {object} args - Arguments.
|
|
212
|
+
* @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
|
|
213
|
+
* @param {string} args.positionColumn - camelCase position attribute name.
|
|
214
|
+
* @param {string} args.scope - camelCase scope attribute name.
|
|
215
|
+
* @param {number} args.fromPosition - Starting position (inclusive).
|
|
216
|
+
* @param {number} [args.toPosition] - Ending position (exclusive).
|
|
217
|
+
* @param {string | number} [args.scopeValue] - Explicit scope value.
|
|
218
|
+
* @returns {Promise<void>}
|
|
219
|
+
*/
|
|
220
|
+
async function shiftPositionsDown({record, positionColumn, scope, fromPosition, toPosition, scopeValue}) {
|
|
221
|
+
const modelClass = /**
|
|
222
|
+
* Narrows the runtime value to the documented type.
|
|
223
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
224
|
+
const connection = modelClass.connection()
|
|
225
|
+
const tableName = modelClass._getTable().getName()
|
|
226
|
+
const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
|
|
227
|
+
const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
|
|
228
|
+
|
|
229
|
+
if (resolvedScopeValue == null) return
|
|
230
|
+
|
|
231
|
+
const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
|
|
232
|
+
const positionColumnSql = connection.quoteColumn(positionColumnName)
|
|
233
|
+
const scopeColumnSql = connection.quoteColumn(scopeColumnName)
|
|
234
|
+
const tableSql = connection.quoteTable(tableName)
|
|
235
|
+
const quotedScope = connection.quote(resolvedScopeValue)
|
|
236
|
+
|
|
237
|
+
// Load rows in ascending order so we shift the lowest gap first
|
|
238
|
+
let query = modelClass
|
|
239
|
+
.select(positionColumn)
|
|
240
|
+
.where({[scopeColumnName]: resolvedScopeValue})
|
|
241
|
+
.where(`${positionColumnSql} >= ${connection.quote(fromPosition)}`)
|
|
242
|
+
.order({column: positionColumnName, direction: "ASC"})
|
|
243
|
+
|
|
244
|
+
if (toPosition != null) {
|
|
245
|
+
query = query.where(`${positionColumnSql} < ${connection.quote(toPosition)}`)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const rows = await query.toArray()
|
|
249
|
+
|
|
250
|
+
setShiftingFlag(record, true)
|
|
251
|
+
|
|
252
|
+
try {
|
|
253
|
+
for (const row of rows) {
|
|
254
|
+
const currentPos = Number(row.readAttribute(positionColumn))
|
|
255
|
+
|
|
256
|
+
await connection.query(
|
|
257
|
+
`UPDATE ${tableSql} SET ${positionColumnSql} = ${positionColumnSql} - 1 WHERE ${scopeColumnSql} = ${quotedScope} AND ${positionColumnSql} = ${connection.quote(currentPos)}`
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
} finally {
|
|
261
|
+
setShiftingFlag(record, false)
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Returns the highest current position value in the record's scope.
|
|
267
|
+
* @param {object} args - Arguments.
|
|
268
|
+
* @param {import("./index.js").default} args.record - The model instance whose scope is the source of truth.
|
|
269
|
+
* @param {string} args.positionColumn - camelCase position attribute name.
|
|
270
|
+
* @param {string} args.scope - camelCase scope attribute name.
|
|
271
|
+
* @param {string | number} [args.scopeValue] - Explicit scope value.
|
|
272
|
+
* @returns {Promise<number>} - Highest position in scope, or 0 when scope is empty.
|
|
273
|
+
*/
|
|
274
|
+
async function highestPositionInScope({record, positionColumn, scope, scopeValue}) {
|
|
275
|
+
const modelClass = /**
|
|
276
|
+
* Narrows the runtime value to the documented type.
|
|
277
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
278
|
+
const connection = modelClass.connection()
|
|
279
|
+
const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
|
|
280
|
+
const positionColumnName = modelClass.getColumnNameForAttributeName(positionColumn)
|
|
281
|
+
const positionColumnSql = connection.quoteColumn(positionColumnName)
|
|
282
|
+
const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
|
|
283
|
+
|
|
284
|
+
if (resolvedScopeValue == null) return 0
|
|
285
|
+
|
|
286
|
+
const rows = await modelClass
|
|
287
|
+
.select(positionColumn)
|
|
288
|
+
.where({[scopeColumnName]: resolvedScopeValue})
|
|
289
|
+
.order(`${positionColumnSql} DESC`)
|
|
290
|
+
.limit(1)
|
|
291
|
+
.toArray()
|
|
292
|
+
|
|
293
|
+
if (rows.length === 0) return 0
|
|
294
|
+
|
|
295
|
+
return Number(rows[0].readAttribute(positionColumn)) || 0
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Resolves a scope value from the attribute store first, then falls back
|
|
300
|
+
* to the loaded belongsTo relationship. This is needed during beforeCreate
|
|
301
|
+
* because the FK attribute may not be set until _createNewRecord flushes
|
|
302
|
+
* _belongsToChanges.
|
|
303
|
+
* @param {import("./index.js").default} record - Model instance.
|
|
304
|
+
* @param {string} scope - camelCase scope attribute name (e.g. "projectId").
|
|
305
|
+
* @returns {string | number | null}
|
|
306
|
+
*/
|
|
307
|
+
function resolveScopeValue(record, scope) {
|
|
308
|
+
const attrValue = record.readAttribute(scope)
|
|
309
|
+
|
|
310
|
+
if (attrValue != null) return /** Narrows the runtime value to the documented type. @type {string | number} */ (attrValue)
|
|
311
|
+
|
|
312
|
+
const modelClass = /**
|
|
313
|
+
* Narrows the runtime value to the documented type.
|
|
314
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
315
|
+
const relationships = modelClass.getRelationshipsMap()
|
|
316
|
+
const scopeColumnName = modelClass.getColumnNameForAttributeName(scope)
|
|
317
|
+
|
|
318
|
+
for (const relationshipName in relationships) {
|
|
319
|
+
const relationship = relationships[relationshipName]
|
|
320
|
+
|
|
321
|
+
if (relationship.getType?.() !== "belongsTo") continue
|
|
322
|
+
|
|
323
|
+
const foreignKey = relationship.getForeignKey()
|
|
324
|
+
|
|
325
|
+
if (foreignKey !== scopeColumnName) continue
|
|
326
|
+
|
|
327
|
+
const instanceRelationship = record.getRelationshipByName(relationshipName)
|
|
328
|
+
const loaded = instanceRelationship.loaded()
|
|
329
|
+
|
|
330
|
+
if (loaded && !Array.isArray(loaded) && typeof loaded.id === "function") {
|
|
331
|
+
return loaded.id()
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return null
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Moves the record to a temporary position outside the normal range so
|
|
340
|
+
* that surrounding position shifts do not hit unique constraint violations.
|
|
341
|
+
* @param {object} args - Arguments.
|
|
342
|
+
* @param {import("./index.js").default} args.record - Model instance.
|
|
343
|
+
* @param {string} args.positionColumn - camelCase position attribute.
|
|
344
|
+
* @param {string} args.scope - camelCase scope attribute.
|
|
345
|
+
* @param {string | number | null} [args.scopeValue] - Explicit scope value (defaults to resolveScopeValue).
|
|
346
|
+
* @returns {Promise<void>}
|
|
347
|
+
*/
|
|
348
|
+
async function moveOutOfWay({record, positionColumn, scope, scopeValue}) {
|
|
349
|
+
const modelClass = /**
|
|
350
|
+
* Narrows the runtime value to the documented type.
|
|
351
|
+
@type {typeof import("./index.js").default} */ (record.constructor)
|
|
352
|
+
const connection = modelClass.connection()
|
|
353
|
+
const tableName = modelClass._getTable().getName()
|
|
354
|
+
const resolvedScopeValue = scopeValue != null ? scopeValue : resolveScopeValue(record, scope)
|
|
355
|
+
|
|
356
|
+
if (resolvedScopeValue == null) return
|
|
357
|
+
|
|
358
|
+
const highest = await highestPositionInScope({record, positionColumn, scope, scopeValue: resolvedScopeValue})
|
|
359
|
+
const tempPosition = highest + 10000
|
|
360
|
+
const positionColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(positionColumn))
|
|
361
|
+
const scopeColumnSql = connection.quoteColumn(modelClass.getColumnNameForAttributeName(scope))
|
|
362
|
+
const tableSql = connection.quoteTable(tableName)
|
|
363
|
+
const pkSql = connection.quoteColumn("id")
|
|
364
|
+
|
|
365
|
+
setShiftingFlag(record, true)
|
|
366
|
+
|
|
367
|
+
try {
|
|
368
|
+
await connection.query(
|
|
369
|
+
`UPDATE ${tableSql} SET ${positionColumnSql} = ${connection.quote(tempPosition)} WHERE ${scopeColumnSql} = ${connection.quote(resolvedScopeValue)} AND ${pkSql} = ${connection.quote(record.id())}`
|
|
370
|
+
)
|
|
371
|
+
} finally {
|
|
372
|
+
// Don't clear the flag here — the caller will do that after shifts
|
|
373
|
+
}
|
|
374
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** Downloaded attachment payload wrapper. */
|
|
4
|
+
export default class RecordAttachmentDownload {
|
|
5
|
+
/**
|
|
6
|
+
* Runs constructor.
|
|
7
|
+
* @param {object} args - Options.
|
|
8
|
+
* @param {string} args.id - Attachment id.
|
|
9
|
+
* @param {string} args.filename - Filename.
|
|
10
|
+
* @param {string | null} args.contentType - Content type.
|
|
11
|
+
* @param {number} args.byteSize - File size in bytes.
|
|
12
|
+
* @param {Buffer} args.content - File content.
|
|
13
|
+
* @param {string | null} [args.url] - Resolvable URL.
|
|
14
|
+
*/
|
|
15
|
+
constructor({byteSize, content, contentType, filename, id, url = null}) {
|
|
16
|
+
this.values = {byteSize, content, contentType, filename, id, url}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Runs byte size.
|
|
21
|
+
* @returns {number} - File size in bytes.
|
|
22
|
+
*/
|
|
23
|
+
byteSize() { return this.values.byteSize }
|
|
24
|
+
/**
|
|
25
|
+
* Runs content.
|
|
26
|
+
* @returns {Buffer} - File content.
|
|
27
|
+
*/
|
|
28
|
+
content() { return this.values.content }
|
|
29
|
+
/**
|
|
30
|
+
* Runs content type.
|
|
31
|
+
* @returns {string | null} - Content type.
|
|
32
|
+
*/
|
|
33
|
+
contentType() { return this.values.contentType }
|
|
34
|
+
/**
|
|
35
|
+
* Runs filename.
|
|
36
|
+
* @returns {string} - Filename.
|
|
37
|
+
*/
|
|
38
|
+
filename() { return this.values.filename }
|
|
39
|
+
/**
|
|
40
|
+
* Runs id.
|
|
41
|
+
* @returns {string} - Attachment id.
|
|
42
|
+
*/
|
|
43
|
+
id() { return this.values.id }
|
|
44
|
+
/**
|
|
45
|
+
* Runs url.
|
|
46
|
+
* @returns {string | null} - Resolvable attachment URL.
|
|
47
|
+
*/
|
|
48
|
+
url() { return this.values.url }
|
|
49
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import RecordAttachmentDownload from "./download.js"
|
|
4
|
+
import {recordAttachmentsStoreForModel} from "./store.js"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Runs download from row.
|
|
8
|
+
* @param {object} args - Options.
|
|
9
|
+
* @param {Record<string, ?>} args.row - Raw row.
|
|
10
|
+
* @param {Buffer} args.content - Attachment bytes.
|
|
11
|
+
* @param {string | null} args.url - Attachment URL.
|
|
12
|
+
* @returns {RecordAttachmentDownload} - Download payload.
|
|
13
|
+
*/
|
|
14
|
+
function downloadFromRow({content, row, url}) {
|
|
15
|
+
const byteSize = Number(row.byte_size)
|
|
16
|
+
|
|
17
|
+
return new RecordAttachmentDownload({
|
|
18
|
+
byteSize: Number.isFinite(byteSize) ? byteSize : content.length,
|
|
19
|
+
content,
|
|
20
|
+
contentType: row.content_type || null,
|
|
21
|
+
filename: row.filename || "attachment.bin",
|
|
22
|
+
id: row.id,
|
|
23
|
+
url
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Runs is array.
|
|
29
|
+
* @param {?} value - Candidate value.
|
|
30
|
+
* @returns {value is Array<?>} - Whether value is an array.
|
|
31
|
+
*/
|
|
32
|
+
function isArray(value) {
|
|
33
|
+
return Array.isArray(value)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Attachment helper bound to one model + attachment name.
|
|
38
|
+
*/
|
|
39
|
+
export default class RecordAttachmentHandle {
|
|
40
|
+
/**
|
|
41
|
+
* Pending inputs.
|
|
42
|
+
@type {Array<?>} */
|
|
43
|
+
pendingInputs = []
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Runs constructor.
|
|
47
|
+
* @param {object} args - Options.
|
|
48
|
+
* @param {import("../index.js").default} args.model - Model instance.
|
|
49
|
+
* @param {string} args.name - Attachment name.
|
|
50
|
+
* @param {"hasOne" | "hasMany"} args.type - Attachment type.
|
|
51
|
+
*/
|
|
52
|
+
constructor({model, name, type}) {
|
|
53
|
+
this.model = model
|
|
54
|
+
this.name = name
|
|
55
|
+
this.type = type
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Runs has pending attachments.
|
|
60
|
+
* @returns {boolean} - Whether there are pending attachment writes.
|
|
61
|
+
*/
|
|
62
|
+
hasPendingAttachments() {
|
|
63
|
+
return this.pendingInputs.length > 0
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Runs queue attach.
|
|
68
|
+
* @param {?} input - Attachment input.
|
|
69
|
+
* @returns {void} - Queues attachment write for next save.
|
|
70
|
+
*/
|
|
71
|
+
queueAttach(input) {
|
|
72
|
+
if (this.type === "hasOne") {
|
|
73
|
+
if (isArray(input)) {
|
|
74
|
+
const lastInput = input[input.length - 1]
|
|
75
|
+
|
|
76
|
+
this.pendingInputs = typeof lastInput === "undefined" ? [] : [lastInput]
|
|
77
|
+
} else {
|
|
78
|
+
this.pendingInputs = [input]
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (isArray(input)) {
|
|
85
|
+
for (const inputEntry of input) {
|
|
86
|
+
this.pendingInputs.push(inputEntry)
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
this.pendingInputs.push(input)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Runs attach.
|
|
95
|
+
* @param {?} input - Attachment input.
|
|
96
|
+
* @returns {Promise<void>} - Resolves when attached.
|
|
97
|
+
*/
|
|
98
|
+
async attach(input) {
|
|
99
|
+
this.queueAttach(input)
|
|
100
|
+
await this.flushPendingAttachments()
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Runs flush pending attachments.
|
|
105
|
+
* @returns {Promise<void>} - Resolves when pending attachments are flushed.
|
|
106
|
+
*/
|
|
107
|
+
async flushPendingAttachments() {
|
|
108
|
+
if (!this.model.isPersisted()) return
|
|
109
|
+
if (this.pendingInputs.length < 1) return
|
|
110
|
+
|
|
111
|
+
const store = recordAttachmentsStoreForModel(this.model)
|
|
112
|
+
const pendingInputs = this.pendingInputs
|
|
113
|
+
|
|
114
|
+
this.pendingInputs = []
|
|
115
|
+
|
|
116
|
+
for (const [index, input] of pendingInputs.entries()) {
|
|
117
|
+
await store.attach({
|
|
118
|
+
input,
|
|
119
|
+
model: this.model,
|
|
120
|
+
name: this.name,
|
|
121
|
+
replace: this.type === "hasOne" && index === 0
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Runs download.
|
|
128
|
+
* @param {string} [id] - Optional attachment id for has-many attachments.
|
|
129
|
+
* @returns {Promise<RecordAttachmentDownload | null>} - Downloaded attachment.
|
|
130
|
+
*/
|
|
131
|
+
async download(id) {
|
|
132
|
+
if (!this.model.isPersisted()) return null
|
|
133
|
+
|
|
134
|
+
const store = recordAttachmentsStoreForModel(this.model)
|
|
135
|
+
const row = await store.findOne({id, model: this.model, name: this.name})
|
|
136
|
+
|
|
137
|
+
if (!row) return null
|
|
138
|
+
|
|
139
|
+
const [content, url] = await Promise.all([
|
|
140
|
+
store.readAttachmentRow({model: this.model, name: this.name, row}),
|
|
141
|
+
store.attachmentRowUrl({model: this.model, name: this.name, row})
|
|
142
|
+
])
|
|
143
|
+
|
|
144
|
+
return downloadFromRow({content, row, url})
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Runs download all.
|
|
149
|
+
* @returns {Promise<Array<RecordAttachmentDownload>>} - Downloaded attachments.
|
|
150
|
+
*/
|
|
151
|
+
async downloadAll() {
|
|
152
|
+
if (!this.model.isPersisted()) return []
|
|
153
|
+
|
|
154
|
+
const store = recordAttachmentsStoreForModel(this.model)
|
|
155
|
+
const rows = await store.findMany({model: this.model, name: this.name})
|
|
156
|
+
/**
|
|
157
|
+
* Downloads.
|
|
158
|
+
@type {RecordAttachmentDownload[]} */
|
|
159
|
+
const downloads = []
|
|
160
|
+
|
|
161
|
+
for (const row of rows) {
|
|
162
|
+
const [content, url] = await Promise.all([
|
|
163
|
+
store.readAttachmentRow({model: this.model, name: this.name, row}),
|
|
164
|
+
store.attachmentRowUrl({model: this.model, name: this.name, row})
|
|
165
|
+
])
|
|
166
|
+
|
|
167
|
+
downloads.push(downloadFromRow({content, row, url}))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return downloads
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Runs url.
|
|
175
|
+
* @param {string} [id] - Optional attachment id for has-many attachments.
|
|
176
|
+
* @returns {Promise<string | null>} - Resolvable attachment URL.
|
|
177
|
+
*/
|
|
178
|
+
async url(id) {
|
|
179
|
+
if (!this.model.isPersisted()) return null
|
|
180
|
+
|
|
181
|
+
const store = recordAttachmentsStoreForModel(this.model)
|
|
182
|
+
const row = await store.findOne({id, model: this.model, name: this.name})
|
|
183
|
+
|
|
184
|
+
if (!row) return null
|
|
185
|
+
|
|
186
|
+
return await store.attachmentRowUrl({model: this.model, name: this.name, row})
|
|
187
|
+
}
|
|
188
|
+
}
|