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.
Files changed (66) hide show
  1. package/README.md +46 -1
  2. package/build/background-jobs/main.js +13 -2
  3. package/build/background-jobs/scheduler.js +11 -7
  4. package/build/background-jobs/store.js +18 -13
  5. package/build/environment-handlers/node/cli/commands/test.js +2 -0
  6. package/build/environment-handlers/node/source-peer-package.js +172 -0
  7. package/build/routes/resolver.js +3 -50
  8. package/build/src/background-jobs/main.d.ts.map +1 -1
  9. package/build/src/background-jobs/main.js +13 -3
  10. package/build/src/background-jobs/scheduler.d.ts +2 -2
  11. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  12. package/build/src/background-jobs/scheduler.js +11 -8
  13. package/build/src/background-jobs/store.d.ts +5 -4
  14. package/build/src/background-jobs/store.d.ts.map +1 -1
  15. package/build/src/background-jobs/store.js +17 -12
  16. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  17. package/build/src/environment-handlers/node/cli/commands/test.js +3 -1
  18. package/build/src/environment-handlers/node/source-peer-package.d.ts +46 -0
  19. package/build/src/environment-handlers/node/source-peer-package.d.ts.map +1 -0
  20. package/build/src/environment-handlers/node/source-peer-package.js +148 -0
  21. package/build/src/routes/resolver.d.ts.map +1 -1
  22. package/build/src/routes/resolver.js +4 -45
  23. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  24. package/build/src/sync/sync-envelope-replay-service.js +9 -2
  25. package/build/sync/sync-envelope-replay-service.js +10 -1
  26. package/build/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +2 -1
  28. package/scripts/run-tests.js +61 -20
  29. package/scripts/test-browser.js +6 -1
  30. package/src/background-jobs/main.js +13 -2
  31. package/src/background-jobs/scheduler.js +11 -7
  32. package/src/background-jobs/store.js +18 -13
  33. package/src/environment-handlers/node/cli/commands/test.js +2 -0
  34. package/src/environment-handlers/node/source-peer-package.js +172 -0
  35. package/src/routes/resolver.js +3 -50
  36. package/src/sync/sync-envelope-replay-service.js +10 -1
  37. package/build/deployment-api/controller.js +0 -437
  38. package/build/deployment-api/index.js +0 -210
  39. package/build/deployment-api/path-matcher.js +0 -45
  40. package/build/deployment-api/registry.js +0 -84
  41. package/build/deployment-api/run-store.js +0 -798
  42. package/build/deployment-api/sanitize.js +0 -114
  43. package/build/src/deployment-api/controller.d.ts +0 -117
  44. package/build/src/deployment-api/controller.d.ts.map +0 -1
  45. package/build/src/deployment-api/controller.js +0 -384
  46. package/build/src/deployment-api/index.d.ts +0 -46
  47. package/build/src/deployment-api/index.d.ts.map +0 -1
  48. package/build/src/deployment-api/index.js +0 -178
  49. package/build/src/deployment-api/path-matcher.d.ts +0 -31
  50. package/build/src/deployment-api/path-matcher.d.ts.map +0 -1
  51. package/build/src/deployment-api/path-matcher.js +0 -39
  52. package/build/src/deployment-api/registry.d.ts +0 -106
  53. package/build/src/deployment-api/registry.d.ts.map +0 -1
  54. package/build/src/deployment-api/registry.js +0 -74
  55. package/build/src/deployment-api/run-store.d.ts +0 -402
  56. package/build/src/deployment-api/run-store.d.ts.map +0 -1
  57. package/build/src/deployment-api/run-store.js +0 -711
  58. package/build/src/deployment-api/sanitize.d.ts +0 -27
  59. package/build/src/deployment-api/sanitize.d.ts.map +0 -1
  60. package/build/src/deployment-api/sanitize.js +0 -100
  61. package/src/deployment-api/controller.js +0 -437
  62. package/src/deployment-api/index.js +0 -210
  63. package/src/deployment-api/path-matcher.js +0 -45
  64. package/src/deployment-api/registry.js +0 -84
  65. package/src/deployment-api/run-store.js +0 -798
  66. 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.575",
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",
@@ -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
- await new Promise((resolve, reject) => {
17
- const childProcess = spawn(process.execPath, [cliPath, ...args], {
18
- cwd: dummyDirectory,
19
- env: {...process.env, VELOCIOUS_TEST_DIR: testDirectory},
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
- childProcess.once("error", reject)
24
- childProcess.once("close", (code, signal) => {
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
- // A non-zero exit without the runner's own failure summary is the
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
- resolve(code ?? 1)
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
- }).then((code) => {
39
- process.exit(/** @type {number} */ (code))
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()
@@ -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 main() {
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
- if (!next || typeof next.scheduledAtMs !== "number") return
1357
+ let delay
1358
1358
 
1359
- const delay = Math.max(0, Math.min(next.scheduledAtMs - Date.now(), MAX_TIMER_MS))
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 {Set<Promise<void>>} - Scheduled enqueues that shutdown must drain. */
85
- this.pendingEnqueues = new Set()
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.pendingEnqueues)
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
- void this.runScheduledJob({jobConfiguration, jobKey})
184
+ const scheduledEnqueue = this.runScheduledJob({jobConfiguration, jobKey})
185
185
 
186
186
  const intervalId = setInterval(() => {
187
- void this.runScheduledJob({jobConfiguration, jobKey})
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.pendingEnqueues.add(pendingEnqueue)
250
+ this.pendingEnqueuesByJobKey.set(jobKey, pendingEnqueue)
247
251
 
248
252
  try {
249
253
  await pendingEnqueue
250
254
  } finally {
251
- this.pendingEnqueues.delete(pendingEnqueue)
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. Two stores that share one connection (SingleMultiUse / SQLite)
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
- if (existingDb) {
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
- * Creates or upgrades the background-jobs tables, columns and concurrency rows on
1073
- * the given connection.
1074
- * @param {import("../database/drivers/base.js").default} db - Database connection.
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(db) {
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 run = previous.then(() => this._applySchemaSteps(db), () => this._applySchemaSteps(db))
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}