velocious 1.0.575 → 1.0.577
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/README.md +46 -1
- package/build/background-jobs/main.js +13 -2
- package/build/background-jobs/scheduler.js +11 -7
- package/build/background-jobs/store.js +18 -13
- package/build/environment-handlers/node/cli/commands/test.js +2 -0
- package/build/environment-handlers/node/source-peer-package.js +172 -0
- package/build/routes/resolver.js +3 -50
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +13 -3
- package/build/src/background-jobs/scheduler.d.ts +2 -2
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +11 -8
- package/build/src/background-jobs/store.d.ts +5 -4
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +17 -12
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test.js +3 -1
- package/build/src/environment-handlers/node/source-peer-package.d.ts +46 -0
- package/build/src/environment-handlers/node/source-peer-package.d.ts.map +1 -0
- package/build/src/environment-handlers/node/source-peer-package.js +148 -0
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +4 -45
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +9 -2
- package/build/sync/sync-envelope-replay-service.js +10 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/scripts/run-tests.js +61 -20
- package/scripts/test-browser.js +6 -1
- package/src/background-jobs/main.js +13 -2
- package/src/background-jobs/scheduler.js +11 -7
- package/src/background-jobs/store.js +18 -13
- package/src/environment-handlers/node/cli/commands/test.js +2 -0
- package/src/environment-handlers/node/source-peer-package.js +172 -0
- package/src/routes/resolver.js +3 -50
- package/src/sync/sync-envelope-replay-service.js +10 -1
- package/build/deployment-api/controller.js +0 -437
- package/build/deployment-api/index.js +0 -210
- package/build/deployment-api/path-matcher.js +0 -45
- package/build/deployment-api/registry.js +0 -84
- package/build/deployment-api/run-store.js +0 -798
- package/build/deployment-api/sanitize.js +0 -114
- package/build/src/deployment-api/controller.d.ts +0 -117
- package/build/src/deployment-api/controller.d.ts.map +0 -1
- package/build/src/deployment-api/controller.js +0 -384
- package/build/src/deployment-api/index.d.ts +0 -46
- package/build/src/deployment-api/index.d.ts.map +0 -1
- package/build/src/deployment-api/index.js +0 -178
- package/build/src/deployment-api/path-matcher.d.ts +0 -31
- package/build/src/deployment-api/path-matcher.d.ts.map +0 -1
- package/build/src/deployment-api/path-matcher.js +0 -39
- package/build/src/deployment-api/registry.d.ts +0 -106
- package/build/src/deployment-api/registry.d.ts.map +0 -1
- package/build/src/deployment-api/registry.js +0 -74
- package/build/src/deployment-api/run-store.d.ts +0 -402
- package/build/src/deployment-api/run-store.d.ts.map +0 -1
- package/build/src/deployment-api/run-store.js +0 -711
- package/build/src/deployment-api/sanitize.d.ts +0 -27
- package/build/src/deployment-api/sanitize.d.ts.map +0 -1
- package/build/src/deployment-api/sanitize.js +0 -100
- package/src/deployment-api/controller.js +0 -437
- package/src/deployment-api/index.js +0 -210
- package/src/deployment-api/path-matcher.js +0 -45
- package/src/deployment-api/registry.js +0 -84
- package/src/deployment-api/run-store.js +0 -798
- package/src/deployment-api/sanitize.js +0 -114
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/pooled-runner-child.js","../src/background-jobs/runner-graceful-shutdown.js","../src/background-jobs/runner-process-title.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/counts-channel.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/operation-connection.js","../src/database/operation-lease.js","../src/database/operation.js","../src/database/query-aborted-error.js","../src/database/record-changes.js","../src/database/structure-sql-loader.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/index-metadata.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query-stream.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/query-for-model.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/deployment-api/controller.js","../src/deployment-api/index.js","../src/deployment-api/path-matcher.js","../src/deployment-api/registry.js","../src/deployment-api/run-store.js","../src/deployment-api/sanitize.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/attachment-path-source.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-deadline.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/client-delivery-queue.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response-compression.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/jobs/prune-terminal-background-jobs.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/signed-sync-envelope-replay-service.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-aggregator.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/testing/wait-for-event.js","../src/testing/factory/association-declaration.js","../src/testing/factory/declarations.js","../src/testing/factory/definition-builder.js","../src/testing/factory/errors.js","../src/testing/factory/evaluation-context.js","../src/testing/factory/events.js","../src/testing/factory/factory-definition.js","../src/testing/factory/factory-registry.js","../src/testing/factory/factory-runner.js","../src/testing/factory/index.js","../src/testing/factory/linter.js","../src/testing/factory/model-contract.js","../src/testing/factory/sequence.js","../src/testing/factory/trait-definition.js","../src/testing/factory/node/load-definitions.js","../src/testing/factory/strategies/attributes-for.js","../src/testing/factory/strategies/base.js","../src/testing/factory/strategies/build.js","../src/testing/factory/strategies/create.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/bearer-token.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/mount-prefix.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/sha256-hex.js","../src/utils/shutdown-lifecycle.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
|
|
1
|
+
{"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/pooled-runner-child.js","../src/background-jobs/runner-graceful-shutdown.js","../src/background-jobs/runner-process-title.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/counts-channel.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/operation-connection.js","../src/database/operation-lease.js","../src/database/operation.js","../src/database/query-aborted-error.js","../src/database/record-changes.js","../src/database/structure-sql-loader.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/index-metadata.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query-stream.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/query-for-model.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/attachment-path-source.js","../src/environment-handlers/node/source-peer-package.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-deadline.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/client-delivery-queue.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response-compression.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/jobs/prune-terminal-background-jobs.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/signed-sync-envelope-replay-service.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-aggregator.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/testing/wait-for-event.js","../src/testing/factory/association-declaration.js","../src/testing/factory/declarations.js","../src/testing/factory/definition-builder.js","../src/testing/factory/errors.js","../src/testing/factory/evaluation-context.js","../src/testing/factory/events.js","../src/testing/factory/factory-definition.js","../src/testing/factory/factory-registry.js","../src/testing/factory/factory-runner.js","../src/testing/factory/index.js","../src/testing/factory/linter.js","../src/testing/factory/model-contract.js","../src/testing/factory/sequence.js","../src/testing/factory/trait-definition.js","../src/testing/factory/node/load-definitions.js","../src/testing/factory/strategies/attributes-for.js","../src/testing/factory/strategies/base.js","../src/testing/factory/strategies/build.js","../src/testing/factory/strategies/create.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/bearer-token.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/mount-prefix.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/sha256-hex.js","../src/utils/shutdown-lifecycle.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"velocious": "build/bin/velocious.js"
|
|
4
4
|
},
|
|
5
5
|
"name": "velocious",
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.577",
|
|
7
7
|
"main": "build/index.js",
|
|
8
8
|
"types": "build/index.d.ts",
|
|
9
9
|
"files": [
|
|
@@ -117,6 +117,7 @@
|
|
|
117
117
|
"mysql": "^2.18.1",
|
|
118
118
|
"node-fetch": "^3.3.1",
|
|
119
119
|
"pg": "^8.16.3",
|
|
120
|
+
"rampway": "^0.4.0",
|
|
120
121
|
"react": "^19.2.0",
|
|
121
122
|
"react-dom": "^19.2.0",
|
|
122
123
|
"release-patch": "^1.0.0",
|
package/scripts/run-tests.js
CHANGED
|
@@ -2,6 +2,18 @@ import path from "node:path"
|
|
|
2
2
|
import process from "node:process"
|
|
3
3
|
import {spawn} from "node:child_process"
|
|
4
4
|
import {fileURLToPath} from "node:url"
|
|
5
|
+
import {prepareSourcePeerPackage} from "../src/environment-handlers/node/source-peer-package.js"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param {NodeJS.Signals} signal - Termination signal.
|
|
9
|
+
* @returns {number} - Conventional signal exit code.
|
|
10
|
+
*/
|
|
11
|
+
function signalExitCode(signal) {
|
|
12
|
+
if (signal === "SIGINT") return 130
|
|
13
|
+
if (signal === "SIGTERM") return 143
|
|
14
|
+
|
|
15
|
+
return 1
|
|
16
|
+
}
|
|
5
17
|
|
|
6
18
|
/** Runs the Velocious test command from the dummy app with cross-platform env setup. */
|
|
7
19
|
async function main() {
|
|
@@ -12,32 +24,61 @@ async function main() {
|
|
|
12
24
|
const testDirectory = path.resolve(dummyDirectory, "..")
|
|
13
25
|
const cliPath = path.join(projectDirectory, "bin", "velocious.js")
|
|
14
26
|
const args = ["test", ...process.argv.slice(2)]
|
|
27
|
+
const sourcePeerPackage = await prepareSourcePeerPackage(projectDirectory)
|
|
28
|
+
/** @type {import("node:child_process").ChildProcess | undefined} */
|
|
29
|
+
let childProcess
|
|
30
|
+
/** @type {NodeJS.Signals | undefined} */
|
|
31
|
+
let receivedSignal
|
|
32
|
+
const handleSignal = (/** @type {NodeJS.Signals} */ signal) => {
|
|
33
|
+
receivedSignal ??= signal
|
|
15
34
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
stdio: "inherit"
|
|
35
|
+
void sourcePeerPackage.cleanup().finally(() => {
|
|
36
|
+
if (childProcess && childProcess.exitCode === null && childProcess.signalCode === null) {
|
|
37
|
+
childProcess.kill(signal)
|
|
38
|
+
}
|
|
21
39
|
})
|
|
40
|
+
}
|
|
22
41
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (signal) {
|
|
26
|
-
reject(new Error(`Test process terminated by signal: ${signal}`))
|
|
27
|
-
return
|
|
28
|
-
}
|
|
42
|
+
process.once("SIGINT", handleSignal)
|
|
43
|
+
process.once("SIGTERM", handleSignal)
|
|
29
44
|
|
|
30
|
-
|
|
31
|
-
// "silent test-runner death" mode (e.g. a hard process.exit or native
|
|
32
|
-
// crash). Always print the exit code so CI logs show that the child
|
|
33
|
-
// died rather than ending the log mid-run with no explanation.
|
|
34
|
-
if (code !== 0) console.error(`Test process exited with code: ${code ?? "unknown"}`)
|
|
45
|
+
let exitCode
|
|
35
46
|
|
|
36
|
-
|
|
47
|
+
try {
|
|
48
|
+
exitCode = await new Promise((resolve, reject) => {
|
|
49
|
+
childProcess = spawn(process.execPath, [cliPath, ...args], {
|
|
50
|
+
cwd: dummyDirectory,
|
|
51
|
+
env: {...process.env, VELOCIOUS_TEST_DIR: testDirectory},
|
|
52
|
+
stdio: "inherit"
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
childProcess.once("error", reject)
|
|
56
|
+
childProcess.once("close", (code, signal) => {
|
|
57
|
+
if (signal) {
|
|
58
|
+
if (receivedSignal) {
|
|
59
|
+
resolve(signalExitCode(receivedSignal))
|
|
60
|
+
} else {
|
|
61
|
+
reject(new Error(`Test process terminated by signal: ${signal}`))
|
|
62
|
+
}
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A non-zero exit without the runner's own failure summary is the
|
|
67
|
+
// "silent test-runner death" mode (e.g. a hard process.exit or native
|
|
68
|
+
// crash). Always print the exit code so CI logs show that the child
|
|
69
|
+
// died rather than ending the log mid-run with no explanation.
|
|
70
|
+
if (code !== 0) console.error(`Test process exited with code: ${code ?? "unknown"}`)
|
|
71
|
+
|
|
72
|
+
resolve(code ?? 1)
|
|
73
|
+
})
|
|
37
74
|
})
|
|
38
|
-
}
|
|
39
|
-
process.
|
|
40
|
-
|
|
75
|
+
} finally {
|
|
76
|
+
process.removeListener("SIGINT", handleSignal)
|
|
77
|
+
process.removeListener("SIGTERM", handleSignal)
|
|
78
|
+
await sourcePeerPackage.cleanup()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
process.exitCode = receivedSignal ? signalExitCode(receivedSignal) : exitCode
|
|
41
82
|
}
|
|
42
83
|
|
|
43
84
|
await main()
|
package/scripts/test-browser.js
CHANGED
|
@@ -19,6 +19,7 @@ import TestRunner from "../src/testing/test-runner.js"
|
|
|
19
19
|
import {normalizeExamplePatterns, parseFilters} from "../src/testing/test-filter-parser.js"
|
|
20
20
|
import fileExists from "../src/utils/file-exists.js"
|
|
21
21
|
import dummyDirectory from "../spec/dummy/dummy-directory.js"
|
|
22
|
+
import {withSourcePeerPackage} from "../src/environment-handlers/node/source-peer-package.js"
|
|
22
23
|
|
|
23
24
|
const rootDir = process.cwd()
|
|
24
25
|
const distDir = path.join(rootDir, "dist")
|
|
@@ -353,7 +354,7 @@ async function startBrowserBackendServer(configuration, port) {
|
|
|
353
354
|
return application
|
|
354
355
|
}
|
|
355
356
|
|
|
356
|
-
async function
|
|
357
|
+
async function runBrowserTests() {
|
|
357
358
|
const processArgs = ["test:browser", ...process.argv.slice(2)]
|
|
358
359
|
|
|
359
360
|
process.env.VELOCIOUS_BROWSER_TESTS = "true"
|
|
@@ -453,6 +454,10 @@ async function main() {
|
|
|
453
454
|
}
|
|
454
455
|
}
|
|
455
456
|
|
|
457
|
+
async function main() {
|
|
458
|
+
await withSourcePeerPackage(rootDir, runBrowserTests)
|
|
459
|
+
}
|
|
460
|
+
|
|
456
461
|
/**
|
|
457
462
|
* @returns {Promise<import("../src/configuration.js").default>} - Backend configuration for browser tests.
|
|
458
463
|
*/
|
|
@@ -1354,9 +1354,20 @@ export default class BackgroundJobsMain {
|
|
|
1354
1354
|
if (this.dispatchStrategy === "polling") return
|
|
1355
1355
|
|
|
1356
1356
|
const next = await this.store.nextScheduledJob()
|
|
1357
|
-
|
|
1357
|
+
let delay
|
|
1358
1358
|
|
|
1359
|
-
|
|
1359
|
+
if (next && typeof next.scheduledAtMs === "number") {
|
|
1360
|
+
delay = Math.max(0, Math.min(next.scheduledAtMs - Date.now(), MAX_TIMER_MS))
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
// `nextScheduledJob` only returns future jobs, so a job that became
|
|
1364
|
+
// eligible after the drain's eligible-job probe is invisible to it. If one
|
|
1365
|
+
// is dispatchable now, arm a 0-delay re-drain so it is dispatched
|
|
1366
|
+
// immediately instead of being stranded until the next future timer (or
|
|
1367
|
+
// external signal) fires.
|
|
1368
|
+
if (await this.nextAvailableJobForReadyWorkers()) delay = 0
|
|
1369
|
+
|
|
1370
|
+
if (typeof delay !== "number") return
|
|
1360
1371
|
|
|
1361
1372
|
this._scheduledTimer = setTimeout(() => {
|
|
1362
1373
|
this._scheduledTimer = undefined
|
|
@@ -81,8 +81,8 @@ export default class BackgroundJobsScheduler {
|
|
|
81
81
|
* Narrows the runtime value to the documented type.
|
|
82
82
|
* @type {Array<ReturnType<typeof setTimeout>>} */
|
|
83
83
|
this.timeoutIds = []
|
|
84
|
-
/** @type {
|
|
85
|
-
this.
|
|
84
|
+
/** @type {Map<string, Promise<void>>} - In-flight scheduled enqueues by schedule key that shutdown must drain. */
|
|
85
|
+
this.pendingEnqueuesByJobKey = new Map()
|
|
86
86
|
/**
|
|
87
87
|
* Narrows the runtime value to the documented type.
|
|
88
88
|
* @type {boolean} - True between stop() and the next start(); cron self-rescheduler checks this so a stop() during an in-flight enqueue doesn't immediately re-arm.
|
|
@@ -131,7 +131,7 @@ export default class BackgroundJobsScheduler {
|
|
|
131
131
|
this.intervalIds = []
|
|
132
132
|
this.timeoutIds = []
|
|
133
133
|
|
|
134
|
-
await Promise.all(this.
|
|
134
|
+
await Promise.all(this.pendingEnqueuesByJobKey.values())
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
/**
|
|
@@ -181,13 +181,15 @@ export default class BackgroundJobsScheduler {
|
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
const timeoutId = setTimeout(() => {
|
|
184
|
-
|
|
184
|
+
const scheduledEnqueue = this.runScheduledJob({jobConfiguration, jobKey})
|
|
185
185
|
|
|
186
186
|
const intervalId = setInterval(() => {
|
|
187
|
-
|
|
187
|
+
return this.runScheduledJob({jobConfiguration, jobKey})
|
|
188
188
|
}, intervalMs)
|
|
189
189
|
|
|
190
190
|
this.intervalIds.push(intervalId)
|
|
191
|
+
|
|
192
|
+
return scheduledEnqueue
|
|
191
193
|
}, firstInMs)
|
|
192
194
|
|
|
193
195
|
this.timeoutIds.push(timeoutId)
|
|
@@ -242,13 +244,15 @@ export default class BackgroundJobsScheduler {
|
|
|
242
244
|
* @returns {Promise<void>} - Resolves after the enqueue attempt finishes.
|
|
243
245
|
*/
|
|
244
246
|
async runScheduledJob({jobConfiguration, jobKey}) {
|
|
247
|
+
if (this.stopped || this.pendingEnqueuesByJobKey.has(jobKey)) return
|
|
248
|
+
|
|
245
249
|
const pendingEnqueue = this.enqueueScheduledJob({jobConfiguration, jobKey})
|
|
246
|
-
this.
|
|
250
|
+
this.pendingEnqueuesByJobKey.set(jobKey, pendingEnqueue)
|
|
247
251
|
|
|
248
252
|
try {
|
|
249
253
|
await pendingEnqueue
|
|
250
254
|
} finally {
|
|
251
|
-
this.
|
|
255
|
+
this.pendingEnqueuesByJobKey.delete(jobKey)
|
|
252
256
|
}
|
|
253
257
|
}
|
|
254
258
|
|
|
@@ -77,7 +77,8 @@ const SORTABLE_COLUMNS = {
|
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* Serializes concurrent `_applySchema` runs within THIS process, keyed by database
|
|
80
|
-
* identifier
|
|
80
|
+
* identifier, before callers without an existing connection check one out. Two
|
|
81
|
+
* stores that share one connection (SingleMultiUse / SQLite)
|
|
81
82
|
* otherwise interleave the multi-step table rebuild and corrupt it (the jobs table
|
|
82
83
|
* is left as its `*_velocious_rebuild` temp). A DB advisory lock can't fix that: on
|
|
83
84
|
* a session-scoped / re-entrant driver (MySQL `GET_LOCK`) a second acquire on the
|
|
@@ -1059,22 +1060,17 @@ export default class BackgroundJobsStore {
|
|
|
1059
1060
|
* @returns {Promise<void>} - Resolves when the schema is present.
|
|
1060
1061
|
*/
|
|
1061
1062
|
async _ensureSchema(existingDb) {
|
|
1062
|
-
|
|
1063
|
-
await this._applySchema(existingDb)
|
|
1064
|
-
|
|
1065
|
-
return
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
await this._withDb((db) => this._applySchema(db))
|
|
1063
|
+
await this._applySchema(existingDb)
|
|
1069
1064
|
}
|
|
1070
1065
|
|
|
1071
1066
|
/**
|
|
1072
|
-
*
|
|
1073
|
-
*
|
|
1074
|
-
* @param {import("../database/drivers/base.js").default}
|
|
1067
|
+
* Serializes creation or upgrade of the background-jobs schema, checking out a
|
|
1068
|
+
* connection only after earlier schema work has completed when one is not supplied.
|
|
1069
|
+
* @param {import("../database/drivers/base.js").default} [existingDb] - Caller-owned
|
|
1070
|
+
* database connection.
|
|
1075
1071
|
* @returns {Promise<void>} - Resolves when the schema is present.
|
|
1076
1072
|
*/
|
|
1077
|
-
async _applySchema(
|
|
1073
|
+
async _applySchema(existingDb) {
|
|
1078
1074
|
// Serialize concurrent schema applies within this process, keyed by database
|
|
1079
1075
|
// identifier (see `schemaApplyChains`). The per-step locks inside the steps use
|
|
1080
1076
|
// DIFFERENT lock names, so two concurrent callers could otherwise each hold a
|
|
@@ -1084,7 +1080,16 @@ export default class BackgroundJobsStore {
|
|
|
1084
1080
|
// the second caller then re-checks and finds every step already done.
|
|
1085
1081
|
const identifier = this.getDatabaseIdentifier() ?? "default"
|
|
1086
1082
|
const previous = schemaApplyChains.get(identifier) ?? Promise.resolve()
|
|
1087
|
-
const
|
|
1083
|
+
const applyWithConnection = async () => {
|
|
1084
|
+
if (existingDb) {
|
|
1085
|
+
await this._applySchemaSteps(existingDb)
|
|
1086
|
+
|
|
1087
|
+
return
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
await this._withDb((db) => this._applySchemaSteps(db))
|
|
1091
|
+
}
|
|
1092
|
+
const run = previous.then(applyWithConnection, applyWithConnection)
|
|
1088
1093
|
|
|
1089
1094
|
// Keep the chain alive regardless of this run's outcome so one failed apply does
|
|
1090
1095
|
// not wedge later callers; this run still propagates its own result/error.
|
|
@@ -6,9 +6,11 @@ import TestFilesFinder from "../../../../testing/test-files-finder.js"
|
|
|
6
6
|
import TestRunner from "../../../../testing/test-runner.js"
|
|
7
7
|
import TestSuiteSplitter from "../../../../testing/test-suite-splitter.js"
|
|
8
8
|
import {normalizeExamplePatterns, parseFilters} from "../../../../testing/test-filter-parser.js"
|
|
9
|
+
import {prepareSourcePeerPackage} from "../../source-peer-package.js"
|
|
9
10
|
|
|
10
11
|
export default class VelociousCliCommandsTest extends BaseCommand {
|
|
11
12
|
async execute() {
|
|
13
|
+
await prepareSourcePeerPackage()
|
|
12
14
|
this.getConfiguration().setEnvironment("test")
|
|
13
15
|
|
|
14
16
|
let directory
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {randomUUID} from "node:crypto"
|
|
2
|
+
import fsSync from "node:fs"
|
|
3
|
+
import fs from "node:fs/promises"
|
|
4
|
+
import path from "node:path"
|
|
5
|
+
import {fileURLToPath} from "node:url"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Invocation-owned source peer package shim.
|
|
9
|
+
* @typedef {object} SourcePeerPackage
|
|
10
|
+
* @property {() => Promise<void>} cleanup - Removes only this invocation's shim.
|
|
11
|
+
* @property {boolean} created - Whether this invocation created the shim.
|
|
12
|
+
* @property {string} packageDirectory - Package path used for peer resolution.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const SOURCE_PEER_SHIM_MARKER_FILE = ".velocious-source-peer-shim"
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Checks a filesystem error code.
|
|
19
|
+
* @param {unknown} error - Filesystem error.
|
|
20
|
+
* @param {string} code - Expected Node error code.
|
|
21
|
+
* @returns {boolean} - Whether the error has the expected code.
|
|
22
|
+
*/
|
|
23
|
+
function errorHasCode(error, code) {
|
|
24
|
+
return error instanceof Error && "code" in error && error.code === code
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolves the Velocious package directory from source or compiled execution.
|
|
29
|
+
* @returns {Promise<string>} - Velocious package directory.
|
|
30
|
+
*/
|
|
31
|
+
async function frameworkPackageDirectory() {
|
|
32
|
+
const helperDirectory = path.dirname(fileURLToPath(import.meta.url))
|
|
33
|
+
const sourceLayoutDirectory = path.resolve(helperDirectory, "..", "..", "..")
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
await fs.access(path.join(sourceLayoutDirectory, "package.json"))
|
|
37
|
+
|
|
38
|
+
return sourceLayoutDirectory
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (!errorHasCode(error, "ENOENT")) throw error
|
|
41
|
+
|
|
42
|
+
return path.dirname(sourceLayoutDirectory)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Removes an invocation-owned shim asynchronously.
|
|
48
|
+
* @param {object} args - Cleanup ownership.
|
|
49
|
+
* @param {string} args.markerPath - Marker file path.
|
|
50
|
+
* @param {string} args.packageDirectory - Synthetic package directory.
|
|
51
|
+
* @param {string} args.token - Invocation ownership token.
|
|
52
|
+
* @returns {Promise<void>} - Resolves after owned cleanup.
|
|
53
|
+
*/
|
|
54
|
+
async function cleanupOwnedShim({markerPath, packageDirectory, token}) {
|
|
55
|
+
let marker
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
marker = await fs.readFile(markerPath, "utf8")
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (errorHasCode(error, "ENOENT")) return
|
|
61
|
+
|
|
62
|
+
throw error
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (marker !== `${token}\n`) return
|
|
66
|
+
|
|
67
|
+
await fs.rm(packageDirectory, {recursive: true, force: true})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Removes an invocation-owned shim during process exit.
|
|
72
|
+
* @param {object} args - Cleanup ownership.
|
|
73
|
+
* @param {string} args.markerPath - Marker file path.
|
|
74
|
+
* @param {string} args.packageDirectory - Synthetic package directory.
|
|
75
|
+
* @param {string} args.token - Invocation ownership token.
|
|
76
|
+
* @returns {void} - No return value.
|
|
77
|
+
*/
|
|
78
|
+
function cleanupOwnedShimSync({markerPath, packageDirectory, token}) {
|
|
79
|
+
let marker
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
marker = fsSync.readFileSync(markerPath, "utf8")
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (errorHasCode(error, "ENOENT")) return
|
|
85
|
+
|
|
86
|
+
throw error
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (marker !== `${token}\n`) return
|
|
90
|
+
|
|
91
|
+
fsSync.rmSync(packageDirectory, {recursive: true, force: true})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Exposes this checkout to published peer packages without loading duplicate
|
|
96
|
+
* classes from generated build output.
|
|
97
|
+
* @param {string} [projectDirectory] - Velocious source checkout.
|
|
98
|
+
* @returns {Promise<SourcePeerPackage>} - Invocation-owned shim handle.
|
|
99
|
+
*/
|
|
100
|
+
async function prepareSourcePeerPackage(projectDirectory) {
|
|
101
|
+
const resolvedProjectDirectory = projectDirectory ?? await frameworkPackageDirectory()
|
|
102
|
+
const nodeModulesDirectory = path.join(resolvedProjectDirectory, "node_modules")
|
|
103
|
+
const packageDirectory = path.join(nodeModulesDirectory, "velocious")
|
|
104
|
+
|
|
105
|
+
await fs.mkdir(nodeModulesDirectory, {recursive: true})
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
await fs.mkdir(packageDirectory)
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (!errorHasCode(error, "EEXIST")) throw error
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
cleanup: async () => {},
|
|
114
|
+
created: false,
|
|
115
|
+
packageDirectory
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const token = randomUUID()
|
|
120
|
+
const markerPath = path.join(packageDirectory, SOURCE_PEER_SHIM_MARKER_FILE)
|
|
121
|
+
const cleanupOnExit = () => cleanupOwnedShimSync({markerPath, packageDirectory, token})
|
|
122
|
+
let cleanupPromise
|
|
123
|
+
const cleanup = () => {
|
|
124
|
+
cleanupPromise ??= cleanupOwnedShim({markerPath, packageDirectory, token})
|
|
125
|
+
.then(() => process.removeListener("exit", cleanupOnExit))
|
|
126
|
+
|
|
127
|
+
return cleanupPromise
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
const buildDirectory = path.join(packageDirectory, "build")
|
|
132
|
+
|
|
133
|
+
await fs.writeFile(markerPath, `${token}\n`, {encoding: "utf8", flag: "wx"})
|
|
134
|
+
process.once("exit", cleanupOnExit)
|
|
135
|
+
await fs.mkdir(buildDirectory)
|
|
136
|
+
await fs.writeFile(
|
|
137
|
+
path.join(packageDirectory, "package.json"),
|
|
138
|
+
`${JSON.stringify({name: "velocious", private: true, type: "module"}, null, 2)}\n`,
|
|
139
|
+
"utf8"
|
|
140
|
+
)
|
|
141
|
+
await fs.symlink(
|
|
142
|
+
path.join(resolvedProjectDirectory, "src"),
|
|
143
|
+
path.join(buildDirectory, "src"),
|
|
144
|
+
process.platform === "win32" ? "junction" : "dir"
|
|
145
|
+
)
|
|
146
|
+
} catch (error) {
|
|
147
|
+
process.removeListener("exit", cleanupOnExit)
|
|
148
|
+
await fs.rm(packageDirectory, {recursive: true, force: true})
|
|
149
|
+
throw error
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return {cleanup, created: true, packageDirectory}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Runs work while the source peer package is available.
|
|
157
|
+
* @template Result
|
|
158
|
+
* @param {string} projectDirectory - Velocious source checkout.
|
|
159
|
+
* @param {() => Promise<Result>} callback - Work requiring source peer resolution.
|
|
160
|
+
* @returns {Promise<Result>} - Callback result.
|
|
161
|
+
*/
|
|
162
|
+
async function withSourcePeerPackage(projectDirectory, callback) {
|
|
163
|
+
const sourcePeerPackage = await prepareSourcePeerPackage(projectDirectory)
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
return await callback()
|
|
167
|
+
} finally {
|
|
168
|
+
await sourcePeerPackage.cleanup()
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export {SOURCE_PEER_SHIM_MARKER_FILE, frameworkPackageDirectory, prepareSourcePeerPackage, withSourcePeerPackage}
|