@warlock.js/core 5.30.0 → 5.32.0
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/CHANGELOG.md +165 -36
- package/README.md +28 -23
- package/bin/source-load-hook.mjs +63 -0
- package/bin/warlock.js +102 -42
- package/esm/application/app.d.mts +3 -3
- package/esm/application/app.d.mts.map +1 -1
- package/esm/application/application-config-types.d.mts +1 -2
- package/esm/application/application-config-types.d.mts.map +1 -1
- package/esm/application/application.d.mts +5 -7
- package/esm/application/application.d.mts.map +1 -1
- package/esm/application/application.mjs +3 -1
- package/esm/application/application.mjs.map +1 -1
- package/esm/application/boot-signal.d.mts +14 -12
- package/esm/application/boot-signal.d.mts.map +1 -1
- package/esm/application/index.d.mts +2 -1
- package/esm/application/index.mjs +1 -1
- package/esm/application/public-url.d.mts +1 -2
- package/esm/application/public-url.d.mts.map +1 -1
- package/esm/application/roles.d.mts +10 -11
- package/esm/application/roles.d.mts.map +1 -1
- package/esm/benchmark/benchmark-snapshots.d.mts +1 -3
- package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
- package/esm/benchmark/benchmark.d.mts +1 -3
- package/esm/benchmark/benchmark.d.mts.map +1 -1
- package/esm/benchmark/channels/console.channel.d.mts +1 -3
- package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
- package/esm/benchmark/channels/noop.channel.d.mts +1 -3
- package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
- package/esm/benchmark/index.mjs +1 -1
- package/esm/benchmark/profiler.d.mts +1 -3
- package/esm/benchmark/profiler.d.mts.map +1 -1
- package/esm/benchmark/profiler.mjs +2 -1
- package/esm/benchmark/profiler.mjs.map +1 -1
- package/esm/benchmark/types.d.mts +22 -17
- package/esm/benchmark/types.d.mts.map +1 -1
- package/esm/bootstrap/setup.d.mts +1 -2
- package/esm/bootstrap/setup.d.mts.map +1 -1
- package/esm/bootstrap.d.mts +1 -2
- package/esm/bootstrap.d.mts.map +1 -1
- package/esm/cache/database-cache-driver.d.mts +3 -5
- package/esm/cache/database-cache-driver.d.mts.map +1 -1
- package/esm/cache/database-cache-driver.mjs +1 -1
- package/esm/cache/index.d.mts +2 -1
- package/esm/cache/index.mjs +1 -1
- package/esm/cli/cli-commands.manager.mjs +6 -3
- package/esm/cli/cli-commands.manager.mjs.map +1 -1
- package/esm/cli/commands/add.command.mjs +4 -2
- package/esm/cli/commands/add.command.mjs.map +1 -1
- package/esm/cli/commands/agents-md/agents-md-command.action.mjs +70 -0
- package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
- package/esm/cli/commands/agents-md.command.mjs +38 -0
- package/esm/cli/commands/agents-md.command.mjs.map +1 -0
- package/esm/cli/commands/board/board-command.action.mjs +279 -0
- package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
- package/esm/cli/commands/board.command.mjs +78 -0
- package/esm/cli/commands/board.command.mjs.map +1 -0
- package/esm/cli/commands/build.command.mjs +6 -1
- package/esm/cli/commands/build.command.mjs.map +1 -1
- package/esm/cli/commands/check/check-command.action.mjs +57 -0
- package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
- package/esm/cli/commands/check/child-typecheck.mjs +66 -0
- package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
- package/esm/cli/commands/check/format-problems.mjs +43 -0
- package/esm/cli/commands/check/format-problems.mjs.map +1 -0
- package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
- package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
- package/esm/cli/commands/check.command.mjs +50 -0
- package/esm/cli/commands/check.command.mjs.map +1 -0
- package/esm/cli/commands/dev-server.command.mjs +12 -3
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
- package/esm/cli/commands/doctor/check.types.d.mts +89 -0
- package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
- package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
- package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +23 -27
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
- package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/doctor-command.action.mjs +15 -6
- package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
- package/esm/cli/commands/doctor/format-report.mjs +30 -2
- package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
- package/esm/cli/commands/doctor.command.mjs +4 -0
- package/esm/cli/commands/doctor.command.mjs.map +1 -1
- package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
- package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
- package/esm/cli/commands/explain.command.mjs +23 -0
- package/esm/cli/commands/explain.command.mjs.map +1 -0
- package/esm/cli/commands/generate/generate.command.mjs +124 -124
- package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs +5 -2
- package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/endpoint.generator.mjs +313 -0
- package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
- package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +4 -3
- package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs +3 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs +3 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs +3 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
- package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
- package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs +136 -0
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
- package/esm/cli/commands/generate/utils/name-parser.mjs +2 -2
- package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
- package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/writer.mjs +38 -13
- package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
- package/esm/cli/commands/inspect/inspect-command.action.mjs +73 -0
- package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
- package/esm/cli/commands/inspect.command.mjs +39 -0
- package/esm/cli/commands/inspect.command.mjs.map +1 -0
- package/esm/cli/commands/issue/collect-environment.mjs +187 -0
- package/esm/cli/commands/issue/collect-environment.mjs.map +1 -0
- package/esm/cli/commands/issue/issue-command.action.mjs +70 -0
- package/esm/cli/commands/issue/issue-command.action.mjs.map +1 -0
- package/esm/cli/commands/issue.command.mjs +31 -0
- package/esm/cli/commands/issue.command.mjs.map +1 -0
- package/esm/cli/commands/mcp/mcp-command.action.mjs +104 -0
- package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
- package/esm/cli/commands/mcp.command.mjs +76 -0
- package/esm/cli/commands/mcp.command.mjs.map +1 -0
- package/esm/cli/commands/openapi-generator.action.mjs +1 -1
- package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
- package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
- package/esm/cli/commands/postman-generator.action.mjs +1 -1
- package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
- package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
- package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
- package/esm/cli/commands/routes/route-row.mjs +1 -1
- package/esm/cli/commands/routes/routes-diff.action.mjs +3 -3
- package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
- package/esm/cli/commands/test.command.mjs +131 -0
- package/esm/cli/commands/test.command.mjs.map +1 -0
- package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
- package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
- package/esm/cli/commands/trace.command.mjs +60 -0
- package/esm/cli/commands/trace.command.mjs.map +1 -0
- package/esm/cli/commands/typecheck.command.mjs +40 -0
- package/esm/cli/commands/typecheck.command.mjs.map +1 -0
- package/esm/cli/commands/upgrade.command.mjs +46 -0
- package/esm/cli/commands/upgrade.command.mjs.map +1 -0
- package/esm/cli/commands-loader.mjs +1 -1
- package/esm/cli/flush-and-exit.mjs +34 -0
- package/esm/cli/flush-and-exit.mjs.map +1 -0
- package/esm/cli/framework-cli-commands.mjs +25 -1
- package/esm/cli/framework-cli-commands.mjs.map +1 -1
- package/esm/cli/parse-cli-args.mjs +3 -2
- package/esm/cli/parse-cli-args.mjs.map +1 -1
- package/esm/cli/start.d.mts +1 -1
- package/esm/cli/string-similarity.mjs +1 -1
- package/esm/commands/cli-command.d.mts +2 -4
- package/esm/commands/cli-command.d.mts.map +1 -1
- package/esm/commands/index.d.mts +2 -1
- package/esm/commands/index.mjs +1 -1
- package/esm/commands/types.d.mts +8 -8
- package/esm/commands/types.d.mts.map +1 -1
- package/esm/config/config-getter.d.mts +2 -3
- package/esm/config/config-getter.d.mts.map +1 -1
- package/esm/config/config-getter.mjs +5 -5
- package/esm/config/config-getter.mjs.map +1 -1
- package/esm/config/config-handlers.d.mts +1 -3
- package/esm/config/config-handlers.d.mts.map +1 -1
- package/esm/config/config-loader.d.mts +1 -2
- package/esm/config/config-loader.d.mts.map +1 -1
- package/esm/config/config-loader.mjs +35 -14
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/config/config-manager.mjs +1 -1
- package/esm/config/config-schema.d.mts +70 -0
- package/esm/config/config-schema.d.mts.map +1 -0
- package/esm/config/config-schema.mjs +77 -0
- package/esm/config/config-schema.mjs.map +1 -0
- package/esm/config/config-setter.d.mts +2 -4
- package/esm/config/config-setter.d.mts.map +1 -1
- package/esm/config/config-setter.mjs +2 -2
- package/esm/config/config-setter.mjs.map +1 -1
- package/esm/config/config-special-handlers.d.mts +2 -4
- package/esm/config/config-special-handlers.d.mts.map +1 -1
- package/esm/config/index.d.mts +7 -0
- package/esm/config/index.mjs +2 -1
- package/esm/config/types.d.mts +4 -5
- package/esm/config/types.d.mts.map +1 -1
- package/esm/connectors/access-connector.d.mts +1 -3
- package/esm/connectors/access-connector.d.mts.map +1 -1
- package/esm/connectors/access-connector.mjs +2 -2
- package/esm/connectors/access-connector.mjs.map +1 -1
- package/esm/connectors/ai-connector.d.mts +1 -3
- package/esm/connectors/ai-connector.d.mts.map +1 -1
- package/esm/connectors/ai-connector.mjs +2 -2
- package/esm/connectors/ai-connector.mjs.map +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -3
- package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
- package/esm/connectors/assert-unique-connector-names.d.mts +1 -3
- package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-unique-connector-names.mjs +26 -1
- package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
- package/esm/connectors/base-connector.d.mts +1 -3
- package/esm/connectors/base-connector.d.mts.map +1 -1
- package/esm/connectors/cache-connector.d.mts +1 -3
- package/esm/connectors/cache-connector.d.mts.map +1 -1
- package/esm/connectors/cache-connector.mjs +3 -3
- package/esm/connectors/cache-connector.mjs.map +1 -1
- package/esm/connectors/connectors-manager.d.mts +2 -4
- package/esm/connectors/connectors-manager.d.mts.map +1 -1
- package/esm/connectors/connectors-manager.mjs +2 -2
- package/esm/connectors/connectors-manager.mjs.map +1 -1
- package/esm/connectors/database-connector.d.mts +1 -3
- package/esm/connectors/database-connector.d.mts.map +1 -1
- package/esm/connectors/database-connector.mjs +2 -2
- package/esm/connectors/database-connector.mjs.map +1 -1
- package/esm/connectors/describe-server-address.mjs +4 -4
- package/esm/connectors/describe-server-address.mjs.map +1 -1
- package/esm/connectors/herald-connector.d.mts +1 -3
- package/esm/connectors/herald-connector.d.mts.map +1 -1
- package/esm/connectors/herald-connector.mjs +2 -2
- package/esm/connectors/herald-connector.mjs.map +1 -1
- package/esm/connectors/http-connector.d.mts +1 -3
- package/esm/connectors/http-connector.d.mts.map +1 -1
- package/esm/connectors/http-connector.mjs +11 -9
- package/esm/connectors/http-connector.mjs.map +1 -1
- package/esm/connectors/index.d.mts +2 -1
- package/esm/connectors/index.mjs +1 -1
- package/esm/connectors/logger-connector.d.mts +1 -3
- package/esm/connectors/logger-connector.d.mts.map +1 -1
- package/esm/connectors/logger-connector.mjs +2 -2
- package/esm/connectors/logger-connector.mjs.map +1 -1
- package/esm/connectors/mail-connector.d.mts +1 -3
- package/esm/connectors/mail-connector.d.mts.map +1 -1
- package/esm/connectors/mail-connector.mjs +2 -2
- package/esm/connectors/mail-connector.mjs.map +1 -1
- package/esm/connectors/notifications-connector.d.mts +1 -3
- package/esm/connectors/notifications-connector.d.mts.map +1 -1
- package/esm/connectors/notifications-connector.mjs +2 -2
- package/esm/connectors/notifications-connector.mjs.map +1 -1
- package/esm/connectors/register-configured-connectors.d.mts +2 -4
- package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
- package/esm/connectors/single-server-warnings.mjs.map +1 -1
- package/esm/connectors/socket-connector.d.mts +1 -3
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs +12 -10
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/connectors/storage.connector.d.mts +1 -3
- package/esm/connectors/storage.connector.d.mts.map +1 -1
- package/esm/connectors/storage.connector.mjs +2 -2
- package/esm/connectors/storage.connector.mjs.map +1 -1
- package/esm/connectors/types.d.mts +17 -14
- package/esm/connectors/types.d.mts.map +1 -1
- package/esm/container/container-instance-registry.mjs.map +1 -1
- package/esm/container/development-app-modules.d.mts +7 -5
- package/esm/container/development-app-modules.d.mts.map +1 -1
- package/esm/container/development-model-modules.d.mts +6 -5
- package/esm/container/development-model-modules.d.mts.map +1 -1
- package/esm/container/index.d.mts +4 -4
- package/esm/container/index.d.mts.map +1 -1
- package/esm/container/index.mjs.map +1 -1
- package/esm/database/index.d.mts +3 -1
- package/esm/database/index.mjs +1 -1
- package/esm/database/migrate-action.mjs +1 -1
- package/esm/database/migrate-action.mjs.map +1 -1
- package/esm/database/models/database-log/database-log.d.mts +2 -31
- package/esm/database/models/database-log/database-log.d.mts.map +1 -1
- package/esm/database/models/database-log/index.d.mts +2 -1
- package/esm/database/models/database-log/index.mjs +1 -1
- package/esm/database/seed-command-action.mjs +1 -1
- package/esm/database/seeds/seeder.d.mts +2 -4
- package/esm/database/seeds/seeder.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.d.mts +6 -3
- package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.mjs +2 -0
- package/esm/database/seeds/seeder.errors.mjs.map +1 -1
- package/esm/database/seeds/seeders.manager.mjs +2 -1
- package/esm/database/seeds/seeders.manager.mjs.map +1 -1
- package/esm/database/seeds/types.d.mts +7 -8
- package/esm/database/seeds/types.d.mts.map +1 -1
- package/esm/database/utils.d.mts +4 -5
- package/esm/database/utils.d.mts.map +1 -1
- package/esm/dev-server/app-module-registry.mjs +1 -1
- package/esm/dev-server/boot-precondition-error.mjs +1 -0
- package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
- package/esm/dev-server/create-worker.mjs +17 -9
- package/esm/dev-server/create-worker.mjs.map +1 -1
- package/esm/dev-server/dependency-graph.d.mts +1 -3
- package/esm/dev-server/dependency-graph.d.mts.map +1 -1
- package/esm/dev-server/dependency-graph.mjs +1 -1
- package/esm/dev-server/dependency-graph.mjs.map +1 -1
- package/esm/dev-server/dev-agent-tooling.mjs +135 -0
- package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
- package/esm/dev-server/dev-logger.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +8 -0
- package/esm/dev-server/development-server.mjs.map +1 -1
- package/esm/dev-server/extract-translation-keys.mjs +16 -17
- package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
- package/esm/dev-server/file-manager.d.mts +3 -7
- package/esm/dev-server/file-manager.d.mts.map +1 -1
- package/esm/dev-server/file-operations.d.mts +1 -3
- package/esm/dev-server/file-operations.d.mts.map +1 -1
- package/esm/dev-server/files-orchestrator.mjs +4 -5
- package/esm/dev-server/files-orchestrator.mjs.map +1 -1
- package/esm/dev-server/files-watcher.mjs +12 -11
- package/esm/dev-server/files-watcher.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
- package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +36 -115
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
- package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +12 -6
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
- package/esm/dev-server/health-checker/file-health-result.d.mts +2 -2
- package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs +16 -4
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
- package/esm/dev-server/health-checker/oxlint-runner.mjs +303 -0
- package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
- package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +1 -1
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
- package/esm/dev-server/health-checker/workers/ts-health.worker.d.mts +1 -1
- package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +40 -174
- package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
- package/esm/dev-server/loader/hook-thread.d.mts +4 -8
- package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
- package/esm/dev-server/loader/load-hook.d.mts +10 -6
- package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
- package/esm/dev-server/loader/load-hook.mjs +4 -3
- package/esm/dev-server/loader/load-hook.mjs.map +1 -1
- package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
- package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
- package/esm/dev-server/loader/own-resolver.mjs +1 -1
- package/esm/dev-server/loader/register-loader.mjs +4 -3
- package/esm/dev-server/loader/register-loader.mjs.map +1 -1
- package/esm/dev-server/loader/resolve-hook.d.mts +2 -2
- package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
- package/esm/dev-server/loader/resolve-hook.mjs +3 -2
- package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
- package/esm/dev-server/loader/transpile-cache.mjs +3 -2
- package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
- package/esm/dev-server/manifest-manager.d.mts +1 -3
- package/esm/dev-server/manifest-manager.d.mts.map +1 -1
- package/esm/dev-server/model-module-registry.mjs +3 -3
- package/esm/dev-server/model-module-registry.mjs.map +1 -1
- package/esm/dev-server/model-resource-typings.mjs +40 -47
- package/esm/dev-server/model-resource-typings.mjs.map +1 -1
- package/esm/dev-server/module-loader.mjs +3 -2
- package/esm/dev-server/module-loader.mjs.map +1 -1
- package/esm/dev-server/package-json-manager.mjs +1 -1
- package/esm/dev-server/parse-imports.mjs +7 -39
- package/esm/dev-server/parse-imports.mjs.map +1 -1
- package/esm/dev-server/read-config-ast.mjs +3 -33
- package/esm/dev-server/read-config-ast.mjs.map +1 -1
- package/esm/dev-server/ready-block.mjs +1 -1
- package/esm/dev-server/route-types-publisher.mjs +1 -1
- package/esm/dev-server/shortcuts.mjs +1 -1
- package/esm/dev-server/special-files-collector.d.mts +2 -4
- package/esm/dev-server/special-files-collector.d.mts.map +1 -1
- package/esm/dev-server/start-development-server.mjs.map +1 -1
- package/esm/dev-server/supervisor.mjs +1 -1
- package/esm/dev-server/translation-keys-sources.mjs +1 -1
- package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
- package/esm/dev-server/tsconfig-manager.mjs +3 -3
- package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
- package/esm/dev-server/type-generator.mjs +31 -38
- package/esm/dev-server/type-generator.mjs.map +1 -1
- package/esm/dev-server/types.d.mts +3 -4
- package/esm/dev-server/types.d.mts.map +1 -1
- package/esm/dev-server/update-check-cache.mjs +2 -2
- package/esm/dev-server/update-check-cache.mjs.map +1 -1
- package/esm/encryption/encrypt.d.mts +2 -3
- package/esm/encryption/encrypt.d.mts.map +1 -1
- package/esm/encryption/hash.d.mts +1 -2
- package/esm/encryption/hash.d.mts.map +1 -1
- package/esm/encryption/index.mjs +1 -1
- package/esm/encryption/password.d.mts +2 -3
- package/esm/encryption/password.d.mts.map +1 -1
- package/esm/encryption/types.d.mts +2 -3
- package/esm/encryption/types.d.mts.map +1 -1
- package/esm/errors/container-key-missing-error.mjs +1 -0
- package/esm/errors/container-key-missing-error.mjs.map +1 -1
- package/esm/errors/error-codes.d.mts +660 -0
- package/esm/errors/error-codes.d.mts.map +1 -0
- package/esm/errors/error-codes.mjs +634 -0
- package/esm/errors/error-codes.mjs.map +1 -0
- package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
- package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
- package/esm/errors/index.d.mts +3 -1
- package/esm/errors/index.mjs +3 -1
- package/esm/errors/unknown-locale-error.mjs +1 -0
- package/esm/errors/unknown-locale-error.mjs.map +1 -1
- package/esm/errors/warlock-error.d.mts +21 -0
- package/esm/errors/warlock-error.d.mts.map +1 -0
- package/esm/errors/warlock-error.mjs +22 -0
- package/esm/errors/warlock-error.mjs.map +1 -0
- package/esm/generations/add-command.action.mjs +22 -5
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/features/access.feature.mjs +1 -1
- package/esm/generations/features/access.feature.mjs.map +1 -1
- package/esm/generations/features/bull-board.feature.mjs +3 -2
- package/esm/generations/features/bull-board.feature.mjs.map +1 -1
- package/esm/generations/features/mysql.feature.mjs.map +1 -1
- package/esm/generations/features/notifications.feature.mjs +7 -3
- package/esm/generations/features/notifications.feature.mjs.map +1 -1
- package/esm/generations/features/queue.feature.mjs +1 -1
- package/esm/generations/features/queue.feature.mjs.map +1 -1
- package/esm/generations/features/react-email.feature.mjs +1 -1
- package/esm/generations/features/react-email.feature.mjs.map +1 -1
- package/esm/generations/features/shadcn.feature.mjs +1 -1
- package/esm/generations/features/shadcn.feature.mjs.map +1 -1
- package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
- package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
- package/esm/generations/features/shared/merge-web-sitemap-config.mjs +16 -23
- package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
- package/esm/generations/features/shared/patch-tsconfig-include.mjs +2 -2
- package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
- package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +2 -2
- package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
- package/esm/generations/features/sitemap.feature.mjs +3 -2
- package/esm/generations/features/sitemap.feature.mjs.map +1 -1
- package/esm/generations/features/tailwind.feature.mjs +1 -1
- package/esm/generations/features/tailwind.feature.mjs.map +1 -1
- package/esm/generations/features/test.feature.mjs +11 -6
- package/esm/generations/features/test.feature.mjs.map +1 -1
- package/esm/generations/features/web.feature.mjs +1 -1
- package/esm/generations/features/web.feature.mjs.map +1 -1
- package/esm/generations/generation-fs.mjs +73 -0
- package/esm/generations/generation-fs.mjs.map +1 -0
- package/esm/generations/generation-run.mjs +185 -0
- package/esm/generations/generation-run.mjs.map +1 -0
- package/esm/generations/stubs.mjs +156 -14
- package/esm/generations/stubs.mjs.map +1 -1
- package/esm/http/boot-port-preflight.d.mts +4 -5
- package/esm/http/boot-port-preflight.d.mts.map +1 -1
- package/esm/http/boot-port-preflight.mjs +2 -2
- package/esm/http/boot-port-preflight.mjs.map +1 -1
- package/esm/http/bounded-stream-queue.d.mts +10 -0
- package/esm/http/bounded-stream-queue.d.mts.map +1 -0
- package/esm/http/bounded-stream-queue.mjs +97 -0
- package/esm/http/bounded-stream-queue.mjs.map +1 -0
- package/esm/http/build-cors-options.mjs +2 -2
- package/esm/http/build-cors-options.mjs.map +1 -1
- package/esm/http/build-rate-limit-options.d.mts +15 -3
- package/esm/http/build-rate-limit-options.d.mts.map +1 -1
- package/esm/http/build-rate-limit-options.mjs +1 -1
- package/esm/http/build-rate-limit-options.mjs.map +1 -1
- package/esm/http/conditional-request.d.mts +87 -0
- package/esm/http/conditional-request.d.mts.map +1 -0
- package/esm/http/conditional-request.mjs +121 -0
- package/esm/http/conditional-request.mjs.map +1 -0
- package/esm/http/config.d.mts +2 -4
- package/esm/http/config.d.mts.map +1 -1
- package/esm/http/config.mjs +2 -2
- package/esm/http/config.mjs.map +1 -1
- package/esm/http/context/request-context.d.mts +6 -7
- package/esm/http/context/request-context.d.mts.map +1 -1
- package/esm/http/context/request-memo.d.mts +1 -2
- package/esm/http/context/request-memo.d.mts.map +1 -1
- package/esm/http/createHttpApplication.d.mts +2 -3
- package/esm/http/createHttpApplication.d.mts.map +1 -1
- package/esm/http/createHttpApplication.mjs +2 -2
- package/esm/http/createHttpApplication.mjs.map +1 -1
- package/esm/http/csp.d.mts +12 -12
- package/esm/http/csp.d.mts.map +1 -1
- package/esm/http/csp.mjs +3 -2
- package/esm/http/csp.mjs.map +1 -1
- package/esm/http/csrf-default-guard.d.mts +2 -4
- package/esm/http/csrf-default-guard.d.mts.map +1 -1
- package/esm/http/csrf-default-guard.mjs +1 -1
- package/esm/http/csrf-default-guard.mjs.map +1 -1
- package/esm/http/csrf-origin-policy.d.mts +7 -9
- package/esm/http/csrf-origin-policy.d.mts.map +1 -1
- package/esm/http/csrf-origin-policy.mjs +2 -2
- package/esm/http/csrf-origin-policy.mjs.map +1 -1
- package/esm/http/database/RequestLog.d.mts +26 -87
- package/esm/http/database/RequestLog.d.mts.map +1 -1
- package/esm/http/error-codes.d.mts +1 -2
- package/esm/http/error-codes.d.mts.map +1 -1
- package/esm/http/error-mapper.d.mts +2 -4
- package/esm/http/error-mapper.d.mts.map +1 -1
- package/esm/http/error-mapper.mjs +2 -2
- package/esm/http/error-mapper.mjs.map +1 -1
- package/esm/http/errors/errors.d.mts +30 -29
- package/esm/http/errors/errors.d.mts.map +1 -1
- package/esm/http/errors/errors.mjs +1 -0
- package/esm/http/errors/errors.mjs.map +1 -1
- package/esm/http/escape-header-value.d.mts +17 -0
- package/esm/http/escape-header-value.d.mts.map +1 -0
- package/esm/http/escape-header-value.mjs +27 -0
- package/esm/http/escape-header-value.mjs.map +1 -0
- package/esm/http/events.d.mts +2 -4
- package/esm/http/events.d.mts.map +1 -1
- package/esm/http/flush-pending-cookies.mjs.map +1 -1
- package/esm/http/health.d.mts +4 -4
- package/esm/http/health.d.mts.map +1 -1
- package/esm/http/index.d.mts +9 -3
- package/esm/http/index.mjs +5 -2
- package/esm/http/lazy-static.mjs +194 -0
- package/esm/http/lazy-static.mjs.map +1 -0
- package/esm/http/middleware/cache-response-middleware.d.mts +2 -4
- package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.d.mts +3 -3
- package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
- package/esm/http/middleware/idempotency.middleware.d.mts +3 -3
- package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
- package/esm/http/middleware/idempotency.middleware.mjs +6 -6
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/middleware/index.d.mts +3 -1
- package/esm/http/middleware/index.mjs +1 -1
- package/esm/http/middleware/inject-request-context.d.mts +2 -4
- package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
- package/esm/http/middleware/inject-request-context.mjs +3 -3
- package/esm/http/middleware/inject-request-context.mjs.map +1 -1
- package/esm/http/middleware/ip-filter.middleware.d.mts +3 -3
- package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
- package/esm/http/middleware/maintenance.middleware.d.mts +3 -3
- package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
- package/esm/http/middleware/maintenance.middleware.mjs +4 -4
- package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
- package/esm/http/middleware/max-body-size.middleware.d.mts +2 -2
- package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
- package/esm/http/middleware/middleware-list.d.mts +1 -3
- package/esm/http/middleware/middleware-list.d.mts.map +1 -1
- package/esm/http/middleware/rate-limit.middleware.d.mts +3 -3
- package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
- package/esm/http/middleware/rate-limit.middleware.mjs +2 -2
- package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
- package/esm/http/middleware/utils/cidr-match.d.mts +2 -3
- package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
- package/esm/http/middleware/utils/idempotency-key.d.mts +3 -5
- package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
- package/esm/http/middleware/utils/index.d.mts +2 -1
- package/esm/http/middleware/utils/parse-size.d.mts +1 -2
- package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
- package/esm/http/middleware/utils/parse-size.mjs +2 -2
- package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
- package/esm/http/plugins.d.mts +2 -4
- package/esm/http/plugins.d.mts.map +1 -1
- package/esm/http/plugins.mjs +17 -14
- package/esm/http/plugins.mjs.map +1 -1
- package/esm/http/port-preflight.d.mts +3 -4
- package/esm/http/port-preflight.d.mts.map +1 -1
- package/esm/http/rate-limit-cache-store.mjs +6 -4
- package/esm/http/rate-limit-cache-store.mjs.map +1 -1
- package/esm/http/ready-report.d.mts +15 -10
- package/esm/http/ready-report.d.mts.map +1 -1
- package/esm/http/request-controller.d.mts +1 -3
- package/esm/http/request-controller.d.mts.map +1 -1
- package/esm/http/request-log-snapshot.d.mts +26 -15
- package/esm/http/request-log-snapshot.d.mts.map +1 -1
- package/esm/http/request-log-snapshot.mjs +85 -6
- package/esm/http/request-log-snapshot.mjs.map +1 -1
- package/esm/http/request.d.mts +6 -5
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +13 -11
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +23 -12
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +169 -81
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/safe-redirect.d.mts +50 -0
- package/esm/http/safe-redirect.d.mts.map +1 -0
- package/esm/http/safe-redirect.mjs +80 -0
- package/esm/http/safe-redirect.mjs.map +1 -0
- package/esm/http/serialized.d.mts +12 -13
- package/esm/http/serialized.d.mts.map +1 -1
- package/esm/http/server-rebuilt.d.mts +3 -5
- package/esm/http/server-rebuilt.d.mts.map +1 -1
- package/esm/http/server.d.mts +11 -9
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +17 -7
- package/esm/http/server.mjs.map +1 -1
- package/esm/http/stream-react-response.d.mts +7 -7
- package/esm/http/stream-react-response.d.mts.map +1 -1
- package/esm/http/stream-transport.mjs +4 -2
- package/esm/http/stream-transport.mjs.map +1 -1
- package/esm/http/tracing/index.mjs +1 -1
- package/esm/http/tracing/trace-id.d.mts +2 -3
- package/esm/http/tracing/trace-id.d.mts.map +1 -1
- package/esm/http/tracing/tracing-dispatcher.d.mts +10 -11
- package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
- package/esm/http/tracing/tracing-dispatcher.mjs +2 -2
- package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
- package/esm/http/tracing/tracing.type.d.mts +11 -9
- package/esm/http/tracing/tracing.type.d.mts.map +1 -1
- package/esm/http/types.d.mts +78 -39
- package/esm/http/types.d.mts.map +1 -1
- package/esm/http/uploaded-file.d.mts +6 -5
- package/esm/http/uploaded-file.d.mts.map +1 -1
- package/esm/http/uploads/generate-image-variant.mjs +1 -1
- package/esm/http/uploads/generate-image-variants.d.mts +13 -10
- package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/generate-image-variants.mjs +62 -25
- package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
- package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
- package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
- package/esm/http/uploads/image-variant-cache.mjs +72 -30
- package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
- package/esm/http/uploads/image-variant-types.d.mts +9 -9
- package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
- package/esm/http/uploads/image-variants-config-error.d.mts +4 -3
- package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
- package/esm/http/uploads/image-variants-config-error.mjs +3 -2
- package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
- package/esm/http/uploads/index.d.mts +2 -1
- package/esm/http/uploads/index.mjs +1 -1
- package/esm/http/uploads/load-variant-source.mjs +1 -1
- package/esm/http/uploads/load-variant-source.mjs.map +1 -1
- package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
- package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
- package/esm/http/uploads/purge-image-variants.d.mts +9 -6
- package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/purge-image-variants.mjs +16 -16
- package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
- package/esm/http/uploads/remote-variant-source.mjs +115 -0
- package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
- package/esm/http/uploads/resolve-image-variant.d.mts +6 -9
- package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
- package/esm/http/uploads/resolve-image-variant.mjs +10 -18
- package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
- package/esm/http/uploads/resolve-image-variants-config.mjs +7 -5
- package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
- package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
- package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
- package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
- package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
- package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
- package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
- package/esm/http/uploads/uploaded-file.controller.d.mts +9 -6
- package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
- package/esm/http/uploads/uploaded-file.controller.mjs +18 -9
- package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
- package/esm/http/uploads/variant-cache-key.mjs +2 -2
- package/esm/http/uploads-config.d.mts +2 -4
- package/esm/http/uploads-config.d.mts.map +1 -1
- package/esm/http/uploads-types.d.mts +22 -16
- package/esm/http/uploads-types.d.mts.map +1 -1
- package/esm/http/xmlable.d.mts +1 -2
- package/esm/http/xmlable.d.mts.map +1 -1
- package/esm/image/image.d.mts +6 -7
- package/esm/image/image.d.mts.map +1 -1
- package/esm/image/image.mjs.map +1 -1
- package/esm/image/index.d.mts +2 -1
- package/esm/image/index.mjs +1 -1
- package/esm/index.d.mts +38 -6
- package/esm/index.mjs +14 -3
- package/esm/loader/app-module-importer.d.mts +1 -2
- package/esm/loader/app-module-importer.d.mts.map +1 -1
- package/esm/localization/index.mjs +1 -1
- package/esm/localization/parse-locale-dictionary.d.mts +6 -5
- package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
- package/esm/localization/parse-locale-dictionary.mjs +2 -1
- package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
- package/esm/localization/register-locale-dictionary.d.mts +3 -4
- package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
- package/esm/localization/register-locale-dictionary.mjs +2 -2
- package/esm/localization/register-locale-dictionary.mjs.map +1 -1
- package/esm/logger/fatal-visibility.d.mts +1 -2
- package/esm/logger/fatal-visibility.d.mts.map +1 -1
- package/esm/logger/index.d.mts +2 -1
- package/esm/logger/index.mjs +1 -1
- package/esm/logger/logger.d.mts +1 -3
- package/esm/logger/logger.d.mts.map +1 -1
- package/esm/logger/types.d.mts +2 -3
- package/esm/logger/types.d.mts.map +1 -1
- package/esm/mail/config.d.mts +21 -12
- package/esm/mail/config.d.mts.map +1 -1
- package/esm/mail/config.mjs +16 -1
- package/esm/mail/config.mjs.map +1 -1
- package/esm/mail/events.d.mts +4 -6
- package/esm/mail/events.d.mts.map +1 -1
- package/esm/mail/index.d.mts +3 -2
- package/esm/mail/index.mjs +2 -2
- package/esm/mail/mail.d.mts +1 -3
- package/esm/mail/mail.d.mts.map +1 -1
- package/esm/mail/mailer-pool.d.mts +5 -7
- package/esm/mail/mailer-pool.d.mts.map +1 -1
- package/esm/mail/react-mail.d.mts +1 -3
- package/esm/mail/react-mail.d.mts.map +1 -1
- package/esm/mail/send-mail.d.mts +1 -3
- package/esm/mail/send-mail.d.mts.map +1 -1
- package/esm/mail/send-mail.mjs +2 -1
- package/esm/mail/send-mail.mjs.map +1 -1
- package/esm/mail/test-mailbox.d.mts +11 -13
- package/esm/mail/test-mailbox.d.mts.map +1 -1
- package/esm/mail/types.d.mts +17 -18
- package/esm/mail/types.d.mts.map +1 -1
- package/esm/manifest/manifest-manager.mjs +1 -1
- package/esm/net/index.d.mts +2 -0
- package/esm/net/index.mjs +3 -0
- package/esm/openapi/build-openapi-document.d.mts +2 -4
- package/esm/openapi/build-openapi-document.d.mts.map +1 -1
- package/esm/openapi/build-openapi-document.mjs +8 -5
- package/esm/openapi/build-openapi-document.mjs.map +1 -1
- package/esm/openapi/cast-schema.mjs +1 -1
- package/esm/openapi/development-openapi-provider.d.mts +5 -6
- package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
- package/esm/openapi/error-responses.mjs +28 -2
- package/esm/openapi/error-responses.mjs.map +1 -1
- package/esm/openapi/index.d.mts +3 -1
- package/esm/openapi/index.mjs +1 -1
- package/esm/openapi/openapi-child-output.mjs +2 -2
- package/esm/openapi/openapi-child-output.mjs.map +1 -1
- package/esm/openapi/postman/build-request-body.mjs.map +1 -1
- package/esm/openapi/postman/build-request-url.mjs +1 -1
- package/esm/openapi/postman/build-request-url.mjs.map +1 -1
- package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
- package/esm/openapi/postman/example-from-schema.d.mts +1 -3
- package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
- package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
- package/esm/openapi/postman/index.d.mts +2 -1
- package/esm/openapi/postman/openapi-to-postman-collection.d.mts +3 -5
- package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
- package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
- package/esm/openapi/postman/postman-types.d.mts +19 -18
- package/esm/openapi/postman/postman-types.d.mts.map +1 -1
- package/esm/openapi/postman/schema-refs.d.mts +1 -3
- package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
- package/esm/openapi/postman/schema-refs.mjs.map +1 -1
- package/esm/openapi/postman/uuid-v5.mjs +1 -1
- package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
- package/esm/openapi/request-schemas.mjs.map +1 -1
- package/esm/openapi/response-schemas.mjs.map +1 -1
- package/esm/openapi/schema-registry.d.mts +1 -0
- package/esm/openapi/schema-registry.mjs.map +1 -1
- package/esm/openapi/security.mjs +1 -1
- package/esm/openapi/security.mjs.map +1 -1
- package/esm/openapi/types.d.mts +23 -20
- package/esm/openapi/types.d.mts.map +1 -1
- package/esm/production/assert-generated-imports.mjs +2 -1
- package/esm/production/assert-generated-imports.mjs.map +1 -1
- package/esm/production/build-contributions.mjs +1 -1
- package/esm/production/bundle-framework-dependencies.mjs +1 -1
- package/esm/production/dist-build-manifest.mjs +1 -1
- package/esm/production/esbuild-plugins.mjs.map +1 -1
- package/esm/production/esbuild-preflight.mjs +1 -1
- package/esm/production/production-builder.mjs +14 -5
- package/esm/production/production-builder.mjs.map +1 -1
- package/esm/production/production-supervisor.mjs +1 -1
- package/esm/production/registration-child-runner.mjs +4 -3
- package/esm/production/registration-child-runner.mjs.map +1 -1
- package/esm/production/resolve-build-config.d.mts +4 -4
- package/esm/production/resolve-build-config.d.mts.map +1 -1
- package/esm/production/resolve-build-config.mjs +2 -1
- package/esm/production/resolve-build-config.mjs.map +1 -1
- package/esm/production/route-registration-child.d.mts +1 -1
- package/esm/production/route-registration-child.mjs +8 -7
- package/esm/production/route-registration-child.mjs.map +1 -1
- package/esm/production/route-registration-snapshot.mjs.map +1 -1
- package/esm/production/tsconfig-path-aliases.mjs +1 -1
- package/esm/react/index.d.mts +1 -3
- package/esm/react/index.d.mts.map +1 -1
- package/esm/react/index.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +3 -4
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +2 -3
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs +10 -9
- package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/index.d.mts +2 -1
- package/esm/repositories/adapters/cascade/index.mjs +1 -1
- package/esm/repositories/contracts/index.d.mts +2 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts +4 -6
- package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -3
- package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
- package/esm/repositories/contracts/types.d.mts +23 -25
- package/esm/repositories/contracts/types.d.mts.map +1 -1
- package/esm/repositories/index.d.mts +4 -1
- package/esm/repositories/index.mjs +1 -1
- package/esm/repositories/repository.manager.d.mts +2 -3
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +2 -2
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/resource/define-resource.d.mts +3 -5
- package/esm/resource/define-resource.d.mts.map +1 -1
- package/esm/resource/index.d.mts +2 -1
- package/esm/resource/index.mjs +1 -1
- package/esm/resource/nullable-resource.d.mts +5 -7
- package/esm/resource/nullable-resource.d.mts.map +1 -1
- package/esm/resource/register-resource.d.mts +1 -3
- package/esm/resource/register-resource.d.mts.map +1 -1
- package/esm/resource/resource-field-builder.d.mts +1 -3
- package/esm/resource/resource-field-builder.d.mts.map +1 -1
- package/esm/resource/resource.d.mts +3 -5
- package/esm/resource/resource.d.mts.map +1 -1
- package/esm/resource/resource.mjs +4 -2
- package/esm/resource/resource.mjs.map +1 -1
- package/esm/resource/types.d.mts +21 -21
- package/esm/resource/types.d.mts.map +1 -1
- package/esm/restful/index.d.mts +2 -1
- package/esm/restful/index.mjs +1 -1
- package/esm/restful/restful.d.mts +11 -31
- package/esm/restful/restful.d.mts.map +1 -1
- package/esm/restful/restful.mjs.map +1 -1
- package/esm/router/build-route-rate-limit.mjs.map +1 -1
- package/esm/router/dev-dispatch.mjs +31 -12
- package/esm/router/dev-dispatch.mjs.map +1 -1
- package/esm/router/index.d.mts +5 -2
- package/esm/router/index.mjs +3 -1
- package/esm/router/log-request-lifecycle.mjs.map +1 -1
- package/esm/router/named-api-routes-with-responses.mjs +2 -1
- package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
- package/esm/router/normalize-request-path.d.mts +1 -2
- package/esm/router/normalize-request-path.d.mts.map +1 -1
- package/esm/router/normalize-route-path.d.mts +1 -2
- package/esm/router/normalize-route-path.d.mts.map +1 -1
- package/esm/router/positional-handler-diagnostics.d.mts +15 -13
- package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
- package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
- package/esm/router/resolve-route-rate-limit.mjs +47 -0
- package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
- package/esm/router/resolve-route-validation.mjs +19 -0
- package/esm/router/resolve-route-validation.mjs.map +1 -0
- package/esm/router/route-builder.d.mts +1 -3
- package/esm/router/route-builder.d.mts.map +1 -1
- package/esm/router/route-guard-names.mjs +30 -0
- package/esm/router/route-guard-names.mjs.map +1 -0
- package/esm/router/route-name-method-suffix.d.mts +2 -3
- package/esm/router/route-name-method-suffix.d.mts.map +1 -1
- package/esm/router/route-name-taken-error.d.mts +12 -0
- package/esm/router/route-name-taken-error.d.mts.map +1 -0
- package/esm/router/route-name-taken-error.mjs +18 -0
- package/esm/router/route-name-taken-error.mjs.map +1 -0
- package/esm/router/route-registry.d.mts +1 -3
- package/esm/router/route-registry.d.mts.map +1 -1
- package/esm/router/router.d.mts +34 -17
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +74 -39
- package/esm/router/router.mjs.map +1 -1
- package/esm/router/types.d.mts +156 -37
- package/esm/router/types.d.mts.map +1 -1
- package/esm/router/unguarded-route-diagnostics.d.mts +38 -0
- package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
- package/esm/router/unguarded-route-diagnostics.mjs +95 -0
- package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
- package/esm/socket/index.d.mts +2 -1
- package/esm/socket/index.mjs +1 -1
- package/esm/socket/types.d.mts +2 -4
- package/esm/socket/types.d.mts.map +1 -1
- package/esm/socket/utils.d.mts +1 -3
- package/esm/socket/utils.d.mts.map +1 -1
- package/esm/storage/config.d.mts +4 -6
- package/esm/storage/config.d.mts.map +1 -1
- package/esm/storage/context/storage-driver-context.d.mts +3 -4
- package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts +2 -4
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/do-spaces-driver.d.mts +1 -3
- package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts +2 -3
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs +8 -3
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/drivers/r2-driver.d.mts +1 -3
- package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
- package/esm/storage/drivers/s3-driver.d.mts +1 -3
- package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
- package/esm/storage/index.d.mts +2 -1
- package/esm/storage/index.mjs +1 -1
- package/esm/storage/local-disk-roots.mjs +24 -0
- package/esm/storage/local-disk-roots.mjs.map +1 -0
- package/esm/storage/scoped-storage.d.mts +2 -3
- package/esm/storage/scoped-storage.d.mts.map +1 -1
- package/esm/storage/storage-file.d.mts +1 -3
- package/esm/storage/storage-file.d.mts.map +1 -1
- package/esm/storage/storage.d.mts +17 -4
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +22 -0
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts +36 -36
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/classify-ip-address.d.mts +1 -2
- package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
- package/esm/storage/utils/contain-path.d.mts +1 -2
- package/esm/storage/utils/contain-path.d.mts.map +1 -1
- package/esm/storage/utils/mime.d.mts +2 -3
- package/esm/storage/utils/mime.d.mts.map +1 -1
- package/esm/storage/utils/safe-fetch.d.mts +6 -6
- package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
- package/esm/storage/utils/safe-fetch.mjs +3 -3
- package/esm/storage/utils/safe-fetch.mjs.map +1 -1
- package/esm/storage/utils/storage-capability-error.d.mts +1 -3
- package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
- package/esm/storage/utils/storage-error.d.mts +2 -3
- package/esm/storage/utils/storage-error.d.mts.map +1 -1
- package/esm/storage/utils/storage-not-initialized-error.d.mts +3 -2
- package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
- package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
- package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
- package/esm/tests/authenticated-test-client.d.mts +31 -0
- package/esm/tests/authenticated-test-client.d.mts.map +1 -0
- package/esm/tests/authenticated-test-client.mjs +40 -0
- package/esm/tests/authenticated-test-client.mjs.map +1 -0
- package/esm/tests/factories.d.mts +74 -0
- package/esm/tests/factories.d.mts.map +1 -0
- package/esm/tests/factories.mjs +105 -0
- package/esm/tests/factories.mjs.map +1 -0
- package/esm/tests/fakes/cache-fake.d.mts +34 -0
- package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
- package/esm/tests/fakes/cache-fake.mjs +79 -0
- package/esm/tests/fakes/cache-fake.mjs.map +1 -0
- package/esm/tests/fakes/clock-fake.d.mts +37 -0
- package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
- package/esm/tests/fakes/clock-fake.mjs +69 -0
- package/esm/tests/fakes/clock-fake.mjs.map +1 -0
- package/esm/tests/fakes/fake-assertion-error.d.mts +12 -0
- package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
- package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
- package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
- package/esm/tests/fakes/ids-fake.d.mts +23 -0
- package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
- package/esm/tests/fakes/ids-fake.mjs +57 -0
- package/esm/tests/fakes/ids-fake.mjs.map +1 -0
- package/esm/tests/fakes/index.d.mts +9 -0
- package/esm/tests/fakes/index.mjs +10 -0
- package/esm/tests/fakes/mail-fake.d.mts +49 -0
- package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
- package/esm/tests/fakes/mail-fake.mjs +111 -0
- package/esm/tests/fakes/mail-fake.mjs.map +1 -0
- package/esm/tests/fakes/queue-fake.d.mts +56 -0
- package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
- package/esm/tests/fakes/queue-fake.mjs +134 -0
- package/esm/tests/fakes/queue-fake.mjs.map +1 -0
- package/esm/tests/fakes/storage-fake.d.mts +35 -0
- package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
- package/esm/tests/fakes/storage-fake.mjs +122 -0
- package/esm/tests/fakes/storage-fake.mjs.map +1 -0
- package/esm/tests/fakes/test-fakes.d.mts +38 -0
- package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
- package/esm/tests/fakes/test-fakes.mjs +90 -0
- package/esm/tests/fakes/test-fakes.mjs.map +1 -0
- package/esm/tests/index.d.mts +15 -2
- package/esm/tests/index.mjs +15 -2
- package/esm/tests/snapshot-response.d.mts +33 -0
- package/esm/tests/snapshot-response.d.mts.map +1 -0
- package/esm/tests/snapshot-response.mjs +42 -0
- package/esm/tests/snapshot-response.mjs.map +1 -0
- package/esm/tests/start-http-development-server.d.mts +25 -5
- package/esm/tests/start-http-development-server.d.mts.map +1 -1
- package/esm/tests/start-http-development-server.mjs +41 -8
- package/esm/tests/start-http-development-server.mjs.map +1 -1
- package/esm/tests/test-connectors-selection.d.mts +2 -2
- package/esm/tests/test-connectors-selection.d.mts.map +1 -1
- package/esm/tests/test-connectors-selection.mjs +1 -1
- package/esm/tests/test-helpers.d.mts +28 -10
- package/esm/tests/test-helpers.d.mts.map +1 -1
- package/esm/tests/test-helpers.mjs +40 -27
- package/esm/tests/test-helpers.mjs.map +1 -1
- package/esm/tests/test-http-server.d.mts +66 -0
- package/esm/tests/test-http-server.d.mts.map +1 -0
- package/esm/tests/test-http-server.mjs +119 -0
- package/esm/tests/test-http-server.mjs.map +1 -0
- package/esm/tests/test-lifecycle-state.mjs +1 -1
- package/esm/tests/vitest-setup.d.mts +17 -7
- package/esm/tests/vitest-setup.d.mts.map +1 -1
- package/esm/tests/vitest-setup.mjs +12 -4
- package/esm/tests/vitest-setup.mjs.map +1 -1
- package/esm/tooling/agents-md/agents-md-markers.d.mts +26 -0
- package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
- package/esm/tooling/agents-md/agents-md-markers.mjs +60 -0
- package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
- package/esm/tooling/agents-md/agents-md-refresher.d.mts +43 -0
- package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
- package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
- package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
- package/esm/tooling/agents-md/index.mjs +7 -0
- package/esm/tooling/agents-md/installed-skills.d.mts +34 -0
- package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
- package/esm/tooling/agents-md/installed-skills.mjs +74 -0
- package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
- package/esm/tooling/agents-md/render-agents-md.d.mts +34 -0
- package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
- package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
- package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
- package/esm/tooling/agents-md/write-agents-md.d.mts +38 -0
- package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
- package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
- package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
- package/esm/tooling/board/board-message.d.mts +29 -0
- package/esm/tooling/board/board-message.d.mts.map +1 -0
- package/esm/tooling/board/board-message.mjs +86 -0
- package/esm/tooling/board/board-message.mjs.map +1 -0
- package/esm/tooling/board/board.d.mts +121 -0
- package/esm/tooling/board/board.d.mts.map +1 -0
- package/esm/tooling/board/board.mjs +407 -0
- package/esm/tooling/board/board.mjs.map +1 -0
- package/esm/tooling/board/board.types.d.mts +81 -0
- package/esm/tooling/board/board.types.d.mts.map +1 -0
- package/esm/tooling/board/board.types.mjs +54 -0
- package/esm/tooling/board/board.types.mjs.map +1 -0
- package/esm/tooling/check/changed-files.d.mts +31 -0
- package/esm/tooling/check/changed-files.d.mts.map +1 -0
- package/esm/tooling/check/changed-files.mjs +73 -0
- package/esm/tooling/check/changed-files.mjs.map +1 -0
- package/esm/tooling/check/check-report.types.d.mts +67 -0
- package/esm/tooling/check/check-report.types.d.mts.map +1 -0
- package/esm/tooling/check/check-report.types.mjs +37 -0
- package/esm/tooling/check/check-report.types.mjs.map +1 -0
- package/esm/tooling/check/code-style-conventions.mjs +106 -0
- package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
- package/esm/tooling/check/conventions-step.d.mts +32 -0
- package/esm/tooling/check/conventions-step.d.mts.map +1 -0
- package/esm/tooling/check/conventions-step.mjs +173 -0
- package/esm/tooling/check/conventions-step.mjs.map +1 -0
- package/esm/tooling/check/environment-step.d.mts +16 -0
- package/esm/tooling/check/environment-step.d.mts.map +1 -0
- package/esm/tooling/check/environment-step.mjs +78 -0
- package/esm/tooling/check/environment-step.mjs.map +1 -0
- package/esm/tooling/check/index.mjs +10 -0
- package/esm/tooling/check/lint-step.d.mts +18 -0
- package/esm/tooling/check/lint-step.d.mts.map +1 -0
- package/esm/tooling/check/lint-step.mjs +112 -0
- package/esm/tooling/check/lint-step.mjs.map +1 -0
- package/esm/tooling/check/request-input.mjs +132 -0
- package/esm/tooling/check/request-input.mjs.map +1 -0
- package/esm/tooling/check/run-check.d.mts +43 -0
- package/esm/tooling/check/run-check.d.mts.map +1 -0
- package/esm/tooling/check/run-check.mjs +192 -0
- package/esm/tooling/check/run-check.mjs.map +1 -0
- package/esm/tooling/check/run-tests.d.mts +55 -0
- package/esm/tooling/check/run-tests.d.mts.map +1 -0
- package/esm/tooling/check/run-tests.mjs +93 -0
- package/esm/tooling/check/run-tests.mjs.map +1 -0
- package/esm/tooling/check/security-conventions.mjs +650 -0
- package/esm/tooling/check/security-conventions.mjs.map +1 -0
- package/esm/tooling/check/source-ast.mjs +155 -0
- package/esm/tooling/check/source-ast.mjs.map +1 -0
- package/esm/tooling/check/source-files.mjs +27 -0
- package/esm/tooling/check/source-files.mjs.map +1 -0
- package/esm/tooling/check/tests-step.d.mts +33 -0
- package/esm/tooling/check/tests-step.d.mts.map +1 -0
- package/esm/tooling/check/tests-step.mjs +177 -0
- package/esm/tooling/check/tests-step.mjs.map +1 -0
- package/esm/tooling/dev-state/dev-server-state.d.mts +43 -0
- package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
- package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
- package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
- package/esm/tooling/devtools/devtools-client.d.mts +100 -0
- package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
- package/esm/tooling/devtools/devtools-client.mjs +155 -0
- package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
- package/esm/tooling/generate/generation.d.mts +90 -0
- package/esm/tooling/generate/generation.d.mts.map +1 -0
- package/esm/tooling/generate/generation.mjs +127 -0
- package/esm/tooling/generate/generation.mjs.map +1 -0
- package/esm/tooling/generate/generator-spec.d.mts +57 -0
- package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
- package/esm/tooling/generate/generator-spec.mjs +102 -0
- package/esm/tooling/generate/generator-spec.mjs.map +1 -0
- package/esm/tooling/generate/index.mjs +6 -0
- package/esm/tooling/generate/project-files.mjs +121 -0
- package/esm/tooling/generate/project-files.mjs.map +1 -0
- package/esm/tooling/generate/run-cli.d.mts +43 -0
- package/esm/tooling/generate/run-cli.d.mts.map +1 -0
- package/esm/tooling/generate/run-cli.mjs +93 -0
- package/esm/tooling/generate/run-cli.mjs.map +1 -0
- package/esm/tooling/generate/unified-diff.d.mts +40 -0
- package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
- package/esm/tooling/generate/unified-diff.mjs +161 -0
- package/esm/tooling/generate/unified-diff.mjs.map +1 -0
- package/esm/tooling/index.d.mts +42 -0
- package/esm/tooling/index.mjs +45 -0
- package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
- package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
- package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
- package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
- package/esm/tooling/inspect/collect-config.mjs +77 -0
- package/esm/tooling/inspect/collect-config.mjs.map +1 -0
- package/esm/tooling/inspect/collect-models.d.mts +10 -0
- package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
- package/esm/tooling/inspect/collect-models.mjs +154 -0
- package/esm/tooling/inspect/collect-models.mjs.map +1 -0
- package/esm/tooling/inspect/collect-packages.d.mts +9 -0
- package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
- package/esm/tooling/inspect/collect-packages.mjs +157 -0
- package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
- package/esm/tooling/inspect/collect-pages.mjs +108 -0
- package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
- package/esm/tooling/inspect/collect-routes.mjs +168 -0
- package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
- package/esm/tooling/inspect/event-recorder.d.mts +37 -0
- package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
- package/esm/tooling/inspect/event-recorder.mjs +91 -0
- package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
- package/esm/tooling/inspect/index.d.mts +8 -0
- package/esm/tooling/inspect/index.mjs +7 -0
- package/esm/tooling/inspect/inspect-app.d.mts +62 -0
- package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-app.mjs +92 -0
- package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
- package/esm/tooling/inspect/inspect-report.schema.d.mts +14 -0
- package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
- package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
- package/esm/tooling/inspect/inspect-report.types.d.mts +228 -0
- package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
- package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
- package/esm/tooling/mcp/create-mcp-context.d.mts +29 -0
- package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
- package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
- package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
- package/esm/tooling/mcp/db-schema.d.mts +50 -0
- package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
- package/esm/tooling/mcp/db-schema.mjs +56 -0
- package/esm/tooling/mcp/db-schema.mjs.map +1 -0
- package/esm/tooling/mcp/docs-search.d.mts +77 -0
- package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
- package/esm/tooling/mcp/docs-search.mjs +178 -0
- package/esm/tooling/mcp/docs-search.mjs.map +1 -0
- package/esm/tooling/mcp/index.mjs +9 -0
- package/esm/tooling/mcp/load-ai-tools.d.mts +61 -0
- package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
- package/esm/tooling/mcp/load-ai-tools.mjs +45 -0
- package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
- package/esm/tooling/mcp/mcp-tools.d.mts +70 -0
- package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
- package/esm/tooling/mcp/mcp-tools.mjs +514 -0
- package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
- package/esm/tooling/mcp/start-mcp-server.d.mts +63 -0
- package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
- package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
- package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
- package/esm/tooling/mcp/tool-input.d.mts +75 -0
- package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
- package/esm/tooling/mcp/tool-input.mjs +72 -0
- package/esm/tooling/mcp/tool-input.mjs.map +1 -0
- package/esm/tooling/problem.d.mts +55 -0
- package/esm/tooling/problem.d.mts.map +1 -0
- package/esm/tooling/problem.mjs +28 -0
- package/esm/tooling/problem.mjs.map +1 -0
- package/esm/tooling/syntax/ast.mjs +230 -0
- package/esm/tooling/syntax/ast.mjs.map +1 -0
- package/esm/tooling/syntax/imports.mjs +34 -0
- package/esm/tooling/syntax/imports.mjs.map +1 -0
- package/esm/tooling/trace/trace-report.types.d.mts +85 -0
- package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
- package/esm/tooling/trace/trace-report.types.mjs +7 -0
- package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
- package/esm/tooling/trace/trace-request.d.mts +90 -0
- package/esm/tooling/trace/trace-request.d.mts.map +1 -0
- package/esm/tooling/trace/trace-request.mjs +241 -0
- package/esm/tooling/trace/trace-request.mjs.map +1 -0
- package/esm/tooling/typecheck/index.mjs +3 -0
- package/esm/tooling/typecheck/run-typecheck.d.mts +26 -0
- package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
- package/esm/tooling/typecheck/run-typecheck.mjs +90 -0
- package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
- package/esm/tooling/typescript/compiler.d.mts +31 -0
- package/esm/tooling/typescript/compiler.d.mts.map +1 -0
- package/esm/tooling/typescript/compiler.mjs +120 -0
- package/esm/tooling/typescript/compiler.mjs.map +1 -0
- package/esm/updater/update-warlock-packages.mjs +3 -2
- package/esm/updater/update-warlock-packages.mjs.map +1 -1
- package/esm/upgrade/codemods/head-viewport.mjs +46 -0
- package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
- package/esm/upgrade/codemods/helpers.mjs +81 -0
- package/esm/upgrade/codemods/helpers.mjs.map +1 -0
- package/esm/upgrade/codemods/index.mjs +34 -0
- package/esm/upgrade/codemods/index.mjs.map +1 -0
- package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
- package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
- package/esm/upgrade/codemods/package-json.mjs +122 -0
- package/esm/upgrade/codemods/package-json.mjs.map +1 -0
- package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
- package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
- package/esm/upgrade/codemods/review-sites.mjs +262 -0
- package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
- package/esm/upgrade/diff.mjs +119 -0
- package/esm/upgrade/diff.mjs.map +1 -0
- package/esm/upgrade/format-upgrade-report.mjs +32 -0
- package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
- package/esm/upgrade/load-ts-morph.mjs +49 -0
- package/esm/upgrade/load-ts-morph.mjs.map +1 -0
- package/esm/upgrade/notes.mjs +16 -0
- package/esm/upgrade/notes.mjs.map +1 -0
- package/esm/upgrade/run-upgrade.mjs +246 -0
- package/esm/upgrade/run-upgrade.mjs.map +1 -0
- package/esm/upgrade/upgrade-command.action.mjs +37 -0
- package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
- package/esm/upgrade/version.mjs +39 -0
- package/esm/upgrade/version.mjs.map +1 -0
- package/esm/use-cases/index.d.mts +2 -1
- package/esm/use-cases/index.mjs +1 -1
- package/esm/use-cases/types.d.mts +116 -63
- package/esm/use-cases/types.d.mts.map +1 -1
- package/esm/use-cases/use-case-broadcast.d.mts +1 -3
- package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
- package/esm/use-cases/use-case-events.d.mts +3 -5
- package/esm/use-cases/use-case-events.d.mts.map +1 -1
- package/esm/use-cases/use-case-pipeline.d.mts +6 -6
- package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
- package/esm/use-cases/use-case.d.mts +2 -4
- package/esm/use-cases/use-case.d.mts.map +1 -1
- package/esm/use-cases/use-case.errors.d.mts +1 -3
- package/esm/use-cases/use-case.errors.d.mts.map +1 -1
- package/esm/use-cases/use-cases-registry.d.mts +8 -10
- package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/app-log.d.mts +1 -2
- package/esm/utils/app-log.d.mts.map +1 -1
- package/esm/utils/clock.d.mts +35 -0
- package/esm/utils/clock.d.mts.map +1 -0
- package/esm/utils/clock.mjs +27 -0
- package/esm/utils/clock.mjs.map +1 -0
- package/esm/utils/database-log.d.mts +3 -4
- package/esm/utils/database-log.d.mts.map +1 -1
- package/esm/utils/environment.d.mts +4 -5
- package/esm/utils/environment.d.mts.map +1 -1
- package/esm/utils/framework-vesion.mjs +1 -1
- package/esm/utils/framework-vesion.mjs.map +1 -1
- package/esm/utils/get-localized.d.mts +2 -3
- package/esm/utils/get-localized.d.mts.map +1 -1
- package/esm/utils/ids.d.mts +35 -0
- package/esm/utils/ids.d.mts.map +1 -0
- package/esm/utils/ids.mjs +33 -0
- package/esm/utils/ids.mjs.map +1 -0
- package/esm/utils/index.d.mts +5 -1
- package/esm/utils/index.mjs +4 -1
- package/esm/utils/normalized-path.d.mts +1 -2
- package/esm/utils/normalized-path.d.mts.map +1 -1
- package/esm/utils/npm-registry.d.mts +1 -2
- package/esm/utils/npm-registry.d.mts.map +1 -1
- package/esm/utils/paths.d.mts +13 -14
- package/esm/utils/paths.d.mts.map +1 -1
- package/esm/utils/paths.mjs +2 -2
- package/esm/utils/paths.mjs.map +1 -1
- package/esm/utils/promise-all-object.d.mts +1 -2
- package/esm/utils/promise-all-object.d.mts.map +1 -1
- package/esm/utils/queue.d.mts +1 -2
- package/esm/utils/queue.d.mts.map +1 -1
- package/esm/utils/runtime.d.mts +60 -0
- package/esm/utils/runtime.d.mts.map +1 -0
- package/esm/utils/runtime.mjs +85 -0
- package/esm/utils/runtime.mjs.map +1 -0
- package/esm/utils/sleep.d.mts +1 -2
- package/esm/utils/sleep.d.mts.map +1 -1
- package/esm/utils/sluggable.d.mts +1 -3
- package/esm/utils/sluggable.d.mts.map +1 -1
- package/esm/utils/to-json.d.mts +1 -2
- package/esm/utils/to-json.d.mts.map +1 -1
- package/esm/utils/types.d.mts +1 -2
- package/esm/utils/types.d.mts.map +1 -1
- package/esm/utils/urls.d.mts +5 -6
- package/esm/utils/urls.d.mts.map +1 -1
- package/esm/utils/version-compare.d.mts +1 -2
- package/esm/utils/version-compare.d.mts.map +1 -1
- package/esm/validation/database/exists-except-current-id.d.mts +2 -3
- package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
- package/esm/validation/database/exists-except-current-user.d.mts +2 -3
- package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
- package/esm/validation/database/index.d.mts +2 -1
- package/esm/validation/database/index.mjs +1 -1
- package/esm/validation/database/types.d.mts +14 -10
- package/esm/validation/database/types.d.mts.map +1 -1
- package/esm/validation/database/unique-except-current-id.d.mts +2 -3
- package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
- package/esm/validation/database/unique-except-current-user.d.mts +2 -3
- package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
- package/esm/validation/file/file.d.mts +4 -6
- package/esm/validation/file/file.d.mts.map +1 -1
- package/esm/validation/file/index.d.mts +2 -1
- package/esm/validation/file/index.mjs +1 -1
- package/esm/validation/index.d.mts +6 -2
- package/esm/validation/index.mjs +1 -1
- package/esm/validation/plugins/index.mjs +1 -1
- package/esm/validation/types.d.mts +61 -4
- package/esm/validation/types.d.mts.map +1 -1
- package/esm/validation/validateAll.mjs +21 -4
- package/esm/validation/validateAll.mjs.map +1 -1
- package/esm/validation/validation-failure-status.mjs +15 -0
- package/esm/validation/validation-failure-status.mjs.map +1 -0
- package/esm/validation/validators/file-validator.d.mts +2 -20
- package/esm/validation/validators/file-validator.d.mts.map +1 -1
- package/esm/validation/validators/index.d.mts +2 -1
- package/esm/validation/validators/index.mjs +1 -1
- package/esm/vite/lower-stage3-decorators.d.mts +2 -3
- package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
- package/esm/warlock-config/bundle-config.mjs +1 -1
- package/esm/warlock-config/define-config.d.mts +1 -3
- package/esm/warlock-config/define-config.d.mts.map +1 -1
- package/esm/warlock-config/define-config.mjs +3 -2
- package/esm/warlock-config/define-config.mjs.map +1 -1
- package/esm/warlock-config/index.d.mts +2 -1
- package/esm/warlock-config/index.mjs +1 -1
- package/esm/warlock-config/types.d.mts +31 -6
- package/esm/warlock-config/types.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts +5 -7
- package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs +2 -1
- package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
- package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
- package/llms-full.txt +3211 -731
- package/llms.txt +16 -6
- package/package.json +47 -15
- package/schemas/inspect-report.schema.json +554 -0
- package/skills/README.md +9 -0
- package/skills/add-connector/SKILL.md +26 -38
- package/skills/benchmark-code/SKILL.md +30 -24
- package/skills/build-restful/SKILL.md +14 -14
- package/skills/build-url/SKILL.md +18 -18
- package/skills/configure-app/SKILL.md +107 -14
- package/skills/create-controller/SKILL.md +25 -12
- package/skills/create-module/SKILL.md +10 -3
- package/skills/define-resource/SKILL.md +32 -29
- package/skills/encrypt-data/SKILL.md +21 -19
- package/skills/generate-openapi/SKILL.md +50 -24
- package/skills/hash-password/SKILL.md +2 -2
- package/skills/health-checks/SKILL.md +24 -7
- package/skills/index.md +11 -4
- package/skills/lower-stage3-decorators/SKILL.md +4 -4
- package/skills/make-endpoint/SKILL.md +110 -0
- package/skills/model-factories/SKILL.md +92 -0
- package/skills/process-image/SKILL.md +32 -30
- package/skills/register-route/SKILL.md +109 -10
- package/skills/report-framework-issue.md +154 -0
- package/skills/request-memo/SKILL.md +1 -1
- package/skills/request-tracing/SKILL.md +4 -1
- package/skills/resolve-path/SKILL.md +45 -44
- package/skills/retry-operation/SKILL.md +20 -11
- package/skills/run-app/SKILL.md +107 -22
- package/skills/send-response/SKILL.md +179 -14
- package/skills/store-file/SKILL.md +93 -53
- package/skills/test-fakes/SKILL.md +123 -0
- package/skills/test-http/SKILL.md +125 -21
- package/skills/test-service/SKILL.md +41 -1
- package/skills/update-packages/SKILL.md +29 -18
- package/skills/upgrade-from-5-29/SKILL.md +454 -0
- package/skills/upload-file/SKILL.md +31 -33
- package/skills/use-app-context/SKILL.md +38 -31
- package/skills/use-middleware/SKILL.md +45 -25
- package/skills/use-model-transformers/SKILL.md +37 -28
- package/skills/use-repository/SKILL.md +2 -2
- package/skills/validate-input/SKILL.md +72 -28
- package/skills/warlock-agents-md/SKILL.md +96 -0
- package/skills/warlock-board/SKILL.md +123 -0
- package/skills/warlock-check/SKILL.md +133 -0
- package/skills/warlock-conventions/SKILL.md +115 -0
- package/skills/warlock-doctor/SKILL.md +55 -22
- package/skills/warlock-inspect/SKILL.md +134 -0
- package/skills/warlock-mcp/SKILL.md +120 -0
- package/skills/warlock-routes/SKILL.md +18 -11
- package/skills/warlock-trace/SKILL.md +81 -0
- package/skills/wire-socket/SKILL.md +8 -8
- package/skills/write-seeder/SKILL.md +46 -32
- package/skills/write-use-case/SKILL.md +40 -27
- package/esm/http/uploads/matches-if-none-match.mjs +0 -13
- package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/dependency-graph.ts"],"sourcesContent":["import type { FileManager } from \"./file-manager\";\n\n/**\n * Dependency Graph\n * Tracks bidirectional relationships between files:\n * - dependencies: files that this file imports\n * - dependents: files that import this file\n *\n * Each forward edge also carries an `isTypeOnly` flag so cycle detection\n * can distinguish runtime cycles from ones formed purely by `import type`\n * edges — the latter are erased by TypeScript and have no runtime effect.\n */\nexport class DependencyGraph {\n /**\n * Map of file -> files it depends on (imports).\n * Key: relative file path.\n * Value: relative dependency path → `{ isTypeOnly }` for that edge.\n */\n private dependencies = new Map<string, Map<string, { isTypeOnly: boolean }>>();\n\n /**\n * Map of file -> files that depend on it (importers)\n * Key: relative file path\n * Value: Set of relative file paths that import this file\n */\n private dependents = new Map<string, Set<string>>();\n\n /**\n * Reference to the files map for accessing FileManager instances\n * Used to read per-file typeOnlyDependencies during graph build.\n */\n private files: Map<string, FileManager> | null = null;\n\n /**\n * Build dependency graph from FileManager map\n */\n public build(files: Map<string, FileManager>) {\n this.files = files;\n\n this.dependencies.clear();\n this.dependents.clear();\n\n for (const [relativePath, fileManager] of files) {\n if (!this.dependencies.has(relativePath)) {\n this.dependencies.set(relativePath, new Map());\n }\n\n if (!this.dependents.has(relativePath)) {\n this.dependents.set(relativePath, new Set());\n }\n\n for (const dependency of fileManager.dependencies) {\n const isTypeOnly = fileManager.typeOnlyDependencies.has(dependency);\n\n this.addDependency(relativePath, dependency, isTypeOnly);\n }\n }\n\n const cycles = this.detectCircularDependencies();\n\n if (cycles.length > 0) {\n this.displayCircularDependencyWarnings(cycles);\n }\n }\n\n /**\n * Add a dependency relationship.\n * If the edge already exists, the type-only flag is ANDed: any runtime\n * statement between the two files makes the edge runtime permanently.\n *\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n * @param isTypeOnly Whether every reference from `file` to `dependency` is type-only\n */\n public addDependency(file: string, dependency: string, isTypeOnly: boolean = false) {\n if (!this.dependencies.has(file)) {\n this.dependencies.set(file, new Map());\n }\n\n if (!this.dependents.has(dependency)) {\n this.dependents.set(dependency, new Set());\n }\n\n const edges = this.dependencies.get(file)!;\n const existing = edges.get(dependency);\n\n if (existing) {\n existing.isTypeOnly = existing.isTypeOnly && isTypeOnly;\n } else {\n edges.set(dependency, { isTypeOnly });\n }\n\n this.dependents.get(dependency)!.add(file);\n }\n\n /**\n * Remove a dependency relationship\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n */\n public removeDependency(file: string, dependency: string) {\n this.dependencies.get(file)?.delete(dependency);\n this.dependents.get(dependency)?.delete(file);\n }\n\n /**\n * Remove all relationships for a file\n * @param file The file to remove\n */\n public removeFile(file: string) {\n const deps = this.dependencies.get(file);\n\n if (deps) {\n for (const dependency of deps.keys()) {\n this.dependents.get(dependency)?.delete(file);\n }\n }\n\n const dependents = this.dependents.get(file);\n\n if (dependents) {\n for (const dependent of dependents) {\n this.dependencies.get(dependent)?.delete(file);\n }\n }\n\n this.dependencies.delete(file);\n this.dependents.delete(file);\n }\n\n /**\n * Update dependencies for a file.\n *\n * Accepts the updated `Set<string>` of dependency paths; when the caller\n * has per-edge type-only info, pass `typeOnlyDependencies` so the new\n * edges get the correct flag. Missing flag defaults to runtime.\n *\n * @param file The file to update\n * @param newDependencies New set of dependency paths\n * @param typeOnlyDependencies Subset of `newDependencies` whose edges are type-only\n */\n public updateFile(\n file: string,\n newDependencies: Set<string>,\n typeOnlyDependencies: Set<string> = new Set(),\n ) {\n const oldEdges = this.dependencies.get(file) ?? new Map<string, { isTypeOnly: boolean }>();\n\n for (const oldDep of oldEdges.keys()) {\n if (!newDependencies.has(oldDep)) {\n this.removeDependency(file, oldDep);\n }\n }\n\n for (const newDep of newDependencies) {\n const isTypeOnly = typeOnlyDependencies.has(newDep);\n const existing = oldEdges.get(newDep);\n\n if (!existing) {\n this.addDependency(file, newDep, isTypeOnly);\n\n continue;\n }\n\n if (existing.isTypeOnly !== isTypeOnly) {\n existing.isTypeOnly = isTypeOnly;\n }\n }\n }\n\n /**\n * Get files that this file depends on (imports)\n * @param file The file to check\n * @returns Set of files this file imports\n */\n public getDependencies(file: string): Set<string> {\n const edges = this.dependencies.get(file);\n\n if (!edges) {\n return new Set();\n }\n\n return new Set(edges.keys());\n }\n\n /**\n * Check whether the edge `file → dependency` is type-only.\n * Returns false if the edge does not exist.\n */\n public isEdgeTypeOnly(file: string, dependency: string): boolean {\n return this.dependencies.get(file)?.get(dependency)?.isTypeOnly === true;\n }\n\n /**\n * Get files that depend on this file (importers)\n * @param file The file to check\n * @returns Set of files that import this file\n */\n public getDependents(file: string): Set<string> {\n return this.dependents.get(file) || new Set();\n }\n\n /**\n * Get invalidation chain for a file\n * Returns all files that need to be reloaded when this file changes\n * Includes the file itself and all transitive dependents\n * @param file The file that changed\n * @returns Array of files to invalidate (in order)\n */\n public getInvalidationChain(file: string): string[] {\n const chain: string[] = [file];\n const visited = new Set([file]);\n\n const traverse = (current: string) => {\n const deps = this.getDependents(current);\n for (const dep of deps) {\n if (!visited.has(dep)) {\n visited.add(dep);\n chain.push(dep);\n traverse(dep); // Recursive traversal\n }\n }\n };\n\n traverse(file);\n return chain;\n }\n\n /**\n * Detect circular dependencies in the dependency graph.\n * Uses depth-first search to find cycles.\n *\n * Filtering rule (per-edge): a cycle is suppressed when **any** edge in\n * the chain is type-only. TypeScript erases type-only imports entirely,\n * so a single type-only edge breaks the cycle at runtime. Only warn when\n * every edge is a runtime binding — that's the cycle that actually loops\n * at load time.\n *\n * @returns Array of circular dependency chains (each chain is an array of file paths)\n */\n public detectCircularDependencies(): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (file: string, path: string[]): void => {\n visited.add(file);\n recursionStack.add(file);\n path.push(file);\n\n const edges = this.dependencies.get(file);\n\n if (edges) {\n for (const dep of edges.keys()) {\n if (!visited.has(dep)) {\n dfs(dep, [...path]);\n } else if (recursionStack.has(dep)) {\n const cycleStart = path.indexOf(dep);\n const cycle = [...path.slice(cycleStart), dep];\n\n cycles.push(cycle);\n }\n }\n }\n\n recursionStack.delete(file);\n };\n\n for (const file of this.dependencies.keys()) {\n if (!visited.has(file)) {\n dfs(file, []);\n }\n }\n\n return cycles.filter((cycle) => this.isRuntimeCycle(cycle));\n }\n\n /**\n * True iff every edge in the cycle is a runtime binding. The cycle array\n * ends with a duplicate of its start (`[A, B, C, A]`) so we walk the\n * consecutive pairs once — any type-only edge means TS erases the loop\n * and there is no runtime cycle to report.\n */\n private isRuntimeCycle(cycle: string[]): boolean {\n for (let index = 0; index < cycle.length - 1; index++) {\n const from = cycle[index];\n const to = cycle[index + 1];\n\n // `index < cycle.length - 1` bounds both reads. Skipping an unreadable\n // edge rather than defaulting: this decides whether a cycle is\n // TYPE-ONLY, and a `?? \"\"` would ask `isEdgeTypeOnly(\"\", \"\")`, whose\n // answer is about a pair of edges that do not exist. A cycle wrongly\n // classified as type-only is a real circular import reported as harmless.\n if (from === undefined || to === undefined) continue;\n\n if (this.isEdgeTypeOnly(from, to)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Display circular dependency warnings in a formatted, user-friendly way\n * Shows each cycle with visual tree structure and helpful recommendations\n */\n private displayCircularDependencyWarnings(cycles: string[][]): void {\n const colors = {\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n dim: (text: string) => `\\x1b[2m${text}\\x1b[0m`,\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n };\n\n console.log(\"\");\n console.log(colors.yellow(\"⚠️ Circular Dependencies Detected\"));\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(\"\");\n console.log(\n colors.dim(\n `Found ${colors.bold(cycles.length.toString())} circular dependency chain${cycles.length > 1 ? \"s\" : \"\"}`,\n ),\n );\n console.log(\"\");\n\n cycles.forEach((cycle, index) => {\n console.log(colors.cyan(` ${index + 1}. Cycle with ${cycle.length - 1} files:`));\n console.log(\"\");\n\n // Display the cycle chain\n cycle.forEach((file, fileIndex) => {\n const isLast = fileIndex === cycle.length - 1;\n const arrow = isLast ? colors.dim(\" └─→ \") : colors.dim(\" ├─→ \");\n const fileName = file.split(\"/\").pop() || file;\n const filePath = colors.dim(file.replace(fileName, \"\"));\n\n if (isLast) {\n // Last item is the same as first (completes the cycle)\n console.log(\n arrow + colors.yellow(`${filePath}${colors.bold(fileName)} (cycle completes)`),\n );\n } else {\n console.log(arrow + filePath + colors.bold(fileName));\n }\n });\n\n console.log(\"\");\n });\n\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(colors.yellow(\"💡 How to Fix:\"));\n console.log(\"\");\n\n // This whole block prints \"How to Fix\" advice for a cycle that was just\n // reported, so there is always one — but this is diagnostic OUTPUT, and a\n // formatter that throws while explaining a problem replaces the problem\n // with itself. An empty list simply has no example to show.\n const exampleCycle = cycles[0] ?? [];\n const fileA = exampleCycle[0]?.split(\"/\").pop() || \"fileA.ts\";\n const fileB = exampleCycle[1]?.split(\"/\").pop() || \"fileB.ts\";\n const stripExt = (file: string) => file.replace(/\\.tsx?$/, \"\");\n\n const kind = classifyCycle(exampleCycle);\n\n if (kind === \"resource\" || kind === \"model\") {\n // Cascade's `lazy()` is purpose-built for circular relations between\n // resources and models — recommend it first, not as a footnote.\n console.log(colors.green(` ✨ Use lazy() for the back-reference`));\n console.log(\n colors.dim(\n ` ${kind === \"resource\" ? \"Resources\" : \"Models\"} that reference each other should declare`,\n ),\n );\n console.log(colors.dim(` one side with lazy() so the import resolves at access time:`));\n console.log(\"\");\n console.log(colors.dim(` import { lazy } from \"@warlock.js/cascade\";`));\n console.log(colors.dim(` // inside ${fileB}:`));\n console.log(\n colors.dim(\n ` other: lazy(() => ${kind === \"resource\" ? \"OtherResource\" : \"OtherModel\"})`,\n ),\n );\n console.log(\"\");\n } else {\n // Generic cycle — dynamic import is the most common reliable fix.\n console.log(colors.green(` ✨ Convert one edge to a dynamic import`));\n console.log(colors.dim(` In ${fileB}, change:`));\n console.log(colors.dim(` import { SomeClass } from \"./${stripExt(fileA)}\";`));\n console.log(colors.dim(` To:`));\n console.log(colors.dim(` const { SomeClass } = await import(\"./${stripExt(fileA)}\");`));\n console.log(\"\");\n }\n\n console.log(colors.dim(\" Other options:\"));\n console.log(colors.dim(\" • Extract the shared symbols into a third file both can import.\"));\n console.log(\n colors.dim(\" • Pass the dependency as a constructor/function parameter instead.\"),\n );\n console.log(\"\");\n\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(colors.dim(\" Circular dependencies can cause HMR issues and hard-to-debug\"));\n console.log(colors.dim(\" initialization order problems. Consider refactoring.\"));\n console.log(\"\");\n }\n\n /**\n * Get statistics about the dependency graph\n */\n public getStats() {\n let totalDependencies = 0;\n let maxDependencies = 0;\n let maxDependents = 0;\n let mostDependedFile = \"\";\n let mostDependingFile = \"\";\n\n for (const [file, deps] of this.dependencies) {\n totalDependencies += deps.size;\n if (deps.size > maxDependencies) {\n maxDependencies = deps.size;\n mostDependingFile = file;\n }\n }\n\n for (const [file, deps] of this.dependents) {\n if (deps.size > maxDependents) {\n maxDependents = deps.size;\n mostDependedFile = file;\n }\n }\n\n return {\n totalFiles: this.dependencies.size,\n totalDependencies,\n avgDependenciesPerFile: totalDependencies / this.dependencies.size || 0,\n maxDependencies,\n maxDependents,\n mostDependingFile,\n mostDependedFile,\n };\n }\n}\n\n/**\n * Pick the most useful \"fix-it\" hint for a cycle by inspecting the file\n * extensions involved. Cascade resources/models have a first-class fix\n * (`lazy()`); generic cycles just want a dynamic import.\n */\nfunction classifyCycle(cycle: string[]): \"resource\" | \"model\" | \"generic\" {\n const files = cycle.slice(0, -1); // last entry repeats the first\n if (files.every((file) => file.endsWith(\".resource.ts\") || file.endsWith(\".resource.tsx\"))) {\n return \"resource\";\n }\n if (files.every((file) => file.endsWith(\".model.ts\") || file.endsWith(\".model.tsx\"))) {\n return \"model\";\n }\n return \"generic\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dependency-graph.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/dependency-graph.ts"],"sourcesContent":["import type { FileManager } from \"./file-manager\";\n\n/**\n * Dependency Graph\n * Tracks bidirectional relationships between files:\n * - dependencies: files that this file imports\n * - dependents: files that import this file\n *\n * Each forward edge also carries an `isTypeOnly` flag so cycle detection\n * can distinguish runtime cycles from ones formed purely by `import type`\n * edges — the latter are erased by TypeScript and have no runtime effect.\n */\nexport class DependencyGraph {\n /**\n * Map of file -> files it depends on (imports).\n * Key: relative file path.\n * Value: relative dependency path → `{ isTypeOnly }` for that edge.\n */\n private dependencies = new Map<string, Map<string, { isTypeOnly: boolean }>>();\n\n /**\n * Map of file -> files that depend on it (importers)\n * Key: relative file path\n * Value: Set of relative file paths that import this file\n */\n private dependents = new Map<string, Set<string>>();\n\n /**\n * Reference to the files map for accessing FileManager instances\n * Used to read per-file typeOnlyDependencies during graph build.\n */\n private files: Map<string, FileManager> | null = null;\n\n /**\n * Build dependency graph from FileManager map\n */\n public build(files: Map<string, FileManager>) {\n this.files = files;\n\n this.dependencies.clear();\n this.dependents.clear();\n\n for (const [relativePath, fileManager] of files) {\n if (!this.dependencies.has(relativePath)) {\n this.dependencies.set(relativePath, new Map());\n }\n\n if (!this.dependents.has(relativePath)) {\n this.dependents.set(relativePath, new Set());\n }\n\n for (const dependency of fileManager.dependencies) {\n const isTypeOnly = fileManager.typeOnlyDependencies.has(dependency);\n\n this.addDependency(relativePath, dependency, isTypeOnly);\n }\n }\n\n const cycles = this.detectCircularDependencies();\n\n if (cycles.length > 0) {\n this.displayCircularDependencyWarnings(cycles);\n }\n }\n\n /**\n * Add a dependency relationship.\n * If the edge already exists, the type-only flag is ANDed: any runtime\n * statement between the two files makes the edge runtime permanently.\n *\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n * @param isTypeOnly Whether every reference from `file` to `dependency` is type-only\n */\n public addDependency(file: string, dependency: string, isTypeOnly: boolean = false) {\n if (!this.dependencies.has(file)) {\n this.dependencies.set(file, new Map());\n }\n\n if (!this.dependents.has(dependency)) {\n this.dependents.set(dependency, new Set());\n }\n\n const edges = this.dependencies.get(file)!;\n const existing = edges.get(dependency);\n\n if (existing) {\n existing.isTypeOnly = existing.isTypeOnly && isTypeOnly;\n } else {\n edges.set(dependency, { isTypeOnly });\n }\n\n this.dependents.get(dependency)!.add(file);\n }\n\n /**\n * Remove a dependency relationship\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n */\n public removeDependency(file: string, dependency: string) {\n this.dependencies.get(file)?.delete(dependency);\n this.dependents.get(dependency)?.delete(file);\n }\n\n /**\n * Remove all relationships for a file\n * @param file The file to remove\n */\n public removeFile(file: string) {\n const deps = this.dependencies.get(file);\n\n if (deps) {\n for (const dependency of deps.keys()) {\n this.dependents.get(dependency)?.delete(file);\n }\n }\n\n const dependents = this.dependents.get(file);\n\n if (dependents) {\n for (const dependent of dependents) {\n this.dependencies.get(dependent)?.delete(file);\n }\n }\n\n this.dependencies.delete(file);\n this.dependents.delete(file);\n }\n\n /**\n * Update dependencies for a file.\n *\n * Accepts the updated `Set<string>` of dependency paths; when the caller\n * has per-edge type-only info, pass `typeOnlyDependencies` so the new\n * edges get the correct flag. Missing flag defaults to runtime.\n *\n * @param file The file to update\n * @param newDependencies New set of dependency paths\n * @param typeOnlyDependencies Subset of `newDependencies` whose edges are type-only\n */\n public updateFile(\n file: string,\n newDependencies: Set<string>,\n typeOnlyDependencies: Set<string> = new Set(),\n ) {\n const oldEdges = this.dependencies.get(file) ?? new Map<string, { isTypeOnly: boolean }>();\n\n for (const oldDep of oldEdges.keys()) {\n if (!newDependencies.has(oldDep)) {\n this.removeDependency(file, oldDep);\n }\n }\n\n for (const newDep of newDependencies) {\n const isTypeOnly = typeOnlyDependencies.has(newDep);\n const existing = oldEdges.get(newDep);\n\n if (!existing) {\n this.addDependency(file, newDep, isTypeOnly);\n\n continue;\n }\n\n if (existing.isTypeOnly !== isTypeOnly) {\n existing.isTypeOnly = isTypeOnly;\n }\n }\n }\n\n /**\n * Get files that this file depends on (imports)\n * @param file The file to check\n * @returns Set of files this file imports\n */\n public getDependencies(file: string): Set<string> {\n const edges = this.dependencies.get(file);\n\n if (!edges) {\n return new Set();\n }\n\n return new Set(edges.keys());\n }\n\n /**\n * Check whether the edge `file → dependency` is type-only.\n * Returns false if the edge does not exist.\n */\n public isEdgeTypeOnly(file: string, dependency: string): boolean {\n return this.dependencies.get(file)?.get(dependency)?.isTypeOnly === true;\n }\n\n /**\n * Get files that depend on this file (importers)\n * @param file The file to check\n * @returns Set of files that import this file\n */\n public getDependents(file: string): Set<string> {\n return this.dependents.get(file) || new Set();\n }\n\n /**\n * Get invalidation chain for a file\n * Returns all files that need to be reloaded when this file changes\n * Includes the file itself and all transitive dependents\n * @param file The file that changed\n * @returns Array of files to invalidate (in order)\n */\n public getInvalidationChain(file: string): string[] {\n const chain: string[] = [file];\n const visited = new Set([file]);\n\n const traverse = (current: string) => {\n const deps = this.getDependents(current);\n for (const dep of deps) {\n if (!visited.has(dep)) {\n visited.add(dep);\n chain.push(dep);\n traverse(dep); // Recursive traversal\n }\n }\n };\n\n traverse(file);\n return chain;\n }\n\n /**\n * Detect circular dependencies in the dependency graph.\n * Uses depth-first search to find cycles.\n *\n * Filtering rule (per-edge): a cycle is suppressed when **any** edge in\n * the chain is type-only. TypeScript erases type-only imports entirely,\n * so a single type-only edge breaks the cycle at runtime. Only warn when\n * every edge is a runtime binding — that's the cycle that actually loops\n * at load time.\n *\n * @returns Array of circular dependency chains (each chain is an array of file paths)\n */\n public detectCircularDependencies(): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (file: string, path: string[]): void => {\n visited.add(file);\n recursionStack.add(file);\n path.push(file);\n\n const edges = this.dependencies.get(file);\n\n if (edges) {\n for (const dep of edges.keys()) {\n if (!visited.has(dep)) {\n dfs(dep, [...path]);\n } else if (recursionStack.has(dep)) {\n const cycleStart = path.indexOf(dep);\n const cycle = [...path.slice(cycleStart), dep];\n\n cycles.push(cycle);\n }\n }\n }\n\n recursionStack.delete(file);\n };\n\n for (const file of this.dependencies.keys()) {\n if (!visited.has(file)) {\n dfs(file, []);\n }\n }\n\n return cycles.filter((cycle) => this.isRuntimeCycle(cycle));\n }\n\n /**\n * True iff every edge in the cycle is a runtime binding. The cycle array\n * ends with a duplicate of its start (`[A, B, C, A]`) so we walk the\n * consecutive pairs once — any type-only edge means TS erases the loop\n * and there is no runtime cycle to report.\n */\n private isRuntimeCycle(cycle: string[]): boolean {\n for (let index = 0; index < cycle.length - 1; index++) {\n const from = cycle[index];\n const to = cycle[index + 1];\n\n // `index < cycle.length - 1` bounds both reads. Skipping an unreadable\n // edge rather than defaulting: this decides whether a cycle is\n // TYPE-ONLY, and a `?? \"\"` would ask `isEdgeTypeOnly(\"\", \"\")`, whose\n // answer is about a pair of edges that do not exist. A cycle wrongly\n // classified as type-only is a real circular import reported as harmless.\n if (from === undefined || to === undefined) continue;\n\n if (this.isEdgeTypeOnly(from, to)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Display circular dependency warnings in a formatted, user-friendly way\n * Shows each cycle with visual tree structure and helpful recommendations\n */\n private displayCircularDependencyWarnings(cycles: string[][]): void {\n const colors = {\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n dim: (text: string) => `\\x1b[2m${text}\\x1b[0m`,\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n };\n\n console.log(\"\");\n console.log(colors.yellow(\"⚠️ Circular Dependencies Detected\"));\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(\"\");\n console.log(\n colors.dim(\n `Found ${colors.bold(cycles.length.toString())} circular dependency chain${cycles.length > 1 ? \"s\" : \"\"}`,\n ),\n );\n console.log(\"\");\n\n cycles.forEach((cycle, index) => {\n console.log(colors.cyan(` ${index + 1}. Cycle with ${cycle.length - 1} files:`));\n console.log(\"\");\n\n // Display the cycle chain\n cycle.forEach((file, fileIndex) => {\n const isLast = fileIndex === cycle.length - 1;\n const arrow = isLast ? colors.dim(\" └─→ \") : colors.dim(\" ├─→ \");\n const fileName = file.split(\"/\").pop() || file;\n const filePath = colors.dim(file.replace(fileName, \"\"));\n\n if (isLast) {\n // Last item is the same as first (completes the cycle)\n console.log(\n arrow + colors.yellow(`${filePath}${colors.bold(fileName)} (cycle completes)`),\n );\n } else {\n console.log(arrow + filePath + colors.bold(fileName));\n }\n });\n\n console.log(\"\");\n });\n\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(colors.yellow(\"💡 How to Fix:\"));\n console.log(\"\");\n\n // This whole block prints \"How to Fix\" advice for a cycle that was just\n // reported, so there is always one — but this is diagnostic OUTPUT, and a\n // formatter that throws while explaining a problem replaces the problem\n // with itself. An empty list simply has no example to show.\n const exampleCycle = cycles[0] ?? [];\n const fileA = exampleCycle[0]?.split(\"/\").pop() || \"fileA.ts\";\n const fileB = exampleCycle[1]?.split(\"/\").pop() || \"fileB.ts\";\n const stripExt = (file: string) => file.replace(/\\.tsx?$/, \"\");\n\n const kind = classifyCycle(exampleCycle);\n\n if (kind === \"resource\" || kind === \"model\") {\n // Cascade's `lazy()` is purpose-built for circular relations between\n // resources and models — recommend it first, not as a footnote.\n console.log(colors.green(` ✨ Use lazy() for the back-reference`));\n console.log(\n colors.dim(\n ` ${kind === \"resource\" ? \"Resources\" : \"Models\"} that reference each other should declare`,\n ),\n );\n console.log(colors.dim(` one side with lazy() so the import resolves at access time:`));\n console.log(\"\");\n console.log(colors.dim(` import { lazy } from \"@warlock.js/cascade\";`));\n console.log(colors.dim(` // inside ${fileB}:`));\n console.log(\n colors.dim(\n ` other: lazy(() => ${kind === \"resource\" ? \"OtherResource\" : \"OtherModel\"})`,\n ),\n );\n console.log(\"\");\n } else {\n // Generic cycle — dynamic import is the most common reliable fix.\n console.log(colors.green(` ✨ Convert one edge to a dynamic import`));\n console.log(colors.dim(` In ${fileB}, change:`));\n console.log(colors.dim(` import { SomeClass } from \"./${stripExt(fileA)}\";`));\n console.log(colors.dim(` To:`));\n console.log(colors.dim(` const { SomeClass } = await import(\"./${stripExt(fileA)}\");`));\n console.log(\"\");\n }\n\n console.log(colors.dim(\" Other options:\"));\n console.log(colors.dim(\" • Extract the shared symbols into a third file both can import.\"));\n console.log(\n colors.dim(\" • Pass the dependency as a constructor/function parameter instead.\"),\n );\n console.log(\"\");\n\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(colors.dim(\" Circular dependencies can cause HMR issues and hard-to-debug\"));\n console.log(colors.dim(\" initialization order problems. Consider refactoring.\"));\n console.log(\"\");\n }\n\n /**\n * Get statistics about the dependency graph\n */\n public getStats() {\n let totalDependencies = 0;\n let maxDependencies = 0;\n let maxDependents = 0;\n let mostDependedFile = \"\";\n let mostDependingFile = \"\";\n\n for (const [file, deps] of this.dependencies) {\n totalDependencies += deps.size;\n if (deps.size > maxDependencies) {\n maxDependencies = deps.size;\n mostDependingFile = file;\n }\n }\n\n for (const [file, deps] of this.dependents) {\n if (deps.size > maxDependents) {\n maxDependents = deps.size;\n mostDependedFile = file;\n }\n }\n\n return {\n totalFiles: this.dependencies.size,\n totalDependencies,\n avgDependenciesPerFile: totalDependencies / this.dependencies.size || 0,\n maxDependencies,\n maxDependents,\n mostDependingFile,\n mostDependedFile,\n };\n }\n}\n\n/**\n * Pick the most useful \"fix-it\" hint for a cycle by inspecting the file\n * extensions involved. Cascade resources/models have a first-class fix\n * (`lazy()`); generic cycles just want a dynamic import.\n */\nfunction classifyCycle(cycle: string[]): \"resource\" | \"model\" | \"generic\" {\n const files = cycle.slice(0, -1); // last entry repeats the first\n if (files.every((file) => file.endsWith(\".resource.ts\") || file.endsWith(\".resource.tsx\"))) {\n return \"resource\";\n }\n if (files.every((file) => file.endsWith(\".model.ts\") || file.endsWith(\".model.tsx\"))) {\n return \"model\";\n }\n return \"generic\";\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { getHttpReadyReport } from "../http/ready-report.mjs";
|
|
2
|
+
import { connectorsManager } from "../connectors/connectors-manager.mjs";
|
|
3
|
+
import { devLogInfo, devLogWarn } from "./dev-logger.mjs";
|
|
4
|
+
import { removeDevServerState, writeDevServerState } from "../tooling/dev-state/dev-server-state.mjs";
|
|
5
|
+
import { DEFAULT_DEVTOOLS_PATH } from "../tooling/devtools/devtools-client.mjs";
|
|
6
|
+
|
|
7
|
+
//#region ../../packages/core/src/dev-server/dev-agent-tooling.ts
|
|
8
|
+
/** Resolve `devServer.mcp` and the `--mcp` flag (the flag turns it on with the config's options). */
|
|
9
|
+
function resolveDevMcpOptions(flag, config) {
|
|
10
|
+
if (!flag && !config) return false;
|
|
11
|
+
const settings = typeof config === "object" ? config : {};
|
|
12
|
+
return {
|
|
13
|
+
port: settings.port ?? 0,
|
|
14
|
+
...settings.token ? { token: settings.token } : {},
|
|
15
|
+
allowWrites: settings.allowWrites === true
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function errorMessage(error) {
|
|
19
|
+
return error instanceof Error ? error.message : String(error);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The agent-facing side of `warlock dev`, all best-effort — none of it may
|
|
23
|
+
* stop the app from serving:
|
|
24
|
+
*
|
|
25
|
+
* - records the server's address in `.warlock/dev-server.json` (read by
|
|
26
|
+
* `warlock trace` and `warlock mcp`), removed on shutdown;
|
|
27
|
+
* - keeps the generated section of `AGENTS.md` fresh (unless
|
|
28
|
+
* `devServer.agentsMd: false`), on boot and after each reload, debounced;
|
|
29
|
+
* - with `--mcp` / `devServer.mcp`, serves `warlock mcp` over HTTP on
|
|
30
|
+
* loopback from this process, so `inspect_*` reads the live registries.
|
|
31
|
+
*
|
|
32
|
+
* The tooling modules are imported lazily: they pull in the TypeScript
|
|
33
|
+
* compiler and the generators, which a dev boot without them never needs.
|
|
34
|
+
*/
|
|
35
|
+
var DevAgentTooling = class {
|
|
36
|
+
/** @param cwd Project root. Default: `process.cwd()`. */
|
|
37
|
+
constructor(cwd = process.cwd()) {
|
|
38
|
+
this.cwd = cwd;
|
|
39
|
+
this.stateWritten = false;
|
|
40
|
+
}
|
|
41
|
+
async start(options) {
|
|
42
|
+
const http = getHttpReadyReport();
|
|
43
|
+
const devtoolsActive = connectorsManager.list().some((connector) => connector.name === "devtools" && connector.isActive());
|
|
44
|
+
if (options.mcp) await this.startMcp(options.mcp, http?.url);
|
|
45
|
+
if (http) try {
|
|
46
|
+
writeDevServerState({
|
|
47
|
+
schemaVersion: 1,
|
|
48
|
+
pid: process.pid,
|
|
49
|
+
url: http.url,
|
|
50
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
51
|
+
devtools: devtoolsActive ? { path: DEFAULT_DEVTOOLS_PATH } : null,
|
|
52
|
+
mcp: this.mcp?.url ? { url: this.mcp.url } : null
|
|
53
|
+
}, this.cwd);
|
|
54
|
+
this.stateWritten = true;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
devLogWarn(`Could not record the dev server address: ${errorMessage(error)}`);
|
|
57
|
+
}
|
|
58
|
+
if (options.agentsMd) await this.startAgentsMd();
|
|
59
|
+
}
|
|
60
|
+
/** Called after every hot reload: routes or modules may have changed. */
|
|
61
|
+
afterReload() {
|
|
62
|
+
this.refresher?.schedule();
|
|
63
|
+
}
|
|
64
|
+
async shutdown() {
|
|
65
|
+
this.refresher?.dispose();
|
|
66
|
+
this.refresher = void 0;
|
|
67
|
+
if (this.mcp) {
|
|
68
|
+
const server = this.mcp;
|
|
69
|
+
this.mcp = void 0;
|
|
70
|
+
try {
|
|
71
|
+
await server.close();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
devLogWarn(`MCP server did not close cleanly: ${errorMessage(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (this.stateWritten) {
|
|
77
|
+
this.stateWritten = false;
|
|
78
|
+
removeDevServerState(process.pid, this.cwd);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async startAgentsMd() {
|
|
82
|
+
try {
|
|
83
|
+
const [{ createAgentsMdRefresher }, { inspectApp }] = await Promise.all([import("../tooling/agents-md/index.mjs"), import("../tooling/inspect/inspect-app.mjs")]);
|
|
84
|
+
this.refresher = createAgentsMdRefresher({
|
|
85
|
+
cwd: this.cwd,
|
|
86
|
+
collect: () => inspectApp({ sections: [
|
|
87
|
+
"routes",
|
|
88
|
+
"models",
|
|
89
|
+
"packages"
|
|
90
|
+
] }),
|
|
91
|
+
onWrite: (result) => {
|
|
92
|
+
if (result.status === "created" || result.status === "updated") devLogInfo(`AGENTS.md generated section ${result.status}`);
|
|
93
|
+
},
|
|
94
|
+
onError: (error) => devLogWarn(`AGENTS.md not refreshed: ${errorMessage(error)}`)
|
|
95
|
+
});
|
|
96
|
+
this.refresher.schedule();
|
|
97
|
+
} catch (error) {
|
|
98
|
+
devLogWarn(`AGENTS.md refresh is off: ${errorMessage(error)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async startMcp(options, serverUrl) {
|
|
102
|
+
try {
|
|
103
|
+
const [{ createMcpContext }, { startWarlockMcpServer }, { inspectApp }, { featuresMap }] = await Promise.all([
|
|
104
|
+
import("../tooling/mcp/create-mcp-context.mjs"),
|
|
105
|
+
import("../tooling/mcp/start-mcp-server.mjs"),
|
|
106
|
+
import("../tooling/inspect/inspect-app.mjs"),
|
|
107
|
+
import("../generations/features/index.mjs")
|
|
108
|
+
]);
|
|
109
|
+
const context = createMcpContext({
|
|
110
|
+
cwd: this.cwd,
|
|
111
|
+
allowWrites: options.allowWrites,
|
|
112
|
+
inspect: (sections) => inspectApp({ sections }),
|
|
113
|
+
...process.argv[1] ? { cliEntry: process.argv[1] } : {},
|
|
114
|
+
devtools: serverUrl ? { url: serverUrl } : {},
|
|
115
|
+
features: Object.keys(featuresMap)
|
|
116
|
+
});
|
|
117
|
+
this.mcp = await startWarlockMcpServer({
|
|
118
|
+
context,
|
|
119
|
+
transport: {
|
|
120
|
+
type: "http",
|
|
121
|
+
host: "127.0.0.1",
|
|
122
|
+
port: options.port,
|
|
123
|
+
...options.token ? { token: options.token } : {}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
devLogInfo(`MCP server at ${this.mcp.url ?? "?"} (${options.allowWrites ? "writes allowed" : "read-only"}${options.token ? ", token required" : ""})`);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
devLogWarn(`MCP server not started: ${errorMessage(error)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
export { DevAgentTooling, resolveDevMcpOptions };
|
|
135
|
+
//# sourceMappingURL=dev-agent-tooling.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-agent-tooling.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/dev-agent-tooling.ts"],"sourcesContent":["import { connectorsManager } from \"../connectors/connectors-manager\";\nimport { getHttpReadyReport } from \"../http/ready-report\";\nimport { removeDevServerState, writeDevServerState } from \"../tooling/dev-state/dev-server-state\";\nimport { DEFAULT_DEVTOOLS_PATH } from \"../tooling/devtools/devtools-client\";\nimport { devLogInfo, devLogWarn } from \"./dev-logger\";\n\n/** `devServer.mcp` (or `--mcp`) resolved: off, or the HTTP options. */\nexport type DevMcpOptions = false | { port: number; token?: string; allowWrites: boolean };\n\n/** Resolve `devServer.mcp` and the `--mcp` flag (the flag turns it on with the config's options). */\nexport function resolveDevMcpOptions(\n flag: boolean | undefined,\n config: boolean | { port?: number; token?: string; allowWrites?: boolean } | undefined,\n): DevMcpOptions {\n if (!flag && !config) return false;\n\n const settings = typeof config === \"object\" ? config : {};\n\n return {\n port: settings.port ?? 0,\n ...(settings.token ? { token: settings.token } : {}),\n allowWrites: settings.allowWrites === true,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * The agent-facing side of `warlock dev`, all best-effort — none of it may\n * stop the app from serving:\n *\n * - records the server's address in `.warlock/dev-server.json` (read by\n * `warlock trace` and `warlock mcp`), removed on shutdown;\n * - keeps the generated section of `AGENTS.md` fresh (unless\n * `devServer.agentsMd: false`), on boot and after each reload, debounced;\n * - with `--mcp` / `devServer.mcp`, serves `warlock mcp` over HTTP on\n * loopback from this process, so `inspect_*` reads the live registries.\n *\n * The tooling modules are imported lazily: they pull in the TypeScript\n * compiler and the generators, which a dev boot without them never needs.\n */\nexport class DevAgentTooling {\n private refresher?: { schedule(): void; dispose(): void };\n private mcp?: { url?: string; close(): Promise<void> };\n private stateWritten = false;\n\n /** @param cwd Project root. Default: `process.cwd()`. */\n public constructor(private readonly cwd: string = process.cwd()) {}\n\n public async start(options: { agentsMd: boolean; mcp: DevMcpOptions }): Promise<void> {\n const http = getHttpReadyReport();\n const devtoolsActive = connectorsManager\n .list()\n .some((connector) => connector.name === \"devtools\" && connector.isActive());\n\n if (options.mcp) {\n await this.startMcp(options.mcp, http?.url);\n }\n\n if (http) {\n try {\n writeDevServerState(\n {\n schemaVersion: 1,\n pid: process.pid,\n url: http.url,\n startedAt: new Date().toISOString(),\n devtools: devtoolsActive ? { path: DEFAULT_DEVTOOLS_PATH } : null,\n mcp: this.mcp?.url ? { url: this.mcp.url } : null,\n },\n this.cwd,\n );\n this.stateWritten = true;\n } catch (error) {\n devLogWarn(`Could not record the dev server address: ${errorMessage(error)}`);\n }\n }\n\n if (options.agentsMd) {\n await this.startAgentsMd();\n }\n }\n\n /** Called after every hot reload: routes or modules may have changed. */\n public afterReload(): void {\n this.refresher?.schedule();\n }\n\n public async shutdown(): Promise<void> {\n this.refresher?.dispose();\n this.refresher = undefined;\n\n if (this.mcp) {\n const server = this.mcp;\n this.mcp = undefined;\n\n try {\n await server.close();\n } catch (error) {\n devLogWarn(`MCP server did not close cleanly: ${errorMessage(error)}`);\n }\n }\n\n if (this.stateWritten) {\n this.stateWritten = false;\n removeDevServerState(process.pid, this.cwd);\n }\n }\n\n private async startAgentsMd(): Promise<void> {\n try {\n const [{ createAgentsMdRefresher }, { inspectApp }] = await Promise.all([\n import(\"../tooling/agents-md\"),\n import(\"../tooling/inspect/inspect-app\"),\n ]);\n\n this.refresher = createAgentsMdRefresher({\n cwd: this.cwd,\n collect: () => inspectApp({ sections: [\"routes\", \"models\", \"packages\"] }),\n onWrite: (result) => {\n if (result.status === \"created\" || result.status === \"updated\") {\n devLogInfo(`AGENTS.md generated section ${result.status}`);\n }\n },\n onError: (error) => devLogWarn(`AGENTS.md not refreshed: ${errorMessage(error)}`),\n });\n this.refresher.schedule();\n } catch (error) {\n devLogWarn(`AGENTS.md refresh is off: ${errorMessage(error)}`);\n }\n }\n\n private async startMcp(\n options: Exclude<DevMcpOptions, false>,\n serverUrl?: string,\n ): Promise<void> {\n try {\n const [{ createMcpContext }, { startWarlockMcpServer }, { inspectApp }, { featuresMap }] =\n await Promise.all([\n import(\"../tooling/mcp/create-mcp-context\"),\n import(\"../tooling/mcp/start-mcp-server\"),\n import(\"../tooling/inspect/inspect-app\"),\n import(\"../generations/features\"),\n ]);\n const context = createMcpContext({\n cwd: this.cwd,\n allowWrites: options.allowWrites,\n inspect: (sections) => inspectApp({ sections }),\n ...(process.argv[1] ? { cliEntry: process.argv[1] } : {}),\n devtools: serverUrl ? { url: serverUrl } : {},\n features: Object.keys(featuresMap),\n });\n\n this.mcp = await startWarlockMcpServer({\n context,\n transport: {\n type: \"http\",\n host: \"127.0.0.1\",\n port: options.port,\n ...(options.token ? { token: options.token } : {}),\n },\n });\n\n devLogInfo(\n `MCP server at ${this.mcp.url ?? \"?\"} (${options.allowWrites ? \"writes allowed\" : \"read-only\"}${options.token ? \", token required\" : \"\"})`,\n );\n } catch (error) {\n devLogWarn(`MCP server not started: ${errorMessage(error)}`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-logger.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/dev-logger.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport dayjs from \"dayjs\";\nimport { Path } from \"../utils/normalized-path\";\n\n/**\n * Dev server logger — Vite-style formatting helpers.\n */\n\nfunction timestamp(): string {\n return colors.dim(`${dayjs().format(\"HH:mm:ss A\")}`);\n}\n\nexport function devLog(message: string) {\n console.log(`${timestamp()} ${message}`);\n}\n\nexport function devLogSuccess(message: string) {\n console.log(`${timestamp()} ${colors.green(\"✓\")} ${colors.green(message)}`);\n}\n\n/**\n * Colourise a stack trace so the eye lands on *your* code.\n *\n * - Error header (`ReferenceError: x is not defined`) → bold red.\n * - Frames in project `src/` → highlighted: a green `›` pointer, yellow\n * function name, cyan relative path, dim `:line:col`. These are almost\n * always where the bug is.\n * - Framework (`@warlock.js`), `node_modules`, and `node:` internal frames\n * → dimmed and relativised. Still there for context, just out of the way.\n *\n * Source maps are enabled in dev, so the paths/lines here are already the\n * original `.ts` locations — this only changes how they're painted.\n */\nexport function formatErrorStack(stack: string): string {\n const frame = /^(\\s*)at (.+?) \\((.+):(\\d+):(\\d+)\\)$/;\n const bareFrame = /^(\\s*)at (.+):(\\d+):(\\d+)$/;\n let headerDone = false;\n\n return stack\n .split(\"\\n\")\n .map((line) => {\n const withFn = line.match(frame);\n const bare = line.match(bareFrame);\n\n if (!withFn && !bare) {\n // Header line(s) before the first frame.\n const painted = headerDone ? colors.dim(line) : colors.bold(colors.red(line));\n return painted;\n }\n\n headerDone = true;\n\n // Every read here is defaulted rather than asserted, and the reason is\n // what this function IS: a stack-trace formatter. If it throws while\n // formatting, it throws INSIDE error reporting — and what the developer\n // then sees is this function's failure instead of the error they were\n // actually chasing. An unreadable frame should degrade to a blank field,\n // never take the report down with it — every fatal needs an\n // unconditional floor.\n const fn = (withFn ? withFn[2] : \"\") ?? \"\";\n const file = (withFn ? withFn[3] : bare?.[2]) ?? \"\";\n const lineNo = (withFn ? withFn[4] : bare?.[3]) ?? \"\";\n const col = (withFn ? withFn[5] : bare?.[4]) ?? \"\";\n\n const isNodeInternal = file.startsWith(\"node:\");\n const isDep = file.includes(\"node_modules\");\n const isFramework = /[\\\\/]@warlock\\.js[\\\\/]/.test(file);\n const isUserCode = !isNodeInternal && !isDep && !isFramework;\n\n const rel = isNodeInternal ? file : Path.toRelative(file);\n const loc = `:${lineNo}:${col}`;\n\n if (isUserCode) {\n return (\n ` ${colors.green(\"›\")} ${colors.dim(\"at\")} ` +\n `${colors.yellow(fn || \"<anonymous>\")} ` +\n `${colors.cyan(rel)}${colors.dim(loc)}`\n );\n }\n\n const label = fn ? `at ${fn} ${rel}${loc}` : `at ${rel}${loc}`;\n return ` ${colors.dim(label)}`;\n })\n .join(\"\\n\");\n}\n\nexport function devLogError(message: string, error?: any) {\n console.log(`${timestamp()} ${colors.red(\"✗\")} ${colors.red(message)}`);\n if (error?.stack) console.log(formatErrorStack(error.stack));\n}\n\nexport function devLogWarn(message: string) {\n console.log(`${timestamp()} ${colors.yellow(\"⚠\")} ${colors.yellow(message)}`);\n}\n\nexport function devLogInfo(message: string) {\n console.log(`${timestamp()} ${colors.cyan(message)}`);\n}\n\nexport function devLogDim(message: string) {\n console.log(`${timestamp()} ${colors.dim(message)}`);\n}\n\nexport function devLogHMR(file: string, dependents?: number, durationMs?: number) {\n const relativePath = Path.toRelative(file);\n const depInfo = dependents\n ? colors.dim(` +${dependents} module${dependents > 1 ? \"s\" : \"\"}`)\n : \"\";\n const durationInfo = durationMs !== undefined ? colors.dim(` (${durationMs}ms)`) : \"\";\n console.log(\n `${timestamp()} 🔥 ${colors.green(\"hmr update\")} ${colors.dim(relativePath)}${depInfo}${durationInfo}`,\n );\n}\n\n/**\n * Per-phase breakdown for one hot reload, printed only when\n * `devServer.timings` is on. Phases run in this order: the watcher's\n * `awaitWriteFinish` settle wait, this handler's own debounce wait,\n * module-graph invalidation (version bumps), re-import of the changed\n * modules, and connector restart/rebind.\n */\nexport type ReloadPhaseTimings = {\n watcherSettleMs: number;\n debounceWaitMs: number;\n moduleGraphInvalidationMs: number;\n reimportMs: number;\n connectorRestartMs: number;\n};\n\nexport function devLogTimings(timings: ReloadPhaseTimings) {\n const phase = (label: string, ms: number) => `${colors.dim(label)} ${colors.dim(`${Math.round(ms)}ms`)}`;\n const line = [\n phase(\"watcher\", timings.watcherSettleMs),\n phase(\"debounce\", timings.debounceWaitMs),\n phase(\"graph\", timings.moduleGraphInvalidationMs),\n phase(\"reimport\", timings.reimportMs),\n phase(\"connectors\", timings.connectorRestartMs),\n ].join(colors.dim(\" · \"));\n console.log(`${timestamp()} ${colors.dim(\"⏱\")} ${line}`);\n}\n\nexport function devLogConfig(file: string, connectors?: string[]) {\n const relativePath = Path.toRelative(file);\n const connectorInfo =\n connectors && connectors.length > 0 ? colors.dim(` → restarting ${connectors.join(\", \")}`) : \"\";\n console.log(\n `${timestamp()} ${colors.cyan(\"config reload\")} ${colors.dim(relativePath)}${connectorInfo}`,\n );\n}\n\nexport function devLogReady(message: string) {\n console.log(`\\n${timestamp()} ${colors.green(\"➜\")} ${colors.bold(message)}`);\n}\n\nexport function devLogSection(title: string) {\n console.log(`\\n${timestamp()} ${colors.bold(colors.cyan(title))}`);\n}\n\n/**\n * Format ERR_MODULE_NOT_FOUND so the displayed paths are relative to the\n * project root. The loader hook keeps source paths in the URL so we only\n * need to strip the absolute prefix — no cache-path translation any more.\n */\nexport function formatModuleNotFoundError(error: Error, suggestions?: string[]): string {\n const match = error.message.match(/Cannot find module '([^']+)' imported from '([^']+)'/);\n if (!match) return error.message;\n\n // Same rule as the frame formatter above: this renders a MODULE NOT FOUND\n // report, so a missing capture must degrade the message, not replace the\n // user's error with a crash inside the reporter.\n const [, rawModulePath, rawImporterPath] = match;\n const modulePath = rawModulePath ?? \"\";\n const importerPath = rawImporterPath ?? \"\";\n const lines: string[] = [\n \"\",\n `${colors.red(\"❌ MODULE NOT FOUND\")}`,\n \"\",\n `${colors.dim(\"Cannot find:\")} ${colors.cyan(Path.toRelative(modulePath))}`,\n \"\",\n `${colors.dim(\"Imported by:\")}`,\n ` ${colors.yellow(\"→\")} ${colors.white(Path.toRelative(importerPath))}`,\n ];\n\n if (suggestions && suggestions.length > 0) {\n lines.push(\"\");\n lines.push(`${colors.dim(\"Did you mean?\")}`);\n suggestions.forEach((s) => lines.push(` ${colors.cyan(\"→\")} ${colors.green(s)}`));\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** @deprecated alias retained for older callers. Use `devLog` directly. */\nexport const devServeLog = devLog;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-logger.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/dev-logger.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport dayjs from \"dayjs\";\nimport { Path } from \"../utils/normalized-path\";\n\n/**\n * Dev server logger — Vite-style formatting helpers.\n */\n\nfunction timestamp(): string {\n return colors.dim(`${dayjs().format(\"HH:mm:ss A\")}`);\n}\n\nexport function devLog(message: string) {\n console.log(`${timestamp()} ${message}`);\n}\n\nexport function devLogSuccess(message: string) {\n console.log(`${timestamp()} ${colors.green(\"✓\")} ${colors.green(message)}`);\n}\n\n/**\n * Colourise a stack trace so the eye lands on *your* code.\n *\n * - Error header (`ReferenceError: x is not defined`) → bold red.\n * - Frames in project `src/` → highlighted: a green `›` pointer, yellow\n * function name, cyan relative path, dim `:line:col`. These are almost\n * always where the bug is.\n * - Framework (`@warlock.js`), `node_modules`, and `node:` internal frames\n * → dimmed and relativised. Still there for context, just out of the way.\n *\n * Source maps are enabled in dev, so the paths/lines here are already the\n * original `.ts` locations — this only changes how they're painted.\n */\nexport function formatErrorStack(stack: string): string {\n const frame = /^(\\s*)at (.+?) \\((.+):(\\d+):(\\d+)\\)$/;\n const bareFrame = /^(\\s*)at (.+):(\\d+):(\\d+)$/;\n let headerDone = false;\n\n return stack\n .split(\"\\n\")\n .map((line) => {\n const withFn = line.match(frame);\n const bare = line.match(bareFrame);\n\n if (!withFn && !bare) {\n // Header line(s) before the first frame.\n const painted = headerDone ? colors.dim(line) : colors.bold(colors.red(line));\n return painted;\n }\n\n headerDone = true;\n\n // Every read here is defaulted rather than asserted, and the reason is\n // what this function IS: a stack-trace formatter. If it throws while\n // formatting, it throws INSIDE error reporting — and what the developer\n // then sees is this function's failure instead of the error they were\n // actually chasing. An unreadable frame should degrade to a blank field,\n // never take the report down with it — every fatal needs an\n // unconditional floor.\n const fn = (withFn ? withFn[2] : \"\") ?? \"\";\n const file = (withFn ? withFn[3] : bare?.[2]) ?? \"\";\n const lineNo = (withFn ? withFn[4] : bare?.[3]) ?? \"\";\n const col = (withFn ? withFn[5] : bare?.[4]) ?? \"\";\n\n const isNodeInternal = file.startsWith(\"node:\");\n const isDep = file.includes(\"node_modules\");\n const isFramework = /[\\\\/]@warlock\\.js[\\\\/]/.test(file);\n const isUserCode = !isNodeInternal && !isDep && !isFramework;\n\n const rel = isNodeInternal ? file : Path.toRelative(file);\n const loc = `:${lineNo}:${col}`;\n\n if (isUserCode) {\n return (\n ` ${colors.green(\"›\")} ${colors.dim(\"at\")} ` +\n `${colors.yellow(fn || \"<anonymous>\")} ` +\n `${colors.cyan(rel)}${colors.dim(loc)}`\n );\n }\n\n const label = fn ? `at ${fn} ${rel}${loc}` : `at ${rel}${loc}`;\n return ` ${colors.dim(label)}`;\n })\n .join(\"\\n\");\n}\n\nexport function devLogError(message: string, error?: any) {\n console.log(`${timestamp()} ${colors.red(\"✗\")} ${colors.red(message)}`);\n if (error?.stack) console.log(formatErrorStack(error.stack));\n}\n\nexport function devLogWarn(message: string) {\n console.log(`${timestamp()} ${colors.yellow(\"⚠\")} ${colors.yellow(message)}`);\n}\n\nexport function devLogInfo(message: string) {\n console.log(`${timestamp()} ${colors.cyan(message)}`);\n}\n\nexport function devLogDim(message: string) {\n console.log(`${timestamp()} ${colors.dim(message)}`);\n}\n\nexport function devLogHMR(file: string, dependents?: number, durationMs?: number) {\n const relativePath = Path.toRelative(file);\n const depInfo = dependents\n ? colors.dim(` +${dependents} module${dependents > 1 ? \"s\" : \"\"}`)\n : \"\";\n const durationInfo = durationMs !== undefined ? colors.dim(` (${durationMs}ms)`) : \"\";\n console.log(\n `${timestamp()} 🔥 ${colors.green(\"hmr update\")} ${colors.dim(relativePath)}${depInfo}${durationInfo}`,\n );\n}\n\n/**\n * Per-phase breakdown for one hot reload, printed only when\n * `devServer.timings` is on. Phases run in this order: the watcher's\n * `awaitWriteFinish` settle wait, this handler's own debounce wait,\n * module-graph invalidation (version bumps), re-import of the changed\n * modules, and connector restart/rebind.\n */\nexport type ReloadPhaseTimings = {\n watcherSettleMs: number;\n debounceWaitMs: number;\n moduleGraphInvalidationMs: number;\n reimportMs: number;\n connectorRestartMs: number;\n};\n\nexport function devLogTimings(timings: ReloadPhaseTimings) {\n const phase = (label: string, ms: number) =>\n `${colors.dim(label)} ${colors.dim(`${Math.round(ms)}ms`)}`;\n const line = [\n phase(\"watcher\", timings.watcherSettleMs),\n phase(\"debounce\", timings.debounceWaitMs),\n phase(\"graph\", timings.moduleGraphInvalidationMs),\n phase(\"reimport\", timings.reimportMs),\n phase(\"connectors\", timings.connectorRestartMs),\n ].join(colors.dim(\" · \"));\n console.log(`${timestamp()} ${colors.dim(\"⏱\")} ${line}`);\n}\n\nexport function devLogConfig(file: string, connectors?: string[]) {\n const relativePath = Path.toRelative(file);\n const connectorInfo =\n connectors && connectors.length > 0 ? colors.dim(` → restarting ${connectors.join(\", \")}`) : \"\";\n console.log(\n `${timestamp()} ${colors.cyan(\"config reload\")} ${colors.dim(relativePath)}${connectorInfo}`,\n );\n}\n\nexport function devLogReady(message: string) {\n console.log(`\\n${timestamp()} ${colors.green(\"➜\")} ${colors.bold(message)}`);\n}\n\nexport function devLogSection(title: string) {\n console.log(`\\n${timestamp()} ${colors.bold(colors.cyan(title))}`);\n}\n\n/**\n * Format ERR_MODULE_NOT_FOUND so the displayed paths are relative to the\n * project root. The loader hook keeps source paths in the URL so we only\n * need to strip the absolute prefix — no cache-path translation any more.\n */\nexport function formatModuleNotFoundError(error: Error, suggestions?: string[]): string {\n const match = error.message.match(/Cannot find module '([^']+)' imported from '([^']+)'/);\n if (!match) return error.message;\n\n // Same rule as the frame formatter above: this renders a MODULE NOT FOUND\n // report, so a missing capture must degrade the message, not replace the\n // user's error with a crash inside the reporter.\n const [, rawModulePath, rawImporterPath] = match;\n const modulePath = rawModulePath ?? \"\";\n const importerPath = rawImporterPath ?? \"\";\n const lines: string[] = [\n \"\",\n `${colors.red(\"❌ MODULE NOT FOUND\")}`,\n \"\",\n `${colors.dim(\"Cannot find:\")} ${colors.cyan(Path.toRelative(modulePath))}`,\n \"\",\n `${colors.dim(\"Imported by:\")}`,\n ` ${colors.yellow(\"→\")} ${colors.white(Path.toRelative(importerPath))}`,\n ];\n\n if (suggestions && suggestions.length > 0) {\n lines.push(\"\");\n lines.push(`${colors.dim(\"Did you mean?\")}`);\n suggestions.forEach((s) => lines.push(` ${colors.cyan(\"→\")} ${colors.green(s)}`));\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** @deprecated alias retained for older callers. Use `devLog` directly. */\nexport const devServeLog = devLog;\n"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { restartDevServer } from "./restart-dev-server.mjs";
|
|
|
13
13
|
import { devServerShortcuts } from "./shortcuts.mjs";
|
|
14
14
|
import { BootPreconditionError } from "./boot-precondition-error.mjs";
|
|
15
15
|
import { buildDevelopmentOpenApiDocument } from "./build-development-openapi-document.mjs";
|
|
16
|
+
import { DevAgentTooling, resolveDevMcpOptions } from "./dev-agent-tooling.mjs";
|
|
16
17
|
import { LayerExecutor } from "./layer-executor.mjs";
|
|
17
18
|
import { printReadyBlock } from "./ready-block.mjs";
|
|
18
19
|
import { registerInstalledDevtools } from "./register-installed-devtools.mjs";
|
|
@@ -32,6 +33,7 @@ var DevelopmentServer = class {
|
|
|
32
33
|
constructor(options = {}) {
|
|
33
34
|
this.running = false;
|
|
34
35
|
this.connectorsStarted = false;
|
|
36
|
+
this.agentTooling = new DevAgentTooling();
|
|
35
37
|
this.reloadQueue = Promise.resolve();
|
|
36
38
|
this.options = options;
|
|
37
39
|
devLogSection("Starting Development Server...");
|
|
@@ -73,6 +75,10 @@ var DevelopmentServer = class {
|
|
|
73
75
|
const devServerConfig = await warlockConfigManager.get("devServer");
|
|
74
76
|
const generateTypings = this.options.generateTypings ?? devServerConfig?.generateTypings ?? true;
|
|
75
77
|
const healthCheckers = this.options.healthCheckers ?? devServerConfig?.healthCheckers ?? true;
|
|
78
|
+
await this.agentTooling.start({
|
|
79
|
+
agentsMd: devServerConfig?.agentsMd !== false,
|
|
80
|
+
mcp: resolveDevMcpOptions(this.options.mcp, devServerConfig?.mcp)
|
|
81
|
+
});
|
|
76
82
|
if (generateTypings) await typeGenerator.executeGenerateAllCommand();
|
|
77
83
|
if (healthCheckers) filesOrchestrator.startCheckingHealth(healthCheckers === true ? void 0 : healthCheckers);
|
|
78
84
|
} catch (error) {
|
|
@@ -108,6 +114,7 @@ var DevelopmentServer = class {
|
|
|
108
114
|
...batch.changed,
|
|
109
115
|
...batch.deleted
|
|
110
116
|
]);
|
|
117
|
+
this.agentTooling.afterReload();
|
|
111
118
|
filesOrchestrator.checkHealth(batch);
|
|
112
119
|
} catch (error) {
|
|
113
120
|
devServeLog(colors.redBright(`Failed to execute batch reload: ${error}`));
|
|
@@ -144,6 +151,7 @@ var DevelopmentServer = class {
|
|
|
144
151
|
devServeLog(colors.redBright("Shutting down Development Server..."));
|
|
145
152
|
this.running = false;
|
|
146
153
|
this.connectorsStarted = false;
|
|
154
|
+
await this.agentTooling.shutdown();
|
|
147
155
|
await connectorsManager.shutdown();
|
|
148
156
|
devServeLog(colors.greenBright("Development Server stopped"));
|
|
149
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"development-server.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/development-server.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport events from \"@mongez/events\";\nimport { fileExistsAsync, unlinkAsync } from \"@warlock.js/fs\";\nimport { Application } from \"../application\";\nimport { connectorsManager } from \"../connectors/connectors-manager\";\nimport { ConnectorLifecyclePhase } from \"../connectors/types\";\nimport { warlockConfigManager } from \"../warlock-config\";\nimport { registerDevelopmentOpenApiProvider } from \"../openapi/development-openapi-provider\";\nimport { BootPreconditionError } from \"./boot-precondition-error\";\nimport { buildDevelopmentOpenApiDocument } from \"./build-development-openapi-document\";\nimport { devLogInfo, devLogSection, devLogWarn, devServeLog } from \"./dev-logger\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { MANIFEST_PATH } from \"./flags\";\nimport type { IncomingReloadTimings } from \"./layer-executor\";\nimport { LayerExecutor } from \"./layer-executor\";\nimport { printReadyBlock } from \"./ready-block\";\nimport { registerInstalledDevtools } from \"./register-installed-devtools\";\nimport { restartDevServer } from \"./restart-dev-server\";\nimport { collectDevelopmentApiRoutes } from \"./collect-development-api-routes\";\nimport { publishCurrentRouteTypes } from \"./route-types-publisher\";\nimport { devServerShortcuts } from \"./shortcuts\";\nimport type { StartDevServerOptions } from \"./start-development-server\";\nimport { typeGenerator } from \"./type-generator\";\n\ntype Batch = {\n added: string[];\n changed: string[];\n deleted: string[];\n /** Non-code `watch.include` files that changed; only a restart applies them. */\n restartTriggers?: string[];\n timings?: IncomingReloadTimings;\n};\n\n/**\n * Top-level coordinator for `warlock dev`. Wires the file orchestrator, the\n * connectors, and the layer executor together, and listens for the watcher's\n * batched events to drive HMR.\n */\nexport class DevelopmentServer {\n private layerExecutor?: LayerExecutor;\n private running = false;\n\n /** Set once boot begins, so a failed boot still closes connectors that already started. */\n private connectorsStarted = false;\n private readonly options: StartDevServerOptions;\n\n public constructor(options: StartDevServerOptions = {}) {\n this.options = options;\n devLogSection(\"Starting Development Server...\");\n }\n\n public async start(): Promise<void> {\n try {\n this.connectorsStarted = true;\n const startedAt = performance.now();\n\n // Devtools reads this through the root barrel, which must not reach dev-server code.\n registerDevelopmentOpenApiProvider(buildDevelopmentOpenApiDocument);\n\n // --fresh deletes the manifest so reconciliation re-parses every file\n // from disk. Transpile caching is owned by the loader hook (in-memory).\n if (this.options.fresh && (await fileExistsAsync(MANIFEST_PATH))) {\n await unlinkAsync(MANIFEST_PATH);\n devServeLog(colors.cyanBright(\"Cleared manifest (--fresh)\"));\n }\n\n await filesOrchestrator.init();\n await filesOrchestrator.initializeAll();\n await filesOrchestrator.watchFiles();\n\n filesOrchestrator.specialFilesCollector.collect(filesOrchestrator.getFiles());\n\n this.setupEventListeners();\n\n // Decorator-driven registries (models, etc.) must be populated before\n // routes/services can resolve symbols by name.\n await this.autoDiscoverFiles();\n\n await filesOrchestrator.moduleLoader.loadAll();\n\n // A rejecting validator (Application.onValidateBoot) must abort boot\n // before late-phase connectors bind a port — this is what makes the\n // hook actually prevent serving instead of merely being defined.\n //\n // Wrapped and re-thrown as a BootPreconditionError: a rejected\n // validator is, by definition, a precondition whose cause cannot\n // change because the worker tried again — the supervisor must not\n // restart into the same rejection. See boot-precondition-error.ts.\n try {\n await Application.runStartupValidators();\n } catch (error) {\n throw new BootPreconditionError((error as Error).message, { cause: error });\n }\n\n // `@warlock.js/devtools` is a dev dependency the config never names;\n // when installed it joins the late phase here, and only here.\n await registerInstalledDevtools();\n\n // Late-phase connectors (http, socket) bind after app code has\n // registered routes/listeners.\n await connectorsManager.startPhase(ConnectorLifecyclePhase.Late);\n\n // Web installs its page table from its late connector. Generate only\n // after that installation so `href()` and the declaration table agree.\n await publishCurrentRouteTypes(process.cwd(), await collectDevelopmentApiRoutes());\n\n this.layerExecutor = new LayerExecutor(\n filesOrchestrator.getDependencyGraph(),\n filesOrchestrator.specialFilesCollector,\n filesOrchestrator.moduleLoader,\n (absolutePath) => filesOrchestrator.bumpVersion(absolutePath),\n () => filesOrchestrator.flushVersionBumps(),\n );\n\n this.running = true;\n\n const duration = performance.now() - startedAt;\n\n // App modules are loaded and both connector phases are active — signal a\n // complete boot so `Application.onceBooted(...)` listeners fire.\n Application.markBooted({\n environment: Application.environment,\n runtimeStrategy: Application.runtimeStrategy,\n bootDurationMs: duration,\n });\n\n // ONE block, AFTER the boot it summarises, replacing the scattered\n // \"N route(s) registered\" / \"Server ready at …\" / \"ready in …\" lines that\n // used to arrive in completion order. Warnings logged during boot sit\n // above it and stay there — see `ready-block.ts`.\n printReadyBlock(duration);\n\n // Tell the supervisor (when there is one) that boot completed, so its\n // healthy-uptime window counts from here rather than from spawn.\n process.send?.(\"warlock:booted\");\n\n // Precedence: explicit CLI option > devServer.* config > default.\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n const generateTypings =\n this.options.generateTypings ?? devServerConfig?.generateTypings ?? true;\n const healthCheckers = this.options.healthCheckers ?? devServerConfig?.healthCheckers ?? true;\n\n if (generateTypings) await typeGenerator.executeGenerateAllCommand();\n\n if (healthCheckers) {\n filesOrchestrator.startCheckingHealth(healthCheckers === true ? undefined : healthCheckers);\n }\n } catch (error) {\n devServeLog(colors.redBright(`Failed to start Development Server: ${error}`));\n await this.shutdown();\n throw error;\n }\n }\n\n /**\n * Eagerly import files whose decorators populate global registries so any\n * symbol-by-name resolution later in boot finds them.\n */\n private async autoDiscoverFiles(): Promise<void> {\n const discoveryTypes = [\"model\"] as const;\n for (const file of filesOrchestrator.files.values()) {\n if (file.type && (discoveryTypes as readonly string[]).includes(file.type)) {\n await filesOrchestrator.moduleLoader.loadModule(file, file.type);\n }\n }\n }\n\n /** Tail of the batch-reload chain (see `setupEventListeners`). */\n private reloadQueue: Promise<void> = Promise.resolve();\n\n private setupEventListeners(): void {\n // Reloads run one at a time: a second batch waits for the first to finish\n // so route re-registration and connector restarts never interleave.\n events.on(\"dev-server:batch-complete\", (batch: Batch) => {\n this.reloadQueue = this.reloadQueue\n .then(() => this.handleBatchComplete(batch))\n .catch((error) => devServeLog(colors.redBright(`Batch reload failed: ${error}`)));\n });\n }\n\n private async handleBatchComplete(batch: Batch): Promise<void> {\n if (!this.running || !this.layerExecutor) return;\n\n // warlock.config.ts holds settings read at boot (CLI commands, build\n // options, watch patterns, scheduled jobs) and .env feeds every config\n // that reads it. Neither can be hot-reloaded without leaving running\n // services configured with stale values, so the only honest response is\n // a full restart.\n const restartTrigger = this.findRestartTrigger(batch);\n\n if (restartTrigger) {\n // On success this never comes back — the process exits and the\n // supervisor replaces it. Reaching the next line means the restart was\n // declined by config or wasn't possible, so we fall through and still\n // hot-reload whatever ordinary code shared the batch.\n await this.restartForConfigChange(restartTrigger);\n }\n\n // No-op saves (an editor that fsyncs without a content write) are already\n // filtered upstream by the file hash in FileEventHandler, so batch.changed\n // only contains genuinely-changed paths by the time it reaches here.\n\n const total = batch.added.length + batch.changed.length + batch.deleted.length;\n if (total === 0) return;\n\n // Boot-time files still ride along in `changed` when a restart was\n // declined (`restartOnConfigChange: false`) or wasn't possible — they are\n // never hot-reloaded, so keep them out of the reload set either way.\n const codeFiles = [...batch.added, ...batch.changed].filter(\n (p) => !isEnvPath(p) && p !== \"warlock.config.ts\" && !batch.restartTriggers?.includes(p),\n );\n\n try {\n await this.layerExecutor.executeBatchReload(\n codeFiles,\n filesOrchestrator.getFiles(),\n batch.deleted,\n batch.changed,\n batch.timings,\n );\n\n // `executeBatchReload` includes route re-imports and affected connector\n // restarts. Publishing earlier could freeze a partial page/API view.\n // This also refreshes deletion-only batches after their cleanup/restart.\n await publishCurrentRouteTypes(process.cwd(), await collectDevelopmentApiRoutes());\n\n typeGenerator.executeTypingsGenerator([...batch.added, ...batch.changed, ...batch.deleted]);\n\n filesOrchestrator.checkHealth(batch);\n } catch (error) {\n devServeLog(colors.redBright(`Failed to execute batch reload: ${error}`));\n }\n }\n\n /**\n * The boot-time file in this batch that can only be applied by restarting,\n * or `undefined` when the batch is ordinary application code.\n */\n private findRestartTrigger(batch: Batch): string | undefined {\n if (batch.changed.includes(\"warlock.config.ts\")) {\n return \"warlock.config.ts\";\n }\n\n return [...batch.added, ...batch.changed].find(isEnvPath) ?? batch.restartTriggers?.[0];\n }\n\n /**\n * Restart so a changed boot-time file actually takes effect.\n *\n * Opt out with `devServer.restartOnConfigChange: false` and the old\n * behaviour returns: a warning telling you to restart yourself. If the\n * restart can't be performed at all (no supervisor, a shutdown that threw),\n * `restartDevServer` reports it and we fall back to the same warning rather\n * than leaving the server running against config it isn't using.\n */\n private async restartForConfigChange(file: string): Promise<void> {\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n\n if (devServerConfig?.restartOnConfigChange === false) {\n devLogWarn(`${file} changed — restart the dev server to apply.`);\n return;\n }\n\n devLogInfo(`${file} changed — restarting to apply.`);\n\n const restarted = await restartDevServer(this);\n\n if (!restarted) {\n devLogWarn(`${file} changed — restart the dev server to apply.`);\n }\n }\n\n public async shutdown(): Promise<void> {\n // Always hand the terminal back, even on a repeat/no-op shutdown — a\n // process that exits while stdin is still in raw mode leaves the user's\n // shell without line editing or Ctrl+C.\n devServerShortcuts.release();\n\n if (!this.running && !this.connectorsStarted) return;\n devServeLog(colors.redBright(\"Shutting down Development Server...\"));\n this.running = false;\n this.connectorsStarted = false;\n await connectorsManager.shutdown();\n devServeLog(colors.greenBright(\"Development Server stopped\"));\n }\n\n public isRunning(): boolean {\n return this.running;\n }\n}\n\nfunction isEnvPath(path: string): boolean {\n const basename = path.split(\"/\").pop() ?? path;\n return basename === \".env\" || basename.startsWith(\".env.\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"development-server.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/development-server.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport events from \"@mongez/events\";\nimport { fileExistsAsync, unlinkAsync } from \"@warlock.js/fs\";\nimport { Application } from \"../application\";\nimport { connectorsManager } from \"../connectors/connectors-manager\";\nimport { ConnectorLifecyclePhase } from \"../connectors/types\";\nimport { warlockConfigManager } from \"../warlock-config\";\nimport { registerDevelopmentOpenApiProvider } from \"../openapi/development-openapi-provider\";\nimport { BootPreconditionError } from \"./boot-precondition-error\";\nimport { buildDevelopmentOpenApiDocument } from \"./build-development-openapi-document\";\nimport { DevAgentTooling, resolveDevMcpOptions } from \"./dev-agent-tooling\";\nimport { devLogInfo, devLogSection, devLogWarn, devServeLog } from \"./dev-logger\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { MANIFEST_PATH } from \"./flags\";\nimport type { IncomingReloadTimings } from \"./layer-executor\";\nimport { LayerExecutor } from \"./layer-executor\";\nimport { printReadyBlock } from \"./ready-block\";\nimport { registerInstalledDevtools } from \"./register-installed-devtools\";\nimport { restartDevServer } from \"./restart-dev-server\";\nimport { collectDevelopmentApiRoutes } from \"./collect-development-api-routes\";\nimport { publishCurrentRouteTypes } from \"./route-types-publisher\";\nimport { devServerShortcuts } from \"./shortcuts\";\nimport type { StartDevServerOptions } from \"./start-development-server\";\nimport { typeGenerator } from \"./type-generator\";\n\ntype Batch = {\n added: string[];\n changed: string[];\n deleted: string[];\n /** Non-code `watch.include` files that changed; only a restart applies them. */\n restartTriggers?: string[];\n timings?: IncomingReloadTimings;\n};\n\n/**\n * Top-level coordinator for `warlock dev`. Wires the file orchestrator, the\n * connectors, and the layer executor together, and listens for the watcher's\n * batched events to drive HMR.\n */\nexport class DevelopmentServer {\n private layerExecutor?: LayerExecutor;\n private running = false;\n\n /** Set once boot begins, so a failed boot still closes connectors that already started. */\n private connectorsStarted = false;\n private readonly options: StartDevServerOptions;\n\n /** `.warlock/dev-server.json`, the AGENTS.md refresher and `--mcp`. */\n private readonly agentTooling = new DevAgentTooling();\n\n public constructor(options: StartDevServerOptions = {}) {\n this.options = options;\n devLogSection(\"Starting Development Server...\");\n }\n\n public async start(): Promise<void> {\n try {\n this.connectorsStarted = true;\n const startedAt = performance.now();\n\n // Devtools reads this through the root barrel, which must not reach dev-server code.\n registerDevelopmentOpenApiProvider(buildDevelopmentOpenApiDocument);\n\n // --fresh deletes the manifest so reconciliation re-parses every file\n // from disk. Transpile caching is owned by the loader hook (in-memory).\n if (this.options.fresh && (await fileExistsAsync(MANIFEST_PATH))) {\n await unlinkAsync(MANIFEST_PATH);\n devServeLog(colors.cyanBright(\"Cleared manifest (--fresh)\"));\n }\n\n await filesOrchestrator.init();\n await filesOrchestrator.initializeAll();\n await filesOrchestrator.watchFiles();\n\n filesOrchestrator.specialFilesCollector.collect(filesOrchestrator.getFiles());\n\n this.setupEventListeners();\n\n // Decorator-driven registries (models, etc.) must be populated before\n // routes/services can resolve symbols by name.\n await this.autoDiscoverFiles();\n\n await filesOrchestrator.moduleLoader.loadAll();\n\n // A rejecting validator (Application.onValidateBoot) must abort boot\n // before late-phase connectors bind a port — this is what makes the\n // hook actually prevent serving instead of merely being defined.\n //\n // Wrapped and re-thrown as a BootPreconditionError: a rejected\n // validator is, by definition, a precondition whose cause cannot\n // change because the worker tried again — the supervisor must not\n // restart into the same rejection. See boot-precondition-error.ts.\n try {\n await Application.runStartupValidators();\n } catch (error) {\n throw new BootPreconditionError((error as Error).message, { cause: error });\n }\n\n // `@warlock.js/devtools` is a dev dependency the config never names;\n // when installed it joins the late phase here, and only here.\n await registerInstalledDevtools();\n\n // Late-phase connectors (http, socket) bind after app code has\n // registered routes/listeners.\n await connectorsManager.startPhase(ConnectorLifecyclePhase.Late);\n\n // Web installs its page table from its late connector. Generate only\n // after that installation so `href()` and the declaration table agree.\n await publishCurrentRouteTypes(process.cwd(), await collectDevelopmentApiRoutes());\n\n this.layerExecutor = new LayerExecutor(\n filesOrchestrator.getDependencyGraph(),\n filesOrchestrator.specialFilesCollector,\n filesOrchestrator.moduleLoader,\n (absolutePath) => filesOrchestrator.bumpVersion(absolutePath),\n () => filesOrchestrator.flushVersionBumps(),\n );\n\n this.running = true;\n\n const duration = performance.now() - startedAt;\n\n // App modules are loaded and both connector phases are active — signal a\n // complete boot so `Application.onceBooted(...)` listeners fire.\n Application.markBooted({\n environment: Application.environment,\n runtimeStrategy: Application.runtimeStrategy,\n bootDurationMs: duration,\n });\n\n // ONE block, AFTER the boot it summarises, replacing the scattered\n // \"N route(s) registered\" / \"Server ready at …\" / \"ready in …\" lines that\n // used to arrive in completion order. Warnings logged during boot sit\n // above it and stay there — see `ready-block.ts`.\n printReadyBlock(duration);\n\n // Tell the supervisor (when there is one) that boot completed, so its\n // healthy-uptime window counts from here rather than from spawn.\n process.send?.(\"warlock:booted\");\n\n // Precedence: explicit CLI option > devServer.* config > default.\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n const generateTypings =\n this.options.generateTypings ?? devServerConfig?.generateTypings ?? true;\n const healthCheckers = this.options.healthCheckers ?? devServerConfig?.healthCheckers ?? true;\n\n await this.agentTooling.start({\n agentsMd: devServerConfig?.agentsMd !== false,\n mcp: resolveDevMcpOptions(this.options.mcp, devServerConfig?.mcp),\n });\n\n if (generateTypings) await typeGenerator.executeGenerateAllCommand();\n\n if (healthCheckers) {\n filesOrchestrator.startCheckingHealth(healthCheckers === true ? undefined : healthCheckers);\n }\n } catch (error) {\n devServeLog(colors.redBright(`Failed to start Development Server: ${error}`));\n await this.shutdown();\n throw error;\n }\n }\n\n /**\n * Eagerly import files whose decorators populate global registries so any\n * symbol-by-name resolution later in boot finds them.\n */\n private async autoDiscoverFiles(): Promise<void> {\n const discoveryTypes = [\"model\"] as const;\n for (const file of filesOrchestrator.files.values()) {\n if (file.type && (discoveryTypes as readonly string[]).includes(file.type)) {\n await filesOrchestrator.moduleLoader.loadModule(file, file.type);\n }\n }\n }\n\n /** Tail of the batch-reload chain (see `setupEventListeners`). */\n private reloadQueue: Promise<void> = Promise.resolve();\n\n private setupEventListeners(): void {\n // Reloads run one at a time: a second batch waits for the first to finish\n // so route re-registration and connector restarts never interleave.\n events.on(\"dev-server:batch-complete\", (batch: Batch) => {\n this.reloadQueue = this.reloadQueue\n .then(() => this.handleBatchComplete(batch))\n .catch((error) => devServeLog(colors.redBright(`Batch reload failed: ${error}`)));\n });\n }\n\n private async handleBatchComplete(batch: Batch): Promise<void> {\n if (!this.running || !this.layerExecutor) return;\n\n // warlock.config.ts holds settings read at boot (CLI commands, build\n // options, watch patterns, scheduled jobs) and .env feeds every config\n // that reads it. Neither can be hot-reloaded without leaving running\n // services configured with stale values, so the only honest response is\n // a full restart.\n const restartTrigger = this.findRestartTrigger(batch);\n\n if (restartTrigger) {\n // On success this never comes back — the process exits and the\n // supervisor replaces it. Reaching the next line means the restart was\n // declined by config or wasn't possible, so we fall through and still\n // hot-reload whatever ordinary code shared the batch.\n await this.restartForConfigChange(restartTrigger);\n }\n\n // No-op saves (an editor that fsyncs without a content write) are already\n // filtered upstream by the file hash in FileEventHandler, so batch.changed\n // only contains genuinely-changed paths by the time it reaches here.\n\n const total = batch.added.length + batch.changed.length + batch.deleted.length;\n if (total === 0) return;\n\n // Boot-time files still ride along in `changed` when a restart was\n // declined (`restartOnConfigChange: false`) or wasn't possible — they are\n // never hot-reloaded, so keep them out of the reload set either way.\n const codeFiles = [...batch.added, ...batch.changed].filter(\n (p) => !isEnvPath(p) && p !== \"warlock.config.ts\" && !batch.restartTriggers?.includes(p),\n );\n\n try {\n await this.layerExecutor.executeBatchReload(\n codeFiles,\n filesOrchestrator.getFiles(),\n batch.deleted,\n batch.changed,\n batch.timings,\n );\n\n // `executeBatchReload` includes route re-imports and affected connector\n // restarts. Publishing earlier could freeze a partial page/API view.\n // This also refreshes deletion-only batches after their cleanup/restart.\n await publishCurrentRouteTypes(process.cwd(), await collectDevelopmentApiRoutes());\n\n typeGenerator.executeTypingsGenerator([...batch.added, ...batch.changed, ...batch.deleted]);\n\n this.agentTooling.afterReload();\n\n filesOrchestrator.checkHealth(batch);\n } catch (error) {\n devServeLog(colors.redBright(`Failed to execute batch reload: ${error}`));\n }\n }\n\n /**\n * The boot-time file in this batch that can only be applied by restarting,\n * or `undefined` when the batch is ordinary application code.\n */\n private findRestartTrigger(batch: Batch): string | undefined {\n if (batch.changed.includes(\"warlock.config.ts\")) {\n return \"warlock.config.ts\";\n }\n\n return [...batch.added, ...batch.changed].find(isEnvPath) ?? batch.restartTriggers?.[0];\n }\n\n /**\n * Restart so a changed boot-time file actually takes effect.\n *\n * Opt out with `devServer.restartOnConfigChange: false` and the old\n * behaviour returns: a warning telling you to restart yourself. If the\n * restart can't be performed at all (no supervisor, a shutdown that threw),\n * `restartDevServer` reports it and we fall back to the same warning rather\n * than leaving the server running against config it isn't using.\n */\n private async restartForConfigChange(file: string): Promise<void> {\n const devServerConfig = await warlockConfigManager.get(\"devServer\");\n\n if (devServerConfig?.restartOnConfigChange === false) {\n devLogWarn(`${file} changed — restart the dev server to apply.`);\n return;\n }\n\n devLogInfo(`${file} changed — restarting to apply.`);\n\n const restarted = await restartDevServer(this);\n\n if (!restarted) {\n devLogWarn(`${file} changed — restart the dev server to apply.`);\n }\n }\n\n public async shutdown(): Promise<void> {\n // Always hand the terminal back, even on a repeat/no-op shutdown — a\n // process that exits while stdin is still in raw mode leaves the user's\n // shell without line editing or Ctrl+C.\n devServerShortcuts.release();\n\n if (!this.running && !this.connectorsStarted) return;\n devServeLog(colors.redBright(\"Shutting down Development Server...\"));\n this.running = false;\n this.connectorsStarted = false;\n await this.agentTooling.shutdown();\n await connectorsManager.shutdown();\n devServeLog(colors.greenBright(\"Development Server stopped\"));\n }\n\n public isRunning(): boolean {\n return this.running;\n }\n}\n\nfunction isEnvPath(path: string): boolean {\n const basename = path.split(\"/\").pop() ?? path;\n return basename === \".env\" || basename.startsWith(\".env.\");\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { expressionOf, forEachChild, isCallExpression, isIdentifier, isObjectLiteralExpression, isPropertyAssignment, isStringLiteral, keyName, valueText } from "../tooling/syntax/ast.mjs";
|
|
2
2
|
|
|
3
3
|
//#region ../../packages/core/src/dev-server/extract-translation-keys.ts
|
|
4
4
|
/**
|
|
@@ -21,46 +21,45 @@ function extractTranslationKeys(sourceFile) {
|
|
|
21
21
|
const keys = /* @__PURE__ */ new Set();
|
|
22
22
|
const visit = (node) => {
|
|
23
23
|
if (isGroupedTranslationsCall(node)) collectFromCall(node, keys);
|
|
24
|
-
|
|
24
|
+
forEachChild(node, visit);
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
forEachChild(sourceFile, visit);
|
|
27
27
|
return Array.from(keys).sort();
|
|
28
28
|
}
|
|
29
29
|
function isGroupedTranslationsCall(node) {
|
|
30
|
-
return
|
|
30
|
+
return isCallExpression(node) && isIdentifier(expressionOf(node)) && valueText(expressionOf(node)) === "groupedTranslations";
|
|
31
31
|
}
|
|
32
32
|
function collectFromCall(call, keys) {
|
|
33
33
|
const [first, second] = call.arguments;
|
|
34
34
|
if (first === void 0) return;
|
|
35
35
|
if (second !== void 0) {
|
|
36
|
-
if (
|
|
36
|
+
if (isStringLiteral(first) && isObjectLiteralExpression(second)) collectLeaves(second, valueText(first), keys);
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
|
-
if (
|
|
40
|
-
if (!
|
|
41
|
-
const groupName = getPropertyName(property.
|
|
39
|
+
if (isObjectLiteralExpression(first)) for (const property of first.properties) {
|
|
40
|
+
if (!isPropertyAssignment(property)) continue;
|
|
41
|
+
const groupName = getPropertyName(property.key);
|
|
42
42
|
if (groupName === void 0) continue;
|
|
43
|
-
if (
|
|
43
|
+
if (isObjectLiteralExpression(property.value)) collectLeaves(property.value, groupName, keys);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
function collectLeaves(object, prefix, keys) {
|
|
47
47
|
for (const property of object.properties) {
|
|
48
|
-
if (!
|
|
49
|
-
const key = getPropertyName(property.
|
|
48
|
+
if (!isPropertyAssignment(property)) continue;
|
|
49
|
+
const key = getPropertyName(property.key);
|
|
50
50
|
if (key === void 0) continue;
|
|
51
|
-
if (!
|
|
51
|
+
if (!isObjectLiteralExpression(property.value)) continue;
|
|
52
52
|
const path = `${prefix}.${key}`;
|
|
53
|
-
if (isLeaf(property.
|
|
54
|
-
else collectLeaves(property.
|
|
53
|
+
if (isLeaf(property.value)) keys.add(path);
|
|
54
|
+
else collectLeaves(property.value, path, keys);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
/** A locale map (`{ en: "...", ar: "..." }`) has no object-literal children. */
|
|
58
58
|
function isLeaf(object) {
|
|
59
|
-
return !object.properties.some((property) =>
|
|
59
|
+
return !object.properties.some((property) => isPropertyAssignment(property) && isObjectLiteralExpression(property.value));
|
|
60
60
|
}
|
|
61
61
|
function getPropertyName(name) {
|
|
62
|
-
|
|
63
|
-
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) return name.text;
|
|
62
|
+
return keyName(name);
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-translation-keys.mjs","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/extract-translation-keys.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"extract-translation-keys.mjs","names":["ast.isCallExpression","ast.isIdentifier","ast.expressionOf","ast.valueText","ast.isStringLiteral","ast.isObjectLiteralExpression","ast.isPropertyAssignment","ast.keyName"],"sources":["../../../../../../../../packages/core/src/dev-server/extract-translation-keys.ts"],"sourcesContent":["import * as ast from \"../tooling/syntax/ast\";\n\n/**\n * Extract literal lookup keys registered through `groupedTranslations` calls,\n * statically, without executing the source.\n *\n * Handles both call shapes:\n * - Named-group: `groupedTranslations(\"site\", { home: { en, ar } })`\n * - Object: `groupedTranslations({ site: { home: { en, ar } } })`\n *\n * Groups nest to any depth (`{ detail: { title: { en, ar } } }` yields\n * `products.detail.title`) — an object is a leaf once none of its own\n * properties hold a further object literal.\n *\n * A dynamic group name, dictionary, or property key (an identifier, spread,\n * or computed name instead of a literal) cannot be resolved statically and is\n * silently skipped; such keys must be documented by the app author instead.\n */\nexport function extractTranslationKeys(sourceFile: ast.SourceFile): string[] {\n const keys = new Set<string>();\n\n const visit = (node: ast.Node): void => {\n if (isGroupedTranslationsCall(node)) {\n collectFromCall(node, keys);\n }\n\n ast.forEachChild(node, visit);\n };\n\n ast.forEachChild(sourceFile, visit);\n\n return Array.from(keys).sort();\n}\n\nfunction isGroupedTranslationsCall(node: ast.Node): node is ast.CallExpression {\n return (\n ast.isCallExpression(node) &&\n ast.isIdentifier(ast.expressionOf(node)) &&\n ast.valueText(ast.expressionOf(node)) === \"groupedTranslations\"\n );\n}\n\nfunction collectFromCall(call: ast.CallExpression, keys: Set<string>): void {\n const [first, second] = call.arguments;\n\n if (first === undefined) return;\n\n if (second !== undefined) {\n if (ast.isStringLiteral(first) && ast.isObjectLiteralExpression(second)) {\n collectLeaves(second, ast.valueText(first), keys);\n }\n return;\n }\n\n if (ast.isObjectLiteralExpression(first)) {\n for (const property of first.properties) {\n if (!ast.isPropertyAssignment(property)) continue;\n\n const groupName = getPropertyName(property.key);\n if (groupName === undefined) continue;\n\n if (ast.isObjectLiteralExpression(property.value)) {\n collectLeaves(property.value, groupName, keys);\n }\n }\n }\n}\n\nfunction collectLeaves(object: ast.ObjectExpression, prefix: string, keys: Set<string>): void {\n for (const property of object.properties) {\n if (!ast.isPropertyAssignment(property)) continue;\n\n const key = getPropertyName(property.key);\n if (key === undefined) continue;\n\n if (!ast.isObjectLiteralExpression(property.value)) continue;\n\n const path = `${prefix}.${key}`;\n\n if (isLeaf(property.value)) {\n keys.add(path);\n } else {\n collectLeaves(property.value, path, keys);\n }\n }\n}\n\n/** A locale map (`{ en: \"...\", ar: \"...\" }`) has no object-literal children. */\nfunction isLeaf(object: ast.ObjectExpression): boolean {\n return !object.properties.some(\n (property) =>\n ast.isPropertyAssignment(property) && ast.isObjectLiteralExpression(property.value),\n );\n}\n\nfunction getPropertyName(name: ast.Node | undefined): string | undefined {\n return ast.keyName(name);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,SAAgB,uBAAuB,YAAsC;CAC3E,MAAM,uBAAO,IAAI,IAAY;CAE7B,MAAM,SAAS,SAAyB;EACtC,IAAI,0BAA0B,IAAI,GAChC,gBAAgB,MAAM,IAAI;EAG5B,aAAiB,MAAM,KAAK;CAC9B;CAEA,aAAiB,YAAY,KAAK;CAElC,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,KAAK;AAC/B;AAEA,SAAS,0BAA0B,MAA4C;CAC7E,OACEA,iBAAqB,IAAI,KACzBC,aAAiBC,aAAiB,IAAI,CAAC,KACvCC,UAAcD,aAAiB,IAAI,CAAC,MAAM;AAE9C;AAEA,SAAS,gBAAgB,MAA0B,MAAyB;CAC1E,MAAM,CAAC,OAAO,UAAU,KAAK;CAE7B,IAAI,UAAU,QAAW;CAEzB,IAAI,WAAW,QAAW;EACxB,IAAIE,gBAAoB,KAAK,KAAKC,0BAA8B,MAAM,GACpE,cAAc,QAAQF,UAAc,KAAK,GAAG,IAAI;EAElD;CACF;CAEA,IAAIE,0BAA8B,KAAK,GACrC,KAAK,MAAM,YAAY,MAAM,YAAY;EACvC,IAAI,CAACC,qBAAyB,QAAQ,GAAG;EAEzC,MAAM,YAAY,gBAAgB,SAAS,GAAG;EAC9C,IAAI,cAAc,QAAW;EAE7B,IAAID,0BAA8B,SAAS,KAAK,GAC9C,cAAc,SAAS,OAAO,WAAW,IAAI;CAEjD;AAEJ;AAEA,SAAS,cAAc,QAA8B,QAAgB,MAAyB;CAC5F,KAAK,MAAM,YAAY,OAAO,YAAY;EACxC,IAAI,CAACC,qBAAyB,QAAQ,GAAG;EAEzC,MAAM,MAAM,gBAAgB,SAAS,GAAG;EACxC,IAAI,QAAQ,QAAW;EAEvB,IAAI,CAACD,0BAA8B,SAAS,KAAK,GAAG;EAEpD,MAAM,OAAO,GAAG,OAAO,GAAG;EAE1B,IAAI,OAAO,SAAS,KAAK,GACvB,KAAK,IAAI,IAAI;OAEb,cAAc,SAAS,OAAO,MAAM,IAAI;CAE5C;AACF;;AAGA,SAAS,OAAO,QAAuC;CACrD,OAAO,CAAC,OAAO,WAAW,MACvB,aACCC,qBAAyB,QAAQ,KAAKD,0BAA8B,SAAS,KAAK,CACtF;AACF;AAEA,SAAS,gBAAgB,MAAgD;CACvE,OAAOE,QAAY,IAAI;AACzB"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { FileManifest, FileState, FileType } from "./types.mjs";
|
|
2
2
|
import { FileOperations } from "./file-operations.mjs";
|
|
3
|
-
|
|
4
3
|
//#region ../../packages/core/src/dev-server/file-manager.d.ts
|
|
5
|
-
type CleanupFunction = () => void;
|
|
4
|
+
export type CleanupFunction = () => void;
|
|
6
5
|
/**
|
|
7
6
|
* FileManager — per-file metadata for the dependency graph.
|
|
8
7
|
*
|
|
@@ -11,7 +10,7 @@ type CleanupFunction = () => void;
|
|
|
11
10
|
* and parse its imports. Its job is keeping the metadata that the
|
|
12
11
|
* orchestrator needs to invalidate dependents on change.
|
|
13
12
|
*/
|
|
14
|
-
declare class FileManager {
|
|
13
|
+
export declare class FileManager {
|
|
15
14
|
readonly absolutePath: string;
|
|
16
15
|
files: Map<string, FileManager>;
|
|
17
16
|
fileOperations: FileOperations;
|
|
@@ -59,9 +58,7 @@ declare class FileManager {
|
|
|
59
58
|
* @param force - re-parse even when the hash matches.
|
|
60
59
|
* @returns true if the file was (re)parsed.
|
|
61
60
|
*/
|
|
62
|
-
process({
|
|
63
|
-
force
|
|
64
|
-
}?: {
|
|
61
|
+
process({ force }?: {
|
|
65
62
|
force?: boolean;
|
|
66
63
|
}): Promise<boolean>;
|
|
67
64
|
/**
|
|
@@ -81,5 +78,4 @@ declare class FileManager {
|
|
|
81
78
|
toManifest(): FileManifest;
|
|
82
79
|
}
|
|
83
80
|
//#endregion
|
|
84
|
-
export { FileManager };
|
|
85
81
|
//# sourceMappingURL=file-manager.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manager.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/file-manager.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-manager.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/dev-server/file-manager.ts"],"mappings":";;;YASY;;;;;;;;;qBAyBC;WAgCO;EACT,OAAO,YAAY;EACnB,gBAAgB;EAjClB;EACA;EACA;EACA;;EAGA,cAAY;;;;;EAMZ,sBAAoB;;EAGpB,WAAS;;EAGT,YAAU;EAEV,MAAM;;EAGN,SAAS;;EAGT;EAEA,OAAO;EAEd,YACkB,sBACT,OAAO,YAAY,cACnB,gBAAgB;EAGlB,WAAW,SAAS,kBAAkB;EAMtC;;;;;EAQM,KAAK,eAAe,QAAQ,gBAAgB;;;;;;;;;;;;;;;;EA0B5C,UAAU;IAAmB;MAAyB;;;;;;;YA+CnD,yBAAyB;;;;;;YAgCzB,iBAAiB,cAAc,QAAQ,gBAAgB;YA6B7D;EAuBH,cAAc"}
|
|
@@ -2,7 +2,6 @@ import { DependencyGraph } from "./dependency-graph.mjs";
|
|
|
2
2
|
import { ManifestManager } from "./manifest-manager.mjs";
|
|
3
3
|
import { SpecialFilesCollector } from "./special-files-collector.mjs";
|
|
4
4
|
import { FileManager } from "./file-manager.mjs";
|
|
5
|
-
|
|
6
5
|
//#region ../../packages/core/src/dev-server/file-operations.d.ts
|
|
7
6
|
/**
|
|
8
7
|
* FileOperations — add/update/delete lifecycle for a single file.
|
|
@@ -10,7 +9,7 @@ import { FileManager } from "./file-manager.mjs";
|
|
|
10
9
|
* Coordinates the dependency graph, manifest, and special-files collector
|
|
11
10
|
* so the orchestrator and event handler can stay declarative.
|
|
12
11
|
*/
|
|
13
|
-
declare class FileOperations {
|
|
12
|
+
export declare class FileOperations {
|
|
14
13
|
private readonly files;
|
|
15
14
|
private readonly dependencyGraph;
|
|
16
15
|
private readonly manifest;
|
|
@@ -39,5 +38,4 @@ declare class FileOperations {
|
|
|
39
38
|
syncFilesToManifest(): void;
|
|
40
39
|
}
|
|
41
40
|
//#endregion
|
|
42
|
-
export { FileOperations };
|
|
43
41
|
//# sourceMappingURL=file-operations.d.mts.map
|