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,394 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {createHash} from "node:crypto"
|
|
4
|
+
import wait from "awaitery/build/wait.js"
|
|
5
|
+
import fs from "fs/promises"
|
|
6
|
+
import os from "node:os"
|
|
7
|
+
import path from "node:path"
|
|
8
|
+
import query from "./query.js"
|
|
9
|
+
import sqlite3 from "sqlite3"
|
|
10
|
+
import {open} from "sqlite"
|
|
11
|
+
|
|
12
|
+
import Base from "./base.js"
|
|
13
|
+
import fileExists from "../../../utils/file-exists.js"
|
|
14
|
+
|
|
15
|
+
export default class VelociousDatabaseDriversSqliteNode extends Base {
|
|
16
|
+
/**
|
|
17
|
+
* Connection.
|
|
18
|
+
@type {import("sqlite3").Database | undefined} */
|
|
19
|
+
connection = undefined
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Advisory lock directory.
|
|
23
|
+
@type {string | undefined} */
|
|
24
|
+
_advisoryLockDirectory = undefined
|
|
25
|
+
|
|
26
|
+
async connect() {
|
|
27
|
+
const args = this.getArgs()
|
|
28
|
+
const databaseDir = `${this.getConfiguration().getDirectory()}/db`
|
|
29
|
+
const databasePath = `${databaseDir}/${this.localStorageName()}.sqlite`
|
|
30
|
+
|
|
31
|
+
if (!await fileExists(databaseDir)) {
|
|
32
|
+
await fs.mkdir(databaseDir, {recursive: true})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (args.reset) {
|
|
36
|
+
await fs.unlink(databasePath)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
this._advisoryLockDirectory = path.join(databaseDir, `${this.localStorageName()}.velocious-advisory-locks`)
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
// @ts-expect-error
|
|
43
|
+
this.connection = /** Narrows the runtime value to the documented type. @type {import("sqlite3").Database} */ (await open({
|
|
44
|
+
filename: databasePath,
|
|
45
|
+
driver: sqlite3.Database
|
|
46
|
+
}))
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (error instanceof Error) {
|
|
49
|
+
throw new Error(`Couldn't open database ${databasePath} because of ${error.constructor.name}: ${error.message}`, {cause: error})
|
|
50
|
+
} else {
|
|
51
|
+
throw new Error(`Couldn't open database ${databasePath} because of ${typeof error}: ${error}`, {cause: error})
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
await this.registerVersion()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
localStorageName() {
|
|
59
|
+
const args = this.getArgs()
|
|
60
|
+
|
|
61
|
+
if (!args.name) throw new Error("No name given for SQLite Node")
|
|
62
|
+
|
|
63
|
+
return `VelociousDatabaseDriversSqlite---${args.name}`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async close() {
|
|
67
|
+
await this.connection?.close()
|
|
68
|
+
this.connection = undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Runs query actual.
|
|
73
|
+
* @param {string} sql - SQL string.
|
|
74
|
+
* @returns {Promise<Record<string, ?>[]>} - Resolves with the query actual.
|
|
75
|
+
*/
|
|
76
|
+
async _queryActual(sql) {
|
|
77
|
+
if (!this.connection) throw new Error("No connection")
|
|
78
|
+
|
|
79
|
+
return await query(this.connection, sql)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Layers a filesystem lock directory on top of the in-process waiter
|
|
84
|
+
* queue so SQLite deployments with multiple Node processes writing to
|
|
85
|
+
* the same database file see consistent advisory-lock mutual exclusion
|
|
86
|
+
* across processes, not just within a single process.
|
|
87
|
+
*
|
|
88
|
+
* The in-process queue from the shared SQLite base class is still used
|
|
89
|
+
* for the fast intra-process path (no polling, waiters wake each other
|
|
90
|
+
* through the `Set<string>` + waiter queue); the filesystem lock is
|
|
91
|
+
* only checked once the in-process queue has granted the caller, so
|
|
92
|
+
* typical single-process traffic pays at most two `fs.mkdir` calls
|
|
93
|
+
* (create and remove) per critical section.
|
|
94
|
+
* @param {string} name - Lock name.
|
|
95
|
+
* @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
|
|
96
|
+
* @returns {Promise<boolean>}
|
|
97
|
+
*/
|
|
98
|
+
async acquireAdvisoryLock(name, {timeoutMs} = {}) {
|
|
99
|
+
const deadline = typeof timeoutMs === "number" && timeoutMs >= 0 ? Date.now() + timeoutMs : null
|
|
100
|
+
const remainingForInProcess = deadline !== null ? Math.max(0, deadline - Date.now()) : null
|
|
101
|
+
const inProcessAcquired = await super.acquireAdvisoryLock(name, {timeoutMs: remainingForInProcess})
|
|
102
|
+
|
|
103
|
+
if (!inProcessAcquired) return false
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const remainingForFile = deadline !== null ? Math.max(0, deadline - Date.now()) : null
|
|
107
|
+
const fileAcquired = await this._acquireAdvisoryLockFile(name, {timeoutMs: remainingForFile})
|
|
108
|
+
|
|
109
|
+
if (!fileAcquired) {
|
|
110
|
+
await super.releaseAdvisoryLock(name)
|
|
111
|
+
return false
|
|
112
|
+
}
|
|
113
|
+
} catch (error) {
|
|
114
|
+
await super.releaseAdvisoryLock(name)
|
|
115
|
+
throw error
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return true
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Runs try acquire advisory lock.
|
|
123
|
+
* @param {string} name - Lock name.
|
|
124
|
+
* @returns {Promise<boolean>}
|
|
125
|
+
*/
|
|
126
|
+
async tryAcquireAdvisoryLock(name) {
|
|
127
|
+
const inProcessAcquired = await super.tryAcquireAdvisoryLock(name)
|
|
128
|
+
|
|
129
|
+
if (!inProcessAcquired) return false
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
const fileAcquired = await this._tryAcquireAdvisoryLockFile(name)
|
|
133
|
+
|
|
134
|
+
if (!fileAcquired) {
|
|
135
|
+
await super.releaseAdvisoryLock(name)
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
} catch (error) {
|
|
139
|
+
await super.releaseAdvisoryLock(name)
|
|
140
|
+
throw error
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return true
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Releases the lock only if **this** driver instance acquired it, both
|
|
148
|
+
* in the shared in-process owner table and in the on-disk lock
|
|
149
|
+
* directory. A caller that tries to release a lock it never acquired
|
|
150
|
+
* (or that was already released by another driver) gets `false` back
|
|
151
|
+
* and the filesystem state is left alone so we never delete somebody
|
|
152
|
+
* else's lock directory.
|
|
153
|
+
* @param {string} name - Lock name.
|
|
154
|
+
* @returns {Promise<boolean>}
|
|
155
|
+
*/
|
|
156
|
+
async releaseAdvisoryLock(name) {
|
|
157
|
+
const inProcessReleased = await super.releaseAdvisoryLock(name)
|
|
158
|
+
|
|
159
|
+
if (inProcessReleased) {
|
|
160
|
+
await this._releaseAdvisoryLockFile(name)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return inProcessReleased
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Runs is advisory lock held.
|
|
168
|
+
* @param {string} name - Lock name.
|
|
169
|
+
* @returns {Promise<boolean>}
|
|
170
|
+
*/
|
|
171
|
+
async isAdvisoryLockHeld(name) {
|
|
172
|
+
if (await super.isAdvisoryLockHeld(name)) return true
|
|
173
|
+
|
|
174
|
+
return await this._isAdvisoryLockFileHeld(name)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Runs resolve advisory lock directory.
|
|
179
|
+
@returns {string} */
|
|
180
|
+
_resolveAdvisoryLockDirectory() {
|
|
181
|
+
if (!this._advisoryLockDirectory) {
|
|
182
|
+
// Fall back to deriving the directory for callers that invoked
|
|
183
|
+
// advisory lock methods before `connect()` wired the field in.
|
|
184
|
+
const databaseDir = `${this.getConfiguration().getDirectory()}/db`
|
|
185
|
+
|
|
186
|
+
this._advisoryLockDirectory = path.join(databaseDir, `${this.localStorageName()}.velocious-advisory-locks`)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return this._advisoryLockDirectory
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Runs advisory lock path.
|
|
194
|
+
* @param {string} name - Lock name.
|
|
195
|
+
* @returns {string}
|
|
196
|
+
*/
|
|
197
|
+
_advisoryLockPath(name) {
|
|
198
|
+
const hash = createHash("sha256").update(name).digest("hex").slice(0, 16)
|
|
199
|
+
const safeName = name.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 64)
|
|
200
|
+
|
|
201
|
+
return path.join(this._resolveAdvisoryLockDirectory(), `${safeName}-${hash}.lock`)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Runs ensure advisory lock directory.
|
|
206
|
+
@returns {Promise<void>} */
|
|
207
|
+
async _ensureAdvisoryLockDirectory() {
|
|
208
|
+
await fs.mkdir(this._resolveAdvisoryLockDirectory(), {recursive: true})
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Runs write advisory lock metadata.
|
|
213
|
+
* @param {string} lockDirPath - Absolute path of the lock directory.
|
|
214
|
+
* @returns {Promise<void>}
|
|
215
|
+
*/
|
|
216
|
+
async _writeAdvisoryLockMetadata(lockDirPath) {
|
|
217
|
+
const ownerPath = path.join(lockDirPath, "owner.json")
|
|
218
|
+
const payload = JSON.stringify({
|
|
219
|
+
pid: process.pid,
|
|
220
|
+
hostname: os.hostname(),
|
|
221
|
+
acquiredAt: new Date().toISOString()
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
await fs.writeFile(ownerPath, payload)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Runs acquire advisory lock file.
|
|
229
|
+
* @param {string} name - Lock name.
|
|
230
|
+
* @param {{timeoutMs?: number | null}} args - Timeout args.
|
|
231
|
+
* @returns {Promise<boolean>}
|
|
232
|
+
*/
|
|
233
|
+
async _acquireAdvisoryLockFile(name, {timeoutMs}) {
|
|
234
|
+
await this._ensureAdvisoryLockDirectory()
|
|
235
|
+
|
|
236
|
+
const lockPath = this._advisoryLockPath(name)
|
|
237
|
+
const deadline = typeof timeoutMs === "number" && timeoutMs >= 0 ? Date.now() + timeoutMs : null
|
|
238
|
+
const pollIntervalMs = 50
|
|
239
|
+
|
|
240
|
+
// Intentionally looping without a fixed iteration cap — either the
|
|
241
|
+
// mkdir succeeds, the deadline elapses, or an unexpected error is
|
|
242
|
+
// re-thrown.
|
|
243
|
+
while (true) {
|
|
244
|
+
try {
|
|
245
|
+
await fs.mkdir(lockPath)
|
|
246
|
+
await this._writeAdvisoryLockMetadata(lockPath)
|
|
247
|
+
|
|
248
|
+
return true
|
|
249
|
+
} catch (error) {
|
|
250
|
+
if (/**
|
|
251
|
+
* Narrows the runtime value to the documented type.
|
|
252
|
+
@type {NodeJS.ErrnoException} */ (error)?.code !== "EEXIST") throw error
|
|
253
|
+
|
|
254
|
+
if (await this._isAdvisoryLockStale(lockPath)) {
|
|
255
|
+
await fs.rm(lockPath, {recursive: true, force: true})
|
|
256
|
+
continue
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (deadline !== null) {
|
|
260
|
+
const remaining = deadline - Date.now()
|
|
261
|
+
|
|
262
|
+
if (remaining <= 0) return false
|
|
263
|
+
|
|
264
|
+
await wait(Math.min(pollIntervalMs, remaining))
|
|
265
|
+
} else {
|
|
266
|
+
await wait(pollIntervalMs)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Runs try acquire advisory lock file.
|
|
274
|
+
* @param {string} name - Lock name.
|
|
275
|
+
* @returns {Promise<boolean>}
|
|
276
|
+
*/
|
|
277
|
+
async _tryAcquireAdvisoryLockFile(name) {
|
|
278
|
+
await this._ensureAdvisoryLockDirectory()
|
|
279
|
+
|
|
280
|
+
const lockPath = this._advisoryLockPath(name)
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
await fs.mkdir(lockPath)
|
|
284
|
+
await this._writeAdvisoryLockMetadata(lockPath)
|
|
285
|
+
|
|
286
|
+
return true
|
|
287
|
+
} catch (error) {
|
|
288
|
+
if (/**
|
|
289
|
+
* Narrows the runtime value to the documented type.
|
|
290
|
+
@type {NodeJS.ErrnoException} */ (error)?.code !== "EEXIST") throw error
|
|
291
|
+
|
|
292
|
+
if (await this._isAdvisoryLockStale(lockPath)) {
|
|
293
|
+
await fs.rm(lockPath, {recursive: true, force: true})
|
|
294
|
+
|
|
295
|
+
try {
|
|
296
|
+
await fs.mkdir(lockPath)
|
|
297
|
+
await this._writeAdvisoryLockMetadata(lockPath)
|
|
298
|
+
|
|
299
|
+
return true
|
|
300
|
+
} catch (retryError) {
|
|
301
|
+
if (/**
|
|
302
|
+
* Narrows the runtime value to the documented type.
|
|
303
|
+
@type {NodeJS.ErrnoException} */ (retryError)?.code === "EEXIST") return false
|
|
304
|
+
|
|
305
|
+
throw retryError
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return false
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Runs release advisory lock file.
|
|
315
|
+
* @param {string} name - Lock name.
|
|
316
|
+
* @returns {Promise<void>}
|
|
317
|
+
*/
|
|
318
|
+
async _releaseAdvisoryLockFile(name) {
|
|
319
|
+
const lockPath = this._advisoryLockPath(name)
|
|
320
|
+
|
|
321
|
+
try {
|
|
322
|
+
await fs.rm(lockPath, {recursive: true, force: true})
|
|
323
|
+
} catch {
|
|
324
|
+
// Best-effort release; in-process state is still authoritative and
|
|
325
|
+
// stale-lock cleanup on the next acquire will remove the directory
|
|
326
|
+
// if it really is still lingering.
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Runs is advisory lock file held.
|
|
332
|
+
* @param {string} name - Lock name.
|
|
333
|
+
* @returns {Promise<boolean>}
|
|
334
|
+
*/
|
|
335
|
+
async _isAdvisoryLockFileHeld(name) {
|
|
336
|
+
const lockPath = this._advisoryLockPath(name)
|
|
337
|
+
|
|
338
|
+
try {
|
|
339
|
+
await fs.stat(lockPath)
|
|
340
|
+
} catch {
|
|
341
|
+
return false
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return !await this._isAdvisoryLockStale(lockPath)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* A lock directory is considered stale when its owner metadata names a
|
|
349
|
+
* PID on this host that is no longer running. Cross-host ownership (a
|
|
350
|
+
* different `hostname`) is treated as live because we cannot reliably
|
|
351
|
+
* probe a PID on another machine; operators in that situation should
|
|
352
|
+
* remove stale lock directories by hand if they linger.
|
|
353
|
+
* @param {string} lockPath - Absolute path of the lock directory.
|
|
354
|
+
* @returns {Promise<boolean>}
|
|
355
|
+
*/
|
|
356
|
+
async _isAdvisoryLockStale(lockPath) {
|
|
357
|
+
/**
|
|
358
|
+
* Defines rawOwner.
|
|
359
|
+
@type {string} */
|
|
360
|
+
let rawOwner
|
|
361
|
+
|
|
362
|
+
try {
|
|
363
|
+
rawOwner = await fs.readFile(path.join(lockPath, "owner.json"), "utf8")
|
|
364
|
+
} catch {
|
|
365
|
+
// Missing or unreadable metadata — treat as stale so we can reclaim.
|
|
366
|
+
return true
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Defines owner.
|
|
371
|
+
@type {{pid?: number, hostname?: string}} */
|
|
372
|
+
let owner
|
|
373
|
+
|
|
374
|
+
try {
|
|
375
|
+
owner = JSON.parse(rawOwner)
|
|
376
|
+
} catch {
|
|
377
|
+
return true
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (!owner || typeof owner.pid !== "number") return true
|
|
381
|
+
if (owner.hostname && owner.hostname !== os.hostname()) return false
|
|
382
|
+
|
|
383
|
+
try {
|
|
384
|
+
// `kill(pid, 0)` is a no-op signal that fails with ESRCH if the
|
|
385
|
+
// process is not running; permission errors still indicate the
|
|
386
|
+
// process exists so we treat those as "not stale".
|
|
387
|
+
process.kill(owner.pid, 0)
|
|
388
|
+
|
|
389
|
+
return false
|
|
390
|
+
} catch (error) {
|
|
391
|
+
return /** Narrows the runtime value to the documented type. @type {NodeJS.ErrnoException} */ (error)?.code === "ESRCH"
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {digg} from "diggerize"
|
|
2
|
+
import envSense from "env-sense/build/use-env-sense.js"
|
|
3
|
+
|
|
4
|
+
// @ts-expect-error
|
|
5
|
+
import query from "./query"
|
|
6
|
+
|
|
7
|
+
// @ts-expect-error
|
|
8
|
+
import * as SQLite from "expo-sqlite"
|
|
9
|
+
|
|
10
|
+
import Base from "./base.js"
|
|
11
|
+
|
|
12
|
+
export default class VelociousDatabaseDriversSqliteNative extends Base {
|
|
13
|
+
async connect() {
|
|
14
|
+
const {isBrowser, isNative, isServer} = envSense()
|
|
15
|
+
|
|
16
|
+
if (!isNative) throw new Error(`SQLite native driver running inside non-native environment: ${JSON.stringify({isBrowser, isNative, isServer})}`)
|
|
17
|
+
|
|
18
|
+
const args = this.getArgs()
|
|
19
|
+
|
|
20
|
+
if (!args.name) throw new Error("No name given for SQLite Native")
|
|
21
|
+
|
|
22
|
+
const databaseName = args.name
|
|
23
|
+
|
|
24
|
+
if (args.reset) {
|
|
25
|
+
try {
|
|
26
|
+
await SQLite.deleteDatabaseAsync(databaseName)
|
|
27
|
+
} catch (error) {
|
|
28
|
+
if (error instanceof Error && error.message.match(/Database '(.+)' not found/)) {
|
|
29
|
+
// Ignore not found
|
|
30
|
+
} else {
|
|
31
|
+
throw error
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.connection = await SQLite.openDatabaseAsync(databaseName)
|
|
37
|
+
await this.registerVersion()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
connectArgs() {
|
|
41
|
+
const args = this.getArgs()
|
|
42
|
+
/**
|
|
43
|
+
* Connect args.
|
|
44
|
+
@type {Record<string, ?>} */
|
|
45
|
+
const connectArgs = {}
|
|
46
|
+
const forward = ["database", "host", "password"]
|
|
47
|
+
|
|
48
|
+
for (const forwardValue of forward) {
|
|
49
|
+
if (forwardValue in args) connectArgs[forwardValue] = digg(args, forwardValue)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if ("username" in args) connectArgs["user"] = args["username"]
|
|
53
|
+
|
|
54
|
+
return connectArgs
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async close() {
|
|
58
|
+
await this.connection.closeAsync()
|
|
59
|
+
this.connection = undefined
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Runs query actual.
|
|
64
|
+
* @param {string} sql - SQL string.
|
|
65
|
+
* @returns {Promise<Record<string, ?>[]>} - Query result rows.
|
|
66
|
+
*/
|
|
67
|
+
async _queryActual(sql) {
|
|
68
|
+
if (!this.connection) throw new Error("Not connected yet")
|
|
69
|
+
|
|
70
|
+
return await query(this.connection, sql)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import BetterLocalStorage from "better-localstorage"
|
|
4
|
+
import ConnectionSqlJs from "./connection-sql-js.js"
|
|
5
|
+
import initSqlJs from "sql.js"
|
|
6
|
+
|
|
7
|
+
import Base from "./base.js"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* VelociousDatabaseDriversSqliteWeb class.
|
|
11
|
+
* @typedef {{query: (sql: string) => Promise<Record<string, ?>[]>, close: () => Promise<void>}} SqliteWebConnection
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export default class VelociousDatabaseDriversSqliteWeb extends Base {
|
|
15
|
+
/**
|
|
16
|
+
* Better local storage.
|
|
17
|
+
@type {BetterLocalStorage | undefined} */
|
|
18
|
+
betterLocalStorage = undefined
|
|
19
|
+
/**
|
|
20
|
+
* Connection.
|
|
21
|
+
@type {ConnectionSqlJs | undefined} */
|
|
22
|
+
_connection = undefined
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Runs sql js locate file.
|
|
26
|
+
* @returns {(file: string) => string} - locateFile callback for sql.js.
|
|
27
|
+
*/
|
|
28
|
+
sqlJsLocateFile() {
|
|
29
|
+
const locateFile = this.getArgs().locateFile
|
|
30
|
+
|
|
31
|
+
if (typeof locateFile === "function") {
|
|
32
|
+
return locateFile
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (file) => `https://sql.js.org/dist/${file}`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async connect() {
|
|
39
|
+
this.args = this.getArgs()
|
|
40
|
+
|
|
41
|
+
if (!this.args.getConnection) {
|
|
42
|
+
this.betterLocalStorage ||= new BetterLocalStorage()
|
|
43
|
+
|
|
44
|
+
if (this.args.reset) {
|
|
45
|
+
await this.betterLocalStorage.delete(this.localStorageName())
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const SQL = await initSqlJs({locateFile: this.sqlJsLocateFile()})
|
|
49
|
+
|
|
50
|
+
const databaseContent = await this.betterLocalStorage.get(this.localStorageName())
|
|
51
|
+
const connectionSqlJs = new ConnectionSqlJs(this, new SQL.Database(databaseContent))
|
|
52
|
+
|
|
53
|
+
this._connection = connectionSqlJs
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async close() {
|
|
58
|
+
await this.getConnection().close()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Runs get connection.
|
|
63
|
+
* @returns {ConnectionSqlJs | SqliteWebConnection} - The connection.
|
|
64
|
+
*/
|
|
65
|
+
getConnection() {
|
|
66
|
+
if (this.args?.getConnection) {
|
|
67
|
+
return /** Narrows the runtime value to the documented type. @type {SqliteWebConnection} */ (this.args.getConnection())
|
|
68
|
+
} else {
|
|
69
|
+
if (!this._connection) throw new Error("SQLite web connection has not been initialized")
|
|
70
|
+
return this._connection
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
localStorageName() {
|
|
75
|
+
if (!this.args?.name) {
|
|
76
|
+
throw new Error("No name given in arguments for SQLite Web database")
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return `VelociousDatabaseDriversSqliteWeb---${this.args?.name}`
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Runs query actual.
|
|
84
|
+
* @param {string} sql - SQL string.
|
|
85
|
+
* @returns {Promise<Record<string, ?>[]>} - Resolves with the query actual.
|
|
86
|
+
*/
|
|
87
|
+
async _queryActual(sql) {
|
|
88
|
+
const result = await this.getConnection().query(sql)
|
|
89
|
+
|
|
90
|
+
if (!Array.isArray(result)) {
|
|
91
|
+
const connection = this.getConnection()
|
|
92
|
+
const connectionName = connection?.constructor?.name || "UnknownConnection"
|
|
93
|
+
|
|
94
|
+
throw new Error(`Sqlite web connection ${connectionName} returned a non-array result: ${typeof result}`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return result
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import QueryParserOptions from "../../query-parser/options.js"
|
|
4
|
+
|
|
5
|
+
export default class VelociousDatabaseDriversSqliteOptions extends QueryParserOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Runs constructor.
|
|
8
|
+
* @param {import("../base.js").default} driver - Database driver instance.
|
|
9
|
+
*/
|
|
10
|
+
constructor(driver) {
|
|
11
|
+
const optionsArgs = {
|
|
12
|
+
driver,
|
|
13
|
+
columnQuote: "`",
|
|
14
|
+
indexQuote: "`",
|
|
15
|
+
stringQuote: "'",
|
|
16
|
+
tableQuote: "`"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
super(optionsArgs)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Runs quote.
|
|
24
|
+
* @param {string} string - String.
|
|
25
|
+
* @returns {number | string} - The quote.
|
|
26
|
+
*/
|
|
27
|
+
quote(string) {
|
|
28
|
+
if (!this.driver) throw new Error("Driver not set")
|
|
29
|
+
|
|
30
|
+
return this.driver.quote(string)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runs query.
|
|
5
|
+
* @param {import("sqlite3").Database} connection - Connection.
|
|
6
|
+
* @param {string} sql - SQL string.
|
|
7
|
+
* @returns {Promise<Record<string, ?>[]>} - Resolves with string value.
|
|
8
|
+
*/
|
|
9
|
+
export default async function query(connection, sql) {
|
|
10
|
+
try {
|
|
11
|
+
/**
|
|
12
|
+
* Defines result.
|
|
13
|
+
@type {Record<string, ?>[]} */
|
|
14
|
+
let result
|
|
15
|
+
|
|
16
|
+
// @ts-expect-error
|
|
17
|
+
result = await connection.all(sql)
|
|
18
|
+
|
|
19
|
+
return result
|
|
20
|
+
} catch (error) {
|
|
21
|
+
let sqlInErrorMessage = `${sql}`
|
|
22
|
+
|
|
23
|
+
if (sqlInErrorMessage.length >= 4096) {
|
|
24
|
+
sqlInErrorMessage = `${sqlInErrorMessage.substring(0, 4096)}...`
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (error instanceof Error) {
|
|
28
|
+
error.message += `\n\n${sqlInErrorMessage}`
|
|
29
|
+
|
|
30
|
+
throw new Error(error.message, {cause: error})
|
|
31
|
+
} else {
|
|
32
|
+
throw new Error(`An error occurred: ${error}\n\n${sql}`, {cause: error})
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a query using the native SQLite async API.
|
|
3
|
+
* @param {import("sqlite3").Database & {getAllAsync: (sql: string) => Promise<Record<string, ?>[]>}} connection - SQLite connection instance.
|
|
4
|
+
* @param {string} sql - SQL string to execute.
|
|
5
|
+
* @returns {Promise<Record<string, ?>[]>} - Resolves with the result rows.
|
|
6
|
+
*/
|
|
7
|
+
export default async function query(connection, sql) {
|
|
8
|
+
const rows = []
|
|
9
|
+
let result
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
result = await connection.getAllAsync(sql)
|
|
13
|
+
} catch (error) {
|
|
14
|
+
let sqlInErrorMessage = `${sql}`
|
|
15
|
+
|
|
16
|
+
if (sqlInErrorMessage.length >= 4096) {
|
|
17
|
+
sqlInErrorMessage = `${sqlInErrorMessage.substring(0, 4096)}...`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (error instanceof Error) {
|
|
21
|
+
error.message += `\n\n${sqlInErrorMessage}`
|
|
22
|
+
|
|
23
|
+
// Re-throw to recover stack trace
|
|
24
|
+
throw new Error(error.message, {cause: error})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
throw new Error(`An error occurred: ${error}\n\n${sqlInErrorMessage}`, {cause: error})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
for await (const entry of result) {
|
|
31
|
+
rows.push(entry)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return rows
|
|
35
|
+
}
|