@warlock.js/core 5.30.0 → 5.31.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 +142 -36
- package/README.md +28 -23
- package/bin/source-load-hook.mjs +63 -0
- package/bin/warlock.js +102 -42
- package/esm/cli/commands/add.command.mjs +4 -2
- package/esm/cli/commands/add.command.mjs.map +1 -1
- package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
- package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
- package/esm/cli/commands/agents-md.command.mjs +38 -0
- package/esm/cli/commands/agents-md.command.mjs.map +1 -0
- package/esm/cli/commands/board/board-command.action.mjs +279 -0
- package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
- package/esm/cli/commands/board.command.mjs +78 -0
- package/esm/cli/commands/board.command.mjs.map +1 -0
- package/esm/cli/commands/build.command.mjs +6 -1
- package/esm/cli/commands/build.command.mjs.map +1 -1
- package/esm/cli/commands/check/check-command.action.mjs +57 -0
- package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
- package/esm/cli/commands/check/child-typecheck.mjs +66 -0
- package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
- package/esm/cli/commands/check/format-problems.mjs +43 -0
- package/esm/cli/commands/check/format-problems.mjs.map +1 -0
- package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
- package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
- package/esm/cli/commands/check.command.mjs +50 -0
- package/esm/cli/commands/check.command.mjs.map +1 -0
- package/esm/cli/commands/dev-server.command.mjs +9 -1
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
- package/esm/cli/commands/doctor/check.types.d.mts +76 -0
- package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
- package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
- package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
- package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/doctor-command.action.mjs +14 -6
- package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
- package/esm/cli/commands/doctor/format-report.mjs +30 -2
- package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
- package/esm/cli/commands/doctor.command.mjs +4 -0
- package/esm/cli/commands/doctor.command.mjs.map +1 -1
- package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
- package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
- package/esm/cli/commands/explain.command.mjs +23 -0
- package/esm/cli/commands/explain.command.mjs.map +1 -0
- package/esm/cli/commands/generate/generate.command.mjs +124 -124
- package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
- package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
- package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
- package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
- package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
- package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
- package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
- package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
- package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/writer.mjs +38 -13
- package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
- package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
- package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
- package/esm/cli/commands/inspect.command.mjs +39 -0
- package/esm/cli/commands/inspect.command.mjs.map +1 -0
- package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
- package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
- package/esm/cli/commands/mcp.command.mjs +76 -0
- package/esm/cli/commands/mcp.command.mjs.map +1 -0
- package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
- package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
- package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
- package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
- package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
- package/esm/cli/commands/test.command.mjs +131 -0
- package/esm/cli/commands/test.command.mjs.map +1 -0
- package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
- package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
- package/esm/cli/commands/trace.command.mjs +60 -0
- package/esm/cli/commands/trace.command.mjs.map +1 -0
- package/esm/cli/commands/typecheck.command.mjs +40 -0
- package/esm/cli/commands/typecheck.command.mjs.map +1 -0
- package/esm/cli/commands/upgrade.command.mjs +46 -0
- package/esm/cli/commands/upgrade.command.mjs.map +1 -0
- package/esm/cli/flush-and-exit.mjs +34 -0
- package/esm/cli/flush-and-exit.mjs.map +1 -0
- package/esm/cli/framework-cli-commands.mjs +23 -1
- package/esm/cli/framework-cli-commands.mjs.map +1 -1
- package/esm/cli/parse-cli-args.mjs +1 -0
- package/esm/cli/parse-cli-args.mjs.map +1 -1
- package/esm/config/config-loader.d.mts.map +1 -1
- package/esm/config/config-loader.mjs +34 -13
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/config/config-schema.d.mts +67 -0
- package/esm/config/config-schema.d.mts.map +1 -0
- package/esm/config/config-schema.mjs +77 -0
- package/esm/config/config-schema.mjs.map +1 -0
- package/esm/config/index.d.mts +6 -0
- package/esm/config/index.mjs +1 -0
- package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
- package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-unique-connector-names.mjs +26 -2
- package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
- package/esm/connectors/http-connector.d.mts.map +1 -1
- package/esm/connectors/http-connector.mjs +3 -2
- package/esm/connectors/http-connector.mjs.map +1 -1
- package/esm/connectors/single-server-warnings.mjs.map +1 -1
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/container/index.d.mts.map +1 -1
- package/esm/container/index.mjs.map +1 -1
- package/esm/database/migrate-action.mjs.map +1 -1
- package/esm/database/models/database-log/database-log.d.mts +0 -28
- package/esm/database/models/database-log/database-log.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.d.mts +4 -0
- package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.mjs +2 -0
- package/esm/database/seeds/seeder.errors.mjs.map +1 -1
- package/esm/dev-server/boot-precondition-error.mjs +1 -0
- package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
- package/esm/dev-server/create-worker.mjs +15 -9
- package/esm/dev-server/create-worker.mjs.map +1 -1
- package/esm/dev-server/dev-agent-tooling.mjs +135 -0
- package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
- package/esm/dev-server/dev-logger.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +8 -0
- package/esm/dev-server/development-server.mjs.map +1 -1
- package/esm/dev-server/files-orchestrator.mjs +4 -5
- package/esm/dev-server/files-orchestrator.mjs.map +1 -1
- package/esm/dev-server/files-watcher.mjs +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
- package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
- package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
- package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +9 -3
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs +15 -4
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
- package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
- package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
- package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
- package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
- package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
- package/esm/dev-server/loader/register-loader.mjs +1 -1
- package/esm/dev-server/loader/register-loader.mjs.map +1 -1
- package/esm/dev-server/loader/resolve-hook.mjs +1 -1
- package/esm/dev-server/loader/transpile-cache.mjs +1 -1
- package/esm/dev-server/model-resource-typings.mjs.map +1 -1
- package/esm/dev-server/module-loader.mjs +1 -0
- package/esm/dev-server/module-loader.mjs.map +1 -1
- package/esm/dev-server/parse-imports.mjs +1 -1
- package/esm/dev-server/parse-imports.mjs.map +1 -1
- package/esm/dev-server/route-types-publisher.mjs +1 -1
- package/esm/dev-server/start-development-server.mjs.map +1 -1
- package/esm/dev-server/translation-keys-sources.mjs +1 -1
- package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
- package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
- package/esm/dev-server/type-generator.mjs +3 -3
- package/esm/dev-server/type-generator.mjs.map +1 -1
- package/esm/dev-server/types.d.mts.map +1 -1
- package/esm/errors/container-key-missing-error.mjs +1 -0
- package/esm/errors/container-key-missing-error.mjs.map +1 -1
- package/esm/errors/error-codes.d.mts +653 -0
- package/esm/errors/error-codes.d.mts.map +1 -0
- package/esm/errors/error-codes.mjs +634 -0
- package/esm/errors/error-codes.mjs.map +1 -0
- package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
- package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
- package/esm/errors/index.d.mts +3 -1
- package/esm/errors/index.mjs +3 -1
- package/esm/errors/unknown-locale-error.mjs +1 -0
- package/esm/errors/unknown-locale-error.mjs.map +1 -1
- package/esm/errors/warlock-error.d.mts +23 -0
- package/esm/errors/warlock-error.d.mts.map +1 -0
- package/esm/errors/warlock-error.mjs +22 -0
- package/esm/errors/warlock-error.mjs.map +1 -0
- package/esm/generations/add-command.action.mjs +19 -3
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/features/access.feature.mjs +1 -1
- package/esm/generations/features/access.feature.mjs.map +1 -1
- package/esm/generations/features/bull-board.feature.mjs +1 -1
- package/esm/generations/features/bull-board.feature.mjs.map +1 -1
- package/esm/generations/features/mysql.feature.mjs.map +1 -1
- package/esm/generations/features/notifications.feature.mjs +5 -2
- package/esm/generations/features/notifications.feature.mjs.map +1 -1
- package/esm/generations/features/queue.feature.mjs +1 -1
- package/esm/generations/features/queue.feature.mjs.map +1 -1
- package/esm/generations/features/react-email.feature.mjs +1 -1
- package/esm/generations/features/react-email.feature.mjs.map +1 -1
- package/esm/generations/features/shadcn.feature.mjs +1 -1
- package/esm/generations/features/shadcn.feature.mjs.map +1 -1
- package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
- package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
- package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
- package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
- package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
- package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
- package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
- package/esm/generations/features/sitemap.feature.mjs +1 -1
- package/esm/generations/features/sitemap.feature.mjs.map +1 -1
- package/esm/generations/features/tailwind.feature.mjs +1 -1
- package/esm/generations/features/tailwind.feature.mjs.map +1 -1
- package/esm/generations/features/test.feature.mjs +11 -6
- package/esm/generations/features/test.feature.mjs.map +1 -1
- package/esm/generations/features/web.feature.mjs +1 -1
- package/esm/generations/features/web.feature.mjs.map +1 -1
- package/esm/generations/generation-fs.mjs +73 -0
- package/esm/generations/generation-fs.mjs.map +1 -0
- package/esm/generations/generation-run.mjs +185 -0
- package/esm/generations/generation-run.mjs.map +1 -0
- package/esm/generations/stubs.mjs +155 -13
- package/esm/generations/stubs.mjs.map +1 -1
- package/esm/http/bounded-stream-queue.d.mts +10 -0
- package/esm/http/bounded-stream-queue.d.mts.map +1 -0
- package/esm/http/bounded-stream-queue.mjs +97 -0
- package/esm/http/bounded-stream-queue.mjs.map +1 -0
- package/esm/http/build-rate-limit-options.d.mts +13 -0
- package/esm/http/build-rate-limit-options.d.mts.map +1 -1
- package/esm/http/build-rate-limit-options.mjs.map +1 -1
- package/esm/http/conditional-request.d.mts +86 -0
- package/esm/http/conditional-request.d.mts.map +1 -0
- package/esm/http/conditional-request.mjs +121 -0
- package/esm/http/conditional-request.mjs.map +1 -0
- package/esm/http/csp.d.mts +2 -0
- package/esm/http/csp.d.mts.map +1 -1
- package/esm/http/csp.mjs +1 -0
- package/esm/http/csp.mjs.map +1 -1
- package/esm/http/csrf-origin-policy.mjs.map +1 -1
- package/esm/http/database/RequestLog.d.mts +24 -84
- package/esm/http/database/RequestLog.d.mts.map +1 -1
- package/esm/http/errors/errors.d.mts +2 -0
- package/esm/http/errors/errors.d.mts.map +1 -1
- package/esm/http/errors/errors.mjs +1 -0
- package/esm/http/errors/errors.mjs.map +1 -1
- package/esm/http/escape-header-value.d.mts +18 -0
- package/esm/http/escape-header-value.d.mts.map +1 -0
- package/esm/http/escape-header-value.mjs +27 -0
- package/esm/http/escape-header-value.mjs.map +1 -0
- package/esm/http/flush-pending-cookies.mjs.map +1 -1
- package/esm/http/index.d.mts +5 -2
- package/esm/http/index.mjs +4 -1
- package/esm/http/lazy-static.mjs +194 -0
- package/esm/http/lazy-static.mjs.map +1 -0
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/plugins.d.mts.map +1 -1
- package/esm/http/plugins.mjs +7 -4
- package/esm/http/plugins.mjs.map +1 -1
- package/esm/http/rate-limit-cache-store.mjs +2 -1
- package/esm/http/rate-limit-cache-store.mjs.map +1 -1
- package/esm/http/request-log-snapshot.d.mts +12 -5
- package/esm/http/request-log-snapshot.d.mts.map +1 -1
- package/esm/http/request-log-snapshot.mjs +83 -4
- package/esm/http/request-log-snapshot.mjs.map +1 -1
- package/esm/http/request.d.mts +2 -2
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +5 -4
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +11 -1
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +164 -76
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/safe-redirect.d.mts +51 -0
- package/esm/http/safe-redirect.d.mts.map +1 -0
- package/esm/http/safe-redirect.mjs +80 -0
- package/esm/http/safe-redirect.mjs.map +1 -0
- package/esm/http/serialized.d.mts.map +1 -1
- package/esm/http/server.d.mts +3 -1
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +14 -4
- package/esm/http/server.mjs.map +1 -1
- package/esm/http/stream-transport.mjs +4 -2
- package/esm/http/stream-transport.mjs.map +1 -1
- package/esm/http/types.d.mts +44 -11
- package/esm/http/types.d.mts.map +1 -1
- package/esm/http/uploads/generate-image-variant.mjs +1 -1
- package/esm/http/uploads/generate-image-variants.d.mts +10 -7
- package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/generate-image-variants.mjs +61 -24
- package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
- package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
- package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
- package/esm/http/uploads/image-variant-cache.mjs +72 -30
- package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
- package/esm/http/uploads/image-variant-types.d.mts +2 -0
- package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
- package/esm/http/uploads/image-variants-config-error.d.mts +3 -1
- package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
- package/esm/http/uploads/image-variants-config-error.mjs +3 -2
- package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
- package/esm/http/uploads/load-variant-source.mjs +1 -1
- package/esm/http/uploads/load-variant-source.mjs.map +1 -1
- package/esm/http/uploads/purge-image-variants.d.mts +7 -2
- package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
- package/esm/http/uploads/purge-image-variants.mjs +16 -16
- package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
- package/esm/http/uploads/remote-variant-source.mjs +115 -0
- package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
- package/esm/http/uploads/resolve-image-variant.d.mts +3 -4
- package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
- package/esm/http/uploads/resolve-image-variant.mjs +10 -18
- package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
- package/esm/http/uploads/resolve-image-variants-config.mjs +5 -3
- package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
- package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
- package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
- package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
- package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
- package/esm/http/uploads/uploaded-file.controller.d.mts +5 -3
- package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
- package/esm/http/uploads/uploaded-file.controller.mjs +16 -8
- 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-types.d.mts +6 -2
- package/esm/http/uploads-types.d.mts.map +1 -1
- package/esm/index.d.mts +17 -6
- package/esm/index.mjs +14 -3
- package/esm/localization/parse-locale-dictionary.d.mts +2 -0
- package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
- package/esm/localization/parse-locale-dictionary.mjs +1 -0
- package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
- package/esm/mail/config.d.mts +12 -1
- package/esm/mail/config.d.mts.map +1 -1
- package/esm/mail/config.mjs +16 -1
- package/esm/mail/config.mjs.map +1 -1
- package/esm/mail/index.d.mts +1 -1
- package/esm/mail/index.mjs +1 -1
- package/esm/net/index.d.mts +2 -0
- package/esm/net/index.mjs +3 -0
- package/esm/openapi/build-openapi-document.d.mts.map +1 -1
- package/esm/openapi/build-openapi-document.mjs +8 -5
- package/esm/openapi/build-openapi-document.mjs.map +1 -1
- package/esm/openapi/error-responses.mjs +28 -2
- package/esm/openapi/error-responses.mjs.map +1 -1
- package/esm/openapi/postman/build-request-body.mjs.map +1 -1
- package/esm/openapi/postman/build-request-url.mjs.map +1 -1
- package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
- package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
- package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
- package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
- package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
- package/esm/openapi/postman/schema-refs.mjs.map +1 -1
- package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
- package/esm/openapi/request-schemas.mjs.map +1 -1
- package/esm/openapi/response-schemas.mjs.map +1 -1
- package/esm/openapi/schema-registry.d.mts +1 -0
- package/esm/openapi/schema-registry.mjs.map +1 -1
- package/esm/openapi/security.mjs.map +1 -1
- package/esm/openapi/types.d.mts +3 -2
- package/esm/openapi/types.d.mts.map +1 -1
- package/esm/production/assert-generated-imports.mjs +1 -0
- package/esm/production/assert-generated-imports.mjs.map +1 -1
- package/esm/production/production-builder.mjs +12 -4
- package/esm/production/production-builder.mjs.map +1 -1
- package/esm/production/resolve-build-config.mjs +1 -0
- package/esm/production/resolve-build-config.mjs.map +1 -1
- package/esm/production/route-registration-child.mjs.map +1 -1
- package/esm/production/route-registration-snapshot.mjs.map +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/repositories/contracts/types.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/resource/resource.d.mts.map +1 -1
- package/esm/resource/resource.mjs.map +1 -1
- package/esm/resource/types.d.mts.map +1 -1
- package/esm/restful/restful.d.mts +5 -5
- package/esm/restful/restful.d.mts.map +1 -1
- package/esm/restful/restful.mjs.map +1 -1
- package/esm/router/build-route-rate-limit.mjs.map +1 -1
- package/esm/router/dev-dispatch.mjs +31 -12
- package/esm/router/dev-dispatch.mjs.map +1 -1
- package/esm/router/index.d.mts +4 -2
- package/esm/router/index.mjs +2 -0
- package/esm/router/log-request-lifecycle.mjs.map +1 -1
- package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
- package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
- package/esm/router/resolve-route-rate-limit.mjs +47 -0
- package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
- package/esm/router/resolve-route-validation.mjs +19 -0
- package/esm/router/resolve-route-validation.mjs.map +1 -0
- package/esm/router/route-guard-names.mjs +30 -0
- package/esm/router/route-guard-names.mjs.map +1 -0
- package/esm/router/route-name-taken-error.d.mts +14 -0
- package/esm/router/route-name-taken-error.d.mts.map +1 -0
- package/esm/router/route-name-taken-error.mjs +18 -0
- package/esm/router/route-name-taken-error.mjs.map +1 -0
- package/esm/router/router.d.mts +32 -13
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +71 -38
- package/esm/router/router.mjs.map +1 -1
- package/esm/router/types.d.mts +137 -17
- package/esm/router/types.d.mts.map +1 -1
- package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
- package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
- package/esm/router/unguarded-route-diagnostics.mjs +95 -0
- package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/local-disk-roots.mjs +24 -0
- package/esm/storage/local-disk-roots.mjs.map +1 -0
- package/esm/storage/storage.d.mts +14 -0
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +22 -0
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/storage-not-initialized-error.d.mts +2 -0
- package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
- package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
- package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
- package/esm/tests/authenticated-test-client.d.mts +32 -0
- package/esm/tests/authenticated-test-client.d.mts.map +1 -0
- package/esm/tests/authenticated-test-client.mjs +40 -0
- package/esm/tests/authenticated-test-client.mjs.map +1 -0
- package/esm/tests/factories.d.mts +59 -0
- package/esm/tests/factories.d.mts.map +1 -0
- package/esm/tests/factories.mjs +105 -0
- package/esm/tests/factories.mjs.map +1 -0
- package/esm/tests/fakes/cache-fake.d.mts +29 -0
- package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
- package/esm/tests/fakes/cache-fake.mjs +79 -0
- package/esm/tests/fakes/cache-fake.mjs.map +1 -0
- package/esm/tests/fakes/clock-fake.d.mts +32 -0
- package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
- package/esm/tests/fakes/clock-fake.mjs +69 -0
- package/esm/tests/fakes/clock-fake.mjs.map +1 -0
- package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
- package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
- package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
- package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
- package/esm/tests/fakes/ids-fake.d.mts +22 -0
- package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
- package/esm/tests/fakes/ids-fake.mjs +57 -0
- package/esm/tests/fakes/ids-fake.mjs.map +1 -0
- package/esm/tests/fakes/index.d.mts +8 -0
- package/esm/tests/fakes/index.mjs +10 -0
- package/esm/tests/fakes/mail-fake.d.mts +41 -0
- package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
- package/esm/tests/fakes/mail-fake.mjs +111 -0
- package/esm/tests/fakes/mail-fake.mjs.map +1 -0
- package/esm/tests/fakes/queue-fake.d.mts +48 -0
- package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
- package/esm/tests/fakes/queue-fake.mjs +134 -0
- package/esm/tests/fakes/queue-fake.mjs.map +1 -0
- package/esm/tests/fakes/storage-fake.d.mts +31 -0
- package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
- package/esm/tests/fakes/storage-fake.mjs +122 -0
- package/esm/tests/fakes/storage-fake.mjs.map +1 -0
- package/esm/tests/fakes/test-fakes.d.mts +39 -0
- package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
- package/esm/tests/fakes/test-fakes.mjs +90 -0
- package/esm/tests/fakes/test-fakes.mjs.map +1 -0
- package/esm/tests/index.d.mts +14 -2
- package/esm/tests/index.mjs +15 -2
- package/esm/tests/snapshot-response.d.mts +34 -0
- package/esm/tests/snapshot-response.d.mts.map +1 -0
- package/esm/tests/snapshot-response.mjs +42 -0
- package/esm/tests/snapshot-response.mjs.map +1 -0
- package/esm/tests/start-http-development-server.d.mts +22 -0
- package/esm/tests/start-http-development-server.d.mts.map +1 -1
- package/esm/tests/start-http-development-server.mjs +36 -3
- package/esm/tests/start-http-development-server.mjs.map +1 -1
- package/esm/tests/test-helpers.d.mts +20 -1
- package/esm/tests/test-helpers.d.mts.map +1 -1
- package/esm/tests/test-helpers.mjs +40 -27
- package/esm/tests/test-helpers.mjs.map +1 -1
- package/esm/tests/test-http-server.d.mts +62 -0
- package/esm/tests/test-http-server.d.mts.map +1 -0
- package/esm/tests/test-http-server.mjs +119 -0
- package/esm/tests/test-http-server.mjs.map +1 -0
- package/esm/tests/vitest-setup.d.mts +11 -0
- package/esm/tests/vitest-setup.d.mts.map +1 -1
- package/esm/tests/vitest-setup.mjs +12 -4
- package/esm/tests/vitest-setup.mjs.map +1 -1
- package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
- package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
- package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
- package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
- package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
- package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
- package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
- package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
- package/esm/tooling/agents-md/index.mjs +7 -0
- package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
- package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
- package/esm/tooling/agents-md/installed-skills.mjs +74 -0
- package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
- package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
- package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
- package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
- package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
- package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
- package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
- package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
- package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
- package/esm/tooling/board/board-message.d.mts +31 -0
- package/esm/tooling/board/board-message.d.mts.map +1 -0
- package/esm/tooling/board/board-message.mjs +86 -0
- package/esm/tooling/board/board-message.mjs.map +1 -0
- package/esm/tooling/board/board.d.mts +109 -0
- package/esm/tooling/board/board.d.mts.map +1 -0
- package/esm/tooling/board/board.mjs +406 -0
- package/esm/tooling/board/board.mjs.map +1 -0
- package/esm/tooling/board/board.types.d.mts +72 -0
- package/esm/tooling/board/board.types.d.mts.map +1 -0
- package/esm/tooling/board/board.types.mjs +54 -0
- package/esm/tooling/board/board.types.mjs.map +1 -0
- package/esm/tooling/check/changed-files.d.mts +33 -0
- package/esm/tooling/check/changed-files.d.mts.map +1 -0
- package/esm/tooling/check/changed-files.mjs +73 -0
- package/esm/tooling/check/changed-files.mjs.map +1 -0
- package/esm/tooling/check/check-report.types.d.mts +62 -0
- package/esm/tooling/check/check-report.types.d.mts.map +1 -0
- package/esm/tooling/check/check-report.types.mjs +37 -0
- package/esm/tooling/check/check-report.types.mjs.map +1 -0
- package/esm/tooling/check/code-style-conventions.mjs +106 -0
- package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
- package/esm/tooling/check/conventions-step.d.mts +34 -0
- package/esm/tooling/check/conventions-step.d.mts.map +1 -0
- package/esm/tooling/check/conventions-step.mjs +184 -0
- package/esm/tooling/check/conventions-step.mjs.map +1 -0
- package/esm/tooling/check/environment-step.d.mts +18 -0
- package/esm/tooling/check/environment-step.d.mts.map +1 -0
- package/esm/tooling/check/environment-step.mjs +78 -0
- package/esm/tooling/check/environment-step.mjs.map +1 -0
- package/esm/tooling/check/index.d.mts +8 -0
- package/esm/tooling/check/index.mjs +10 -0
- package/esm/tooling/check/lint-step.d.mts +19 -0
- package/esm/tooling/check/lint-step.d.mts.map +1 -0
- package/esm/tooling/check/lint-step.mjs +111 -0
- package/esm/tooling/check/lint-step.mjs.map +1 -0
- package/esm/tooling/check/request-input.mjs +132 -0
- package/esm/tooling/check/request-input.mjs.map +1 -0
- package/esm/tooling/check/run-check.d.mts +35 -0
- package/esm/tooling/check/run-check.d.mts.map +1 -0
- package/esm/tooling/check/run-check.mjs +192 -0
- package/esm/tooling/check/run-check.mjs.map +1 -0
- package/esm/tooling/check/run-tests.d.mts +48 -0
- package/esm/tooling/check/run-tests.d.mts.map +1 -0
- package/esm/tooling/check/run-tests.mjs +93 -0
- package/esm/tooling/check/run-tests.mjs.map +1 -0
- package/esm/tooling/check/security-conventions.mjs +648 -0
- package/esm/tooling/check/security-conventions.mjs.map +1 -0
- package/esm/tooling/check/source-ast.mjs +195 -0
- package/esm/tooling/check/source-ast.mjs.map +1 -0
- package/esm/tooling/check/source-files.mjs +27 -0
- package/esm/tooling/check/source-files.mjs.map +1 -0
- package/esm/tooling/check/tests-step.d.mts +34 -0
- package/esm/tooling/check/tests-step.d.mts.map +1 -0
- package/esm/tooling/check/tests-step.mjs +177 -0
- package/esm/tooling/check/tests-step.mjs.map +1 -0
- package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
- package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
- package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
- package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
- package/esm/tooling/devtools/devtools-client.d.mts +91 -0
- package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
- package/esm/tooling/devtools/devtools-client.mjs +155 -0
- package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
- package/esm/tooling/generate/generation.d.mts +78 -0
- package/esm/tooling/generate/generation.d.mts.map +1 -0
- package/esm/tooling/generate/generation.mjs +123 -0
- package/esm/tooling/generate/generation.mjs.map +1 -0
- package/esm/tooling/generate/generator-spec.d.mts +57 -0
- package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
- package/esm/tooling/generate/generator-spec.mjs +102 -0
- package/esm/tooling/generate/generator-spec.mjs.map +1 -0
- package/esm/tooling/generate/index.mjs +6 -0
- package/esm/tooling/generate/project-files.mjs +121 -0
- package/esm/tooling/generate/project-files.mjs.map +1 -0
- package/esm/tooling/generate/run-cli.d.mts +40 -0
- package/esm/tooling/generate/run-cli.d.mts.map +1 -0
- package/esm/tooling/generate/run-cli.mjs +93 -0
- package/esm/tooling/generate/run-cli.mjs.map +1 -0
- package/esm/tooling/generate/unified-diff.d.mts +37 -0
- package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
- package/esm/tooling/generate/unified-diff.mjs +161 -0
- package/esm/tooling/generate/unified-diff.mjs.map +1 -0
- package/esm/tooling/index.d.mts +41 -0
- package/esm/tooling/index.mjs +45 -0
- package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
- package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
- package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
- package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
- package/esm/tooling/inspect/collect-config.mjs +77 -0
- package/esm/tooling/inspect/collect-config.mjs.map +1 -0
- package/esm/tooling/inspect/collect-models.d.mts +9 -0
- package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
- package/esm/tooling/inspect/collect-models.mjs +154 -0
- package/esm/tooling/inspect/collect-models.mjs.map +1 -0
- package/esm/tooling/inspect/collect-packages.d.mts +10 -0
- package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
- package/esm/tooling/inspect/collect-packages.mjs +157 -0
- package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
- package/esm/tooling/inspect/collect-pages.mjs +108 -0
- package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
- package/esm/tooling/inspect/collect-routes.mjs +168 -0
- package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
- package/esm/tooling/inspect/event-recorder.d.mts +37 -0
- package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
- package/esm/tooling/inspect/event-recorder.mjs +91 -0
- package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
- package/esm/tooling/inspect/index.d.mts +7 -0
- package/esm/tooling/inspect/index.mjs +7 -0
- package/esm/tooling/inspect/inspect-app.d.mts +53 -0
- package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-app.mjs +92 -0
- package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
- package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
- package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
- package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
- package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
- package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
- package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
- package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
- package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
- package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
- package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
- package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
- package/esm/tooling/mcp/db-schema.d.mts +49 -0
- package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
- package/esm/tooling/mcp/db-schema.mjs +56 -0
- package/esm/tooling/mcp/db-schema.mjs.map +1 -0
- package/esm/tooling/mcp/docs-search.d.mts +72 -0
- package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
- package/esm/tooling/mcp/docs-search.mjs +178 -0
- package/esm/tooling/mcp/docs-search.mjs.map +1 -0
- package/esm/tooling/mcp/index.mjs +9 -0
- package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
- package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
- package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
- package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
- package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
- package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
- package/esm/tooling/mcp/mcp-tools.mjs +513 -0
- package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
- package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
- package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
- package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
- package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
- package/esm/tooling/mcp/tool-input.d.mts +75 -0
- package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
- package/esm/tooling/mcp/tool-input.mjs +72 -0
- package/esm/tooling/mcp/tool-input.mjs.map +1 -0
- package/esm/tooling/problem.d.mts +45 -0
- package/esm/tooling/problem.d.mts.map +1 -0
- package/esm/tooling/problem.mjs +28 -0
- package/esm/tooling/problem.mjs.map +1 -0
- package/esm/tooling/trace/trace-report.types.d.mts +71 -0
- package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
- package/esm/tooling/trace/trace-report.types.mjs +7 -0
- package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
- package/esm/tooling/trace/trace-request.d.mts +83 -0
- package/esm/tooling/trace/trace-request.d.mts.map +1 -0
- package/esm/tooling/trace/trace-request.mjs +241 -0
- package/esm/tooling/trace/trace-request.mjs.map +1 -0
- package/esm/tooling/typecheck/index.d.mts +1 -0
- package/esm/tooling/typecheck/index.mjs +3 -0
- package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
- package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
- package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
- package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
- package/esm/upgrade/codemods/head-viewport.mjs +46 -0
- package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
- package/esm/upgrade/codemods/helpers.mjs +81 -0
- package/esm/upgrade/codemods/helpers.mjs.map +1 -0
- package/esm/upgrade/codemods/index.mjs +34 -0
- package/esm/upgrade/codemods/index.mjs.map +1 -0
- package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
- package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
- package/esm/upgrade/codemods/package-json.mjs +122 -0
- package/esm/upgrade/codemods/package-json.mjs.map +1 -0
- package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
- package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
- package/esm/upgrade/codemods/review-sites.mjs +262 -0
- package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
- package/esm/upgrade/diff.mjs +119 -0
- package/esm/upgrade/diff.mjs.map +1 -0
- package/esm/upgrade/format-upgrade-report.mjs +32 -0
- package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
- package/esm/upgrade/load-ts-morph.mjs +48 -0
- package/esm/upgrade/load-ts-morph.mjs.map +1 -0
- package/esm/upgrade/notes.mjs +16 -0
- package/esm/upgrade/notes.mjs.map +1 -0
- package/esm/upgrade/run-upgrade.mjs +246 -0
- package/esm/upgrade/run-upgrade.mjs.map +1 -0
- package/esm/upgrade/upgrade-command.action.mjs +37 -0
- package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
- package/esm/upgrade/version.mjs +39 -0
- package/esm/upgrade/version.mjs.map +1 -0
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/clock.d.mts +33 -0
- package/esm/utils/clock.d.mts.map +1 -0
- package/esm/utils/clock.mjs +27 -0
- package/esm/utils/clock.mjs.map +1 -0
- package/esm/utils/framework-vesion.mjs +1 -1
- package/esm/utils/framework-vesion.mjs.map +1 -1
- package/esm/utils/ids.d.mts +32 -0
- package/esm/utils/ids.d.mts.map +1 -0
- package/esm/utils/ids.mjs +33 -0
- package/esm/utils/ids.mjs.map +1 -0
- package/esm/utils/index.d.mts +3 -0
- package/esm/utils/index.mjs +3 -0
- package/esm/utils/runtime.d.mts +59 -0
- package/esm/utils/runtime.d.mts.map +1 -0
- package/esm/utils/runtime.mjs +85 -0
- package/esm/utils/runtime.mjs.map +1 -0
- package/esm/validation/index.d.mts +1 -1
- package/esm/validation/types.d.mts +57 -2
- package/esm/validation/types.d.mts.map +1 -1
- package/esm/validation/validateAll.mjs +19 -2
- package/esm/validation/validateAll.mjs.map +1 -1
- package/esm/validation/validation-failure-status.mjs +15 -0
- package/esm/validation/validation-failure-status.mjs.map +1 -0
- package/esm/validation/validators/file-validator.d.mts +0 -16
- package/esm/validation/validators/file-validator.d.mts.map +1 -1
- package/esm/warlock-config/bundle-config.mjs +1 -1
- package/esm/warlock-config/types.d.mts +27 -3
- package/esm/warlock-config/types.d.mts.map +1 -1
- package/llms-full.txt +3166 -736
- package/llms.txt +16 -6
- package/package.json +43 -13
- package/schemas/inspect-report.schema.json +554 -0
- package/skills/README.md +9 -0
- package/skills/add-connector/SKILL.md +26 -38
- package/skills/benchmark-code/SKILL.md +30 -24
- package/skills/build-restful/SKILL.md +14 -14
- package/skills/build-url/SKILL.md +18 -18
- package/skills/configure-app/SKILL.md +107 -14
- package/skills/create-controller/SKILL.md +25 -12
- package/skills/create-module/SKILL.md +3 -3
- package/skills/define-resource/SKILL.md +32 -29
- package/skills/encrypt-data/SKILL.md +21 -19
- package/skills/generate-openapi/SKILL.md +50 -24
- package/skills/hash-password/SKILL.md +2 -2
- package/skills/health-checks/SKILL.md +24 -7
- package/skills/index.md +9 -4
- package/skills/lower-stage3-decorators/SKILL.md +4 -4
- package/skills/make-endpoint/SKILL.md +110 -0
- package/skills/model-factories/SKILL.md +92 -0
- package/skills/process-image/SKILL.md +32 -30
- package/skills/register-route/SKILL.md +109 -10
- package/skills/request-memo/SKILL.md +1 -1
- package/skills/request-tracing/SKILL.md +4 -1
- package/skills/resolve-path/SKILL.md +45 -44
- package/skills/retry-operation/SKILL.md +20 -11
- package/skills/run-app/SKILL.md +106 -22
- package/skills/send-response/SKILL.md +179 -14
- package/skills/store-file/SKILL.md +93 -53
- package/skills/test-fakes/SKILL.md +123 -0
- package/skills/test-http/SKILL.md +125 -21
- package/skills/test-service/SKILL.md +41 -1
- package/skills/update-packages/SKILL.md +29 -18
- package/skills/upgrade-from-5-29/SKILL.md +413 -0
- package/skills/upload-file/SKILL.md +31 -33
- package/skills/use-app-context/SKILL.md +38 -31
- package/skills/use-middleware/SKILL.md +45 -25
- package/skills/use-model-transformers/SKILL.md +37 -28
- package/skills/use-repository/SKILL.md +2 -2
- package/skills/validate-input/SKILL.md +72 -28
- package/skills/warlock-agents-md/SKILL.md +96 -0
- package/skills/warlock-board/SKILL.md +123 -0
- package/skills/warlock-check/SKILL.md +132 -0
- package/skills/warlock-conventions/SKILL.md +115 -0
- package/skills/warlock-doctor/SKILL.md +55 -22
- package/skills/warlock-inspect/SKILL.md +134 -0
- package/skills/warlock-mcp/SKILL.md +120 -0
- package/skills/warlock-routes/SKILL.md +18 -11
- package/skills/warlock-trace/SKILL.md +81 -0
- package/skills/wire-socket/SKILL.md +8 -8
- package/skills/write-seeder/SKILL.md +46 -32
- package/skills/write-use-case/SKILL.md +40 -27
- package/esm/http/uploads/matches-if-none-match.mjs +0 -13
- package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
|
@@ -10,11 +10,7 @@ A **connector** is a long-lived subsystem owned by the framework: database, HTTP
|
|
|
10
10
|
## The shape
|
|
11
11
|
|
|
12
12
|
```ts title="src/connectors/queue-connector.ts"
|
|
13
|
-
import {
|
|
14
|
-
BaseConnector,
|
|
15
|
-
ConnectorLifecyclePhase,
|
|
16
|
-
type ConnectorName,
|
|
17
|
-
} from "@warlock.js/core";
|
|
13
|
+
import { BaseConnector, ConnectorLifecyclePhase, type ConnectorName } from "@warlock.js/core";
|
|
18
14
|
|
|
19
15
|
export class QueueConnector extends BaseConnector {
|
|
20
16
|
public readonly name: ConnectorName = "queue";
|
|
@@ -40,14 +36,14 @@ That's the connector class. The file's home is `src/connectors/<name>.ts` by con
|
|
|
40
36
|
|
|
41
37
|
## `BaseConnector` — required surface
|
|
42
38
|
|
|
43
|
-
| Member
|
|
44
|
-
|
|
|
45
|
-
| `name`
|
|
46
|
-
| `priority`
|
|
47
|
-
| `lifecyclePhase
|
|
48
|
-
| `watchedFiles`
|
|
49
|
-
| `start()`
|
|
50
|
-
| `shutdown()`
|
|
39
|
+
| Member | Type | Notes |
|
|
40
|
+
| ---------------- | ------------------------- | ------------------------------------------------------------------------------------ |
|
|
41
|
+
| `name` | `ConnectorName` | Unique. Used in preload lists (`preload.connectors: ["queue"]`). |
|
|
42
|
+
| `priority` | `number` | Lower starts first. See built-in `ConnectorPriority` enum for the existing ordering. |
|
|
43
|
+
| `lifecyclePhase` | `ConnectorLifecyclePhase` | `Early` (default) or `Late`. See phase semantics below. |
|
|
44
|
+
| `watchedFiles` | `string[]` (protected) | Relative paths; touching any triggers a restart in dev. |
|
|
45
|
+
| `start()` | `() => Promise<void>` | The work that brings the subsystem online. Set `this.active = true` on success. |
|
|
46
|
+
| `shutdown()` | `() => Promise<void>` | Inverse — close connections, drain queues. Set `this.active = false`. |
|
|
51
47
|
|
|
52
48
|
Optional overrides:
|
|
53
49
|
|
|
@@ -61,19 +57,19 @@ Optional overrides:
|
|
|
61
57
|
|
|
62
58
|
Lower number = earlier. The built-in ordering, from `ConnectorPriority` in `@warlock.js/core/src/connectors/types.ts`:
|
|
63
59
|
|
|
64
|
-
| Connector
|
|
65
|
-
|
|
|
66
|
-
| `logger`
|
|
67
|
-
| `mailer`
|
|
68
|
-
| `database`
|
|
69
|
-
| `communicator
|
|
70
|
-
| `cache`
|
|
71
|
-
| `http`
|
|
72
|
-
| `storage`
|
|
73
|
-
| `socket`
|
|
74
|
-
| `notifications
|
|
75
|
-
| `access`
|
|
76
|
-
| `ai`
|
|
60
|
+
| Connector | Priority | Phase |
|
|
61
|
+
| --------------- | -------- | -------- |
|
|
62
|
+
| `logger` | 0 | Early |
|
|
63
|
+
| `mailer` | 1 | Early |
|
|
64
|
+
| `database` | 2 | Early |
|
|
65
|
+
| `communicator` | 3 | Early |
|
|
66
|
+
| `cache` | 4 | Early |
|
|
67
|
+
| `http` | 5 | **Late** |
|
|
68
|
+
| `storage` | 6 | Early |
|
|
69
|
+
| `socket` | 7 | **Late** |
|
|
70
|
+
| `notifications` | 8 | Early |
|
|
71
|
+
| `access` | 9 | Early |
|
|
72
|
+
| `ai` | 10 | Early |
|
|
77
73
|
|
|
78
74
|
Pick a number that places your connector where it belongs. If your queue needs the database, set `priority > 2` (e.g. `11`). If you replace the cache, set `< 4` to win.
|
|
79
75
|
|
|
@@ -85,7 +81,7 @@ Negative priorities are fine for "start before everything" — the project's `sr
|
|
|
85
81
|
|
|
86
82
|
`ConnectorLifecyclePhase` exists because **HTTP and socket need user code loaded first**: they scan the router (which user `routes.ts` files populate) and the container (which app `main.ts` files mutate). So the framework boots in two passes:
|
|
87
83
|
|
|
88
|
-
1. **Early phase** runs before user code imports — for things user code needs
|
|
84
|
+
1. **Early phase** runs before user code imports — for things user code needs _at import time_ (database/cache so models work, logger so app modules can `log.info`).
|
|
89
85
|
2. **Late phase** runs after user code imports — for things that consume registrations user code just made (HTTP reads the router, socket reads HTTP's instance).
|
|
90
86
|
|
|
91
87
|
If your connector is a self-contained service (queue client, scheduler), `Early` is correct. If it depends on app-level registrations, `Late`. Default is `Early` — don't change it without a reason.
|
|
@@ -161,11 +157,7 @@ The manager swallows errors from individual `shutdown()`s (logs and continues)
|
|
|
161
157
|
### Queue worker (depends on DB)
|
|
162
158
|
|
|
163
159
|
```ts title="src/connectors/queue-worker-connector.ts"
|
|
164
|
-
import {
|
|
165
|
-
BaseConnector,
|
|
166
|
-
ConnectorLifecyclePhase,
|
|
167
|
-
type ConnectorName,
|
|
168
|
-
} from "@warlock.js/core";
|
|
160
|
+
import { BaseConnector, ConnectorLifecyclePhase, type ConnectorName } from "@warlock.js/core";
|
|
169
161
|
import { startWorker, stopWorker } from "app/queue/services/worker.service";
|
|
170
162
|
|
|
171
163
|
export class QueueWorkerConnector extends BaseConnector {
|
|
@@ -191,11 +183,7 @@ export class QueueWorkerConnector extends BaseConnector {
|
|
|
191
183
|
### Scheduler (Late — wants the router up first)
|
|
192
184
|
|
|
193
185
|
```ts
|
|
194
|
-
import {
|
|
195
|
-
BaseConnector,
|
|
196
|
-
ConnectorLifecyclePhase,
|
|
197
|
-
type ConnectorName,
|
|
198
|
-
} from "@warlock.js/core";
|
|
186
|
+
import { BaseConnector, ConnectorLifecyclePhase, type ConnectorName } from "@warlock.js/core";
|
|
199
187
|
|
|
200
188
|
export class SchedulerConnector extends BaseConnector {
|
|
201
189
|
public readonly name: ConnectorName = "scheduler";
|
|
@@ -231,7 +219,7 @@ See the [Registering a connector](#registering-a-connector) section above for th
|
|
|
231
219
|
- **`shutdown()` must be idempotent.** SIGINT can fire twice on Windows. The manager guards re-entry with its own flag, but individual connectors get called once per shutdown loop — guard with `if (!this.active) return`.
|
|
232
220
|
- **Don't reach across connector boundaries in `start()`.** The manager's `start()` loop runs all `boot()`s first, then all `start()`s — wiring across connectors goes through the `container`, not through imports. Use `container.tryGet("http.server")` when the other connector is genuinely optional (e.g. socket falls back to its own raw server when HTTP isn't configured); use `container.get("http.server")` when its absence would be a bug — it throws a named `ContainerKeyMissingError` instead of handing back `undefined`.
|
|
233
221
|
- **Production build still needs config registration.** Placing the connector under `src/connectors/<name>.ts` does not auto-register it. Put the same instance in `warlock.config.ts > connectors`; that array is what build-time contribution discovery and runtime boot share.
|
|
234
|
-
- **`watchedFiles` is restart-trigger, not dependency.** It says "I want to restart when this file changes." It does
|
|
222
|
+
- **`watchedFiles` is restart-trigger, not dependency.** It says "I want to restart when this file changes." It does _not_ mean the framework reloads that file first — that's the file orchestrator's job.
|
|
235
223
|
|
|
236
224
|
## See also
|
|
237
225
|
|
|
@@ -12,18 +12,21 @@ description: 'Wrap a function with `measure(name, fn, options?)` to time it and
|
|
|
12
12
|
```ts
|
|
13
13
|
import { measure } from "@warlock.js/core";
|
|
14
14
|
|
|
15
|
+
declare const db: { users: { findOne(query: { id: number }): Promise<{ id: number } | null> } }; // your data layer
|
|
16
|
+
declare const id: number;
|
|
17
|
+
|
|
15
18
|
const result = await measure("db.findUser", () => db.users.findOne({ id }));
|
|
16
19
|
|
|
17
20
|
if (result.success) {
|
|
18
|
-
console.log(result.value);
|
|
19
|
-
console.log(result.latency);
|
|
20
|
-
console.log(result.state);
|
|
21
|
+
console.log(result.value); // T
|
|
22
|
+
console.log(result.latency); // ms
|
|
23
|
+
console.log(result.state); // "excellent" | "good" | "poor"
|
|
21
24
|
} else {
|
|
22
25
|
console.error(result.error);
|
|
23
26
|
}
|
|
24
27
|
```
|
|
25
28
|
|
|
26
|
-
`measure()` always
|
|
29
|
+
`measure()` always _returns_ — it never re-throws. The return type is `BenchmarkSuccessResult<T> | BenchmarkErrorResult`, discriminated by `result.success`. The one exception: `shouldBenchmarkError` returning false re-throws (see below).
|
|
27
30
|
|
|
28
31
|
## `BenchmarkResult` — what you get back
|
|
29
32
|
|
|
@@ -89,7 +92,7 @@ await measure("http.outbound", () => fetch(url), {
|
|
|
89
92
|
|
|
90
93
|
## Selective error capture — `shouldBenchmarkError`
|
|
91
94
|
|
|
92
|
-
Business errors (4xx, validation) are not infrastructure problems and shouldn't pollute your latency stats. Return `false` to
|
|
95
|
+
Business errors (4xx, validation) are not infrastructure problems and shouldn't pollute your latency stats. Return `false` to _re-throw_ the error without producing a benchmark result:
|
|
93
96
|
|
|
94
97
|
```ts
|
|
95
98
|
await measure("create-user", () => createUser(input), {
|
|
@@ -119,18 +122,19 @@ For high-volume operations where you want p50/p95/p99 rather than per-call hooks
|
|
|
119
122
|
```ts
|
|
120
123
|
import { BenchmarkProfiler, ConsoleChannel, measure } from "@warlock.js/core";
|
|
121
124
|
|
|
125
|
+
declare const db: { users: { findOne(query: { id: number }): Promise<{ id: number } | null> } }; // your data layer
|
|
126
|
+
|
|
122
127
|
const profiler = new BenchmarkProfiler({
|
|
123
|
-
maxSamples: 1000,
|
|
124
|
-
channels: [new ConsoleChannel()],
|
|
125
|
-
flushEvery: 60_000,
|
|
128
|
+
maxSamples: 1000, // ring buffer per operation name
|
|
129
|
+
channels: [new ConsoleChannel()], // where stats go on flush()
|
|
130
|
+
flushEvery: 60_000, // auto-flush every minute
|
|
126
131
|
});
|
|
127
132
|
|
|
128
133
|
for (let i = 0; i < 5; i++) {
|
|
129
|
-
await measure(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
);
|
|
134
|
+
await measure("db.findUser", () => db.users.findOne({ id: i }), {
|
|
135
|
+
profiler,
|
|
136
|
+
latencyRange: { excellent: 50, poor: 300 },
|
|
137
|
+
});
|
|
134
138
|
}
|
|
135
139
|
|
|
136
140
|
const stats = profiler.stats("db.findUser");
|
|
@@ -146,6 +150,8 @@ Wire a profiler globally through `BenchmarkConfigurations.profiler` in `src/conf
|
|
|
146
150
|
```ts
|
|
147
151
|
import type { BenchmarkChannel, BenchmarkStats } from "@warlock.js/core";
|
|
148
152
|
|
|
153
|
+
declare const datadog: { gauge(metric: string, value: number): Promise<void> }; // your metrics client
|
|
154
|
+
|
|
149
155
|
export class DatadogChannel implements BenchmarkChannel {
|
|
150
156
|
public async onFlush(stats: Record<string, BenchmarkStats>): Promise<void> {
|
|
151
157
|
for (const [name, operationStats] of Object.entries(stats)) {
|
|
@@ -164,9 +170,12 @@ When percentiles aren't enough — you need the actual failing inputs/errors for
|
|
|
164
170
|
```ts
|
|
165
171
|
import { BenchmarkSnapshots, measure } from "@warlock.js/core";
|
|
166
172
|
|
|
173
|
+
declare const stripe: { charge(payload: { amount: number }): Promise<{ id: string }> }; // your payment client
|
|
174
|
+
declare const payload: { amount: number };
|
|
175
|
+
|
|
167
176
|
const snapshots = new BenchmarkSnapshots({
|
|
168
177
|
maxSnapshots: 100,
|
|
169
|
-
capture: "error",
|
|
178
|
+
capture: "error", // "error" (default, safe) | "value" | "all"
|
|
170
179
|
});
|
|
171
180
|
|
|
172
181
|
await measure("payment.charge", () => stripe.charge(payload), { snapshotContainer: snapshots });
|
|
@@ -180,11 +189,7 @@ const failed = snapshots.getSnapshots("payment.charge");
|
|
|
180
189
|
## Globals via `src/config/benchmark.ts`
|
|
181
190
|
|
|
182
191
|
```ts title="src/config/benchmark.ts"
|
|
183
|
-
import {
|
|
184
|
-
BenchmarkProfiler,
|
|
185
|
-
ConsoleChannel,
|
|
186
|
-
type BenchmarkConfigurations,
|
|
187
|
-
} from "@warlock.js/core";
|
|
192
|
+
import { BenchmarkProfiler, ConsoleChannel, type BenchmarkConfigurations } from "@warlock.js/core";
|
|
188
193
|
|
|
189
194
|
const benchmarkConfig: BenchmarkConfigurations = {
|
|
190
195
|
enabled: true,
|
|
@@ -235,18 +240,19 @@ const result = await measure(
|
|
|
235
240
|
import { measure } from "@warlock.js/core";
|
|
236
241
|
import { retry } from "@mongez/reinforcements";
|
|
237
242
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
declare const bus: { publish(event: unknown): Promise<void> }; // your event bus
|
|
244
|
+
declare const event: { type: string };
|
|
245
|
+
|
|
246
|
+
await measure("publish-event", () => retry(() => bus.publish(event), { attempts: 4, delay: 200 }));
|
|
241
247
|
```
|
|
242
248
|
|
|
243
|
-
The `latency` is the
|
|
249
|
+
The `latency` is the _total_ time including retries — useful for the SLO you actually care about. (`retry` moved to `@mongez/reinforcements`; `count` is now `attempts` — total tries.)
|
|
244
250
|
|
|
245
251
|
## Gotchas
|
|
246
252
|
|
|
247
253
|
- **Name collisions aggregate.** Two calls to `measure("foo", …)` share one profiler bucket. Make `name` specific (`db.findUser`, not `db.query`) so percentiles mean something.
|
|
248
254
|
- **`measure()` doesn't propagate AbortSignal.** If `fn` is cancellable, plumb that through yourself — the wrapper only times.
|
|
249
|
-
- **Don't `measure()` synchronous trivia.** A `Math.round` call isn't worth a microsecond of overhead. Reserve for things that
|
|
255
|
+
- **Don't `measure()` synchronous trivia.** A `Math.round` call isn't worth a microsecond of overhead. Reserve for things that _can_ be slow.
|
|
250
256
|
- **Snapshots with `"value"` retain references.** If `value` holds a request stream or a large buffer, you've kept it in memory until eviction.
|
|
251
257
|
- **`shouldBenchmarkError` re-throws.** Make sure the caller is ready for that, or set it conservatively (`true` by default).
|
|
252
258
|
|
|
@@ -133,15 +133,15 @@ router.restfulResource("/users", new UsersRestful());
|
|
|
133
133
|
|
|
134
134
|
This registers:
|
|
135
135
|
|
|
136
|
-
| Path
|
|
137
|
-
|
|
|
138
|
-
| `/users`
|
|
139
|
-
| `/users/:id
|
|
140
|
-
| `/users`
|
|
141
|
-
| `/users/:id
|
|
142
|
-
| `/users/:id
|
|
143
|
-
| `/users/:id
|
|
144
|
-
| `/users`
|
|
136
|
+
| Path | Verb | Method |
|
|
137
|
+
| ------------ | -------- | -------------- |
|
|
138
|
+
| `/users` | `GET` | `list()` |
|
|
139
|
+
| `/users/:id` | `GET` | `get()` |
|
|
140
|
+
| `/users` | `POST` | `create()` |
|
|
141
|
+
| `/users/:id` | `PUT` | `update()` |
|
|
142
|
+
| `/users/:id` | `PATCH` | `patch()` |
|
|
143
|
+
| `/users/:id` | `DELETE` | `delete()` |
|
|
144
|
+
| `/users` | `DELETE` | `bulkDelete()` |
|
|
145
145
|
|
|
146
146
|
`bulkDelete` expects an array of ids in the `id` field; it 400s otherwise. All actions except `bulkDelete` only register when the corresponding method is defined on the class — `Restful` provides them all by default.
|
|
147
147
|
|
|
@@ -176,11 +176,11 @@ router.restfulResource("/users", new UsersRestful(), {
|
|
|
176
176
|
|
|
177
177
|
Override any of these `protected async` methods:
|
|
178
178
|
|
|
179
|
-
| Hook
|
|
180
|
-
|
|
|
181
|
-
| `beforeCreate(request, response, model)`
|
|
182
|
-
| `onCreate(request, response, record)`
|
|
183
|
-
| `beforeUpdate(request, response, record, old?)` | Before `update`
|
|
179
|
+
| Hook | When |
|
|
180
|
+
| ----------------------------------------------- | ----------------------------------- |
|
|
181
|
+
| `beforeCreate(request, response, model)` | New model instance, before `create` |
|
|
182
|
+
| `onCreate(request, response, record)` | After successful `create` |
|
|
183
|
+
| `beforeUpdate(request, response, record, old?)` | Before `update` |
|
|
184
184
|
| `onUpdate(request, response, record, old)` | After successful `update` |
|
|
185
185
|
| `beforePatch(request, response, record, old?)` | Before `patch` |
|
|
186
186
|
| `onPatch(request, response, record, old)` | After successful `patch` |
|
|
@@ -14,11 +14,11 @@ Use URL helpers whenever you need to render a string that goes into a browser, a
|
|
|
14
14
|
```ts
|
|
15
15
|
import { url, publicUrl, assetsUrl, uploadsUrl } from "@warlock.js/core";
|
|
16
16
|
|
|
17
|
-
url();
|
|
18
|
-
url("/health");
|
|
17
|
+
url(); // → "http://localhost:3000"
|
|
18
|
+
url("/health"); // → "http://localhost:3000/health"
|
|
19
19
|
|
|
20
|
-
publicUrl("favicon.ico");
|
|
21
|
-
assetsUrl("logo.png");
|
|
20
|
+
publicUrl("favicon.ico"); // → "http://localhost:3000/public/favicon.ico"
|
|
21
|
+
assetsUrl("logo.png"); // → "http://localhost:3000/public/assets/logo.png"
|
|
22
22
|
uploadsUrl("avatars/42.png"); // → "http://localhost:3000/uploads/avatars/42.png"
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -54,13 +54,13 @@ setBaseUrl("https://cdn.example.com");
|
|
|
54
54
|
|
|
55
55
|
## Full inventory
|
|
56
56
|
|
|
57
|
-
| Helper
|
|
58
|
-
|
|
|
59
|
-
| `url(path?)`
|
|
60
|
-
| `publicUrl(path?)`
|
|
61
|
-
| `assetsUrl(path?)`
|
|
62
|
-
| `uploadsUrl(path?)`
|
|
63
|
-
| `setBaseUrl(url)`
|
|
57
|
+
| Helper | Resolves to | Use for |
|
|
58
|
+
| ------------------- | -------------------------------------- | ----------------------------------------- |
|
|
59
|
+
| `url(path?)` | `<baseUrl>/<path>` | Arbitrary absolute URL on the same host. |
|
|
60
|
+
| `publicUrl(path?)` | `<baseUrl>/public/<path>` | Files served out of the `public/` folder. |
|
|
61
|
+
| `assetsUrl(path?)` | `<baseUrl>/public/assets/<path>` | Assets inside `public/assets/`. |
|
|
62
|
+
| `uploadsUrl(path?)` | `<baseUrl>/uploads/<path>` | User-uploaded files served over HTTP. |
|
|
63
|
+
| `setBaseUrl(url)` | (sets the anchor for all of the above) | Override at runtime — rarely needed. |
|
|
64
64
|
|
|
65
65
|
`assetsUrl` is just `publicUrl` with `assets/` prepended — they share the same `/public/` mount point.
|
|
66
66
|
|
|
@@ -70,12 +70,12 @@ setBaseUrl("https://cdn.example.com");
|
|
|
70
70
|
|
|
71
71
|
The most common confusion. They look related but resolve completely differently:
|
|
72
72
|
|
|
73
|
-
| Goal
|
|
74
|
-
|
|
|
75
|
-
| **Read** a file from the filesystem
|
|
76
|
-
| **Render** an `<img src>` for the same file
|
|
77
|
-
| **Write** to public folder
|
|
78
|
-
| **Embed** an asset URL in a response
|
|
73
|
+
| Goal | Helper | Returns |
|
|
74
|
+
| ------------------------------------------- | ------------------ | ------------------------------------------- |
|
|
75
|
+
| **Read** a file from the filesystem | `uploadsPath(...)` | `<cwd>/storage/uploads/<path>` (filesystem) |
|
|
76
|
+
| **Render** an `<img src>` for the same file | `uploadsUrl(...)` | `<baseUrl>/uploads/<path>` (HTTP URL) |
|
|
77
|
+
| **Write** to public folder | `publicPath(...)` | `<cwd>/public/<path>` (filesystem) |
|
|
78
|
+
| **Embed** an asset URL in a response | `publicUrl(...)` | `<baseUrl>/public/<path>` (HTTP URL) |
|
|
79
79
|
|
|
80
80
|
Pick by the consumer:
|
|
81
81
|
|
|
@@ -144,7 +144,7 @@ await sendWebhook({
|
|
|
144
144
|
url: vendor.callback_url,
|
|
145
145
|
payload: {
|
|
146
146
|
order_id: order.id,
|
|
147
|
-
receipt_url: url(`/orders/${order.id}/receipt`),
|
|
147
|
+
receipt_url: url(`/orders/${order.id}/receipt`), // → "https://api.example.com/orders/42/receipt"
|
|
148
148
|
},
|
|
149
149
|
});
|
|
150
150
|
```
|
|
@@ -115,16 +115,16 @@ same nonce reaches the page's `<script>` tags.
|
|
|
115
115
|
|
|
116
116
|
## Which layer holds what
|
|
117
117
|
|
|
118
|
-
| Setting
|
|
119
|
-
|
|
|
120
|
-
| Build/bundler options (minify, sourcemap, outFile)
|
|
121
|
-
| Dev server (HMR scope, health checkers, typings)
|
|
122
|
-
| Package migrations (external `@warlock.js/*` packages)
|
|
123
|
-
| CLI commands (registered via `warlock <cmd>`)
|
|
124
|
-
| HTTP server tuning per env (port, host, retry)
|
|
125
|
-
| HTTP runtime (CORS, cookies, rate limits, upload size)
|
|
126
|
-
| App identity (name, baseUrl, publicUrl, timezone, locales) | `src/config/app.ts`
|
|
127
|
-
| Subsystem configs (auth, mail, storage, cache, ai, …)
|
|
118
|
+
| Setting | Layer |
|
|
119
|
+
| ---------------------------------------------------------- | ------------------------------- |
|
|
120
|
+
| Build/bundler options (minify, sourcemap, outFile) | `warlock.config.ts > build` |
|
|
121
|
+
| Dev server (HMR scope, health checkers, typings) | `warlock.config.ts > devServer` |
|
|
122
|
+
| Package migrations (external `@warlock.js/*` packages) | `warlock.config.ts > database` |
|
|
123
|
+
| CLI commands (registered via `warlock <cmd>`) | `warlock.config.ts > cli` |
|
|
124
|
+
| HTTP server tuning per env (port, host, retry) | `warlock.config.ts > server` |
|
|
125
|
+
| HTTP runtime (CORS, cookies, rate limits, upload size) | `src/config/http.ts` |
|
|
126
|
+
| App identity (name, baseUrl, publicUrl, timezone, locales) | `src/config/app.ts` |
|
|
127
|
+
| Subsystem configs (auth, mail, storage, cache, ai, …) | `src/config/<name>.ts` |
|
|
128
128
|
|
|
129
129
|
Heuristic: if the setting changes how the framework **boots, builds, or scaffolds**, it goes in `warlock.config.ts`. If it changes how a **subsystem behaves at runtime**, it goes in `src/config/`.
|
|
130
130
|
|
|
@@ -139,10 +139,10 @@ Heuristic: if the setting changes how the framework **boots, builds, or scaffold
|
|
|
139
139
|
```ts
|
|
140
140
|
import { env } from "@warlock.js/core";
|
|
141
141
|
|
|
142
|
-
env("HTTP_PORT", 3000);
|
|
143
|
-
env("CACHE_LOGGING", false);
|
|
142
|
+
env("HTTP_PORT", 3000); // number
|
|
143
|
+
env("CACHE_LOGGING", false); // boolean
|
|
144
144
|
env("BASE_URL", "http://localhost:3000"); // string
|
|
145
|
-
env("REDIS_URL");
|
|
145
|
+
env("REDIS_URL"); // undefined if unset
|
|
146
146
|
```
|
|
147
147
|
|
|
148
148
|
`env` is re-exported from `@warlock.js/core` (sourced from `@mongez/dotenv`). Use this — not `process.env.X` — so callers consistently get coerced values.
|
|
@@ -178,6 +178,35 @@ The `ConfigRegistry` interface is augmented by generated typings — once you ad
|
|
|
178
178
|
|
|
179
179
|
That's the contract. Filename → config key. No registration, no manifest, no side effects.
|
|
180
180
|
|
|
181
|
+
### Validate a config file at boot: `configSchema`
|
|
182
|
+
|
|
183
|
+
Export a `configSchema` next to the default export. The value is validated
|
|
184
|
+
before it is registered (dev boot, each hot reload, production start); every
|
|
185
|
+
problem in every config file is reported in one `InvalidConfigError`, naming
|
|
186
|
+
the env variable to set. Values are never printed; an invalid config never
|
|
187
|
+
reaches its special handler; a bad hot reload keeps the previous value.
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
// src/config/payments.ts
|
|
191
|
+
import { defineConfigSchema, env, type ConfigOf } from "@warlock.js/core";
|
|
192
|
+
import { v } from "@warlock.js/seal";
|
|
193
|
+
|
|
194
|
+
export const configSchema = defineConfigSchema(
|
|
195
|
+
v.object({ apiKey: v.string(), webhookSecret: v.string() }),
|
|
196
|
+
{ env: { apiKey: "PAYMENTS_API_KEY", webhookSecret: "PAYMENTS_WEBHOOK_SECRET" } },
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const paymentsConfig: ConfigOf<typeof configSchema> = {
|
|
200
|
+
apiKey: env("PAYMENTS_API_KEY"),
|
|
201
|
+
webhookSecret: env("PAYMENTS_WEBHOOK_SECRET"),
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
export default paymentsConfig;
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Nested keys use dotted paths in the `env` map (`"smtp.password"`). Files
|
|
208
|
+
without a `configSchema` load as before.
|
|
209
|
+
|
|
181
210
|
## Special handlers
|
|
182
211
|
|
|
183
212
|
Some subsystems need to do extra work when their config loads (e.g. set the active locale, register a driver). Those have a special handler attached internally — for the most part you don't see them. The takeaway: changing a config file at dev time fires the handler again automatically.
|
|
@@ -243,7 +272,7 @@ Same shape — TS validates the union; runtime picks the `default` key.
|
|
|
243
272
|
|
|
244
273
|
## Multi-server settings (5.20.0)
|
|
245
274
|
|
|
246
|
-
- `http.rateLimit` — `@fastify/rate-limit` options (`nameSpace`, ...); `store: "cache"` counts in `@warlock.js/cache` so every server shares the limit (per-route `middleware.rateLimit()` follows it; `skipOnError` defaults to `true`, so a cache outage fails open; the `null` and `file` cache drivers are refused); `redis` needs an ioredis client; `enabled: false` disables.
|
|
275
|
+
- `http.rateLimit` — `@fastify/rate-limit` options (`nameSpace`, ...); `store: "cache"` counts in `@warlock.js/cache` so every server shares the limit (per-route `middleware.rateLimit()` follows it; `skipOnError` defaults to `true`, so a cache outage fails open; the `null` and `file` cache drivers are refused); `redis` needs an ioredis client; `enabled: false` disables. Static files (public folder, `router.directory()` mounts, `router.file()` routes, web build assets) are exempt unless `staticFiles: true`.
|
|
247
276
|
- `socket.adapter` — adapter factory for cross-server broadcast.
|
|
248
277
|
- `cache.silenceSingleServerWarning`, `storage.silenceSingleServerWarning`, `socket.silenceSingleServerWarning` — silence the production warnings for in-memory cache, local storage, and adapter-less sockets.
|
|
249
278
|
|
|
@@ -328,3 +357,67 @@ Internal `@warlock.js/*` packages read from `config.get("<name>")` the same way
|
|
|
328
357
|
- The `pick-cache-driver` topic of the `warlock-js-cache` skill — picking and registering a cache driver in `src/config/cache.ts`.
|
|
329
358
|
- The `send-mail` topic — the `src/config/mail.ts` shape.
|
|
330
359
|
- The `store-file` topic — the `src/config/storage.ts` shape.
|
|
360
|
+
|
|
361
|
+
## Hide input for a family of URLs
|
|
362
|
+
|
|
363
|
+
```ts
|
|
364
|
+
import type { HttpConfigurations } from "@warlock.js/core";
|
|
365
|
+
|
|
366
|
+
export default {
|
|
367
|
+
logging: {
|
|
368
|
+
private: [
|
|
369
|
+
{ path: "/api/private", body: false, query: false },
|
|
370
|
+
{ path: /^\/credentials(?:\/|$)/, body: false },
|
|
371
|
+
],
|
|
372
|
+
},
|
|
373
|
+
} satisfies HttpConfigurations;
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
String paths match a prefix at a segment boundary. Both string and regex rules
|
|
377
|
+
are checked against several pathname candidates: the raw path, the decoded path,
|
|
378
|
+
and the decoded path with dot segments resolved, each with repeated and trailing
|
|
379
|
+
slashes collapsed. Any match suppresses input, so normalization never narrows a
|
|
380
|
+
raw-path match. The matched route pattern is checked too, and the rules apply
|
|
381
|
+
even when no route matches. Matching rules combine and only remove input; a
|
|
382
|
+
route cannot re-enable fields they suppress. `query: false` also removes the
|
|
383
|
+
logged URL's query string.
|
|
384
|
+
|
|
385
|
+
With private policies configured, a request path that does not decode withholds
|
|
386
|
+
both body and query. The same holds for the matched route pattern: a route
|
|
387
|
+
pattern containing a `%` that does not decode (such as `/files/100%`) withholds
|
|
388
|
+
body and query on every request to that route. An undecodable configured prefix
|
|
389
|
+
suppresses its selected fields for all requests. Rules assume case-sensitive
|
|
390
|
+
routing defaults; with case-insensitive routing, use a regex with `i` and
|
|
391
|
+
include any custom semicolon delimiters in the matcher. The URL's original path
|
|
392
|
+
spelling is retained in the snapshot.
|
|
393
|
+
|
|
394
|
+
The rules are prepared once per `private` array. To change them at runtime, set
|
|
395
|
+
a new array (`config.set("http.logging.private", [...])`) rather than editing the
|
|
396
|
+
existing one in place.
|
|
397
|
+
|
|
398
|
+
When upgrading from 5.29, update redaction censors that inspect `context.request`:
|
|
399
|
+
it is a `RequestLogSnapshot`, with `url` and `route` (a string), rather than a
|
|
400
|
+
Request instance with `baseRequest.url` or `route.path`. Custom log calls can use
|
|
401
|
+
`request.toLogSnapshot()` to apply these same policies.
|
|
402
|
+
|
|
403
|
+
## Map domain errors at the HTTP edge
|
|
404
|
+
|
|
405
|
+
```ts title="src/config/http.ts"
|
|
406
|
+
import type { HttpConfigurations } from "@warlock.js/core";
|
|
407
|
+
|
|
408
|
+
class InventoryConflict extends Error {}
|
|
409
|
+
|
|
410
|
+
export default {
|
|
411
|
+
errorMapper(error) {
|
|
412
|
+
if (error instanceof InventoryConflict) {
|
|
413
|
+
return { status: 409, message: error.message };
|
|
414
|
+
}
|
|
415
|
+
return undefined;
|
|
416
|
+
},
|
|
417
|
+
logging: { body: true, query: true, redactQueryParams: ["token"] },
|
|
418
|
+
} satisfies HttpConfigurations;
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
Keep the domain error class in an app module imported by both the service and
|
|
422
|
+
this config. Return `undefined` for errors you do not recognize; a mapped 5xx
|
|
423
|
+
is opaque unless the mapper explicitly chooses a public message.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-controller
|
|
3
|
-
description: 'Author HTTP controllers in @warlock.js/core — RequestHandler signature, validated input via seal schemas, response helpers, attaching metadata. Controllers are thin functions; business logic moves to services or use-cases. Triggers: `RequestHandler`, `Request<TSchema>`, `GuardedRequestHandler`, `request.validated`, `request.input`, `controller.validation`, `controller.responseSchema`, `response.success`, `response.successCreate`; "write a controller", "attach a schema to a handler", "thin controller pattern", "guarded request type", "type the API response"; typical import `import { type RequestHandler } from "@warlock.js/core"`. Skip: response helper menu — the `send-response` topic; schema authoring — the `validate-input` topic; URL wiring — the `register-route` topic; competing patterns: `express` middleware functions, `@nestjs/common` `@Controller`/`@Get` decorators.'
|
|
3
|
+
description: 'Author HTTP controllers in @warlock.js/core — RequestHandler signature, validated input via seal schemas, response helpers, attaching metadata. Controllers are thin functions; business logic moves to services or use-cases. Triggers: `RequestHandler`, `Request<TSchema>`, `GuardedRequestHandler`, `request.validated`, `request.signal`, `request.input`, `controller.validation`, `controller.responseSchema`, `response.success`, `response.successCreate`; "write a controller", "attach a schema to a handler", "thin controller pattern", "guarded request type", "type the API response"; typical import `import { type RequestHandler } from "@warlock.js/core"`. Skip: response helper menu — the `send-response` topic; schema authoring — the `validate-input` topic; URL wiring — the `register-route` topic; competing patterns: `express` middleware functions, `@nestjs/common` `@Controller`/`@Get` decorators.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Warlock — create a controller
|
|
@@ -45,11 +45,11 @@ Prefer `request.validated()` once a schema is attached — it's typed.
|
|
|
45
45
|
|
|
46
46
|
`request.input()` / `.all()` / `.validated()` read the same way regardless of how the body arrived — every content type below feeds the same parsed bag:
|
|
47
47
|
|
|
48
|
-
| Content type
|
|
49
|
-
|
|
|
50
|
-
| `application/json`
|
|
51
|
-
| `multipart/form-data`
|
|
52
|
-
| `application/x-www-form-urlencoded`
|
|
48
|
+
| Content type | Parsed by | Notes |
|
|
49
|
+
| ----------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------ |
|
|
50
|
+
| `application/json` | Fastify (built-in) | objects/arrays parsed as-is |
|
|
51
|
+
| `multipart/form-data` | `@fastify/multipart` | fields + files; see the `upload-file` topic |
|
|
52
|
+
| `application/x-www-form-urlencoded` | Warlock's own content-type parser (`http/parse-urlencoded-body.ts`) | plain HTML forms, OAuth `form_post` callbacks (e.g. Apple Sign in) |
|
|
53
53
|
|
|
54
54
|
For urlencoded bodies: fields decode via `URLSearchParams`. A key sent more than once (`tag=a&tag=b`) becomes an array (`request.input("tag")` → `["a", "b"]`); every other key is a plain string. Bracket-notation keys (`a[b]=1`) are **not** expanded by the urlencoded parser itself — nesting only happens through the same shared bracket-key logic every body type already goes through, so it behaves exactly like a JSON or query-string key of that shape, no differently than today.
|
|
55
55
|
|
|
@@ -163,12 +163,12 @@ loginController.responseSchema = {
|
|
|
163
163
|
|
|
164
164
|
A body is an object whose values are one of:
|
|
165
165
|
|
|
166
|
-
| Value
|
|
167
|
-
|
|
|
168
|
-
| a cast string, with the resource suffixes
|
|
169
|
-
| a resource
|
|
170
|
-
| `[Resource]`
|
|
171
|
-
| a nested plain object of any of the above
|
|
166
|
+
| Value | Meaning |
|
|
167
|
+
| ----------------------------------------- | ------------------------------------------------------------------------------------------- |
|
|
168
|
+
| a cast string, with the resource suffixes | `"string"`, `"number?"`, `"string[]"`, `"date[]?"` (`?` is `T \| null`, key always present) |
|
|
169
|
+
| a resource | one `ResourceOutput` object |
|
|
170
|
+
| `[Resource]` | an array of that resource |
|
|
171
|
+
| a nested plain object of any of the above | recursed |
|
|
172
172
|
|
|
173
173
|
The output types follow the same rules as `defineResource` (`ResponseBodyOutput<B>` and `ResponseSchemaOutput<S>` are exported if you need the type of a body or of the whole schema).
|
|
174
174
|
|
|
@@ -280,3 +280,16 @@ No `if (!product)` branch in the controller. The error class carries the HTTP se
|
|
|
280
280
|
- The `register-route` topic — wiring a controller to a URL.
|
|
281
281
|
- The `send-response` topic — full Response helper surface.
|
|
282
282
|
- The `warlock-conventions` topic — controller-service-repository layering.
|
|
283
|
+
|
|
284
|
+
## Complete cancellation example
|
|
285
|
+
|
|
286
|
+
```ts title="src/app/catalog/controllers/remote-catalog.controller.ts"
|
|
287
|
+
import type { RequestHandler } from "@warlock.js/core";
|
|
288
|
+
|
|
289
|
+
export const remoteCatalogController: RequestHandler = async ({ request, response }) => {
|
|
290
|
+
const signal = AbortSignal.any([request.signal, AbortSignal.timeout(30_000)]);
|
|
291
|
+
const upstream = await fetch("https://example.com/catalog.json", { signal });
|
|
292
|
+
if (!upstream.ok) return response.badRequest({ error: "Catalog unavailable" });
|
|
293
|
+
return response.success({ catalog: await upstream.json() });
|
|
294
|
+
};
|
|
295
|
+
```
|
|
@@ -14,7 +14,7 @@ npx warlock generate.module products # full CRUD bootstrap (default
|
|
|
14
14
|
npx warlock generate.module products --minimal # bare bones (routes.ts + main.ts + utils/locales.ts + empty subfolders)
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Full CRUD is the default — opt down to a bare skeleton with `--minimal` (`-m`) when you want to build the module piece by piece. `--force` (`-f`) overwrites existing files. The plural form is auto-derived: `generate.module product` and `generate.module products` produce the same `src/app/products/` folder.
|
|
17
|
+
Full CRUD is the default — opt down to a bare skeleton with `--minimal` (`-m`) when you want to build the module piece by piece. `--force` (`-f`) overwrites existing files. Every generator takes `--dry-run` (write nothing, list the plan) and `--json` (one machine-readable report on stdout). To add one endpoint from its request schema — controller, service, resource, route, locale key and an HTTP test — use `warlock make endpoint` (the `make-endpoint` topic). The plural form is auto-derived: `generate.module product` and `generate.module products` produce the same `src/app/products/` folder.
|
|
18
18
|
|
|
19
19
|
## What the generator creates
|
|
20
20
|
|
|
@@ -76,7 +76,7 @@ Run after `generate.module` to fill in gaps or add to an existing module.
|
|
|
76
76
|
| Command | Alias | Flags |
|
|
77
77
|
| ----------------------------------------------- | --------- | ----------------------------------------------------------------- |
|
|
78
78
|
| `warlock generate.module <name>` | `gen.m` | `--minimal` (`-m`), `--force` |
|
|
79
|
-
| `warlock generate.controller <module>/<action>` | `gen.c` | `--with-validation` (also generates the `schema/` file)
|
|
79
|
+
| `warlock generate.controller <module>/<action>` | `gen.c` | `--with-validation` (also generates the `schema/` file) |
|
|
80
80
|
| `warlock generate.service <module>/<action>` | `gen.s` | `--force` |
|
|
81
81
|
| `warlock generate.model <module>/<entity>` | `gen.md` | `--with-resource`, `--table <name>`, `--timestamps` |
|
|
82
82
|
| `warlock generate.repository <module>/<entity>` | `gen.r` | `--force` |
|
|
@@ -85,7 +85,7 @@ Run after `generate.module` to fill in gaps or add to an existing module.
|
|
|
85
85
|
|
|
86
86
|
The DSL for `--add` is `name:type:modifier,…` — see `write-cli-command` and the column-DSL parser in `@warlock.js/core/src/cli/commands/generate/generators/column-dsl-parser.ts`.
|
|
87
87
|
|
|
88
|
-
Every `generate.*` command (and the master `generate`) also accepts **`--dry-run`** — it prints the files it
|
|
88
|
+
Every `generate.*` command (and the master `generate`) also accepts **`--dry-run`** — it prints the files it _would_ create and writes nothing. Run it before a full `generate.module` scaffold or any `--force` to preview the blast radius.
|
|
89
89
|
|
|
90
90
|
## Path alias
|
|
91
91
|
|