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,74 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseColumn from "../base-column.js"
|
|
4
|
+
import ColumnsIndex from "./columns-index.js"
|
|
5
|
+
import {digg} from "diggerize"
|
|
6
|
+
|
|
7
|
+
export default class VelociousDatabaseDriversMssqlColumn extends BaseColumn {
|
|
8
|
+
/**
|
|
9
|
+
* Runs constructor.
|
|
10
|
+
* @param {import("../base-table.js").default} table - Table.
|
|
11
|
+
* @param {Record<string, ?>} data - Data payload.
|
|
12
|
+
*/
|
|
13
|
+
constructor(table, data) {
|
|
14
|
+
super()
|
|
15
|
+
this.data = data
|
|
16
|
+
this.table = table
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
getAutoIncrement() { return digg(this, "data", "isIdentity") === 1 }
|
|
20
|
+
|
|
21
|
+
async getIndexes() {
|
|
22
|
+
const options = this.getOptions()
|
|
23
|
+
const sql = `
|
|
24
|
+
SELECT
|
|
25
|
+
sys.tables.name AS TableName,
|
|
26
|
+
sys.columns.name AS ColumnName,
|
|
27
|
+
sys.indexes.name AS index_name,
|
|
28
|
+
sys.indexes.type_desc AS IndexType,
|
|
29
|
+
sys.index_columns.is_included_column AS IsIncludedColumn,
|
|
30
|
+
sys.indexes.is_unique,
|
|
31
|
+
sys.indexes.is_primary_key,
|
|
32
|
+
sys.indexes.is_unique_constraint
|
|
33
|
+
FROM sys.indexes
|
|
34
|
+
INNER JOIN sys.index_columns ON sys.indexes.object_id = sys.index_columns.object_id AND sys.indexes.index_id = sys.index_columns.index_id
|
|
35
|
+
INNER JOIN sys.columns ON sys.index_columns.object_id = sys.columns.object_id AND sys.index_columns.column_id = sys.columns.column_id
|
|
36
|
+
INNER JOIN sys.tables ON sys.indexes.object_id = sys.tables.object_id
|
|
37
|
+
WHERE
|
|
38
|
+
sys.tables.name = ${options.quote(this.getTable().getName())} AND
|
|
39
|
+
sys.columns.name = ${options.quote(this.getName())}
|
|
40
|
+
ORDER BY
|
|
41
|
+
sys.indexes.name,
|
|
42
|
+
sys.index_columns.key_ordinal
|
|
43
|
+
`
|
|
44
|
+
|
|
45
|
+
const rows = await this.getDriver().query(sql)
|
|
46
|
+
const indexes = []
|
|
47
|
+
|
|
48
|
+
for (const row of rows) {
|
|
49
|
+
const index = new ColumnsIndex(this.getTable(), row)
|
|
50
|
+
|
|
51
|
+
indexes.push(index)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return indexes
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
getDefault() { return digg(this, "data", "COLUMN_DEFAULT") }
|
|
58
|
+
getMaxLength() { return digg(this, "data", "CHARACTER_MAXIMUM_LENGTH") }
|
|
59
|
+
getName() { return digg(this, "data", "COLUMN_NAME") }
|
|
60
|
+
|
|
61
|
+
getNull() {
|
|
62
|
+
const nullValue = digg(this, "data", "IS_NULLABLE")
|
|
63
|
+
|
|
64
|
+
if (nullValue == "NO") {
|
|
65
|
+
return false
|
|
66
|
+
} else {
|
|
67
|
+
return true
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
getPrimaryKey() { return digg(this, "data", "isIdentity") === 1 }
|
|
72
|
+
getType() { return digg(this, "data", "DATA_TYPE") }
|
|
73
|
+
}
|
|
74
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connect a MSSQL connection instance.
|
|
3
|
+
* @param {import("mssql").Connection} connection - MSSQL connection instance.
|
|
4
|
+
* @returns {Promise<void>} - Resolves when the connection is established.
|
|
5
|
+
*/
|
|
6
|
+
export default function connectConnection(connection) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
connection.connect((error) => {
|
|
9
|
+
if (error) {
|
|
10
|
+
reject(error)
|
|
11
|
+
} else {
|
|
12
|
+
resolve()
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
})
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BaseForeignKey from "../base-foreign-key.js"
|
|
4
|
+
import {digg} from "diggerize"
|
|
5
|
+
|
|
6
|
+
export default class VelociousDatabaseDriversMssqlForeignKey extends BaseForeignKey {
|
|
7
|
+
getColumnName() { return digg(this, "data", "ParentColumn") }
|
|
8
|
+
getName() { return digg(this, "data", "CONSTRAINT_NAME") }
|
|
9
|
+
getTableName() { return digg(this, "data", "TableName") }
|
|
10
|
+
getReferencedColumnName() { return digg(this, "data", "ReferencedColumn") }
|
|
11
|
+
getReferencedTableName() { return digg(this, "data", "ReferencedTable") }
|
|
12
|
+
}
|
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import AlterTable from "./sql/alter-table.js"
|
|
4
|
+
import Base from "../base.js"
|
|
5
|
+
import CreateDatabase from "./sql/create-database.js"
|
|
6
|
+
import CreateIndex from "./sql/create-index.js"
|
|
7
|
+
import CreateTable from "./sql/create-table.js"
|
|
8
|
+
import Delete from "./sql/delete.js"
|
|
9
|
+
import DropDatabase from "./sql/drop-database.js"
|
|
10
|
+
import DropTable from "./sql/drop-table.js"
|
|
11
|
+
import {digg} from "diggerize"
|
|
12
|
+
import escapeString from "sql-escape-string"
|
|
13
|
+
import Insert from "./sql/insert.js"
|
|
14
|
+
import Options from "./options.js"
|
|
15
|
+
import mssql from "mssql"
|
|
16
|
+
import net from "node:net"
|
|
17
|
+
import QueryParser from "./query-parser.js"
|
|
18
|
+
import Table from "./table.js"
|
|
19
|
+
import StructureSql from "./structure-sql.js"
|
|
20
|
+
import timeout from "awaitery/build/timeout.js"
|
|
21
|
+
import Upsert from "./sql/upsert.js"
|
|
22
|
+
import Update from "./sql/update.js"
|
|
23
|
+
import UUID from "pure-uuid"
|
|
24
|
+
|
|
25
|
+
export default class VelociousDatabaseDriversMssql extends Base{
|
|
26
|
+
async connect() {
|
|
27
|
+
const args = this.getArgs()
|
|
28
|
+
const sqlConfig = digg(args, "sqlConfig")
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
if (this.connection) await this.close()
|
|
32
|
+
|
|
33
|
+
if (sqlConfig?.server && !sqlConfig.options?.serverName && net.isIP(sqlConfig.server)) {
|
|
34
|
+
sqlConfig.options = Object.assign({}, sqlConfig.options, {serverName: ""})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
this.connection = new mssql.ConnectionPool(sqlConfig)
|
|
38
|
+
await this.connection.connect()
|
|
39
|
+
} catch (error) {
|
|
40
|
+
// Re-throw to fix unuseable stack trace.
|
|
41
|
+
throw new Error(`Couldn't connect to database: ${error instanceof Error ? error.message : error}`, {cause: error})
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async close() {
|
|
46
|
+
if (!this.connection) return
|
|
47
|
+
|
|
48
|
+
const connection = this.connection
|
|
49
|
+
this.connection = undefined
|
|
50
|
+
this._currentTransaction = null
|
|
51
|
+
this._transactionsCount = 0
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
await timeout({timeout: 2000}, () => connection.close())
|
|
55
|
+
} catch (error) {
|
|
56
|
+
this.logger.warn("Failed to close MSSQL connection cleanly", {error})
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Runs alter table sqls.
|
|
62
|
+
* @param {import("../../table-data/index.js").default} tableData - Table data.
|
|
63
|
+
* @returns {Promise<string[]>} - Resolves with SQL statements.
|
|
64
|
+
*/
|
|
65
|
+
async alterTableSQLs(tableData) {
|
|
66
|
+
const alterArgs = {tableData, driver: this}
|
|
67
|
+
const alterTable = new AlterTable(alterArgs)
|
|
68
|
+
|
|
69
|
+
return await alterTable.toSQLs()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Runs create database sql.
|
|
74
|
+
* @param {string} databaseName - Database name.
|
|
75
|
+
* @param {object} [args] - Options object.
|
|
76
|
+
* @param {boolean} [args.ifNotExists] - Whether if not exists.
|
|
77
|
+
* @returns {string[]} - SQL statements.
|
|
78
|
+
*/
|
|
79
|
+
createDatabaseSql(databaseName, args) {
|
|
80
|
+
const createArgs = Object.assign({databaseName, driver: this}, args)
|
|
81
|
+
const createDatabase = new CreateDatabase(createArgs)
|
|
82
|
+
|
|
83
|
+
return createDatabase.toSql()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Runs drop database sql.
|
|
88
|
+
* @param {string} databaseName - Database name.
|
|
89
|
+
* @param {object} [args] - Options object.
|
|
90
|
+
* @param {boolean} [args.ifExists] - Whether if exists.
|
|
91
|
+
* @returns {string[]} - SQL statements.
|
|
92
|
+
*/
|
|
93
|
+
dropDatabaseSql(databaseName, args) {
|
|
94
|
+
const dropArgs = Object.assign({databaseName, driver: this}, args)
|
|
95
|
+
const dropDatabase = new DropDatabase(dropArgs)
|
|
96
|
+
|
|
97
|
+
return dropDatabase.toSql()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Runs create index sqls.
|
|
102
|
+
* @param {import("../base.js").CreateIndexSqlArgs} indexData - Index data.
|
|
103
|
+
* @returns {Promise<string[]>} - Resolves with SQL statements.
|
|
104
|
+
*/
|
|
105
|
+
async createIndexSQLs(indexData) {
|
|
106
|
+
const createArgs = Object.assign({driver: this}, indexData)
|
|
107
|
+
const createIndex = new CreateIndex(createArgs)
|
|
108
|
+
|
|
109
|
+
return await createIndex.toSQLs()
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Runs create table sql.
|
|
114
|
+
* @param {import("../../table-data/index.js").default} tableData - Table data.
|
|
115
|
+
* @returns {Promise<string[]>} - Resolves with SQL statements.
|
|
116
|
+
*/
|
|
117
|
+
async createTableSql(tableData) {
|
|
118
|
+
const createArgs = {tableData, driver: this, indexInCreateTable: false}
|
|
119
|
+
const createTable = new CreateTable(createArgs)
|
|
120
|
+
|
|
121
|
+
return await createTable.toSql()
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Runs current database.
|
|
126
|
+
* @returns {Promise<string>} - Resolves with the current database.
|
|
127
|
+
*/
|
|
128
|
+
async currentDatabase() {
|
|
129
|
+
const rows = await this.query("SELECT DB_NAME() AS db_name")
|
|
130
|
+
|
|
131
|
+
return digg(rows, 0, "db_name")
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async disableForeignKeys() {
|
|
135
|
+
await this.query("EXEC sp_MSforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT all\"")
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async enableForeignKeys() {
|
|
139
|
+
await this.query("EXEC sp_MSforeachtable @command1=\"print '?'\", @command2=\"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all\"")
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Runs drop table sqls.
|
|
144
|
+
* @param {string} tableName - Table name.
|
|
145
|
+
* @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
|
|
146
|
+
* @returns {Promise<string[]>} - Resolves with SQL statements.
|
|
147
|
+
*/
|
|
148
|
+
async dropTableSQLs(tableName, args = {}) {
|
|
149
|
+
const dropArgs = Object.assign({tableName, driver: this}, args)
|
|
150
|
+
const dropTable = new DropTable(dropArgs)
|
|
151
|
+
|
|
152
|
+
return await dropTable.toSQLs()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Drops the foreign key constraints that reference the given table. MSSQL
|
|
157
|
+
* refuses to drop a table that is still referenced by a FOREIGN KEY
|
|
158
|
+
* constraint even when constraints are disabled via NOCHECK, so the
|
|
159
|
+
* referencing constraints must be removed before the table can be dropped.
|
|
160
|
+
* This lets callers drop tables in any order (e.g. wiping a whole schema)
|
|
161
|
+
* without first dropping every dependent table.
|
|
162
|
+
* @param {string} tableName - Table name.
|
|
163
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
164
|
+
*/
|
|
165
|
+
async _dropReferencingForeignKeys(tableName) {
|
|
166
|
+
const rows = await this.query(
|
|
167
|
+
"SELECT fk.name AS constraint_name, OBJECT_NAME(fk.parent_object_id) AS parent_table " +
|
|
168
|
+
`FROM sys.foreign_keys fk WHERE fk.referenced_object_id = OBJECT_ID(${this.quote(tableName)})`
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
for (const row of rows) {
|
|
172
|
+
const constraintName = row.constraint_name ?? row.CONSTRAINT_NAME
|
|
173
|
+
const parentTable = row.parent_table ?? row.PARENT_TABLE
|
|
174
|
+
|
|
175
|
+
await this.query(`ALTER TABLE [${parentTable}] DROP CONSTRAINT [${constraintName}]`)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Runs drop table.
|
|
181
|
+
* @param {string} tableName - Table name.
|
|
182
|
+
* @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
|
|
183
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
184
|
+
*/
|
|
185
|
+
async dropTable(tableName, args = {}) {
|
|
186
|
+
this._assertNotReadOnly()
|
|
187
|
+
await this._dropReferencingForeignKeys(tableName)
|
|
188
|
+
|
|
189
|
+
const sqls = await this.dropTableSQLs(tableName, args)
|
|
190
|
+
|
|
191
|
+
for (const sql of sqls) {
|
|
192
|
+
await this.query(sql)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Runs get type.
|
|
198
|
+
* @returns {string} - The type.
|
|
199
|
+
*/
|
|
200
|
+
getType() { return "mssql" }
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Runs primary key type.
|
|
204
|
+
* @returns {string} - The primary key type.
|
|
205
|
+
*/
|
|
206
|
+
primaryKeyType() { return "bigint" }
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Runs query actual.
|
|
210
|
+
* @param {string} sql - SQL string.
|
|
211
|
+
* @returns {Promise<import("../base.js").QueryResultType>} - Resolves with the query actual.
|
|
212
|
+
*/
|
|
213
|
+
async _queryActual(sql) {
|
|
214
|
+
let result
|
|
215
|
+
let tries = 0
|
|
216
|
+
|
|
217
|
+
while (true) {
|
|
218
|
+
tries++
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
const request = this._currentTransaction
|
|
222
|
+
? new mssql.Request(this._currentTransaction)
|
|
223
|
+
: new mssql.Request(this.connection)
|
|
224
|
+
result = await request.query(sql)
|
|
225
|
+
break
|
|
226
|
+
} catch (error) {
|
|
227
|
+
if (error instanceof Error && error.message == "No connection is specified for that request." && tries <= 3) {
|
|
228
|
+
this.logger.warn("Reconnecting to database")
|
|
229
|
+
await this.reconnect()
|
|
230
|
+
// Retry
|
|
231
|
+
} else if (error instanceof Error) {
|
|
232
|
+
// Re-throw error because the stack-trace is broken and can't be used for app-development.
|
|
233
|
+
throw new Error(`Query failed '${error.message}': ${sql}`, {cause: error})
|
|
234
|
+
} else {
|
|
235
|
+
throw new Error(`Query failed '${error}': ${sql}`, {cause: error})
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return Array.isArray(result.recordsets) ? result.recordsets[0] || [] : []
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Runs query to sql.
|
|
245
|
+
* @param {import("../../query/index.js").default} query - Query instance.
|
|
246
|
+
* @returns {string} - SQL string.
|
|
247
|
+
*/
|
|
248
|
+
queryToSql(query) { return new QueryParser({query}).toSql() }
|
|
249
|
+
|
|
250
|
+
shouldSetAutoIncrementWhenPrimaryKey() { return true }
|
|
251
|
+
supportsDefaultPrimaryKeyUUID() { return true }
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Runs escape.
|
|
255
|
+
* @param {?} value - Value to use.
|
|
256
|
+
* @returns {string} - The escape.
|
|
257
|
+
*/
|
|
258
|
+
escape(value) {
|
|
259
|
+
value = this._convertValue(value)
|
|
260
|
+
const stringValue = typeof value == "string" ? value : `${value}`
|
|
261
|
+
|
|
262
|
+
const resultWithQuotes = escapeString(stringValue, null)
|
|
263
|
+
const result = resultWithQuotes.substring(1, resultWithQuotes.length - 1)
|
|
264
|
+
|
|
265
|
+
return result
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Runs quote.
|
|
270
|
+
* @param {?} value - Value to use.
|
|
271
|
+
* @returns {string | number} - The quoted value.
|
|
272
|
+
*/
|
|
273
|
+
quote(value) {
|
|
274
|
+
value = this._convertValue(value)
|
|
275
|
+
|
|
276
|
+
if (typeof value == "number") return value
|
|
277
|
+
const stringValue = typeof value == "string" ? value : String(value)
|
|
278
|
+
|
|
279
|
+
return `N${escapeString(stringValue, null)}`
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Runs quote column.
|
|
284
|
+
* @param {string} columnName - Column name.
|
|
285
|
+
* @returns {string} - The quote column.
|
|
286
|
+
*/
|
|
287
|
+
quoteColumn(columnName) { return this.options().quoteColumnName(columnName) }
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Runs quote table.
|
|
291
|
+
* @param {string} string - String.
|
|
292
|
+
* @returns {string} - The quote table.
|
|
293
|
+
*/
|
|
294
|
+
quoteTable(string) { return this.options().quoteTableName(string) }
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Runs rename column.
|
|
298
|
+
* @param {string} tableName - Table name.
|
|
299
|
+
* @param {string} oldColumnName - Previous column name.
|
|
300
|
+
* @param {string} newColumnName - New column name.
|
|
301
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
302
|
+
*/
|
|
303
|
+
async renameColumn(tableName, oldColumnName, newColumnName) {
|
|
304
|
+
await this.query(`EXEC sp_rename ${this.quote(`${tableName}.${oldColumnName}`)}, ${this.quote(newColumnName)}, 'COLUMN'`)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Runs delete sql.
|
|
309
|
+
* @param {import("../base.js").DeleteSqlArgsType} args - Options object.
|
|
310
|
+
* @returns {string} - SQL string.
|
|
311
|
+
*/
|
|
312
|
+
deleteSql({tableName, conditions}) {
|
|
313
|
+
const deleteInstruction = new Delete({conditions, driver: this, tableName})
|
|
314
|
+
|
|
315
|
+
return deleteInstruction.toSql()
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Runs insert sql.
|
|
320
|
+
* @abstract
|
|
321
|
+
* @param {import("../base.js").InsertSqlArgsType} args - Options object.
|
|
322
|
+
* @returns {string} - SQL string.
|
|
323
|
+
*/
|
|
324
|
+
insertSql(args) {
|
|
325
|
+
const insertArgs = Object.assign({driver: this}, args)
|
|
326
|
+
const insert = new Insert(insertArgs)
|
|
327
|
+
|
|
328
|
+
return insert.toSql()
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Runs get tables.
|
|
333
|
+
* @returns {Promise<Array<import("../base-table.js").default>>} - Resolves with the tables.
|
|
334
|
+
*/
|
|
335
|
+
async getTables() {
|
|
336
|
+
return await this._cachedSchemaMetadata("tables", async () => {
|
|
337
|
+
const schema = this.getArgs()?.schema || this.getArgs()?.sqlConfig?.options?.schema
|
|
338
|
+
const schemaClause = schema
|
|
339
|
+
? ` AND [TABLE_SCHEMA] = ${this.quote(schema)}`
|
|
340
|
+
: " AND [TABLE_SCHEMA] = SCHEMA_NAME()"
|
|
341
|
+
const result = await this.query(`SELECT [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_CATALOG] = DB_NAME()${schemaClause}`)
|
|
342
|
+
const tables = []
|
|
343
|
+
|
|
344
|
+
for (const row of result) {
|
|
345
|
+
const table = new Table(this, /**
|
|
346
|
+
* Narrows the runtime value to the documented type.
|
|
347
|
+
@type {Record<string, string>} */ (row))
|
|
348
|
+
|
|
349
|
+
tables.push(table)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return tables
|
|
353
|
+
})
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async lastInsertID() {
|
|
357
|
+
const result = await this.query("SELECT SCOPE_IDENTITY() AS last_insert_id")
|
|
358
|
+
const lastInsertID = digg(result, 0, "last_insert_id")
|
|
359
|
+
|
|
360
|
+
if (lastInsertID === null) throw new Error("Couldn't get the last inserted ID")
|
|
361
|
+
|
|
362
|
+
return lastInsertID
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Runs options.
|
|
367
|
+
* @returns {Options} - The options options.
|
|
368
|
+
*/
|
|
369
|
+
options() {
|
|
370
|
+
if (!this._options) this._options = new Options({driver: this})
|
|
371
|
+
|
|
372
|
+
return this._options
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
async _startTransactionAction() {
|
|
376
|
+
if (this._currentTransaction) throw new Error("A transaction is already running")
|
|
377
|
+
if (!this.connection) await this.connect()
|
|
378
|
+
|
|
379
|
+
this._currentTransaction = new mssql.Transaction(this.connection)
|
|
380
|
+
|
|
381
|
+
try {
|
|
382
|
+
await this._currentTransaction.begin()
|
|
383
|
+
} catch (error) {
|
|
384
|
+
this._currentTransaction = null
|
|
385
|
+
throw error
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async _commitTransactionAction() {
|
|
390
|
+
if (!this._currentTransaction) throw new Error("A transaction isn't running")
|
|
391
|
+
|
|
392
|
+
await this._currentTransaction.commit()
|
|
393
|
+
this._currentTransaction = null
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async _rollbackTransactionAction() {
|
|
397
|
+
if (!this._currentTransaction) {
|
|
398
|
+
this.logger.debug("A transaction isn't running - ignoring because that can happen if something else has failed in the db")
|
|
399
|
+
return
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
try {
|
|
403
|
+
await this._currentTransaction.rollback()
|
|
404
|
+
} catch (transactionRollbackError) {
|
|
405
|
+
// When SQL Server has already aborted the transaction (e.g., a
|
|
406
|
+
// stale concurrent request triggered XACT_ABORT), the
|
|
407
|
+
// mssql.Transaction.rollback() call fails because the
|
|
408
|
+
// Transaction object is dead. Issue a raw ROLLBACK on the
|
|
409
|
+
// underlying connection to clear SQL Server's session-level
|
|
410
|
+
// aborted-transaction state so the connection is usable for the
|
|
411
|
+
// next BEGIN TRANSACTION.
|
|
412
|
+
this.logger.warn("Transaction.rollback() failed, clearing session state with raw ROLLBACK", {
|
|
413
|
+
error: transactionRollbackError instanceof Error ? transactionRollbackError.message : transactionRollbackError
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
const request = new mssql.Request(this.connection)
|
|
417
|
+
|
|
418
|
+
await request.query("IF @@TRANCOUNT > 0 ROLLBACK")
|
|
419
|
+
} finally {
|
|
420
|
+
this._currentTransaction = null
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Runs start save point action.
|
|
426
|
+
* @param {string} savePointName - Save point name.
|
|
427
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
428
|
+
*/
|
|
429
|
+
async _startSavePointAction(savePointName) {
|
|
430
|
+
await this.query(`SAVE TRANSACTION [${savePointName}]`)
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Runs release save point action.
|
|
435
|
+
* @param {string} savePointName - Save point name.
|
|
436
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
437
|
+
*/
|
|
438
|
+
async _releaseSavePointAction(savePointName) { // eslint-disable-line no-unused-vars
|
|
439
|
+
// Do nothing in MS-SQL.
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Runs rollback save point action.
|
|
444
|
+
* @param {string} savePointName - Save point name.
|
|
445
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
446
|
+
*/
|
|
447
|
+
async _rollbackSavePointAction(savePointName) {
|
|
448
|
+
try {
|
|
449
|
+
await this.query(`ROLLBACK TRANSACTION [${savePointName}]`)
|
|
450
|
+
} catch (error) {
|
|
451
|
+
const message = error instanceof Error ? error.message : `${error}`
|
|
452
|
+
|
|
453
|
+
// When XACT_ABORT kills the entire transaction, the savepoint
|
|
454
|
+
// no longer exists and the ROLLBACK TRANSACTION [name] fails.
|
|
455
|
+
// Issue a raw IF @@TRANCOUNT > 0 ROLLBACK to clear whatever
|
|
456
|
+
// session state remains, then let the error propagate so the
|
|
457
|
+
// outer transaction() call knows the transaction is dead.
|
|
458
|
+
if (message.includes("Transaction has not begun") || message.includes("Transaction has been aborted")) {
|
|
459
|
+
this.logger.debug("Savepoint rollback failed; transaction already dead, clearing session state")
|
|
460
|
+
|
|
461
|
+
const request = new mssql.Request(this.connection)
|
|
462
|
+
|
|
463
|
+
await request.query("IF @@TRANCOUNT > 0 ROLLBACK")
|
|
464
|
+
|
|
465
|
+
return
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
throw error
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
generateSavePointName() {
|
|
473
|
+
return `sp${new UUID(4).format().replaceAll("-", "")}`.substring(0, 32)
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Runs update sql.
|
|
478
|
+
* @param {import("../base.js").UpdateSqlArgsType} args - Options object.
|
|
479
|
+
* @returns {string} - SQL string.
|
|
480
|
+
*/
|
|
481
|
+
updateSql({conditions, data, tableName}) {
|
|
482
|
+
const update = new Update({conditions, data, driver: this, tableName})
|
|
483
|
+
|
|
484
|
+
return update.toSql()
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Runs upsert sql.
|
|
489
|
+
* @param {import("../base.js").UpsertSqlArgsType} args - Options object.
|
|
490
|
+
* @returns {string} - SQL string.
|
|
491
|
+
*/
|
|
492
|
+
upsertSql(args) {
|
|
493
|
+
const upsert = new Upsert({...args, driver: this})
|
|
494
|
+
|
|
495
|
+
return upsert.toSql()
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Runs structure sql.
|
|
500
|
+
* @returns {Promise<string | null>} - Resolves with SQL string.
|
|
501
|
+
*/
|
|
502
|
+
async structureSql() {
|
|
503
|
+
return await this._cachedSchemaMetadata("structureSql", async () => await new StructureSql({driver: this}).toSql())
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Blocks until a SQL Server application lock is acquired on this
|
|
508
|
+
* connection via `sp_getapplock`. The Session lock owner scopes the lock
|
|
509
|
+
* to the current session, matching the connection-scoped semantics on
|
|
510
|
+
* MySQL and PostgreSQL.
|
|
511
|
+
*
|
|
512
|
+
* `sp_getapplock` returns 0 on immediate grant, 1 after waiting, and
|
|
513
|
+
* negative values on failure (timeout, deadlock, canceled, parameter
|
|
514
|
+
* error). We treat 0/1 as success and -1 (timeout) as a clean `false`;
|
|
515
|
+
* anything else throws.
|
|
516
|
+
* @param {string} name - Lock name.
|
|
517
|
+
* @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
|
|
518
|
+
* @returns {Promise<boolean>} - True if the lock was acquired, false if the timeout elapsed.
|
|
519
|
+
*/
|
|
520
|
+
async acquireAdvisoryLock(name, {timeoutMs} = {}) {
|
|
521
|
+
const timeoutValue = typeof timeoutMs === "number" && timeoutMs >= 0 ? Math.ceil(timeoutMs) : -1
|
|
522
|
+
const rows = await this.query(
|
|
523
|
+
`DECLARE @velocious_advisory_lock_result INT; EXEC @velocious_advisory_lock_result = sp_getapplock @Resource = ${this.quote(name)}, @LockMode = 'Exclusive', @LockOwner = 'Session', @LockTimeout = ${timeoutValue}; SELECT @velocious_advisory_lock_result AS velocious_advisory_lock_result`
|
|
524
|
+
)
|
|
525
|
+
const result = Number(rows?.[0]?.velocious_advisory_lock_result)
|
|
526
|
+
|
|
527
|
+
if (result === 0 || result === 1) return true
|
|
528
|
+
if (result === -1) return false
|
|
529
|
+
|
|
530
|
+
throw new Error(`sp_getapplock returned ${result} for advisory lock ${JSON.stringify(name)} (see SQL Server documentation for sp_getapplock return codes)`)
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Runs try acquire advisory lock.
|
|
535
|
+
* @param {string} name - Lock name.
|
|
536
|
+
* @returns {Promise<boolean>} - True if the lock was acquired, false if it was already held.
|
|
537
|
+
*/
|
|
538
|
+
async tryAcquireAdvisoryLock(name) {
|
|
539
|
+
return await this.acquireAdvisoryLock(name, {timeoutMs: 0})
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Runs release advisory lock.
|
|
544
|
+
* @param {string} name - Lock name.
|
|
545
|
+
* @returns {Promise<boolean>} - True if the lock was held by this session and has now been released.
|
|
546
|
+
*/
|
|
547
|
+
async releaseAdvisoryLock(name) {
|
|
548
|
+
const rows = await this.query(
|
|
549
|
+
`DECLARE @velocious_advisory_lock_result INT; EXEC @velocious_advisory_lock_result = sp_releaseapplock @Resource = ${this.quote(name)}, @LockOwner = 'Session'; SELECT @velocious_advisory_lock_result AS velocious_advisory_lock_result`
|
|
550
|
+
)
|
|
551
|
+
const result = Number(rows?.[0]?.velocious_advisory_lock_result)
|
|
552
|
+
|
|
553
|
+
return result === 0
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Returns true if any session currently holds the application lock.
|
|
558
|
+
*
|
|
559
|
+
* This combines two probes because neither is sufficient on its own:
|
|
560
|
+
* - `APPLOCK_MODE(..., 'Session')` only reports locks held by the
|
|
561
|
+
* **current** session, so it misses locks held by any other
|
|
562
|
+
* session and would return `NoLock` even under cross-session
|
|
563
|
+
* contention.
|
|
564
|
+
* - `APPLOCK_TEST(..., 'Exclusive', 'Session')` returns whether an
|
|
565
|
+
* Exclusive lock could be granted to *this* session right now. A
|
|
566
|
+
* return value of 0 means somebody else holds an incompatible
|
|
567
|
+
* lock; a value of 1 means it is either free **or** already held
|
|
568
|
+
* by us re-entrantly (which the `APPLOCK_MODE` check catches).
|
|
569
|
+
*
|
|
570
|
+
* The combined result is "held" iff we hold it ourselves or
|
|
571
|
+
* `APPLOCK_TEST` reports we cannot acquire it without waiting.
|
|
572
|
+
* @param {string} name - Lock name.
|
|
573
|
+
* @returns {Promise<boolean>} - True if any session currently holds the lock.
|
|
574
|
+
*/
|
|
575
|
+
async isAdvisoryLockHeld(name) {
|
|
576
|
+
const rows = await this.query(
|
|
577
|
+
`SELECT ` +
|
|
578
|
+
`APPLOCK_MODE('public', ${this.quote(name)}, 'Session') AS velocious_advisory_self_mode, ` +
|
|
579
|
+
`APPLOCK_TEST('public', ${this.quote(name)}, 'Exclusive', 'Session') AS velocious_advisory_test_result`
|
|
580
|
+
)
|
|
581
|
+
const selfMode = rows?.[0]?.velocious_advisory_self_mode
|
|
582
|
+
const heldBySelf = typeof selfMode === "string" && selfMode.length > 0 && selfMode !== "NoLock"
|
|
583
|
+
|
|
584
|
+
if (heldBySelf) return true
|
|
585
|
+
|
|
586
|
+
const testResult = Number(rows?.[0]?.velocious_advisory_test_result)
|
|
587
|
+
|
|
588
|
+
return testResult === 0
|
|
589
|
+
}
|
|
590
|
+
}
|