@warlock.js/core 5.31.0 → 5.33.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 +61 -0
- 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 +9 -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 +22 -20
- package/esm/application/boot-signal.d.mts.map +1 -1
- package/esm/application/boot-signal.mjs +15 -9
- package/esm/application/boot-signal.mjs.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/agents-md/agents-md-command.action.mjs +3 -2
- package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -1
- package/esm/cli/commands/ai/ai-command.action.mjs +140 -0
- package/esm/cli/commands/ai/ai-command.action.mjs.map +1 -0
- package/esm/cli/commands/ai.command.mjs +50 -0
- package/esm/cli/commands/ai.command.mjs.map +1 -0
- package/esm/cli/commands/board/board-command.action.mjs +1 -1
- package/esm/cli/commands/check/check-command.action.mjs +4 -1
- package/esm/cli/commands/check/check-command.action.mjs.map +1 -1
- package/esm/cli/commands/check/child-typecheck.mjs +1 -1
- package/esm/cli/commands/check/child-typecheck.mjs.map +1 -1
- package/esm/cli/commands/check/format-problems.mjs +1 -1
- package/esm/cli/commands/check.command.mjs +6 -1
- package/esm/cli/commands/check.command.mjs.map +1 -1
- package/esm/cli/commands/dev-server.command.mjs +3 -2
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/doctor/check.types.d.mts +29 -16
- package/esm/cli/commands/doctor/check.types.d.mts.map +1 -1
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +22 -27
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/doctor-command.action.mjs +2 -1
- package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
- package/esm/cli/commands/explain/explain-command.action.mjs +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 +5 -3
- package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +3 -2
- 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 +2 -2
- package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs +1 -2
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
- package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
- package/esm/cli/commands/inspect/inspect-command.action.mjs +3 -2
- package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -1
- 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 +15 -14
- package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -1
- package/esm/cli/commands/openapi-generator.action.mjs +1 -1
- package/esm/cli/commands/pm2/pm2-command.action.mjs +91 -0
- package/esm/cli/commands/pm2/pm2-command.action.mjs.map +1 -0
- package/esm/cli/commands/pm2/pm2-config.mjs +115 -0
- package/esm/cli/commands/pm2/pm2-config.mjs.map +1 -0
- package/esm/cli/commands/pm2.command.mjs +53 -0
- package/esm/cli/commands/pm2.command.mjs.map +1 -0
- package/esm/cli/commands/postman-generator.action.mjs +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 +2 -2
- package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
- package/esm/cli/commands/test.command.mjs +1 -1
- package/esm/cli/commands/trace/trace-command.action.mjs +1 -1
- package/esm/cli/commands-loader.mjs +1 -1
- package/esm/cli/framework-cli-commands.mjs +6 -0
- package/esm/cli/framework-cli-commands.mjs.map +1 -1
- package/esm/cli/parse-cli-args.mjs +2 -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 +3 -3
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/config/config-manager.mjs +1 -1
- package/esm/config/config-schema.d.mts +19 -16
- package/esm/config/config-schema.d.mts.map +1 -1
- 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 +2 -1
- package/esm/config/index.mjs +1 -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-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 +2 -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 +3 -6
- 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 +8 -7
- 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/shutdown-timeout.mjs +7 -0
- package/esm/connectors/shutdown-timeout.mjs.map +1 -0
- 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 +20 -11
- 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/database/index.d.mts +3 -1
- package/esm/database/index.mjs +1 -1
- package/esm/database/migrate-action.mjs +1 -1
- package/esm/database/models/database-log/database-log.d.mts +2 -3
- 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 +2 -3
- package/esm/database/seeds/seeder.errors.d.mts.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/create-worker.mjs +5 -3
- 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/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-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 +6 -8
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
- 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 +6 -15
- package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -1
- package/esm/dev-server/health-checker/eslint-support.mjs +27 -0
- package/esm/dev-server/health-checker/eslint-support.mjs.map +1 -0
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +7 -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 +1 -0
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
- package/esm/dev-server/health-checker/oxlint-runner.mjs +6 -5
- package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +1 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +2 -11
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -1
- 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/own-resolver.mjs +1 -1
- package/esm/dev-server/loader/register-loader.mjs +3 -2
- 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 +2 -1
- package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
- package/esm/dev-server/loader/transpile-cache.mjs +2 -1
- 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 +2 -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 +6 -38
- 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/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/supervisor.mjs +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 +28 -35
- 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/error-codes.d.mts +29 -22
- package/esm/errors/error-codes.d.mts.map +1 -1
- package/esm/errors/warlock-error.d.mts +1 -3
- package/esm/errors/warlock-error.d.mts.map +1 -1
- package/esm/generations/add-command.action.mjs +3 -2
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/features/bull-board.feature.mjs +2 -1
- package/esm/generations/features/bull-board.feature.mjs.map +1 -1
- package/esm/generations/features/index.mjs +2 -0
- package/esm/generations/features/index.mjs.map +1 -1
- package/esm/generations/features/notifications.feature.mjs +2 -1
- package/esm/generations/features/notifications.feature.mjs.map +1 -1
- package/esm/generations/features/process.feature.mjs +65 -0
- package/esm/generations/features/process.feature.mjs.map +1 -0
- 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 +1 -1
- package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
- package/esm/generations/features/sitemap.feature.mjs +2 -1
- package/esm/generations/features/sitemap.feature.mjs.map +1 -1
- package/esm/generations/generation-fs.mjs +1 -1
- package/esm/generations/generation-run.mjs +1 -1
- package/esm/generations/stubs.mjs +1 -1
- 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 +4 -4
- package/esm/http/bounded-stream-queue.d.mts.map +1 -1
- package/esm/http/bounded-stream-queue.mjs +1 -1
- package/esm/http/bounded-stream-queue.mjs.map +1 -1
- 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 +2 -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 +14 -13
- package/esm/http/conditional-request.d.mts.map +1 -1
- 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 +10 -12
- package/esm/http/csp.d.mts.map +1 -1
- package/esm/http/csp.mjs +2 -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 +2 -3
- 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 +28 -29
- package/esm/http/errors/errors.d.mts.map +1 -1
- package/esm/http/escape-header-value.d.mts +1 -2
- package/esm/http/escape-header-value.d.mts.map +1 -1
- package/esm/http/events.d.mts +2 -4
- package/esm/http/events.d.mts.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 +4 -1
- package/esm/http/index.mjs +1 -1
- 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 +10 -10
- 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/port-preflight.mjs +2 -0
- package/esm/http/port-preflight.mjs.map +1 -1
- package/esm/http/rate-limit-cache-store.mjs +4 -3
- 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 +20 -16
- package/esm/http/request-log-snapshot.d.mts.map +1 -1
- package/esm/http/request-log-snapshot.mjs +3 -3
- package/esm/http/request-log-snapshot.mjs.map +1 -1
- package/esm/http/request.d.mts +8 -7
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +8 -7
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +12 -11
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +7 -7
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/safe-redirect.d.mts +3 -4
- package/esm/http/safe-redirect.d.mts.map +1 -1
- 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 +9 -9
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +4 -4
- 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/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 +49 -43
- 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-variants.d.mts +6 -6
- package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/generate-image-variants.mjs +1 -1
- package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
- package/esm/http/uploads/image-variant-cache-entries.mjs +1 -1
- package/esm/http/uploads/image-variant-cache.mjs +8 -8
- package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
- package/esm/http/uploads/image-variant-types.d.mts +7 -9
- package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
- package/esm/http/uploads/image-variants-config-error.d.mts +1 -2
- package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
- package/esm/http/uploads/index.d.mts +2 -1
- package/esm/http/uploads/index.mjs +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 +2 -4
- package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/resolve-image-variant.d.mts +3 -5
- package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
- package/esm/http/uploads/resolve-image-variants-config.mjs +4 -4
- 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/trim-image-variant-cache.mjs +3 -3
- package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -1
- package/esm/http/uploads/uploaded-file.controller.d.mts +6 -5
- package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
- package/esm/http/uploads/uploaded-file.controller.mjs +2 -1
- package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
- package/esm/http/uploads/variant-cache-key.mjs +1 -1
- 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 +19 -17
- 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 +28 -2
- package/esm/index.mjs +7 -2
- 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 +4 -5
- package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
- package/esm/localization/parse-locale-dictionary.mjs +1 -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 +12 -14
- package/esm/mail/config.d.mts.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 +2 -1
- package/esm/mail/index.mjs +1 -1
- 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/openapi/build-openapi-document.d.mts +2 -4
- package/esm/openapi/build-openapi-document.d.mts.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/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-url.mjs +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/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/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/uuid-v5.mjs +1 -1
- package/esm/openapi/schema-registry.d.mts +1 -1
- package/esm/openapi/security.mjs +1 -1
- package/esm/openapi/types.d.mts +23 -21
- package/esm/openapi/types.d.mts.map +1 -1
- package/esm/production/assert-generated-imports.mjs +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 +2 -1
- 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 +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/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 +12 -32
- package/esm/restful/restful.d.mts.map +1 -1
- package/esm/router/index.d.mts +2 -1
- package/esm/router/index.mjs +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/resolve-route-rate-limit.mjs +3 -3
- package/esm/router/resolve-route-rate-limit.mjs.map +1 -1
- 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 +1 -1
- package/esm/router/route-guard-names.mjs.map +1 -1
- 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 +1 -3
- package/esm/router/route-name-taken-error.d.mts.map +1 -1
- 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 +2 -4
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +8 -6
- package/esm/router/router.mjs.map +1 -1
- package/esm/router/types.d.mts +25 -26
- package/esm/router/types.d.mts.map +1 -1
- package/esm/router/unguarded-route-diagnostics.d.mts +6 -8
- package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -1
- package/esm/secrets/errors.d.mts +9 -0
- package/esm/secrets/errors.d.mts.map +1 -0
- package/esm/secrets/errors.mjs +22 -0
- package/esm/secrets/errors.mjs.map +1 -0
- package/esm/secrets/file-backend.mjs +167 -0
- package/esm/secrets/file-backend.mjs.map +1 -0
- package/esm/secrets/index.d.mts +6 -0
- package/esm/secrets/index.mjs +6 -0
- package/esm/secrets/keyring-backend.mjs +50 -0
- package/esm/secrets/keyring-backend.mjs.map +1 -0
- package/esm/secrets/memory-backend.d.mts +12 -0
- package/esm/secrets/memory-backend.d.mts.map +1 -0
- package/esm/secrets/memory-backend.mjs +28 -0
- package/esm/secrets/memory-backend.mjs.map +1 -0
- package/esm/secrets/secret-store.d.mts +25 -0
- package/esm/secrets/secret-store.d.mts.map +1 -0
- package/esm/secrets/secret-store.mjs +117 -0
- package/esm/secrets/secret-store.mjs.map +1 -0
- package/esm/secrets/secrets.d.mts +11 -0
- package/esm/secrets/secrets.d.mts.map +1 -0
- package/esm/secrets/secrets.mjs +63 -0
- package/esm/secrets/secrets.mjs.map +1 -0
- package/esm/secrets/types.d.mts +22 -0
- package/esm/secrets/types.d.mts.map +1 -0
- package/esm/socket/index.d.mts +2 -1
- package/esm/socket/index.mjs +2 -2
- package/esm/socket/types.d.mts +2 -4
- package/esm/socket/types.d.mts.map +1 -1
- package/esm/socket/utils.d.mts +8 -3
- package/esm/socket/utils.d.mts.map +1 -1
- package/esm/socket/utils.mjs +12 -1
- package/esm/socket/utils.mjs.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 +2 -2
- package/esm/storage/local-disk-roots.mjs.map +1 -1
- 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 +3 -4
- package/esm/storage/storage.d.mts.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 +1 -2
- package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
- package/esm/tests/authenticated-test-client.d.mts +5 -6
- package/esm/tests/authenticated-test-client.d.mts.map +1 -1
- package/esm/tests/factories.d.mts +38 -23
- package/esm/tests/factories.d.mts.map +1 -1
- package/esm/tests/fakes/cache-fake.d.mts +14 -9
- package/esm/tests/fakes/cache-fake.d.mts.map +1 -1
- package/esm/tests/fakes/clock-fake.d.mts +13 -8
- package/esm/tests/fakes/clock-fake.d.mts.map +1 -1
- package/esm/tests/fakes/fake-assertion-error.d.mts +2 -3
- package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -1
- package/esm/tests/fakes/ids-fake.d.mts +5 -4
- package/esm/tests/fakes/ids-fake.d.mts.map +1 -1
- package/esm/tests/fakes/index.d.mts +3 -1
- package/esm/tests/fakes/index.mjs +2 -1
- package/esm/tests/fakes/mail-fake.d.mts +21 -13
- package/esm/tests/fakes/mail-fake.d.mts.map +1 -1
- package/esm/tests/fakes/queue-fake.d.mts +21 -13
- package/esm/tests/fakes/queue-fake.d.mts.map +1 -1
- package/esm/tests/fakes/secrets-fake.d.mts +13 -0
- package/esm/tests/fakes/secrets-fake.d.mts.map +1 -0
- package/esm/tests/fakes/secrets-fake.mjs +50 -0
- package/esm/tests/fakes/secrets-fake.mjs.map +1 -0
- package/esm/tests/fakes/storage-fake.d.mts +12 -8
- package/esm/tests/fakes/storage-fake.d.mts.map +1 -1
- package/esm/tests/fakes/storage-fake.mjs +1 -1
- package/esm/tests/fakes/test-fakes.d.mts +9 -10
- package/esm/tests/fakes/test-fakes.d.mts.map +1 -1
- package/esm/tests/fakes/test-fakes.mjs +6 -3
- package/esm/tests/fakes/test-fakes.mjs.map +1 -1
- package/esm/tests/index.d.mts +3 -1
- package/esm/tests/index.mjs +2 -1
- package/esm/tests/snapshot-response.d.mts +4 -5
- package/esm/tests/snapshot-response.d.mts.map +1 -1
- package/esm/tests/start-http-development-server.d.mts +4 -6
- package/esm/tests/start-http-development-server.d.mts.map +1 -1
- package/esm/tests/start-http-development-server.mjs +5 -5
- 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 +11 -12
- package/esm/tests/test-helpers.d.mts.map +1 -1
- package/esm/tests/test-http-server.d.mts +14 -10
- package/esm/tests/test-http-server.d.mts.map +1 -1
- package/esm/tests/test-lifecycle-state.mjs +1 -1
- package/esm/tests/vitest-setup.d.mts +7 -8
- package/esm/tests/vitest-setup.d.mts.map +1 -1
- package/esm/tests/vitest-setup.mjs.map +1 -1
- package/esm/tooling/agents-md/agents-md-markers.d.mts +4 -5
- package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -1
- package/esm/tooling/agents-md/agents-md-markers.mjs +2 -1
- package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -1
- package/esm/tooling/agents-md/agents-md-refresher.d.mts +19 -12
- package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -1
- package/esm/tooling/agents-md/installed-skills.d.mts +13 -9
- package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -1
- package/esm/tooling/agents-md/render-agents-md.d.mts +8 -7
- package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -1
- package/esm/tooling/agents-md/render-agents-md.mjs +2 -2
- package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -1
- package/esm/tooling/agents-md/write-agents-md.d.mts +17 -12
- package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -1
- package/esm/tooling/board/board-message.d.mts +4 -6
- package/esm/tooling/board/board-message.d.mts.map +1 -1
- package/esm/tooling/board/board.d.mts +50 -38
- package/esm/tooling/board/board.d.mts.map +1 -1
- package/esm/tooling/board/board.mjs +4 -3
- package/esm/tooling/board/board.mjs.map +1 -1
- package/esm/tooling/board/board.types.d.mts +32 -23
- package/esm/tooling/board/board.types.d.mts.map +1 -1
- package/esm/tooling/check/changed-files.d.mts +4 -6
- package/esm/tooling/check/changed-files.d.mts.map +1 -1
- package/esm/tooling/check/changed-files.mjs +2 -2
- package/esm/tooling/check/changed-files.mjs.map +1 -1
- package/esm/tooling/check/check-report.types.d.mts +22 -17
- package/esm/tooling/check/check-report.types.d.mts.map +1 -1
- package/esm/tooling/check/code-style-conventions.mjs +25 -25
- package/esm/tooling/check/code-style-conventions.mjs.map +1 -1
- package/esm/tooling/check/conventions-step.d.mts +4 -6
- package/esm/tooling/check/conventions-step.d.mts.map +1 -1
- package/esm/tooling/check/conventions-step.mjs +7 -18
- package/esm/tooling/check/conventions-step.mjs.map +1 -1
- package/esm/tooling/check/environment-step.d.mts +2 -4
- package/esm/tooling/check/environment-step.d.mts.map +1 -1
- package/esm/tooling/check/environment-step.mjs +1 -1
- package/esm/tooling/check/index.mjs +1 -1
- package/esm/tooling/check/lint-step.d.mts +5 -12
- package/esm/tooling/check/lint-step.d.mts.map +1 -1
- package/esm/tooling/check/lint-step.mjs +16 -12
- package/esm/tooling/check/lint-step.mjs.map +1 -1
- package/esm/tooling/check/request-input.mjs +15 -15
- package/esm/tooling/check/request-input.mjs.map +1 -1
- package/esm/tooling/check/run-check.d.mts +24 -14
- package/esm/tooling/check/run-check.d.mts.map +1 -1
- package/esm/tooling/check/run-check.mjs +2 -2
- package/esm/tooling/check/run-check.mjs.map +1 -1
- package/esm/tooling/check/run-tests.d.mts +22 -15
- package/esm/tooling/check/run-tests.d.mts.map +1 -1
- package/esm/tooling/check/security-conventions.mjs +133 -131
- package/esm/tooling/check/security-conventions.mjs.map +1 -1
- package/esm/tooling/check/source-ast.mjs +92 -132
- package/esm/tooling/check/source-ast.mjs.map +1 -1
- package/esm/tooling/check/tests-step.d.mts +7 -8
- package/esm/tooling/check/tests-step.d.mts.map +1 -1
- package/esm/tooling/check/tests-step.mjs +3 -3
- package/esm/tooling/check/tests-step.mjs.map +1 -1
- package/esm/tooling/dev-state/dev-server-state.d.mts +17 -13
- package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -1
- package/esm/tooling/devtools/devtools-client.d.mts +29 -20
- package/esm/tooling/devtools/devtools-client.d.mts.map +1 -1
- package/esm/tooling/generate/generation.d.mts +34 -22
- package/esm/tooling/generate/generation.d.mts.map +1 -1
- package/esm/tooling/generate/generation.mjs +9 -5
- package/esm/tooling/generate/generation.mjs.map +1 -1
- package/esm/tooling/generate/generator-spec.d.mts +9 -9
- package/esm/tooling/generate/generator-spec.d.mts.map +1 -1
- package/esm/tooling/generate/index.mjs +1 -1
- package/esm/tooling/generate/project-files.mjs +3 -3
- package/esm/tooling/generate/project-files.mjs.map +1 -1
- package/esm/tooling/generate/run-cli.d.mts +14 -11
- package/esm/tooling/generate/run-cli.d.mts.map +1 -1
- package/esm/tooling/generate/run-cli.mjs +2 -2
- package/esm/tooling/generate/run-cli.mjs.map +1 -1
- package/esm/tooling/generate/unified-diff.d.mts +10 -7
- package/esm/tooling/generate/unified-diff.d.mts.map +1 -1
- package/esm/tooling/index.d.mts +1 -0
- package/esm/tooling/inspect/boot-for-inspect.d.mts +7 -7
- package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -1
- package/esm/tooling/inspect/collect-config.mjs +3 -3
- package/esm/tooling/inspect/collect-config.mjs.map +1 -1
- package/esm/tooling/inspect/collect-models.d.mts +4 -3
- package/esm/tooling/inspect/collect-models.d.mts.map +1 -1
- package/esm/tooling/inspect/collect-models.mjs +1 -1
- package/esm/tooling/inspect/collect-packages.d.mts +1 -2
- package/esm/tooling/inspect/collect-packages.d.mts.map +1 -1
- package/esm/tooling/inspect/collect-pages.mjs +10 -10
- package/esm/tooling/inspect/collect-pages.mjs.map +1 -1
- package/esm/tooling/inspect/collect-routes.mjs +1 -1
- package/esm/tooling/inspect/event-recorder.d.mts +7 -7
- package/esm/tooling/inspect/event-recorder.d.mts.map +1 -1
- package/esm/tooling/inspect/index.d.mts +2 -1
- package/esm/tooling/inspect/index.mjs +1 -1
- package/esm/tooling/inspect/inspect-app.d.mts +25 -16
- package/esm/tooling/inspect/inspect-app.d.mts.map +1 -1
- package/esm/tooling/inspect/inspect-report.schema.d.mts +1 -2
- package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -1
- package/esm/tooling/inspect/inspect-report.types.d.mts +86 -54
- package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -1
- package/esm/tooling/mcp/create-mcp-context.d.mts +11 -8
- package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -1
- package/esm/tooling/mcp/db-schema.d.mts +10 -9
- package/esm/tooling/mcp/db-schema.d.mts.map +1 -1
- package/esm/tooling/mcp/docs-search.d.mts +20 -15
- package/esm/tooling/mcp/docs-search.d.mts.map +1 -1
- package/esm/tooling/mcp/index.mjs +1 -1
- package/esm/tooling/mcp/load-ai-tools.d.mts +7 -8
- package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -1
- package/esm/tooling/mcp/load-ai-tools.mjs +2 -1
- package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -1
- package/esm/tooling/mcp/mcp-tools.d.mts +29 -19
- package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -1
- package/esm/tooling/mcp/mcp-tools.mjs +3 -2
- package/esm/tooling/mcp/mcp-tools.mjs.map +1 -1
- package/esm/tooling/mcp/start-mcp-server.d.mts +24 -17
- package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -1
- package/esm/tooling/mcp/start-mcp-server.mjs +1 -1
- package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -1
- package/esm/tooling/mcp/tool-input.d.mts +7 -7
- package/esm/tooling/mcp/tool-input.d.mts.map +1 -1
- package/esm/tooling/problem.d.mts +27 -17
- package/esm/tooling/problem.d.mts.map +1 -1
- 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 +36 -22
- package/esm/tooling/trace/trace-report.types.d.mts.map +1 -1
- package/esm/tooling/trace/trace-request.d.mts +27 -20
- package/esm/tooling/trace/trace-request.d.mts.map +1 -1
- package/esm/tooling/trace/trace-request.mjs +2 -2
- package/esm/tooling/trace/trace-request.mjs.map +1 -1
- package/esm/tooling/typecheck/index.mjs +1 -1
- package/esm/tooling/typecheck/run-typecheck.d.mts +15 -48
- package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -1
- package/esm/tooling/typecheck/run-typecheck.mjs +42 -105
- package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -1
- 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/index.mjs +3 -1
- package/esm/upgrade/codemods/index.mjs.map +1 -1
- package/esm/upgrade/codemods/logger-sync-calls.mjs +1 -1
- package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -1
- package/esm/upgrade/codemods/oxc-toolchain.mjs +142 -0
- package/esm/upgrade/codemods/oxc-toolchain.mjs.map +1 -0
- package/esm/upgrade/codemods/request-log-snapshot.mjs +1 -1
- package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -1
- package/esm/upgrade/codemods/toolchain-templates.mjs +244 -0
- package/esm/upgrade/codemods/toolchain-templates.mjs.map +1 -0
- package/esm/upgrade/diff.mjs +1 -1
- package/esm/upgrade/diff.mjs.map +1 -1
- package/esm/upgrade/load-ts-morph.mjs +3 -2
- package/esm/upgrade/load-ts-morph.mjs.map +1 -1
- package/esm/upgrade/run-upgrade.mjs +26 -7
- package/esm/upgrade/run-upgrade.mjs.map +1 -1
- 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/utils/app-log.d.mts +1 -2
- package/esm/utils/app-log.d.mts.map +1 -1
- package/esm/utils/clock.d.mts +8 -6
- package/esm/utils/clock.d.mts.map +1 -1
- 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.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 +9 -6
- package/esm/utils/ids.d.mts.map +1 -1
- package/esm/utils/index.d.mts +2 -1
- package/esm/utils/index.mjs +1 -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 +11 -10
- package/esm/utils/runtime.d.mts.map +1 -1
- 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 +5 -1
- package/esm/validation/index.mjs +1 -1
- package/esm/validation/plugins/index.mjs +1 -1
- package/esm/validation/types.d.mts +6 -4
- package/esm/validation/types.d.mts.map +1 -1
- package/esm/validation/validateAll.mjs +2 -2
- package/esm/validation/validateAll.mjs.map +1 -1
- package/esm/validation/validation-failure-status.mjs +2 -2
- package/esm/validation/validation-failure-status.mjs.map +1 -1
- package/esm/validation/validators/file-validator.d.mts +2 -4
- 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/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 +8 -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 +379 -22
- package/llms.txt +3 -2
- package/package.json +27 -15
- package/skills/README.md +2 -1
- package/skills/create-module/SKILL.md +7 -0
- package/skills/index.md +3 -1
- package/skills/report-framework-issue.md +154 -0
- package/skills/run-app/SKILL.md +120 -10
- package/skills/store-secrets/SKILL.md +102 -0
- package/skills/test-fakes/SKILL.md +13 -11
- package/skills/upgrade-from-5-29/SKILL.md +78 -0
- package/skills/warlock-check/SKILL.md +6 -1
- package/skills/warlock-doctor/SKILL.md +9 -0
- package/skills/wire-socket/SKILL.md +19 -0
- package/skills/write-cli-command/SKILL.md +21 -0
- package/esm/tooling/check/index.d.mts +0 -8
- package/esm/tooling/typecheck/index.d.mts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oxlint-runner.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/health-checker/oxlint-runner.ts"],"sourcesContent":["import { execFile, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nexport type OxlintFile = { path: string; relativePath: string };\nexport type OxlintMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n ruleId?: string;\n};\nexport type OxlintFileResult = OxlintFile & {\n healthy: boolean;\n errors: OxlintMessage[];\n warnings: OxlintMessage[];\n};\n\nconst CONFIG_FILES = [\".oxlintrc.json\", \".oxlintrc.jsonc\", \"oxlint.config.ts\", \"oxlint.config.mts\"];\n\n/** Whether the app has an oxlint config file at its root. */\nexport function hasOxlintConfig(cwd: string): boolean {\n return CONFIG_FILES.some((name) => existsSync(path.join(cwd, name)));\n}\n\n/** Resolve the app's optional CLI package, without using global PATH binaries. */\nexport function findOxlint(cwd: string): string | undefined {\n if (!hasOxlintConfig(cwd)) return undefined;\n try {\n const require = createRequire(path.join(cwd, \"package.json\"));\n const packagePath = require.resolve(\"oxlint/package.json\");\n const manifest = JSON.parse(readFileSync(packagePath, \"utf8\")) as {\n bin?: { oxlint?: unknown } | string;\n };\n const bin = typeof manifest.bin === \"string\" ? manifest.bin : manifest.bin?.oxlint;\n if (typeof bin !== \"string\") return undefined;\n const binaryPath = path.resolve(path.dirname(packagePath), bin);\n return existsSync(binaryPath) ? binaryPath : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction coordinate(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? Math.max(1, Math.trunc(value)) : 1;\n}\n\nclass OxlintOutputParseError extends Error {}\n\nfunction outputDetail(stdout: string, stderr: string): string {\n return [stderr.trim(), stdout.trim()].filter(Boolean).join(\"\\n\").slice(0, 2000);\n}\n\n/** Most output one CLI run may write before Node stops it. */\nconst MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\n\n/**\n * Most files passed to one CLI run. An 8 MiB report holds roughly 16,000\n * diagnostics, so a batch of thousands of files with several diagnostics each\n * could overflow it; a batch that still overflows is split in half and retried.\n */\nexport const MAX_FILES_PER_BATCH = 500;\n\n/**\n * How long `shutdown()` waits after SIGTERM before sending SIGKILL. Below the\n * health-check manager's 500 ms wait for its workers, so a child that ignores\n * SIGTERM is still reaped before the worker is terminated.\n */\nexport const SHUTDOWN_KILL_GRACE_MS = 250;\n\nconst MAX_BUFFER_CODE = \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\";\n/** The OS refused the command line: too long overall, or one argument too long. */\nconst COMMAND_TOO_LONG_CODES = new Set([\"E2BIG\", \"ENAMETOOLONG\"]);\n\n/** A failed CLI run; `code` keeps the process or spawn error code (`E2BIG`, maxBuffer, …). */\nexport class OxlintCommandError extends Error {\n public constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"OxlintCommandError\";\n }\n}\n\n/** A check stopped because the runner is shutting down; not a lint or tool failure. */\nexport class OxlintCheckCancelledError extends Error {\n public constructor() {\n super(\"Oxlint check cancelled: the development server is shutting down.\");\n this.name = \"OxlintCheckCancelledError\";\n }\n}\n\nfunction errorCodeOf(error: unknown): string | undefined {\n const code = (error as { code?: unknown } | null)?.code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nexport function oxlintCommandError(\n error: { code?: unknown; signal?: string | null; killed?: boolean },\n stdout: string,\n stderr: string,\n): OxlintCommandError {\n const status =\n error.code === MAX_BUFFER_CODE\n ? `produced more than ${MAX_OUTPUT_BYTES / (1024 * 1024)} MiB of output`\n : error.killed\n ? \"timed out or terminated (30s limit)\"\n : `failed (code ${String(error.code ?? \"unknown\")}${error.signal ? `, signal ${error.signal}` : \"\"})`;\n return new OxlintCommandError(\n `Oxlint could not check changed files: ${status}${outputDetail(stdout, stderr) ? `\\n${outputDetail(stdout, stderr)}` : \"\"}`,\n typeof error.code === \"string\" ? error.code : undefined,\n );\n}\n\nexport function parseOxlintResults(\n output: string,\n files: OxlintFile[],\n cwd: string,\n): OxlintFileResult[] {\n let report: unknown;\n try {\n report = JSON.parse(output);\n } catch {\n throw new OxlintOutputParseError(\n `Oxlint could not check changed files: ${output.trim().slice(0, 2000) || \"empty diagnostics report\"}`,\n );\n }\n if (!record(report) || !Array.isArray(report.diagnostics)) {\n throw new Error(\"Oxlint returned an invalid JSON diagnostics report.\");\n }\n const results = files.map((file): OxlintFileResult => ({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n }));\n const byPath = new Map(results.map((result) => [path.resolve(result.path), result]));\n for (const diagnostic of report.diagnostics) {\n if (!record(diagnostic) || typeof diagnostic.message !== \"string\") continue;\n if (diagnostic.severity !== \"error\" && diagnostic.severity !== \"warning\") continue;\n const target =\n typeof diagnostic.filename === \"string\"\n ? byPath.get(path.resolve(cwd, diagnostic.filename))\n : undefined;\n if (!target) {\n throw new Error(`Oxlint: ${diagnostic.message}`);\n }\n const label = Array.isArray(diagnostic.labels) ? diagnostic.labels.find(record) : undefined;\n const span = record(label) && record(label.span) ? label.span : {};\n const message: OxlintMessage = {\n type: diagnostic.severity,\n message: diagnostic.message,\n lineNumber: coordinate(span.line),\n columnNumber: coordinate(span.column),\n length: coordinate(span.length),\n filePath: target.path,\n relativePath: target.relativePath,\n ...(typeof diagnostic.code === \"string\" ? { ruleId: diagnostic.code } : {}),\n };\n target.healthy = false;\n (message.type === \"error\" ? target.errors : target.warnings).push(message);\n }\n return results;\n}\n\ntype OxlintCommandOutput = { stdout: string; stderr: string };\ntype OxlintRunnerDependencies = {\n execute?: (binaryPath: string, args: string[], cwd: string) => Promise<OxlintCommandOutput>;\n exists?: (file: string) => boolean;\n platform?: NodeJS.Platform;\n /** Overrides the per-platform command-line budget, in the units of {@link oxlintArgumentSize}. */\n commandLineLimit?: number;\n};\n\n/**\n * The share of the command-line budget one argument uses. Windows counts\n * UTF-16 characters plus quoting and a separator. POSIX `execve` counts the\n * argument's bytes, its NUL terminator and its slot in the `argv` pointer\n * array (8 bytes on 64-bit systems), all against `ARG_MAX`.\n */\nexport function oxlintArgumentSize(argument: string, platform: NodeJS.Platform): number {\n return platform === \"win32\" ? argument.length + 3 : Buffer.byteLength(argument) + 1 + 8;\n}\n\n/**\n * The command-line budget per platform, well below the real limits: Linux's\n * `ARG_MAX` is about 2 MB (512 KiB here), Windows allows 32,767 characters\n * (24 KiB here) and other systems get 128 KiB.\n */\nfunction commandLineLimit(platform: NodeJS.Platform): number {\n return platform === \"win32\" ? 24 * 1024 : platform === \"linux\" ? 512 * 1024 : 128 * 1024;\n}\n\nfunction uncheckedResult(file: OxlintFile, code: string): OxlintFileResult {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: false,\n errors: [],\n warnings: [\n {\n type: \"warning\",\n message: `Oxlint could not check this file: its path is too long for one command line (${code}).`,\n lineNumber: 1,\n columnNumber: 1,\n length: 1,\n filePath: file.path,\n relativePath: file.relativePath,\n },\n ],\n };\n}\n\nconst OXLINT_FLAGS = [\"--format=json\", \"--threads=1\", \"--no-error-on-unmatched-pattern\", \"--\"];\n\nfunction healthy(file: OxlintFile): OxlintFileResult {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n}\n\n/** Invoked in a dedicated worker during development; lints only the supplied disk files. */\nexport class OxlintRunner {\n private binaryPath?: string;\n private cwd = process.cwd();\n private readonly children = new Set<ChildProcess>();\n private shuttingDown = false;\n\n public constructor(private readonly dependencies: OxlintRunnerDependencies = {}) {}\n\n public initialize(cwd: string): { success: boolean; hasConfig: boolean } {\n this.cwd = cwd;\n this.binaryPath = findOxlint(cwd);\n this.shuttingDown = false;\n return { success: true, hasConfig: this.binaryPath !== undefined };\n }\n\n /**\n * Stop every running CLI child: SIGTERM first, then SIGKILL after\n * {@link SHUTDOWN_KILL_GRACE_MS} for a child that ignores it. Pending checks\n * reject with {@link OxlintCheckCancelledError}.\n */\n public async shutdown(): Promise<void> {\n this.shuttingDown = true;\n await Promise.all(\n [...this.children].map(\n (child) =>\n new Promise<void>((resolve) => {\n if (child.exitCode !== null || child.signalCode !== null) {\n resolve();\n return;\n }\n const timer = setTimeout(() => child.kill(\"SIGKILL\"), SHUTDOWN_KILL_GRACE_MS);\n child.once(\"close\", () => {\n clearTimeout(timer);\n resolve();\n });\n child.kill(\"SIGTERM\");\n }),\n ),\n );\n this.children.clear();\n }\n\n private execute(binaryPath: string, args: string[], cwd: string): Promise<OxlintCommandOutput> {\n if (this.dependencies.execute) return this.dependencies.execute(binaryPath, args, cwd);\n return new Promise((resolve, reject) => {\n const child = execFile(\n process.execPath,\n [binaryPath, ...args],\n {\n cwd,\n encoding: \"utf8\",\n windowsHide: true,\n timeout: 30_000,\n maxBuffer: MAX_OUTPUT_BYTES,\n },\n (error, stdout, stderr) => {\n this.children.delete(child);\n if (error && this.shuttingDown) {\n reject(new OxlintCheckCancelledError());\n return;\n }\n // Exit 1 with a JSON report is the normal result for lint errors.\n if (error && (error.code !== 1 || error.killed)) {\n reject(oxlintCommandError(error, stdout, stderr));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n this.children.add(child);\n });\n }\n\n /**\n * Lint one batch. A batch whose report overflows the output buffer is split\n * in half and retried, down to single files; a single file whose path the OS\n * refuses as too long is reported as unchecked instead of failing the check.\n */\n private async checkBatch(\n binaryPath: string,\n filesInBatch: OxlintFile[],\n ): Promise<OxlintFileResult[]> {\n if (this.shuttingDown) throw new OxlintCheckCancelledError();\n let output: OxlintCommandOutput;\n try {\n output = await this.execute(\n binaryPath,\n [...OXLINT_FLAGS, ...filesInBatch.map((file) => path.relative(this.cwd, file.path))],\n this.cwd,\n );\n } catch (error) {\n if (this.shuttingDown) throw new OxlintCheckCancelledError();\n const code = errorCodeOf(error);\n if (code === MAX_BUFFER_CODE && filesInBatch.length > 1) {\n const middle = Math.ceil(filesInBatch.length / 2);\n return [\n ...(await this.checkBatch(binaryPath, filesInBatch.slice(0, middle))),\n ...(await this.checkBatch(binaryPath, filesInBatch.slice(middle))),\n ];\n }\n const [only] = filesInBatch;\n if (code && COMMAND_TOO_LONG_CODES.has(code) && only && filesInBatch.length === 1) {\n return [uncheckedResult(only, code)];\n }\n throw error;\n }\n try {\n return parseOxlintResults(output.stdout, filesInBatch, this.cwd);\n } catch (error) {\n if (!(error instanceof OxlintOutputParseError)) throw error;\n const detail = outputDetail(output.stdout, output.stderr) || \"empty diagnostics report\";\n throw new Error(`Oxlint could not check changed files: ${detail}`, { cause: error });\n }\n }\n\n public async checkFiles(files: OxlintFile[]): Promise<OxlintFileResult[]> {\n const exists = this.dependencies.exists ?? existsSync;\n const lintable = files.filter(\n (file) => /\\.[cm]?[jt]sx?$/i.test(file.path) && exists(file.path),\n );\n const binaryPath = this.binaryPath;\n if (!binaryPath || lintable.length === 0) return files.map(healthy);\n const platform = this.dependencies.platform ?? process.platform;\n const limit = this.dependencies.commandLineLimit ?? commandLineLimit(platform);\n const size = (arg: string) => oxlintArgumentSize(arg, platform);\n const baseSize = [process.execPath, binaryPath, ...OXLINT_FLAGS].reduce(\n (sum, arg) => sum + size(arg),\n 0,\n );\n const batches: OxlintFile[][] = [];\n let batch: OxlintFile[] = [];\n let batchSize = baseSize;\n const flush = () => {\n if (batch.length) batches.push(batch);\n batch = [];\n batchSize = baseSize;\n };\n for (const file of lintable) {\n const argumentSize = size(path.relative(this.cwd, file.path));\n if (baseSize + argumentSize > limit) {\n // Over the conservative budget on its own: run it alone, since the\n // real limit is usually far higher.\n flush();\n batches.push([file]);\n continue;\n }\n if (batch.length >= MAX_FILES_PER_BATCH || batchSize + argumentSize > limit) flush();\n batch.push(file);\n batchSize += argumentSize;\n }\n flush();\n const results = new Map(files.map((file) => [file.path, healthy(file)]));\n for (const filesInBatch of batches) {\n for (const result of await this.checkBatch(binaryPath, filesInBatch)) {\n results.set(result.path, result);\n }\n }\n return files.map((file) => results.get(file.path) ?? healthy(file));\n }\n}\n"],"mappings":";;;;;;AAsBA,MAAM,eAAe;CAAC;CAAkB;CAAmB;CAAoB;AAAmB;;AAGlG,SAAgB,gBAAgB,KAAsB;CACpD,OAAO,aAAa,MAAM,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AACrE;;AAGA,SAAgB,WAAW,KAAiC;CAC1D,IAAI,CAAC,gBAAgB,GAAG,GAAG,OAAO;CAClC,IAAI;EAEF,MAAM,cADU,cAAc,KAAK,KAAK,KAAK,cAAc,CACjC,CAAC,CAAC,QAAQ,qBAAqB;EACzD,MAAM,WAAW,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC;EAG7D,MAAM,MAAM,OAAO,SAAS,QAAQ,WAAW,SAAS,MAAM,SAAS,KAAK;EAC5E,IAAI,OAAO,QAAQ,UAAU,OAAO;EACpC,MAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,WAAW,GAAG,GAAG;EAC9D,OAAO,WAAW,UAAU,IAAI,aAAa;CAC/C,QAAQ;EACN;CACF;AACF;AAEA,SAAS,OAAO,OAAkD;CAChE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,OAAwB;CAC1C,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;AAChG;AAEA,IAAM,yBAAN,cAAqC,MAAM,CAAC;AAE5C,SAAS,aAAa,QAAgB,QAAwB;CAC5D,OAAO,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,GAAI;AAChF;;AAGA,MAAM,mBAAmB,IAAI,OAAO;;;;;;AAOpC,MAAa,sBAAsB;;;;;;AAOnC,MAAa,yBAAyB;AAEtC,MAAM,kBAAkB;;AAExB,MAAM,yBAAyB,IAAI,IAAI,CAAC,SAAS,cAAc,CAAC;;AAGhE,IAAa,qBAAb,cAAwC,MAAM;CAC5C,AAAO,YACL,SACA,AAAgB,MAChB;EACA,MAAM,OAAO;EAFG;EAGhB,KAAK,OAAO;CACd;AACF;;AAGA,IAAa,4BAAb,cAA+C,MAAM;CACnD,AAAO,cAAc;EACnB,MAAM,kEAAkE;EACxE,KAAK,OAAO;CACd;AACF;AAEA,SAAS,YAAY,OAAoC;CACvD,MAAM,OAAQ,OAAqC;CACnD,OAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,SAAgB,mBACd,OACA,QACA,QACoB;CAOpB,OAAO,IAAI,mBACT,yCANA,MAAM,SAAS,kBACX,sBAAsB,oBAAoB,OAAO,MAAM,kBACvD,MAAM,SACJ,wCACA,gBAAgB,OAAO,MAAM,QAAQ,SAAS,IAAI,MAAM,SAAS,YAAY,MAAM,WAAW,GAAG,KAErD,aAAa,QAAQ,MAAM,IAAI,KAAK,aAAa,QAAQ,MAAM,MAAM,MACvH,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,MAChD;AACF;AAEA,SAAgB,mBACd,QACA,OACA,KACoB;CACpB,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,MAAM;CAC5B,QAAQ;EACN,MAAM,IAAI,uBACR,yCAAyC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,GAAI,KAAK,4BAC3E;CACF;CACA,IAAI,CAAC,OAAO,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,WAAW,GACtD,MAAM,IAAI,MAAM,qDAAqD;CAEvE,MAAM,UAAU,MAAM,KAAK,UAA4B;EACrD,MAAM,KAAK;EACX,cAAc,KAAK;EACnB,SAAS;EACT,QAAQ,CAAC;EACT,UAAU,CAAC;CACb,EAAE;CACF,MAAM,SAAS,IAAI,IAAI,QAAQ,KAAK,WAAW,CAAC,KAAK,QAAQ,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;CACnF,KAAK,MAAM,cAAc,OAAO,aAAa;EAC3C,IAAI,CAAC,OAAO,UAAU,KAAK,OAAO,WAAW,YAAY,UAAU;EACnE,IAAI,WAAW,aAAa,WAAW,WAAW,aAAa,WAAW;EAC1E,MAAM,SACJ,OAAO,WAAW,aAAa,WAC3B,OAAO,IAAI,KAAK,QAAQ,KAAK,WAAW,QAAQ,CAAC,IACjD;EACN,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,WAAW,SAAS;EAEjD,MAAM,QAAQ,MAAM,QAAQ,WAAW,MAAM,IAAI,WAAW,OAAO,KAAK,MAAM,IAAI;EAClF,MAAM,OAAO,OAAO,KAAK,KAAK,OAAO,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;EACjE,MAAM,UAAyB;GAC7B,MAAM,WAAW;GACjB,SAAS,WAAW;GACpB,YAAY,WAAW,KAAK,IAAI;GAChC,cAAc,WAAW,KAAK,MAAM;GACpC,QAAQ,WAAW,KAAK,MAAM;GAC9B,UAAU,OAAO;GACjB,cAAc,OAAO;GACrB,GAAI,OAAO,WAAW,SAAS,WAAW,EAAE,QAAQ,WAAW,KAAK,IAAI,CAAC;EAC3E;EACA,OAAO,UAAU;EACjB,CAAC,QAAQ,SAAS,UAAU,OAAO,SAAS,OAAO,SAAQ,CAAE,KAAK,OAAO;CAC3E;CACA,OAAO;AACT;;;;;;;AAiBA,SAAgB,mBAAmB,UAAkB,UAAmC;CACtF,OAAO,aAAa,UAAU,SAAS,SAAS,IAAI,OAAO,WAAW,QAAQ,IAAI,IAAI;AACxF;;;;;;AAOA,SAAS,iBAAiB,UAAmC;CAC3D,OAAO,aAAa,UAAU,KAAK,OAAO,aAAa,UAAU,MAAM,OAAO,MAAM;AACtF;AAEA,SAAS,gBAAgB,MAAkB,MAAgC;CACzE,OAAO;EACL,MAAM,KAAK;EACX,cAAc,KAAK;EACnB,SAAS;EACT,QAAQ,CAAC;EACT,UAAU,CACR;GACE,MAAM;GACN,SAAS,gFAAgF,KAAK;GAC9F,YAAY;GACZ,cAAc;GACd,QAAQ;GACR,UAAU,KAAK;GACf,cAAc,KAAK;EACrB,CACF;CACF;AACF;AAEA,MAAM,eAAe;CAAC;CAAiB;CAAe;CAAmC;AAAI;AAE7F,SAAS,QAAQ,MAAoC;CACnD,OAAO;EACL,MAAM,KAAK;EACX,cAAc,KAAK;EACnB,SAAS;EACT,QAAQ,CAAC;EACT,UAAU,CAAC;CACb;AACF;;AAGA,IAAa,eAAb,MAA0B;CAMxB,AAAO,YAAY,AAAiB,eAAyC,CAAC,GAAG;EAA7C;aAJtB,QAAQ,IAAI;kCACE,IAAI,IAAkB;sBAC3B;CAE2D;CAElF,AAAO,WAAW,KAAuD;EACvE,KAAK,MAAM;EACX,KAAK,aAAa,WAAW,GAAG;EAChC,KAAK,eAAe;EACpB,OAAO;GAAE,SAAS;GAAM,WAAW,KAAK,eAAe;EAAU;CACnE;;;;;;CAOA,MAAa,WAA0B;EACrC,KAAK,eAAe;EACpB,MAAM,QAAQ,IACZ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,KAChB,UACC,IAAI,SAAe,YAAY;GAC7B,IAAI,MAAM,aAAa,QAAQ,MAAM,eAAe,MAAM;IACxD,QAAQ;IACR;GACF;GACA,MAAM,QAAQ,iBAAiB,MAAM,KAAK,SAAS,MAAyB;GAC5E,MAAM,KAAK,eAAe;IACxB,aAAa,KAAK;IAClB,QAAQ;GACV,CAAC;GACD,MAAM,KAAK,SAAS;EACtB,CAAC,CACL,CACF;EACA,KAAK,SAAS,MAAM;CACtB;CAEA,AAAQ,QAAQ,YAAoB,MAAgB,KAA2C;EAC7F,IAAI,KAAK,aAAa,SAAS,OAAO,KAAK,aAAa,QAAQ,YAAY,MAAM,GAAG;EACrF,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,QAAQ,SACZ,QAAQ,UACR,CAAC,YAAY,GAAG,IAAI,GACpB;IACE;IACA,UAAU;IACV,aAAa;IACb,SAAS;IACT,WAAW;GACb,IACC,OAAO,QAAQ,WAAW;IACzB,KAAK,SAAS,OAAO,KAAK;IAC1B,IAAI,SAAS,KAAK,cAAc;KAC9B,OAAO,IAAI,0BAA0B,CAAC;KACtC;IACF;IAEA,IAAI,UAAU,MAAM,SAAS,KAAK,MAAM,SAAS;KAC/C,OAAO,mBAAmB,OAAO,QAAQ,MAAM,CAAC;KAChD;IACF;IACA,QAAQ;KAAE;KAAQ;IAAO,CAAC;GAC5B,CACF;GACA,KAAK,SAAS,IAAI,KAAK;EACzB,CAAC;CACH;;;;;;CAOA,MAAc,WACZ,YACA,cAC6B;EAC7B,IAAI,KAAK,cAAc,MAAM,IAAI,0BAA0B;EAC3D,IAAI;EACJ,IAAI;GACF,SAAS,MAAM,KAAK,QAClB,YACA,CAAC,GAAG,cAAc,GAAG,aAAa,KAAK,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,GACnF,KAAK,GACP;EACF,SAAS,OAAO;GACd,IAAI,KAAK,cAAc,MAAM,IAAI,0BAA0B;GAC3D,MAAM,OAAO,YAAY,KAAK;GAC9B,IAAI,SAAS,mBAAmB,aAAa,SAAS,GAAG;IACvD,MAAM,SAAS,KAAK,KAAK,aAAa,SAAS,CAAC;IAChD,OAAO,CACL,GAAI,MAAM,KAAK,WAAW,YAAY,aAAa,MAAM,GAAG,MAAM,CAAC,GACnE,GAAI,MAAM,KAAK,WAAW,YAAY,aAAa,MAAM,MAAM,CAAC,CAClE;GACF;GACA,MAAM,CAAC,QAAQ;GACf,IAAI,QAAQ,uBAAuB,IAAI,IAAI,KAAK,QAAQ,aAAa,WAAW,GAC9E,OAAO,CAAC,gBAAgB,MAAM,IAAI,CAAC;GAErC,MAAM;EACR;EACA,IAAI;GACF,OAAO,mBAAmB,OAAO,QAAQ,cAAc,KAAK,GAAG;EACjE,SAAS,OAAO;GACd,IAAI,EAAE,iBAAiB,yBAAyB,MAAM;GACtD,MAAM,SAAS,aAAa,OAAO,QAAQ,OAAO,MAAM,KAAK;GAC7D,MAAM,IAAI,MAAM,yCAAyC,UAAU,EAAE,OAAO,MAAM,CAAC;EACrF;CACF;CAEA,MAAa,WAAW,OAAkD;EACxE,MAAM,SAAS,KAAK,aAAa,UAAU;EAC3C,MAAM,WAAW,MAAM,QACpB,SAAS,mBAAmB,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,CAClE;EACA,MAAM,aAAa,KAAK;EACxB,IAAI,CAAC,cAAc,SAAS,WAAW,GAAG,OAAO,MAAM,IAAI,OAAO;EAClE,MAAM,WAAW,KAAK,aAAa,YAAY,QAAQ;EACvD,MAAM,QAAQ,KAAK,aAAa,oBAAoB,iBAAiB,QAAQ;EAC7E,MAAM,QAAQ,QAAgB,mBAAmB,KAAK,QAAQ;EAC9D,MAAM,WAAW;GAAC,QAAQ;GAAU;GAAY,GAAG;EAAY,CAAC,CAAC,QAC9D,KAAK,QAAQ,MAAM,KAAK,GAAG,GAC5B,CACF;EACA,MAAM,UAA0B,CAAC;EACjC,IAAI,QAAsB,CAAC;EAC3B,IAAI,YAAY;EAChB,MAAM,cAAc;GAClB,IAAI,MAAM,QAAQ,QAAQ,KAAK,KAAK;GACpC,QAAQ,CAAC;GACT,YAAY;EACd;EACA,KAAK,MAAM,QAAQ,UAAU;GAC3B,MAAM,eAAe,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC;GAC5D,IAAI,WAAW,eAAe,OAAO;IAGnC,MAAM;IACN,QAAQ,KAAK,CAAC,IAAI,CAAC;IACnB;GACF;GACA,IAAI,MAAM,iBAAiC,YAAY,eAAe,OAAO,MAAM;GACnF,MAAM,KAAK,IAAI;GACf,aAAa;EACf;EACA,MAAM;EACN,MAAM,UAAU,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC;EACvE,KAAK,MAAM,gBAAgB,SACzB,KAAK,MAAM,UAAU,MAAM,KAAK,WAAW,YAAY,YAAY,GACjE,QAAQ,IAAI,OAAO,MAAM,MAAM;EAGnC,OAAO,MAAM,KAAK,SAAS,QAAQ,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,CAAC;CACpE;AACF"}
|
|
1
|
+
{"version":3,"file":"oxlint-runner.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/health-checker/oxlint-runner.ts"],"sourcesContent":["import { execFile, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nexport type OxlintFile = { path: string; relativePath: string };\nexport type OxlintMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n ruleId?: string;\n};\nexport type OxlintFileResult = OxlintFile & {\n healthy: boolean;\n errors: OxlintMessage[];\n warnings: OxlintMessage[];\n};\n\nconst CONFIG_FILES = [\".oxlintrc.json\", \".oxlintrc.jsonc\", \"oxlint.config.ts\", \"oxlint.config.mts\"];\n\n/** Whether the app has an oxlint config file at its root. */\nexport function hasOxlintConfig(cwd: string): boolean {\n return CONFIG_FILES.some((name) => existsSync(path.join(cwd, name)));\n}\n\n/** Resolve the app's optional CLI package, without using global PATH binaries. */\nexport function findOxlint(cwd: string): string | undefined {\n if (!hasOxlintConfig(cwd)) return undefined;\n try {\n const require = createRequire(path.join(cwd, \"package.json\"));\n const packagePath = require.resolve(\"oxlint/package.json\");\n const manifest = JSON.parse(readFileSync(packagePath, \"utf8\")) as {\n bin?: { oxlint?: unknown } | string;\n };\n const bin = typeof manifest.bin === \"string\" ? manifest.bin : manifest.bin?.oxlint;\n if (typeof bin !== \"string\") return undefined;\n const binaryPath = path.resolve(path.dirname(packagePath), bin);\n return existsSync(binaryPath) ? binaryPath : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction coordinate(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? Math.max(1, Math.trunc(value)) : 1;\n}\n\nclass OxlintOutputParseError extends Error {}\n\nfunction outputDetail(stdout: string, stderr: string): string {\n return [stderr.trim(), stdout.trim()].filter(Boolean).join(\"\\n\").slice(0, 2000);\n}\n\n/** Most output one CLI run may write before Node stops it. */\nconst MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\n\n/**\n * Most files passed to one CLI run. An 8 MiB report holds roughly 16,000\n * diagnostics, so a batch of thousands of files with several diagnostics each\n * could overflow it; a batch that still overflows is split in half and retried.\n */\nexport const MAX_FILES_PER_BATCH = 500;\n\n/**\n * How long `shutdown()` waits after SIGTERM before sending SIGKILL. Below the\n * health-check manager's 500 ms wait for its workers, so a child that ignores\n * SIGTERM is still reaped before the worker is terminated.\n */\nexport const SHUTDOWN_KILL_GRACE_MS = 250;\n\nconst MAX_BUFFER_CODE = \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\";\n/** The OS refused the command line: too long overall, or one argument too long. */\nconst COMMAND_TOO_LONG_CODES = new Set([\"E2BIG\", \"ENAMETOOLONG\"]);\n\n/** A failed CLI run; `code` keeps the process or spawn error code (`E2BIG`, maxBuffer, …). */\nexport class OxlintCommandError extends Error {\n public constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"OxlintCommandError\";\n }\n}\n\n/** A check stopped because the runner is shutting down; not a lint or tool failure. */\nexport class OxlintCheckCancelledError extends Error {\n public constructor() {\n super(\"Oxlint check cancelled: the development server is shutting down.\");\n this.name = \"OxlintCheckCancelledError\";\n }\n}\n\nfunction errorCodeOf(error: unknown): string | undefined {\n const code = (error as { code?: unknown } | null)?.code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nexport function oxlintCommandError(\n error: { code?: unknown; signal?: string | null; killed?: boolean },\n stdout: string,\n stderr: string,\n): OxlintCommandError {\n const status =\n error.code === MAX_BUFFER_CODE\n ? `produced more than ${MAX_OUTPUT_BYTES / (1024 * 1024)} MiB of output`\n : error.killed\n ? \"timed out or terminated (30s limit)\"\n : `failed (code ${String(error.code ?? \"unknown\")}${error.signal ? `, signal ${error.signal}` : \"\"})`;\n return new OxlintCommandError(\n `Oxlint could not check changed files: ${status}${outputDetail(stdout, stderr) ? `\\n${outputDetail(stdout, stderr)}` : \"\"}`,\n typeof error.code === \"string\" ? error.code : undefined,\n );\n}\n\nexport function parseOxlintResults(\n output: string,\n files: OxlintFile[],\n cwd: string,\n): OxlintFileResult[] {\n let report: unknown;\n try {\n report = JSON.parse(output);\n } catch {\n throw new OxlintOutputParseError(\n `Oxlint could not check changed files: ${output.trim().slice(0, 2000) || \"empty diagnostics report\"}`,\n );\n }\n if (!record(report) || !Array.isArray(report.diagnostics)) {\n throw new Error(\"Oxlint returned an invalid JSON diagnostics report.\");\n }\n const results = files.map((file): OxlintFileResult => ({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n }));\n const byPath = new Map(results.map((result) => [path.resolve(result.path), result]));\n for (const diagnostic of report.diagnostics) {\n if (!record(diagnostic) || typeof diagnostic.message !== \"string\") continue;\n if (diagnostic.severity !== \"error\" && diagnostic.severity !== \"warning\") continue;\n const target =\n typeof diagnostic.filename === \"string\"\n ? byPath.get(path.resolve(cwd, diagnostic.filename))\n : undefined;\n if (!target) {\n throw new Error(`Oxlint: ${diagnostic.message}`);\n }\n const label = Array.isArray(diagnostic.labels) ? diagnostic.labels.find(record) : undefined;\n const span = record(label) && record(label.span) ? label.span : {};\n const message: OxlintMessage = {\n type: diagnostic.severity,\n message: diagnostic.message,\n lineNumber: coordinate(span.line),\n columnNumber: coordinate(span.column),\n length: coordinate(span.length),\n filePath: target.path,\n relativePath: target.relativePath,\n ...(typeof diagnostic.code === \"string\" ? { ruleId: diagnostic.code } : {}),\n };\n target.healthy = false;\n (message.type === \"error\" ? target.errors : target.warnings).push(message);\n }\n return results;\n}\n\ntype OxlintCommandOutput = { stdout: string; stderr: string };\ntype OxlintRunnerDependencies = {\n execute?: (binaryPath: string, args: string[], cwd: string) => Promise<OxlintCommandOutput>;\n exists?: (file: string) => boolean;\n platform?: NodeJS.Platform;\n /** Overrides the per-platform command-line budget, in the units of {@link oxlintArgumentSize}. */\n commandLineLimit?: number;\n};\n\n/**\n * The share of the command-line budget one argument uses. Windows counts\n * UTF-16 characters plus quoting and a separator. POSIX `execve` counts the\n * argument's bytes, its NUL terminator and its slot in the `argv` pointer\n * array (8 bytes on 64-bit systems), all against `ARG_MAX`.\n */\nexport function oxlintArgumentSize(argument: string, platform: NodeJS.Platform): number {\n return platform === \"win32\" ? argument.length + 3 : Buffer.byteLength(argument) + 1 + 8;\n}\n\n/**\n * The command-line budget per platform, well below the real limits: Linux's\n * `ARG_MAX` is about 2 MB (512 KiB here), Windows allows 32,767 characters\n * (24 KiB here) and other systems get 128 KiB.\n */\nfunction commandLineLimit(platform: NodeJS.Platform): number {\n return platform === \"win32\" ? 24 * 1024 : platform === \"linux\" ? 512 * 1024 : 128 * 1024;\n}\n\nfunction uncheckedResult(file: OxlintFile, code: string): OxlintFileResult {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: false,\n errors: [],\n warnings: [\n {\n type: \"warning\",\n message: `Oxlint could not check this file: its path is too long for one command line (${code}).`,\n lineNumber: 1,\n columnNumber: 1,\n length: 1,\n filePath: file.path,\n relativePath: file.relativePath,\n },\n ],\n };\n}\n\nconst OXLINT_FLAGS = [\"--format=json\", \"--threads=1\", \"--no-error-on-unmatched-pattern\", \"--\"];\n\nfunction healthy(file: OxlintFile): OxlintFileResult {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n}\n\n/** Invoked in a dedicated worker during development; lints only the supplied disk files. */\nexport class OxlintRunner {\n private binaryPath?: string;\n private cwd = process.cwd();\n private readonly children = new Set<ChildProcess>();\n private shuttingDown = false;\n\n public constructor(private readonly dependencies: OxlintRunnerDependencies = {}) {}\n\n public initialize(cwd: string): { success: boolean; hasConfig: boolean } {\n this.cwd = cwd;\n this.binaryPath = findOxlint(cwd);\n this.shuttingDown = false;\n return { success: true, hasConfig: this.binaryPath !== undefined };\n }\n\n /**\n * Stop every running CLI child: SIGTERM first, then SIGKILL after\n * {@link SHUTDOWN_KILL_GRACE_MS} for a child that ignores it. Pending checks\n * reject with {@link OxlintCheckCancelledError}.\n */\n public async shutdown(): Promise<void> {\n this.shuttingDown = true;\n await Promise.all(\n [...this.children].map(\n (child) =>\n new Promise<void>((resolve) => {\n if (child.exitCode !== null || child.signalCode !== null) {\n resolve();\n return;\n }\n const timer = setTimeout(() => child.kill(\"SIGKILL\"), SHUTDOWN_KILL_GRACE_MS);\n child.once(\"close\", () => {\n clearTimeout(timer);\n resolve();\n });\n child.kill(\"SIGTERM\");\n }),\n ),\n );\n this.children.clear();\n }\n\n private execute(binaryPath: string, args: string[], cwd: string): Promise<OxlintCommandOutput> {\n if (this.dependencies.execute) return this.dependencies.execute(binaryPath, args, cwd);\n return new Promise((resolve, reject) => {\n const child = execFile(\n process.execPath,\n [binaryPath, ...args],\n {\n cwd,\n encoding: \"utf8\",\n windowsHide: true,\n timeout: 30_000,\n maxBuffer: MAX_OUTPUT_BYTES,\n },\n (error, stdout, stderr) => {\n this.children.delete(child);\n if (error && this.shuttingDown) {\n reject(new OxlintCheckCancelledError());\n return;\n }\n // Exit 1 with a JSON report is the normal result for lint errors.\n if (error && (error.code !== 1 || error.killed)) {\n reject(oxlintCommandError(error, stdout, stderr));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n this.children.add(child);\n });\n }\n\n /**\n * Lint one batch. A batch whose report overflows the output buffer is split\n * in half and retried, down to single files; a single file whose path the OS\n * refuses as too long is reported as unchecked instead of failing the check.\n */\n private async checkBatch(\n binaryPath: string,\n filesInBatch: OxlintFile[],\n ): Promise<OxlintFileResult[]> {\n if (this.shuttingDown) throw new OxlintCheckCancelledError();\n let output: OxlintCommandOutput;\n try {\n output = await this.execute(\n binaryPath,\n [...OXLINT_FLAGS, ...filesInBatch.map((file) => path.relative(this.cwd, file.path))],\n this.cwd,\n );\n } catch (error) {\n if (this.shuttingDown) throw new OxlintCheckCancelledError();\n const code = errorCodeOf(error);\n if (code === MAX_BUFFER_CODE && filesInBatch.length > 1) {\n const middle = Math.ceil(filesInBatch.length / 2);\n return [\n ...(await this.checkBatch(binaryPath, filesInBatch.slice(0, middle))),\n ...(await this.checkBatch(binaryPath, filesInBatch.slice(middle))),\n ];\n }\n const [only] = filesInBatch;\n if (code && COMMAND_TOO_LONG_CODES.has(code) && only && filesInBatch.length === 1) {\n return [uncheckedResult(only, code)];\n }\n throw error;\n }\n try {\n return parseOxlintResults(output.stdout, filesInBatch, this.cwd);\n } catch (error) {\n if (!(error instanceof OxlintOutputParseError)) throw error;\n const detail = outputDetail(output.stdout, output.stderr) || \"empty diagnostics report\";\n throw new Error(`Oxlint could not check changed files: ${detail}`, { cause: error });\n }\n }\n\n public async checkFiles(files: OxlintFile[]): Promise<OxlintFileResult[]> {\n const exists = this.dependencies.exists ?? existsSync;\n const lintable = files.filter(\n (file) => /\\.[cm]?[jt]sx?$/i.test(file.path) && exists(file.path),\n );\n const binaryPath = this.binaryPath;\n if (!binaryPath || lintable.length === 0) return files.map(healthy);\n const platform = this.dependencies.platform ?? process.platform;\n const limit = this.dependencies.commandLineLimit ?? commandLineLimit(platform);\n const size = (arg: string) => oxlintArgumentSize(arg, platform);\n const baseSize = [process.execPath, binaryPath, ...OXLINT_FLAGS].reduce(\n (sum, arg) => sum + size(arg),\n 0,\n );\n const batches: OxlintFile[][] = [];\n let batch: OxlintFile[] = [];\n let batchSize = baseSize;\n const flush = () => {\n if (batch.length) batches.push(batch);\n batch = [];\n batchSize = baseSize;\n };\n for (const file of lintable) {\n const argumentSize = size(path.relative(this.cwd, file.path));\n if (baseSize + argumentSize > limit) {\n // Over the conservative budget on its own: run it alone, since the\n // real limit is usually far higher.\n flush();\n batches.push([file]);\n continue;\n }\n if (batch.length >= MAX_FILES_PER_BATCH || batchSize + argumentSize > limit) flush();\n batch.push(file);\n batchSize += argumentSize;\n }\n flush();\n const results = new Map(files.map((file) => [file.path, healthy(file)]));\n for (const filesInBatch of batches) {\n for (const result of await this.checkBatch(binaryPath, filesInBatch)) {\n results.set(result.path, result);\n }\n }\n return files.map((file) => results.get(file.path) ?? healthy(file));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import fs from "fs";
|
|
1
|
+
import { hasEslint } from "../eslint-support.mjs";
|
|
3
2
|
import { ESLint } from "eslint";
|
|
4
3
|
import { parentPort, workerData } from "worker_threads";
|
|
5
4
|
|
|
@@ -32,15 +31,7 @@ var ESLintHealthWorker = class {
|
|
|
32
31
|
initialize(config) {
|
|
33
32
|
try {
|
|
34
33
|
this.cwd = config.cwd || process.cwd();
|
|
35
|
-
|
|
36
|
-
"js",
|
|
37
|
-
"mjs",
|
|
38
|
-
"cjs",
|
|
39
|
-
"ts",
|
|
40
|
-
"mts",
|
|
41
|
-
"cts"
|
|
42
|
-
];
|
|
43
|
-
this.hasConfig = flatConfigExtensions.some((extension) => fs.existsSync(path.join(this.cwd, `eslint.config.${extension}`)));
|
|
34
|
+
this.hasConfig = hasEslint(this.cwd);
|
|
44
35
|
if (!this.hasConfig) {
|
|
45
36
|
this.initialized = true;
|
|
46
37
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-health.worker.mjs","names":[],"sources":["../../../../../../../../../../packages/core/src/dev-server/health-checker/workers/eslint-health.worker.ts"],"sourcesContent":["/**\n * ESLint Health Check Worker\n *\n * This worker runs in a dedicated thread to perform ESLint linting\n * without blocking the main dev server thread. It maintains a persistent\n * ESLint instance for efficient linting.\n *\n * Communication:\n * - Receives: { type: 'init' | 'check' | 'shutdown', ... }\n * - Sends: { type: 'results' | 'initialized' | 'error', ... }\n */\nimport { ESLint } from \"eslint\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { parentPort, workerData } from \"worker_threads\";\n\n/**\n * Serialized file data received from main thread\n */\ntype SerializedFile = {\n /** Absolute file path */\n path: string;\n /** File content (source code) */\n content: string;\n /** Relative path for display */\n relativePath: string;\n};\n\n/**\n * Lint message sent back to main thread\n */\ntype LintMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n ruleId?: string;\n};\n\n/**\n * Health check result for a single file\n */\ntype FileCheckResult = {\n path: string;\n relativePath: string;\n healthy: boolean;\n errors: LintMessage[];\n warnings: LintMessage[];\n};\n\n/**\n * Messages received from main thread\n */\n/**\n * Deleted file info\n */\ntype DeletedFile = {\n path: string;\n relativePath: string;\n};\n\n/**\n * Messages received from main thread\n */\ntype WorkerMessage =\n | { type: \"init\"; config: { cwd: string } }\n | { type: \"check\"; files: SerializedFile[] }\n | { type: \"filesDeleted\"; files: DeletedFile[] }\n | { type: \"shutdown\" };\n\n/**\n * Messages sent to main thread\n */\ntype WorkerResponse =\n | { type: \"initialized\"; success: boolean; hasConfig: boolean; error?: string }\n | { type: \"results\"; results: FileCheckResult[] }\n | { type: \"error\"; message: string };\n\n/**\n * ESLint Health Worker class\n * Maintains persistent ESLint instance for efficient linting\n */\nclass ESLintHealthWorker {\n /**\n * ESLint instance\n */\n private eslint: ESLint | null = null;\n\n /**\n * Whether the worker is initialized\n */\n private initialized = false;\n\n /**\n * Whether ESLint config was found\n */\n private hasConfig = false;\n\n /**\n * Current working directory\n */\n private cwd: string = process.cwd();\n\n /**\n * Initialize the worker with ESLint configuration\n */\n public initialize(config: { cwd: string }): { success: boolean; hasConfig: boolean } {\n try {\n this.cwd = config.cwd || process.cwd();\n\n // Check if ESLint flat config exists\n // (.ts/.mts/.cts are supported since ESLint 9.18)\n const flatConfigExtensions = [\"js\", \"mjs\", \"cjs\", \"ts\", \"mts\", \"cts\"];\n\n this.hasConfig = flatConfigExtensions.some((extension) =>\n fs.existsSync(path.join(this.cwd, `eslint.config.${extension}`)),\n );\n\n if (!this.hasConfig) {\n this.initialized = true;\n return { success: true, hasConfig: false };\n }\n\n // Create ESLint instance with flat config\n this.eslint = new ESLint({\n cwd: this.cwd,\n });\n\n this.initialized = true;\n return { success: true, hasConfig: true };\n } catch (error) {\n console.error(\"ESLint Worker: Failed to initialize:\", error);\n this.initialized = true;\n return { success: false, hasConfig: false };\n }\n }\n\n /**\n * Check files for ESLint errors\n */\n public async checkFiles(files: SerializedFile[]): Promise<FileCheckResult[]> {\n if (!this.eslint || !this.hasConfig) {\n // No ESLint config, return all files as healthy\n return files.map((file) => ({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n }));\n }\n\n const results: FileCheckResult[] = [];\n\n for (const file of files) {\n // Only lint lintable files\n if (!this.isLintableFile(file.path)) {\n results.push({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n });\n continue;\n }\n\n try {\n const result = await this.checkSingleFile(file);\n results.push(result);\n } catch (error) {\n // On error, mark as healthy to avoid blocking\n results.push({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n });\n }\n }\n\n return results;\n }\n\n /**\n * Check a single file for lint issues\n */\n private async checkSingleFile(file: SerializedFile): Promise<FileCheckResult> {\n if (!this.eslint) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n // Use lintText to lint from memory (not disk)\n const lintResults = await this.eslint.lintText(file.content, {\n filePath: file.path,\n });\n\n const lintResult = lintResults[0];\n\n if (!lintResult) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n const errors: LintMessage[] = [];\n const warnings: LintMessage[] = [];\n\n for (const message of lintResult.messages) {\n const lintMessage: LintMessage = {\n type: message.severity === 2 ? \"error\" : \"warning\",\n message: message.message,\n lineNumber: message.line || 1,\n columnNumber: message.column || 1,\n length: message.endColumn && message.column ? message.endColumn - message.column : 1,\n filePath: file.path,\n relativePath: file.relativePath,\n ruleId: message.ruleId || undefined,\n };\n\n if (message.severity === 2) {\n errors.push(lintMessage);\n } else if (message.severity === 1) {\n warnings.push(lintMessage);\n }\n }\n\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: errors.length === 0 && warnings.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Check if file is a lintable file\n */\n private isLintableFile(filePath: string): boolean {\n const ext = filePath.toLowerCase();\n return (\n ext.endsWith(\".ts\") || ext.endsWith(\".tsx\") || ext.endsWith(\".js\") || ext.endsWith(\".jsx\")\n );\n }\n}\n\n// Create worker instance\nconst worker = new ESLintHealthWorker();\n\n// Handle messages from main thread\nparentPort?.on(\"message\", async (message: WorkerMessage) => {\n try {\n switch (message.type) {\n case \"init\": {\n const initResult = worker.initialize(message.config);\n const response: WorkerResponse = {\n type: \"initialized\",\n success: initResult.success,\n hasConfig: initResult.hasConfig,\n };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"check\": {\n const results = await worker.checkFiles(message.files);\n const response: WorkerResponse = { type: \"results\", results };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"filesDeleted\": {\n // ESLint doesn't maintain internal file cache (lints from memory)\n // No cleanup needed, just acknowledge\n break;\n }\n\n case \"shutdown\": {\n process.exit(0);\n }\n }\n } catch (error) {\n const response: WorkerResponse = {\n type: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n parentPort?.postMessage(response);\n }\n});\n\n// Handle initialization from workerData if provided\nif (workerData?.autoInit) {\n worker.initialize({ cwd: workerData.cwd || process.cwd() });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eslint-health.worker.mjs","names":[],"sources":["../../../../../../../../../../packages/core/src/dev-server/health-checker/workers/eslint-health.worker.ts"],"sourcesContent":["/**\n * ESLint Health Check Worker\n *\n * This worker runs in a dedicated thread to perform ESLint linting\n * without blocking the main dev server thread. It maintains a persistent\n * ESLint instance for efficient linting.\n *\n * Communication:\n * - Receives: { type: 'init' | 'check' | 'shutdown', ... }\n * - Sends: { type: 'results' | 'initialized' | 'error', ... }\n */\nimport { ESLint } from \"eslint\";\nimport { parentPort, workerData } from \"worker_threads\";\nimport { hasEslint } from \"../eslint-support\";\n\n/**\n * Serialized file data received from main thread\n */\ntype SerializedFile = {\n /** Absolute file path */\n path: string;\n /** File content (source code) */\n content: string;\n /** Relative path for display */\n relativePath: string;\n};\n\n/**\n * Lint message sent back to main thread\n */\ntype LintMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n ruleId?: string;\n};\n\n/**\n * Health check result for a single file\n */\ntype FileCheckResult = {\n path: string;\n relativePath: string;\n healthy: boolean;\n errors: LintMessage[];\n warnings: LintMessage[];\n};\n\n/**\n * Messages received from main thread\n */\n/**\n * Deleted file info\n */\ntype DeletedFile = {\n path: string;\n relativePath: string;\n};\n\n/**\n * Messages received from main thread\n */\ntype WorkerMessage =\n | { type: \"init\"; config: { cwd: string } }\n | { type: \"check\"; files: SerializedFile[] }\n | { type: \"filesDeleted\"; files: DeletedFile[] }\n | { type: \"shutdown\" };\n\n/**\n * Messages sent to main thread\n */\ntype WorkerResponse =\n | { type: \"initialized\"; success: boolean; hasConfig: boolean; error?: string }\n | { type: \"results\"; results: FileCheckResult[] }\n | { type: \"error\"; message: string };\n\n/**\n * ESLint Health Worker class\n * Maintains persistent ESLint instance for efficient linting\n */\nclass ESLintHealthWorker {\n /**\n * ESLint instance\n */\n private eslint: ESLint | null = null;\n\n /**\n * Whether the worker is initialized\n */\n private initialized = false;\n\n /**\n * Whether ESLint config was found\n */\n private hasConfig = false;\n\n /**\n * Current working directory\n */\n private cwd: string = process.cwd();\n\n /**\n * Initialize the worker with ESLint configuration\n */\n public initialize(config: { cwd: string }): { success: boolean; hasConfig: boolean } {\n try {\n this.cwd = config.cwd || process.cwd();\n\n // The main-thread checker emits the one-time deprecation warning.\n this.hasConfig = hasEslint(this.cwd);\n\n if (!this.hasConfig) {\n this.initialized = true;\n return { success: true, hasConfig: false };\n }\n\n // Create ESLint instance with flat config\n this.eslint = new ESLint({\n cwd: this.cwd,\n });\n\n this.initialized = true;\n return { success: true, hasConfig: true };\n } catch (error) {\n console.error(\"ESLint Worker: Failed to initialize:\", error);\n this.initialized = true;\n return { success: false, hasConfig: false };\n }\n }\n\n /**\n * Check files for ESLint errors\n */\n public async checkFiles(files: SerializedFile[]): Promise<FileCheckResult[]> {\n if (!this.eslint || !this.hasConfig) {\n // No ESLint config, return all files as healthy\n return files.map((file) => ({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n }));\n }\n\n const results: FileCheckResult[] = [];\n\n for (const file of files) {\n // Only lint lintable files\n if (!this.isLintableFile(file.path)) {\n results.push({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n });\n continue;\n }\n\n try {\n const result = await this.checkSingleFile(file);\n results.push(result);\n } catch (error) {\n // On error, mark as healthy to avoid blocking\n results.push({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n });\n }\n }\n\n return results;\n }\n\n /**\n * Check a single file for lint issues\n */\n private async checkSingleFile(file: SerializedFile): Promise<FileCheckResult> {\n if (!this.eslint) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n // Use lintText to lint from memory (not disk)\n const lintResults = await this.eslint.lintText(file.content, {\n filePath: file.path,\n });\n\n const lintResult = lintResults[0];\n\n if (!lintResult) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n const errors: LintMessage[] = [];\n const warnings: LintMessage[] = [];\n\n for (const message of lintResult.messages) {\n const lintMessage: LintMessage = {\n type: message.severity === 2 ? \"error\" : \"warning\",\n message: message.message,\n lineNumber: message.line || 1,\n columnNumber: message.column || 1,\n length: message.endColumn && message.column ? message.endColumn - message.column : 1,\n filePath: file.path,\n relativePath: file.relativePath,\n ruleId: message.ruleId || undefined,\n };\n\n if (message.severity === 2) {\n errors.push(lintMessage);\n } else if (message.severity === 1) {\n warnings.push(lintMessage);\n }\n }\n\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: errors.length === 0 && warnings.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Check if file is a lintable file\n */\n private isLintableFile(filePath: string): boolean {\n const ext = filePath.toLowerCase();\n return (\n ext.endsWith(\".ts\") || ext.endsWith(\".tsx\") || ext.endsWith(\".js\") || ext.endsWith(\".jsx\")\n );\n }\n}\n\n// Create worker instance\nconst worker = new ESLintHealthWorker();\n\n// Handle messages from main thread\nparentPort?.on(\"message\", async (message: WorkerMessage) => {\n try {\n switch (message.type) {\n case \"init\": {\n const initResult = worker.initialize(message.config);\n const response: WorkerResponse = {\n type: \"initialized\",\n success: initResult.success,\n hasConfig: initResult.hasConfig,\n };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"check\": {\n const results = await worker.checkFiles(message.files);\n const response: WorkerResponse = { type: \"results\", results };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"filesDeleted\": {\n // ESLint doesn't maintain internal file cache (lints from memory)\n // No cleanup needed, just acknowledge\n break;\n }\n\n case \"shutdown\": {\n process.exit(0);\n }\n }\n } catch (error) {\n const response: WorkerResponse = {\n type: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n parentPort?.postMessage(response);\n }\n});\n\n// Handle initialization from workerData if provided\nif (workerData?.autoInit) {\n worker.initialize({ cwd: workerData.cwd || process.cwd() });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { CompilerSession } from "../../../tooling/typescript/compiler.mjs";
|
|
1
2
|
import path from "node:path";
|
|
2
|
-
import
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
3
4
|
import { parentPort, workerData } from "worker_threads";
|
|
4
5
|
|
|
5
6
|
//#region ../../packages/core/src/dev-server/health-checker/workers/ts-health.worker.ts
|
|
@@ -8,194 +9,56 @@ import { parentPort, workerData } from "worker_threads";
|
|
|
8
9
|
*
|
|
9
10
|
* This worker runs in a dedicated thread to perform TypeScript type checking
|
|
10
11
|
* without blocking the main dev server thread. It maintains a persistent
|
|
11
|
-
*
|
|
12
|
+
* native compiler session for fast incremental type checking.
|
|
12
13
|
*
|
|
13
14
|
* Communication:
|
|
14
15
|
* - Receives: { type: 'init' | 'check' | 'fileChanges' | 'shutdown', ... }
|
|
15
16
|
* - Sends: { type: 'results' | 'initialized' | 'error', ... }
|
|
16
17
|
*/
|
|
17
|
-
/**
|
|
18
|
-
* TypeScript Health Worker class
|
|
19
|
-
* Maintains persistent ts.Program for incremental type checking
|
|
20
|
-
*/
|
|
18
|
+
/** The session owns one native compiler child and closes it on shutdown. */
|
|
21
19
|
var TypeScriptHealthWorker = class {
|
|
22
20
|
constructor() {
|
|
23
|
-
this.
|
|
24
|
-
this.parsedConfig = null;
|
|
25
|
-
this.fileContents = /* @__PURE__ */ new Map();
|
|
26
|
-
this.deletedRootPaths = /* @__PURE__ */ new Set();
|
|
27
|
-
this.initialized = false;
|
|
28
|
-
this.cwd = process.cwd();
|
|
21
|
+
this.session = null;
|
|
29
22
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Initialize the worker with TypeScript configuration
|
|
32
|
-
*/
|
|
33
23
|
initialize(config) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
|
|
42
|
-
if (configFile.error) {
|
|
43
|
-
console.warn("TypeScript Worker: Error reading tsconfig:", configFile.error);
|
|
44
|
-
this.initialized = true;
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
this.parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, this.cwd);
|
|
48
|
-
if (this.parsedConfig.errors.length > 0) console.warn("TypeScript Worker: tsconfig has errors:", this.parsedConfig.errors);
|
|
49
|
-
this.initialized = true;
|
|
50
|
-
return true;
|
|
51
|
-
} catch (error) {
|
|
52
|
-
console.error("TypeScript Worker: Failed to initialize:", error);
|
|
53
|
-
this.initialized = true;
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
24
|
+
this.close();
|
|
25
|
+
const cwd = config.cwd || process.cwd();
|
|
26
|
+
const configPath = path.resolve(cwd, config.tsconfigPath ?? "tsconfig.json");
|
|
27
|
+
if (existsSync(configPath)) this.session = new CompilerSession(cwd, configPath);
|
|
28
|
+
return true;
|
|
56
29
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Check files for TypeScript errors
|
|
59
|
-
*/
|
|
60
30
|
checkFiles(files) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
31
|
+
this.session?.update(files);
|
|
32
|
+
return files.map((file) => {
|
|
33
|
+
const messages = (this.session?.diagnostics(file.path) ?? []).map((diagnostic) => ({
|
|
34
|
+
type: diagnostic.severity,
|
|
35
|
+
message: diagnostic.message,
|
|
36
|
+
lineNumber: diagnostic.line,
|
|
37
|
+
columnNumber: diagnostic.column,
|
|
38
|
+
length: diagnostic.length,
|
|
39
|
+
filePath: file.path,
|
|
40
|
+
relativePath: file.relativePath
|
|
41
|
+
}));
|
|
42
|
+
const errors = messages.filter((message) => message.type === "error");
|
|
43
|
+
const warnings = messages.filter((message) => message.type === "warning");
|
|
44
|
+
return {
|
|
45
|
+
path: file.path,
|
|
46
|
+
relativePath: file.relativePath,
|
|
47
|
+
healthy: errors.length === 0 && warnings.length === 0,
|
|
48
|
+
errors,
|
|
49
|
+
warnings
|
|
50
|
+
};
|
|
51
|
+
});
|
|
79
52
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Handle file changes (update program incrementally)
|
|
82
|
-
*/
|
|
83
53
|
handleFileChanges(files) {
|
|
84
|
-
|
|
85
|
-
this.fileContents.set(file.path, file.content);
|
|
86
|
-
this.deletedRootPaths.delete(this.getPathIdentity(file.path));
|
|
87
|
-
}
|
|
88
|
-
if (this.parsedConfig && this.program) this.program = ts.createProgram(this.getProgramRootNames(), this.parsedConfig.options, this.createCompilerHost(), this.program || void 0);
|
|
54
|
+
this.session?.update(files);
|
|
89
55
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Handle deleted files (remove from cache)
|
|
92
|
-
*/
|
|
93
56
|
handleFilesDeleted(files) {
|
|
94
|
-
|
|
95
|
-
for (const file of files) {
|
|
96
|
-
const identity = this.getPathIdentity(file.path);
|
|
97
|
-
const cachedPath = Array.from(this.fileContents.keys()).find((candidate) => this.getPathIdentity(candidate) === identity);
|
|
98
|
-
if (cachedPath) {
|
|
99
|
-
this.fileContents.delete(cachedPath);
|
|
100
|
-
hasChanges = true;
|
|
101
|
-
}
|
|
102
|
-
if (!this.deletedRootPaths.has(identity)) hasChanges = true;
|
|
103
|
-
this.deletedRootPaths.add(identity);
|
|
104
|
-
}
|
|
105
|
-
if (hasChanges && this.parsedConfig) this.program = ts.createProgram(this.getProgramRootNames(), this.parsedConfig.options, this.createCompilerHost(), this.program || void 0);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Check a single file for diagnostics
|
|
109
|
-
*/
|
|
110
|
-
checkSingleFile(file) {
|
|
111
|
-
if (!this.program) return {
|
|
112
|
-
path: file.path,
|
|
113
|
-
relativePath: file.relativePath,
|
|
114
|
-
healthy: true,
|
|
115
|
-
errors: [],
|
|
116
|
-
warnings: []
|
|
117
|
-
};
|
|
118
|
-
const sourceFile = this.program.getSourceFile(file.path);
|
|
119
|
-
if (!sourceFile) return {
|
|
120
|
-
path: file.path,
|
|
121
|
-
relativePath: file.relativePath,
|
|
122
|
-
healthy: true,
|
|
123
|
-
errors: [],
|
|
124
|
-
warnings: []
|
|
125
|
-
};
|
|
126
|
-
const syntacticDiagnostics = this.program.getSyntacticDiagnostics(sourceFile);
|
|
127
|
-
const semanticDiagnostics = this.program.getSemanticDiagnostics(sourceFile);
|
|
128
|
-
const allDiagnostics = [...syntacticDiagnostics, ...semanticDiagnostics];
|
|
129
|
-
const errors = [];
|
|
130
|
-
const warnings = [];
|
|
131
|
-
for (const diagnostic of allDiagnostics) {
|
|
132
|
-
const message = this.formatDiagnostic(diagnostic, file);
|
|
133
|
-
if (diagnostic.category === ts.DiagnosticCategory.Error) errors.push(message);
|
|
134
|
-
else if (diagnostic.category === ts.DiagnosticCategory.Warning) warnings.push(message);
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
path: file.path,
|
|
138
|
-
relativePath: file.relativePath,
|
|
139
|
-
healthy: errors.length === 0 && warnings.length === 0,
|
|
140
|
-
errors,
|
|
141
|
-
warnings
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Format a TypeScript diagnostic into our message format
|
|
146
|
-
*/
|
|
147
|
-
formatDiagnostic(diagnostic, file) {
|
|
148
|
-
let lineNumber = 1;
|
|
149
|
-
let columnNumber = 1;
|
|
150
|
-
let length = 1;
|
|
151
|
-
if (diagnostic.file && diagnostic.start !== void 0) {
|
|
152
|
-
const pos = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
|
|
153
|
-
lineNumber = pos.line + 1;
|
|
154
|
-
columnNumber = pos.character + 1;
|
|
155
|
-
length = diagnostic.length || 1;
|
|
156
|
-
}
|
|
157
|
-
const messageText = typeof diagnostic.messageText === "string" ? diagnostic.messageText : diagnostic.messageText.messageText;
|
|
158
|
-
return {
|
|
159
|
-
type: diagnostic.category === ts.DiagnosticCategory.Error ? "error" : "warning",
|
|
160
|
-
message: messageText,
|
|
161
|
-
lineNumber,
|
|
162
|
-
columnNumber,
|
|
163
|
-
length,
|
|
164
|
-
filePath: file.path,
|
|
165
|
-
relativePath: file.relativePath
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Create a custom compiler host that reads from in-memory cache
|
|
170
|
-
*/
|
|
171
|
-
createCompilerHost() {
|
|
172
|
-
const defaultHost = ts.createCompilerHost(this.parsedConfig?.options || {});
|
|
173
|
-
return {
|
|
174
|
-
...defaultHost,
|
|
175
|
-
readFile: (fileName) => {
|
|
176
|
-
if (this.fileContents.has(fileName)) return this.fileContents.get(fileName);
|
|
177
|
-
return defaultHost.readFile(fileName);
|
|
178
|
-
},
|
|
179
|
-
fileExists: (fileName) => {
|
|
180
|
-
if (this.fileContents.has(fileName)) return true;
|
|
181
|
-
return defaultHost.fileExists(fileName);
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
/** Keep tsconfig-selected declarations in every incremental program. */
|
|
186
|
-
getProgramRootNames() {
|
|
187
|
-
const configuredRoots = this.parsedConfig?.fileNames || [];
|
|
188
|
-
const rootsByIdentity = /* @__PURE__ */ new Map();
|
|
189
|
-
for (const filePath of [...configuredRoots, ...this.fileContents.keys()]) {
|
|
190
|
-
const identity = this.getPathIdentity(filePath);
|
|
191
|
-
if (!this.deletedRootPaths.has(identity)) rootsByIdentity.set(identity, filePath);
|
|
192
|
-
}
|
|
193
|
-
return [...rootsByIdentity.values()];
|
|
57
|
+
this.session?.update([], files.map((file) => file.path));
|
|
194
58
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return ts.sys.useCaseSensitiveFileNames ? normalized : normalized.toLowerCase();
|
|
59
|
+
close() {
|
|
60
|
+
this.session?.close();
|
|
61
|
+
this.session = null;
|
|
199
62
|
}
|
|
200
63
|
};
|
|
201
64
|
const worker = new TypeScriptHealthWorker();
|
|
@@ -224,7 +87,9 @@ parentPort?.on("message", (message) => {
|
|
|
224
87
|
case "filesDeleted":
|
|
225
88
|
worker.handleFilesDeleted(message.files);
|
|
226
89
|
break;
|
|
227
|
-
case "shutdown":
|
|
90
|
+
case "shutdown":
|
|
91
|
+
worker.close();
|
|
92
|
+
process.exit(0);
|
|
228
93
|
}
|
|
229
94
|
} catch (error) {
|
|
230
95
|
const response = {
|
|
@@ -235,6 +100,7 @@ parentPort?.on("message", (message) => {
|
|
|
235
100
|
}
|
|
236
101
|
});
|
|
237
102
|
if (workerData?.autoInit) worker.initialize({ cwd: workerData.cwd || process.cwd() });
|
|
103
|
+
parentPort?.on("close", () => worker.close());
|
|
238
104
|
|
|
239
105
|
//#endregion
|
|
240
106
|
export { };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-health.worker.mjs","names":[],"sources":["../../../../../../../../../../packages/core/src/dev-server/health-checker/workers/ts-health.worker.ts"],"sourcesContent":["/**\n * TypeScript Health Check Worker\n *\n * This worker runs in a dedicated thread to perform TypeScript type checking\n * without blocking the main dev server thread. It maintains a persistent\n * ts.Program instance for fast incremental type checking.\n *\n * Communication:\n * - Receives: { type: 'init' | 'check' | 'fileChanges' | 'shutdown', ... }\n * - Sends: { type: 'results' | 'initialized' | 'error', ... }\n */\nimport ts from \"typescript\";\nimport path from \"node:path\";\nimport { parentPort, workerData } from \"worker_threads\";\n\n/**\n * Serialized file data received from main thread\n */\ntype SerializedFile = {\n /** Absolute file path */\n path: string;\n /** File content (source code) */\n content: string;\n /** Relative path for display */\n relativePath: string;\n};\n\n/**\n * Diagnostic message sent back to main thread\n */\ntype DiagnosticMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n};\n\n/**\n * Health check result for a single file\n */\ntype FileCheckResult = {\n path: string;\n relativePath: string;\n healthy: boolean;\n errors: DiagnosticMessage[];\n warnings: DiagnosticMessage[];\n};\n\n/**\n * Messages received from main thread\n */\n/**\n * Deleted file info\n */\ntype DeletedFile = {\n path: string;\n relativePath: string;\n};\n\n/**\n * Messages received from main thread\n */\ntype WorkerMessage =\n | { type: \"init\"; config: { cwd: string; tsconfigPath?: string } }\n | { type: \"check\"; files: SerializedFile[] }\n | { type: \"fileChanges\"; files: SerializedFile[] }\n | { type: \"filesDeleted\"; files: DeletedFile[] }\n | { type: \"shutdown\" };\n\n/**\n * Messages sent to main thread\n */\ntype WorkerResponse =\n | { type: \"initialized\"; success: boolean; error?: string }\n | { type: \"results\"; results: FileCheckResult[] }\n | { type: \"error\"; message: string };\n\n/**\n * TypeScript Health Worker class\n * Maintains persistent ts.Program for incremental type checking\n */\nclass TypeScriptHealthWorker {\n /**\n * Cached TypeScript program instance\n */\n private program: ts.Program | null = null;\n\n /**\n * Parsed TypeScript configuration\n */\n private parsedConfig: ts.ParsedCommandLine | null = null;\n\n /**\n * In-memory file contents cache\n */\n private fileContents = new Map<string, string>();\n\n /** Source paths removed since the tsconfig was parsed. */\n private deletedRootPaths = new Set<string>();\n\n /**\n * Whether the worker is initialized\n */\n private initialized = false;\n\n /**\n * Current working directory\n */\n private cwd: string = process.cwd();\n\n /**\n * Initialize the worker with TypeScript configuration\n */\n public initialize(config: { cwd: string; tsconfigPath?: string }): boolean {\n try {\n this.cwd = config.cwd || process.cwd();\n\n // Try to load tsconfig.json\n const tsconfigPath = config.tsconfigPath || ts.findConfigFile(this.cwd, ts.sys.fileExists);\n\n if (!tsconfigPath) {\n this.initialized = true;\n return true; // No tsconfig, will skip type checking\n }\n\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n\n if (configFile.error) {\n console.warn(\"TypeScript Worker: Error reading tsconfig:\", configFile.error);\n this.initialized = true;\n return true;\n }\n\n this.parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, this.cwd);\n\n if (this.parsedConfig.errors.length > 0) {\n console.warn(\"TypeScript Worker: tsconfig has errors:\", this.parsedConfig.errors);\n }\n\n this.initialized = true;\n return true;\n } catch (error) {\n console.error(\"TypeScript Worker: Failed to initialize:\", error);\n this.initialized = true;\n return false;\n }\n }\n\n /**\n * Check files for TypeScript errors\n */\n public checkFiles(files: SerializedFile[]): FileCheckResult[] {\n if (!this.parsedConfig) {\n // No config, return all files as healthy\n return files.map((file) => ({\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n }));\n }\n\n // Update in-memory file cache\n for (const file of files) {\n this.fileContents.set(file.path, file.content);\n this.deletedRootPaths.delete(this.getPathIdentity(file.path));\n }\n\n // Create or update the program (incremental)\n this.program = ts.createProgram(\n this.getProgramRootNames(),\n this.parsedConfig.options,\n this.createCompilerHost(),\n this.program || undefined, // Pass old program for incremental compilation\n );\n\n // Check each file\n const results: FileCheckResult[] = [];\n\n for (const file of files) {\n const result = this.checkSingleFile(file);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Handle file changes (update program incrementally)\n */\n public handleFileChanges(files: SerializedFile[]): void {\n for (const file of files) {\n this.fileContents.set(file.path, file.content);\n this.deletedRootPaths.delete(this.getPathIdentity(file.path));\n }\n\n // Recreate program with new file contents\n if (this.parsedConfig && this.program) {\n this.program = ts.createProgram(\n this.getProgramRootNames(),\n this.parsedConfig.options,\n this.createCompilerHost(),\n this.program || undefined,\n );\n }\n }\n\n /**\n * Handle deleted files (remove from cache)\n */\n public handleFilesDeleted(files: DeletedFile[]): void {\n let hasChanges = false;\n\n for (const file of files) {\n const identity = this.getPathIdentity(file.path);\n const cachedPath = Array.from(this.fileContents.keys()).find(\n (candidate) => this.getPathIdentity(candidate) === identity,\n );\n\n if (cachedPath) {\n this.fileContents.delete(cachedPath);\n hasChanges = true;\n }\n if (!this.deletedRootPaths.has(identity)) hasChanges = true;\n this.deletedRootPaths.add(identity);\n }\n\n // Recreate program without deleted files\n if (hasChanges && this.parsedConfig) {\n this.program = ts.createProgram(\n this.getProgramRootNames(),\n this.parsedConfig.options,\n this.createCompilerHost(),\n this.program || undefined,\n );\n }\n }\n\n /**\n * Check a single file for diagnostics\n */\n private checkSingleFile(file: SerializedFile): FileCheckResult {\n if (!this.program) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n const sourceFile = this.program.getSourceFile(file.path);\n\n if (!sourceFile) {\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: true,\n errors: [],\n warnings: [],\n };\n }\n\n const syntacticDiagnostics = this.program.getSyntacticDiagnostics(sourceFile);\n const semanticDiagnostics = this.program.getSemanticDiagnostics(sourceFile);\n const allDiagnostics = [...syntacticDiagnostics, ...semanticDiagnostics];\n\n const errors: DiagnosticMessage[] = [];\n const warnings: DiagnosticMessage[] = [];\n\n for (const diagnostic of allDiagnostics) {\n const message = this.formatDiagnostic(diagnostic, file);\n\n if (diagnostic.category === ts.DiagnosticCategory.Error) {\n errors.push(message);\n } else if (diagnostic.category === ts.DiagnosticCategory.Warning) {\n warnings.push(message);\n }\n }\n\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: errors.length === 0 && warnings.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Format a TypeScript diagnostic into our message format\n */\n private formatDiagnostic(diagnostic: ts.Diagnostic, file: SerializedFile): DiagnosticMessage {\n let lineNumber = 1;\n let columnNumber = 1;\n let length = 1;\n\n if (diagnostic.file && diagnostic.start !== undefined) {\n const pos = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\n lineNumber = pos.line + 1;\n columnNumber = pos.character + 1;\n length = diagnostic.length || 1;\n }\n\n const messageText =\n typeof diagnostic.messageText === \"string\"\n ? diagnostic.messageText\n : diagnostic.messageText.messageText;\n\n return {\n type: diagnostic.category === ts.DiagnosticCategory.Error ? \"error\" : \"warning\",\n message: messageText,\n lineNumber,\n columnNumber,\n length,\n filePath: file.path,\n relativePath: file.relativePath,\n };\n }\n\n /**\n * Create a custom compiler host that reads from in-memory cache\n */\n private createCompilerHost(): ts.CompilerHost {\n const defaultHost = ts.createCompilerHost(this.parsedConfig?.options || {});\n\n return {\n ...defaultHost,\n readFile: (fileName: string) => {\n // Check in-memory cache first\n if (this.fileContents.has(fileName)) {\n return this.fileContents.get(fileName);\n }\n // Fall back to disk\n return defaultHost.readFile(fileName);\n },\n fileExists: (fileName: string) => {\n if (this.fileContents.has(fileName)) {\n return true;\n }\n return defaultHost.fileExists(fileName);\n },\n };\n }\n\n /** Keep tsconfig-selected declarations in every incremental program. */\n private getProgramRootNames(): string[] {\n const configuredRoots = this.parsedConfig?.fileNames || [];\n\n const rootsByIdentity = new Map<string, string>();\n\n for (const filePath of [...configuredRoots, ...this.fileContents.keys()]) {\n const identity = this.getPathIdentity(filePath);\n if (!this.deletedRootPaths.has(identity)) rootsByIdentity.set(identity, filePath);\n }\n\n return [...rootsByIdentity.values()];\n }\n\n /** Compare equivalent Windows path spellings as one TypeScript root. */\n private getPathIdentity(filePath: string): string {\n const normalized = path.normalize(path.resolve(filePath));\n\n return ts.sys.useCaseSensitiveFileNames ? normalized : normalized.toLowerCase();\n }\n}\n\n// Create worker instance\nconst worker = new TypeScriptHealthWorker();\n\n// Handle messages from main thread\nparentPort?.on(\"message\", (message: WorkerMessage) => {\n try {\n switch (message.type) {\n case \"init\": {\n const success = worker.initialize(message.config);\n const response: WorkerResponse = { type: \"initialized\", success };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"check\": {\n const results = worker.checkFiles(message.files);\n const response: WorkerResponse = { type: \"results\", results };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"fileChanges\": {\n worker.handleFileChanges(message.files);\n break;\n }\n\n case \"filesDeleted\": {\n worker.handleFilesDeleted(message.files);\n break;\n }\n\n case \"shutdown\": {\n process.exit(0);\n }\n }\n } catch (error) {\n const response: WorkerResponse = {\n type: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n parentPort?.postMessage(response);\n }\n});\n\n// Handle initialization from workerData if provided\nif (workerData?.autoInit) {\n worker.initialize({ cwd: workerData.cwd || process.cwd() });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ts-health.worker.mjs","names":[],"sources":["../../../../../../../../../../packages/core/src/dev-server/health-checker/workers/ts-health.worker.ts"],"sourcesContent":["/**\n * TypeScript Health Check Worker\n *\n * This worker runs in a dedicated thread to perform TypeScript type checking\n * without blocking the main dev server thread. It maintains a persistent\n * native compiler session for fast incremental type checking.\n *\n * Communication:\n * - Receives: { type: 'init' | 'check' | 'fileChanges' | 'shutdown', ... }\n * - Sends: { type: 'results' | 'initialized' | 'error', ... }\n */\nimport { existsSync } from \"node:fs\";\nimport { CompilerSession } from \"../../../tooling/typescript/compiler\";\nimport path from \"node:path\";\nimport { parentPort, workerData } from \"worker_threads\";\n\n/**\n * Serialized file data received from main thread\n */\ntype SerializedFile = {\n /** Absolute file path */\n path: string;\n /** File content (source code) */\n content: string;\n /** Relative path for display */\n relativePath: string;\n};\n\n/**\n * Diagnostic message sent back to main thread\n */\ntype DiagnosticMessage = {\n type: \"error\" | \"warning\";\n message: string;\n lineNumber: number;\n columnNumber: number;\n length: number;\n filePath: string;\n relativePath: string;\n};\n\n/**\n * Health check result for a single file\n */\ntype FileCheckResult = {\n path: string;\n relativePath: string;\n healthy: boolean;\n errors: DiagnosticMessage[];\n warnings: DiagnosticMessage[];\n};\n\n/**\n * Messages received from main thread\n */\n/**\n * Deleted file info\n */\ntype DeletedFile = {\n path: string;\n relativePath: string;\n};\n\n/**\n * Messages received from main thread\n */\ntype WorkerMessage =\n | { type: \"init\"; config: { cwd: string; tsconfigPath?: string } }\n | { type: \"check\"; files: SerializedFile[] }\n | { type: \"fileChanges\"; files: SerializedFile[] }\n | { type: \"filesDeleted\"; files: DeletedFile[] }\n | { type: \"shutdown\" };\n\n/**\n * Messages sent to main thread\n */\ntype WorkerResponse =\n | { type: \"initialized\"; success: boolean; error?: string }\n | { type: \"results\"; results: FileCheckResult[] }\n | { type: \"error\"; message: string };\n\n/** The session owns one native compiler child and closes it on shutdown. */\nclass TypeScriptHealthWorker {\n private session: CompilerSession | null = null;\n public initialize(config: { cwd: string; tsconfigPath?: string }): boolean {\n this.close();\n const cwd = config.cwd || process.cwd();\n const configPath = path.resolve(cwd, config.tsconfigPath ?? \"tsconfig.json\");\n if (existsSync(configPath)) this.session = new CompilerSession(cwd, configPath);\n return true;\n }\n public checkFiles(files: SerializedFile[]): FileCheckResult[] {\n this.session?.update(files);\n return files.map((file) => {\n const diagnostics = this.session?.diagnostics(file.path) ?? [];\n const messages: DiagnosticMessage[] = diagnostics.map((diagnostic) => ({\n type: diagnostic.severity,\n message: diagnostic.message,\n lineNumber: diagnostic.line,\n columnNumber: diagnostic.column,\n length: diagnostic.length,\n filePath: file.path,\n relativePath: file.relativePath,\n }));\n const errors = messages.filter((message) => message.type === \"error\");\n const warnings = messages.filter((message) => message.type === \"warning\");\n return {\n path: file.path,\n relativePath: file.relativePath,\n healthy: errors.length === 0 && warnings.length === 0,\n errors,\n warnings,\n };\n });\n }\n public handleFileChanges(files: SerializedFile[]): void {\n this.session?.update(files);\n }\n public handleFilesDeleted(files: DeletedFile[]): void {\n this.session?.update(\n [],\n files.map((file) => file.path),\n );\n }\n public close(): void {\n this.session?.close();\n this.session = null;\n }\n}\n\n// Create worker instance\nconst worker = new TypeScriptHealthWorker();\n\n// Handle messages from main thread\nparentPort?.on(\"message\", (message: WorkerMessage) => {\n try {\n switch (message.type) {\n case \"init\": {\n const success = worker.initialize(message.config);\n const response: WorkerResponse = { type: \"initialized\", success };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"check\": {\n const results = worker.checkFiles(message.files);\n const response: WorkerResponse = { type: \"results\", results };\n parentPort?.postMessage(response);\n break;\n }\n\n case \"fileChanges\": {\n worker.handleFileChanges(message.files);\n break;\n }\n\n case \"filesDeleted\": {\n worker.handleFilesDeleted(message.files);\n break;\n }\n\n case \"shutdown\": {\n worker.close();\n process.exit(0);\n }\n }\n } catch (error) {\n const response: WorkerResponse = {\n type: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n parentPort?.postMessage(response);\n }\n});\n\n// Handle initialization from workerData if provided\nif (workerData?.autoInit) {\n worker.initialize({ cwd: workerData.cwd || process.cwd() });\n}\n\nparentPort?.on(\"close\", () => worker.close());\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkFA,IAAM,yBAAN,MAA6B;;iBACe;;CAC1C,AAAO,WAAW,QAAyD;EACzE,KAAK,MAAM;EACX,MAAM,MAAM,OAAO,OAAO,QAAQ,IAAI;EACtC,MAAM,aAAa,KAAK,QAAQ,KAAK,OAAO,gBAAgB,eAAe;EAC3E,IAAI,WAAW,UAAU,GAAG,KAAK,UAAU,IAAI,gBAAgB,KAAK,UAAU;EAC9E,OAAO;CACT;CACA,AAAO,WAAW,OAA4C;EAC5D,KAAK,SAAS,OAAO,KAAK;EAC1B,OAAO,MAAM,KAAK,SAAS;GAEzB,MAAM,YADc,KAAK,SAAS,YAAY,KAAK,IAAI,KAAK,CAAC,EACZ,CAAC,KAAK,gBAAgB;IACrE,MAAM,WAAW;IACjB,SAAS,WAAW;IACpB,YAAY,WAAW;IACvB,cAAc,WAAW;IACzB,QAAQ,WAAW;IACnB,UAAU,KAAK;IACf,cAAc,KAAK;GACrB,EAAE;GACF,MAAM,SAAS,SAAS,QAAQ,YAAY,QAAQ,SAAS,OAAO;GACpE,MAAM,WAAW,SAAS,QAAQ,YAAY,QAAQ,SAAS,SAAS;GACxE,OAAO;IACL,MAAM,KAAK;IACX,cAAc,KAAK;IACnB,SAAS,OAAO,WAAW,KAAK,SAAS,WAAW;IACpD;IACA;GACF;EACF,CAAC;CACH;CACA,AAAO,kBAAkB,OAA+B;EACtD,KAAK,SAAS,OAAO,KAAK;CAC5B;CACA,AAAO,mBAAmB,OAA4B;EACpD,KAAK,SAAS,OACZ,CAAC,GACD,MAAM,KAAK,SAAS,KAAK,IAAI,CAC/B;CACF;CACA,AAAO,QAAc;EACnB,KAAK,SAAS,MAAM;EACpB,KAAK,UAAU;CACjB;AACF;AAGA,MAAM,SAAS,IAAI,uBAAuB;AAG1C,YAAY,GAAG,YAAY,YAA2B;CACpD,IAAI;EACF,QAAQ,QAAQ,MAAhB;GACE,KAAK,QAAQ;IAEX,MAAM,WAA2B;KAAE,MAAM;KAAe,SADxC,OAAO,WAAW,QAAQ,MACoB;IAAE;IAChE,YAAY,YAAY,QAAQ;IAChC;GACF;GAEA,KAAK,SAAS;IAEZ,MAAM,WAA2B;KAAE,MAAM;KAAW,SADpC,OAAO,WAAW,QAAQ,KACgB;IAAE;IAC5D,YAAY,YAAY,QAAQ;IAChC;GACF;GAEA,KAAK;IACH,OAAO,kBAAkB,QAAQ,KAAK;IACtC;GAGF,KAAK;IACH,OAAO,mBAAmB,QAAQ,KAAK;IACvC;GAGF,KAAK;IACH,OAAO,MAAM;IACb,QAAQ,KAAK,CAAC;EAElB;CACF,SAAS,OAAO;EACd,MAAM,WAA2B;GAC/B,MAAM;GACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAChE;EACA,YAAY,YAAY,QAAQ;CAClC;AACF,CAAC;AAGD,IAAI,YAAY,UACd,OAAO,WAAW,EAAE,KAAK,WAAW,OAAO,QAAQ,IAAI,EAAE,CAAC;AAG5D,YAAY,GAAG,eAAe,OAAO,MAAM,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { TranspileInit, load } from "./load-hook.mjs";
|
|
2
2
|
import { resolve } from "./resolve-hook.mjs";
|
|
3
3
|
import { MessagePort } from "node:worker_threads";
|
|
4
|
-
|
|
5
4
|
//#region ../../packages/core/src/dev-server/loader/hook-thread.d.ts
|
|
6
5
|
type InitializeData = {
|
|
7
6
|
port: MessagePort;
|
|
8
|
-
srcRoot: string;
|
|
7
|
+
srcRoot: string;
|
|
8
|
+
/** Transpile config (always present — esbuild transpile is unconditional). */
|
|
9
9
|
transpile: TranspileInit;
|
|
10
10
|
};
|
|
11
11
|
/**
|
|
@@ -38,11 +38,7 @@ type InitializeData = {
|
|
|
38
38
|
* // File watcher later:
|
|
39
39
|
* port1.postMessage({ type: "bump", absolutePath: "/abs/path/to/user.model.ts" });
|
|
40
40
|
*/
|
|
41
|
-
declare function initialize({
|
|
42
|
-
port,
|
|
43
|
-
srcRoot,
|
|
44
|
-
transpile
|
|
45
|
-
}: InitializeData): void;
|
|
41
|
+
export declare function initialize({ port, srcRoot, transpile }: InitializeData): void;
|
|
46
42
|
//#endregion
|
|
47
|
-
export {
|
|
43
|
+
export { load, resolve };
|
|
48
44
|
//# sourceMappingURL=hook-thread.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-thread.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/hook-thread.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"hook-thread.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/hook-thread.ts"],"mappings":";;;;KAKK;EACH,MAAM;EACN;;EAEA,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAiCG,aAAa,MAAM,SAAS,aAAa"}
|
|
@@ -14,10 +14,14 @@ type NextLoad = (url: string, context?: LoadContext) => Promise<LoadResult>;
|
|
|
14
14
|
* shipped into the hook worker via `initialize()`. Always present — esbuild
|
|
15
15
|
* transpile is unconditional now (tsx is no longer in the TS path).
|
|
16
16
|
*/
|
|
17
|
-
type TranspileInit = {
|
|
18
|
-
/** Absolute `.warlock/transpile` directory. */
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
export type TranspileInit = {
|
|
18
|
+
/** Absolute `.warlock/transpile` directory. */
|
|
19
|
+
cacheDir: string;
|
|
20
|
+
/** Source-content key salt: esbuild version + epoch + tsconfig blob. */
|
|
21
|
+
fingerprint: string;
|
|
22
|
+
/** esbuild `target` (e.g. `"node22"` — must match the prod builder). */
|
|
23
|
+
target: string;
|
|
24
|
+
/** JSON string of `{ compilerOptions }` handed to esbuild as tsconfigRaw. */
|
|
21
25
|
tsconfigRaw: string;
|
|
22
26
|
/**
|
|
23
27
|
* Debug-only: name cache files `<slug>.<hash>.js` and append a trailing
|
|
@@ -52,7 +56,7 @@ type TranspileInit = {
|
|
|
52
56
|
* // load("file:///@warlock.js/core/src/x.ts") → esbuild transpile + cache
|
|
53
57
|
* // load("file:///node_modules/ms/index.js") → nextLoad (Node default)
|
|
54
58
|
*/
|
|
55
|
-
declare function load(url: string, context: LoadContext, nextLoad: NextLoad): Promise<LoadResult>;
|
|
59
|
+
export declare function load(url: string, context: LoadContext, nextLoad: NextLoad): Promise<LoadResult>;
|
|
56
60
|
//#endregion
|
|
57
|
-
export {
|
|
61
|
+
export {};
|
|
58
62
|
//# sourceMappingURL=load-hook.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-hook.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/load-hook.ts"],"mappings":";KAMK
|
|
1
|
+
{"version":3,"file":"load-hook.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/dev-server/loader/load-hook.ts"],"mappings":";KAMK;EACH;EACA,mBAAmB;;KAGhB;EACH;EACA,iBAAiB;EACjB;;KAGG,YAAY,aAAa,UAAU,gBAAgB,QAAQ;;;;;;YAOpD;;EAEV;;EAEA;;EAEA;;EAEA;;;;;;EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqDoB,KACpB,aACA,SAAS,aACT,UAAU,WACT,QAAQ"}
|
|
@@ -18,8 +18,8 @@ function configureTranspile(init) {
|
|
|
18
18
|
transpile = init;
|
|
19
19
|
cache = new TranspileCache(init.cacheDir);
|
|
20
20
|
cache.gc({
|
|
21
|
-
maxBytes:
|
|
22
|
-
maxAgeMs:
|
|
21
|
+
maxBytes: 268435456,
|
|
22
|
+
maxAgeMs: 12096e5
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
@@ -61,8 +61,9 @@ async function load(url, context, nextLoad) {
|
|
|
61
61
|
source: hit.code,
|
|
62
62
|
shortCircuit: true
|
|
63
63
|
};
|
|
64
|
+
const loader = absolutePath.endsWith(".tsx") ? "tsx" : "ts";
|
|
64
65
|
const result = transformSync(source, {
|
|
65
|
-
loader
|
|
66
|
+
loader,
|
|
66
67
|
format: "esm",
|
|
67
68
|
target: transpile.target,
|
|
68
69
|
sourcefile: absolutePath,
|