@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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { getAllModelsFromRegistry } from "@warlock.js/cascade";
|
|
2
|
+
import { isLazy } from "@mongez/reinforcements";
|
|
3
|
+
|
|
4
|
+
//#region ../../packages/core/src/tooling/inspect/collect-models.ts
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
/** A static property of a class, read structurally. */
|
|
9
|
+
function staticOf(model, key) {
|
|
10
|
+
return typeof model === "function" ? Reflect.get(model, key) : void 0;
|
|
11
|
+
}
|
|
12
|
+
function stringOrNull(value) {
|
|
13
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Whether a value is a Cascade model class: a class with its own `table` and
|
|
17
|
+
* the static `query()` every model inherits. Read by shape, not `instanceof`.
|
|
18
|
+
*/
|
|
19
|
+
function isModelClass(value) {
|
|
20
|
+
return typeof value === "function" && typeof Reflect.get(value, "table") === "string" && typeof Reflect.get(value, "query") === "function";
|
|
21
|
+
}
|
|
22
|
+
function errorMessage(error) {
|
|
23
|
+
return error instanceof Error ? error.message : String(error);
|
|
24
|
+
}
|
|
25
|
+
function readColumns(model, name, warnings) {
|
|
26
|
+
const schema = staticOf(model, "schema");
|
|
27
|
+
if (typeof schema !== "object" || schema === null) return [];
|
|
28
|
+
const convert = Reflect.get(schema, "toJsonSchema");
|
|
29
|
+
if (typeof convert !== "function") return [];
|
|
30
|
+
let json;
|
|
31
|
+
try {
|
|
32
|
+
json = convert.call(schema, "draft-2020-12");
|
|
33
|
+
} catch (error) {
|
|
34
|
+
warnings.push({
|
|
35
|
+
code: "WL4001",
|
|
36
|
+
message: `${name}.schema could not be converted to JSON Schema: ${errorMessage(error)}`,
|
|
37
|
+
source: "models"
|
|
38
|
+
});
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
if (!isRecord(json) || !isRecord(json.properties)) return [];
|
|
42
|
+
const required = new Set(Array.isArray(json.required) ? json.required.filter((key) => typeof key === "string") : []);
|
|
43
|
+
return Object.entries(json.properties).map(([column, columnSchema]) => ({
|
|
44
|
+
name: column,
|
|
45
|
+
required: required.has(column),
|
|
46
|
+
schema: isRecord(columnSchema) ? columnSchema : {}
|
|
47
|
+
})).sort((first, second) => first.name.localeCompare(second.name));
|
|
48
|
+
}
|
|
49
|
+
/** The name of a relation target given as a string, a class or `lazy(() => X)`. */
|
|
50
|
+
function relationTargetName(target) {
|
|
51
|
+
if (typeof target === "string") return target;
|
|
52
|
+
try {
|
|
53
|
+
const resolved = isLazy(target) ? target.resolve() : target;
|
|
54
|
+
return typeof resolved === "function" && resolved.name ? resolved.name : null;
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function readRelations(model) {
|
|
60
|
+
const relations = staticOf(model, "relations");
|
|
61
|
+
if (!isRecord(relations)) return [];
|
|
62
|
+
return Object.entries(relations).filter((entry) => isRecord(entry[1])).map(([name, definition]) => ({
|
|
63
|
+
name,
|
|
64
|
+
type: typeof definition.type === "string" ? definition.type : "unknown",
|
|
65
|
+
model: relationTargetName(definition.model),
|
|
66
|
+
foreignKey: stringOrNull(definition.foreignKey),
|
|
67
|
+
localKey: stringOrNull(definition.localKey)
|
|
68
|
+
})).sort((first, second) => first.name.localeCompare(second.name));
|
|
69
|
+
}
|
|
70
|
+
function columnSetting(model, key) {
|
|
71
|
+
return stringOrNull(staticOf(model, key));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Describe every model the app defines: the classes exported by the model
|
|
75
|
+
* modules the boot pass imported, plus everything `@RegisterModel()` put in
|
|
76
|
+
* Cascade's registry. Columns come from the model's Seal `schema` as JSON
|
|
77
|
+
* Schema; the model's resource is registered in `registry` so its output
|
|
78
|
+
* shape lands in `components.schemas`.
|
|
79
|
+
*/
|
|
80
|
+
function collectModels(modules, registry, warnings) {
|
|
81
|
+
const found = /* @__PURE__ */ new Map();
|
|
82
|
+
for (const module of modules) for (const [exportName, value] of Object.entries(module.exports)) {
|
|
83
|
+
if (!isModelClass(value) || found.has(value)) continue;
|
|
84
|
+
found.set(value, {
|
|
85
|
+
name: value.name || exportName,
|
|
86
|
+
sourceFile: module.file,
|
|
87
|
+
registered: false
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
for (const [name, model] of getAllModelsFromRegistry()) {
|
|
91
|
+
const existing = found.get(model);
|
|
92
|
+
if (existing) {
|
|
93
|
+
existing.registered = true;
|
|
94
|
+
existing.name = name;
|
|
95
|
+
} else found.set(model, {
|
|
96
|
+
name,
|
|
97
|
+
sourceFile: null,
|
|
98
|
+
registered: true
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const resourceModels = /* @__PURE__ */ new Map();
|
|
102
|
+
const models = [];
|
|
103
|
+
for (const [model, meta] of found) try {
|
|
104
|
+
const resource = staticOf(model, "resource");
|
|
105
|
+
let resourceName = null;
|
|
106
|
+
if (registry.isResourceClass(resource)) {
|
|
107
|
+
const ref = registry.resourceRef(resource).$ref;
|
|
108
|
+
resourceName = typeof ref === "string" ? ref.split("/").pop() ?? null : null;
|
|
109
|
+
if (resourceName) resourceModels.set(resourceName, [...resourceModels.get(resourceName) ?? [], meta.name]);
|
|
110
|
+
}
|
|
111
|
+
const dataSource = staticOf(model, "dataSource");
|
|
112
|
+
const deletedAt = staticOf(model, "deletedAtColumn");
|
|
113
|
+
models.push({
|
|
114
|
+
name: meta.name,
|
|
115
|
+
table: stringOrNull(staticOf(model, "table")),
|
|
116
|
+
primaryKey: stringOrNull(staticOf(model, "primaryKey")),
|
|
117
|
+
dataSource: stringOrNull(dataSource),
|
|
118
|
+
sourceFile: meta.sourceFile,
|
|
119
|
+
registered: meta.registered,
|
|
120
|
+
columns: readColumns(model, meta.name, warnings),
|
|
121
|
+
relations: readRelations(model),
|
|
122
|
+
resource: resourceName,
|
|
123
|
+
deleteStrategy: columnSetting(model, "deleteStrategy"),
|
|
124
|
+
createdAtColumn: columnSetting(model, "createdAtColumn"),
|
|
125
|
+
updatedAtColumn: columnSetting(model, "updatedAtColumn"),
|
|
126
|
+
deletedAtColumn: stringOrNull(deletedAt)
|
|
127
|
+
});
|
|
128
|
+
} catch (error) {
|
|
129
|
+
warnings.push({
|
|
130
|
+
code: null,
|
|
131
|
+
message: `Model ${meta.name} could not be described: ${errorMessage(error)}`,
|
|
132
|
+
source: meta.sourceFile ?? "models"
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
models: models.sort((first, second) => first.name.localeCompare(second.name)),
|
|
137
|
+
resourceModels
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Every resource in `components.schemas`, with the models that use it. Called
|
|
142
|
+
* after routes and models registered their resources.
|
|
143
|
+
*/
|
|
144
|
+
function collectResources(registry, resourceModels) {
|
|
145
|
+
return Object.entries(registry.schemas).map(([name, schema]) => ({
|
|
146
|
+
name,
|
|
147
|
+
schema,
|
|
148
|
+
models: [...resourceModels.get(name) ?? []].sort()
|
|
149
|
+
})).sort((first, second) => first.name.localeCompare(second.name));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//#endregion
|
|
153
|
+
export { collectModels, collectResources };
|
|
154
|
+
//# sourceMappingURL=collect-models.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-models.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/inspect/collect-models.ts"],"sourcesContent":["import { isLazy } from \"@mongez/reinforcements\";\nimport { getAllModelsFromRegistry } from \"@warlock.js/cascade\";\nimport type { SchemaRegistry } from \"../../openapi/schema-registry\";\nimport type {\n InspectModel,\n InspectModelColumn,\n InspectModelRelation,\n InspectResource,\n InspectWarning,\n JsonSchema,\n} from \"./inspect-report.types\";\n\n/** A model module the boot pass imported: its file and its exports. */\nexport type InspectModelModule = {\n /** Project-relative path. */\n file: string;\n exports: Record<string, unknown>;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** A static property of a class, read structurally. */\nfunction staticOf(model: unknown, key: string): unknown {\n return typeof model === \"function\" ? Reflect.get(model, key) : undefined;\n}\n\nfunction stringOrNull(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\n/**\n * Whether a value is a Cascade model class: a class with its own `table` and\n * the static `query()` every model inherits. Read by shape, not `instanceof`.\n */\nexport function isModelClass(value: unknown): value is (...args: never[]) => unknown {\n return (\n typeof value === \"function\" &&\n typeof Reflect.get(value, \"table\") === \"string\" &&\n typeof Reflect.get(value, \"query\") === \"function\"\n );\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readColumns(\n model: unknown,\n name: string,\n warnings: InspectWarning[],\n): InspectModelColumn[] {\n const schema = staticOf(model, \"schema\");\n\n if (typeof schema !== \"object\" || schema === null) return [];\n\n const convert = Reflect.get(schema, \"toJsonSchema\");\n\n if (typeof convert !== \"function\") return [];\n\n let json: unknown;\n\n try {\n json = convert.call(schema, \"draft-2020-12\");\n } catch (error) {\n warnings.push({\n code: \"WL4001\",\n message: `${name}.schema could not be converted to JSON Schema: ${errorMessage(error)}`,\n source: \"models\",\n });\n\n return [];\n }\n\n if (!isRecord(json) || !isRecord(json.properties)) {\n return [];\n }\n\n const required = new Set(\n Array.isArray(json.required) ? json.required.filter((key) => typeof key === \"string\") : [],\n );\n\n return Object.entries(json.properties)\n .map(([column, columnSchema]) => ({\n name: column,\n required: required.has(column),\n schema: isRecord(columnSchema) ? (columnSchema as JsonSchema) : {},\n }))\n .sort((first, second) => first.name.localeCompare(second.name));\n}\n\n/** The name of a relation target given as a string, a class or `lazy(() => X)`. */\nfunction relationTargetName(target: unknown): string | null {\n if (typeof target === \"string\") return target;\n\n try {\n const resolved = isLazy(target) ? target.resolve() : target;\n\n return typeof resolved === \"function\" && resolved.name ? resolved.name : null;\n } catch {\n return null;\n }\n}\n\nfunction readRelations(model: unknown): InspectModelRelation[] {\n const relations = staticOf(model, \"relations\");\n\n if (!isRecord(relations)) return [];\n\n return Object.entries(relations)\n .filter((entry): entry is [string, Record<string, unknown>] => isRecord(entry[1]))\n .map(([name, definition]) => ({\n name,\n type: typeof definition.type === \"string\" ? definition.type : \"unknown\",\n model: relationTargetName(definition.model),\n foreignKey: stringOrNull(definition.foreignKey),\n localKey: stringOrNull(definition.localKey),\n }))\n .sort((first, second) => first.name.localeCompare(second.name));\n}\n\nfunction columnSetting(model: unknown, key: string): string | null {\n return stringOrNull(staticOf(model, key));\n}\n\n/** The outcome of {@link collectModels}: the models plus the resources they name. */\nexport type CollectedModels = {\n models: InspectModel[];\n /** Resource classes keyed by the name they got in `components.schemas`, with their models. */\n resourceModels: Map<string, string[]>;\n};\n\n/**\n * Describe every model the app defines: the classes exported by the model\n * modules the boot pass imported, plus everything `@RegisterModel()` put in\n * Cascade's registry. Columns come from the model's Seal `schema` as JSON\n * Schema; the model's resource is registered in `registry` so its output\n * shape lands in `components.schemas`.\n */\nexport function collectModels(\n modules: readonly InspectModelModule[],\n registry: SchemaRegistry,\n warnings: InspectWarning[],\n): CollectedModels {\n const found = new Map<\n unknown,\n { name: string; sourceFile: string | null; registered: boolean }\n >();\n\n for (const module of modules) {\n for (const [exportName, value] of Object.entries(module.exports)) {\n if (!isModelClass(value) || found.has(value)) continue;\n\n found.set(value, {\n name: value.name || exportName,\n sourceFile: module.file,\n registered: false,\n });\n }\n }\n\n for (const [name, model] of getAllModelsFromRegistry()) {\n const existing = found.get(model);\n\n if (existing) {\n existing.registered = true;\n existing.name = name;\n } else {\n found.set(model, { name, sourceFile: null, registered: true });\n }\n }\n\n const resourceModels = new Map<string, string[]>();\n const models: InspectModel[] = [];\n\n for (const [model, meta] of found) {\n try {\n const resource = staticOf(model, \"resource\");\n let resourceName: string | null = null;\n\n if (registry.isResourceClass(resource)) {\n const ref = registry.resourceRef(resource).$ref;\n\n resourceName = typeof ref === \"string\" ? (ref.split(\"/\").pop() ?? null) : null;\n\n if (resourceName) {\n resourceModels.set(resourceName, [\n ...(resourceModels.get(resourceName) ?? []),\n meta.name,\n ]);\n }\n }\n\n const dataSource = staticOf(model, \"dataSource\");\n const deletedAt = staticOf(model, \"deletedAtColumn\");\n\n models.push({\n name: meta.name,\n table: stringOrNull(staticOf(model, \"table\")),\n primaryKey: stringOrNull(staticOf(model, \"primaryKey\")),\n dataSource: stringOrNull(dataSource),\n sourceFile: meta.sourceFile,\n registered: meta.registered,\n columns: readColumns(model, meta.name, warnings),\n relations: readRelations(model),\n resource: resourceName,\n deleteStrategy: columnSetting(model, \"deleteStrategy\"),\n createdAtColumn: columnSetting(model, \"createdAtColumn\"),\n updatedAtColumn: columnSetting(model, \"updatedAtColumn\"),\n deletedAtColumn: stringOrNull(deletedAt),\n });\n } catch (error) {\n warnings.push({\n code: null,\n message: `Model ${meta.name} could not be described: ${errorMessage(error)}`,\n source: meta.sourceFile ?? \"models\",\n });\n }\n }\n\n return {\n models: models.sort((first, second) => first.name.localeCompare(second.name)),\n resourceModels,\n };\n}\n\n/**\n * Every resource in `components.schemas`, with the models that use it. Called\n * after routes and models registered their resources.\n */\nexport function collectResources(\n registry: SchemaRegistry,\n resourceModels: ReadonlyMap<string, string[]>,\n): InspectResource[] {\n return Object.entries(registry.schemas)\n .map(([name, schema]) => ({\n name,\n schema,\n models: [...(resourceModels.get(name) ?? [])].sort(),\n }))\n .sort((first, second) => first.name.localeCompare(second.name));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region ../../packages/core/src/tooling/inspect/collect-packages.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Import a package the way the APP resolves it, so inspect reads the same
|
|
4
|
+
* module instance (and registry) the app's own modules populated. Resolves to
|
|
5
|
+
* `undefined` when the app does not have the package.
|
|
6
|
+
*/
|
|
7
|
+
type AppModuleImporter = (specifier: string) => Promise<unknown>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { AppModuleImporter };
|
|
10
|
+
//# sourceMappingURL=collect-packages.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-packages.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/inspect/collect-packages.ts"],"mappings":";AAgBA;;;;AAA8D;AAA9D,KAAY,iBAAA,IAAqB,SAAA,aAAsB,OAAO"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { resolve as resolve$1 } from "import-meta-resolve";
|
|
5
|
+
|
|
6
|
+
//#region ../../packages/core/src/tooling/inspect/collect-packages.ts
|
|
7
|
+
/** The default {@link AppModuleImporter}: resolve from `<cwd>/package.json`, then import. */
|
|
8
|
+
function createAppModuleImporter(cwd) {
|
|
9
|
+
return async (specifier) => {
|
|
10
|
+
let url;
|
|
11
|
+
try {
|
|
12
|
+
url = resolve$1(specifier, pathToFileURL(path.join(cwd, "package.json")).href);
|
|
13
|
+
} catch {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
return import(url);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function readJson(file) {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
22
|
+
} catch {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function stringField(value, key) {
|
|
27
|
+
if (typeof value !== "object" || value === null) return null;
|
|
28
|
+
const field = Reflect.get(value, key);
|
|
29
|
+
return typeof field === "string" ? field : null;
|
|
30
|
+
}
|
|
31
|
+
/** The app's own `name` and `version`. */
|
|
32
|
+
function readAppPackage(cwd) {
|
|
33
|
+
const manifest = readJson(path.join(cwd, "package.json"));
|
|
34
|
+
return {
|
|
35
|
+
name: stringField(manifest, "name"),
|
|
36
|
+
version: stringField(manifest, "version")
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Every `@warlock.js/*` package installed at the app root, with its version. */
|
|
40
|
+
function collectPackages(cwd) {
|
|
41
|
+
const scope = path.join(cwd, "node_modules", "@warlock.js");
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = readdirSync(scope);
|
|
45
|
+
} catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const packages = [];
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
const manifest = readJson(path.join(scope, entry, "package.json"));
|
|
51
|
+
const name = stringField(manifest, "name");
|
|
52
|
+
const version = stringField(manifest, "version");
|
|
53
|
+
if (name && version) packages.push({
|
|
54
|
+
name,
|
|
55
|
+
version
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return packages.sort((first, second) => first.name.localeCompare(second.name));
|
|
59
|
+
}
|
|
60
|
+
function errorMessage(error) {
|
|
61
|
+
return error instanceof Error ? error.message : String(error);
|
|
62
|
+
}
|
|
63
|
+
function numberOrNull(value) {
|
|
64
|
+
return typeof value === "number" ? value : null;
|
|
65
|
+
}
|
|
66
|
+
function retentionOf(value) {
|
|
67
|
+
return typeof value === "boolean" || typeof value === "number" ? value : null;
|
|
68
|
+
}
|
|
69
|
+
function backoffOf(value) {
|
|
70
|
+
if (typeof value === "number") return value;
|
|
71
|
+
if (typeof value === "object" && value !== null) {
|
|
72
|
+
const type = Reflect.get(value, "type");
|
|
73
|
+
const delay = Reflect.get(value, "delay");
|
|
74
|
+
if (typeof type === "string" && typeof delay === "number") return {
|
|
75
|
+
type,
|
|
76
|
+
delay
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The jobs `defineJob()` registered, read from the app's `@warlock.js/queue`
|
|
83
|
+
* (`registeredJobs()` / `queueOf()`). Empty when the app has no queue package.
|
|
84
|
+
*/
|
|
85
|
+
async function collectJobs(importFromApp, warnings) {
|
|
86
|
+
let queue;
|
|
87
|
+
try {
|
|
88
|
+
queue = await importFromApp("@warlock.js/queue");
|
|
89
|
+
} catch (error) {
|
|
90
|
+
warnings.push({
|
|
91
|
+
code: null,
|
|
92
|
+
message: `@warlock.js/queue could not be loaded: ${errorMessage(error)}`,
|
|
93
|
+
source: "jobs"
|
|
94
|
+
});
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
if (typeof queue !== "object" || queue === null) return [];
|
|
98
|
+
const registered = Reflect.get(queue, "registeredJobs");
|
|
99
|
+
const queueOf = Reflect.get(queue, "queueOf");
|
|
100
|
+
if (typeof registered !== "function") return [];
|
|
101
|
+
const jobs = registered();
|
|
102
|
+
if (!Array.isArray(jobs)) return [];
|
|
103
|
+
return jobs.filter((job) => typeof job === "object" && job !== null).map((job) => {
|
|
104
|
+
const queueName = typeof queueOf === "function" ? queueOf(job) : Reflect.get(job, "queue");
|
|
105
|
+
return {
|
|
106
|
+
name: stringField(job, "name") ?? "anonymous",
|
|
107
|
+
queue: typeof queueName === "string" ? queueName : "default",
|
|
108
|
+
attempts: numberOrNull(Reflect.get(job, "attempts")),
|
|
109
|
+
backoff: backoffOf(Reflect.get(job, "backoff")),
|
|
110
|
+
removeOnComplete: retentionOf(Reflect.get(job, "removeOnComplete")),
|
|
111
|
+
removeOnFail: retentionOf(Reflect.get(job, "removeOnFail"))
|
|
112
|
+
};
|
|
113
|
+
}).sort((first, second) => first.name.localeCompare(second.name));
|
|
114
|
+
}
|
|
115
|
+
function isoOrNull(value) {
|
|
116
|
+
if (typeof value !== "object" || value === null) return null;
|
|
117
|
+
const toISOString = Reflect.get(value, "toISOString");
|
|
118
|
+
if (typeof toISOString !== "function") return null;
|
|
119
|
+
const iso = toISOString.call(value);
|
|
120
|
+
return typeof iso === "string" ? iso : null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The tasks on the app's `@warlock.js/scheduler` scheduler (`scheduler.list()`):
|
|
124
|
+
* name, cron expression, interval settings and next run. Empty when absent.
|
|
125
|
+
*/
|
|
126
|
+
async function collectSchedules(importFromApp, warnings) {
|
|
127
|
+
let module;
|
|
128
|
+
try {
|
|
129
|
+
module = await importFromApp("@warlock.js/scheduler");
|
|
130
|
+
} catch (error) {
|
|
131
|
+
warnings.push({
|
|
132
|
+
code: null,
|
|
133
|
+
message: `@warlock.js/scheduler could not be loaded: ${errorMessage(error)}`,
|
|
134
|
+
source: "schedules"
|
|
135
|
+
});
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
if (typeof module !== "object" || module === null) return [];
|
|
139
|
+
const scheduler = Reflect.get(module, "scheduler");
|
|
140
|
+
const list = typeof scheduler === "object" && scheduler !== null ? Reflect.get(scheduler, "list") : void 0;
|
|
141
|
+
if (typeof list !== "function") return [];
|
|
142
|
+
const tasks = list.call(scheduler);
|
|
143
|
+
if (!Array.isArray(tasks)) return [];
|
|
144
|
+
return tasks.filter((task) => typeof task === "object" && task !== null).map((task) => {
|
|
145
|
+
const intervals = Reflect.get(task, "intervals");
|
|
146
|
+
return {
|
|
147
|
+
name: stringField(task, "name") ?? "anonymous",
|
|
148
|
+
cron: stringField(task, "cronExpression"),
|
|
149
|
+
intervals: typeof intervals === "object" && intervals !== null ? Object.fromEntries(Object.entries(intervals)) : {},
|
|
150
|
+
nextRun: isoOrNull(Reflect.get(task, "nextRun"))
|
|
151
|
+
};
|
|
152
|
+
}).sort((first, second) => first.name.localeCompare(second.name));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
//#endregion
|
|
156
|
+
export { collectJobs, collectPackages, collectSchedules, createAppModuleImporter, readAppPackage };
|
|
157
|
+
//# sourceMappingURL=collect-packages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-packages.mjs","names":["resolveModule"],"sources":["../../../../../../../../../packages/core/src/tooling/inspect/collect-packages.ts"],"sourcesContent":["import { readdirSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolve as resolveModule } from \"import-meta-resolve\";\nimport type {\n InspectJob,\n InspectPackage,\n InspectSchedule,\n InspectWarning,\n} from \"./inspect-report.types\";\n\n/**\n * Import a package the way the APP resolves it, so inspect reads the same\n * module instance (and registry) the app's own modules populated. Resolves to\n * `undefined` when the app does not have the package.\n */\nexport type AppModuleImporter = (specifier: string) => Promise<unknown>;\n\n/** The default {@link AppModuleImporter}: resolve from `<cwd>/package.json`, then import. */\nexport function createAppModuleImporter(cwd: string): AppModuleImporter {\n return async (specifier) => {\n let url: string;\n\n try {\n url = resolveModule(specifier, pathToFileURL(path.join(cwd, \"package.json\")).href);\n } catch {\n return undefined;\n }\n\n return import(url);\n };\n}\n\nfunction readJson(file: string): unknown {\n try {\n return JSON.parse(readFileSync(file, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\nfunction stringField(value: unknown, key: string): string | null {\n if (typeof value !== \"object\" || value === null) return null;\n\n const field = Reflect.get(value, key);\n\n return typeof field === \"string\" ? field : null;\n}\n\n/** The app's own `name` and `version`. */\nexport function readAppPackage(cwd: string): { name: string | null; version: string | null } {\n const manifest = readJson(path.join(cwd, \"package.json\"));\n\n return { name: stringField(manifest, \"name\"), version: stringField(manifest, \"version\") };\n}\n\n/** Every `@warlock.js/*` package installed at the app root, with its version. */\nexport function collectPackages(cwd: string): InspectPackage[] {\n const scope = path.join(cwd, \"node_modules\", \"@warlock.js\");\n let entries: string[];\n\n try {\n entries = readdirSync(scope);\n } catch {\n return [];\n }\n\n const packages: InspectPackage[] = [];\n\n for (const entry of entries) {\n const manifest = readJson(path.join(scope, entry, \"package.json\"));\n const name = stringField(manifest, \"name\");\n const version = stringField(manifest, \"version\");\n\n if (name && version) packages.push({ name, version });\n }\n\n return packages.sort((first, second) => first.name.localeCompare(second.name));\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" ? value : null;\n}\n\nfunction retentionOf(value: unknown): boolean | number | null {\n return typeof value === \"boolean\" || typeof value === \"number\" ? value : null;\n}\n\nfunction backoffOf(value: unknown): InspectJob[\"backoff\"] {\n if (typeof value === \"number\") return value;\n\n if (typeof value === \"object\" && value !== null) {\n const type = Reflect.get(value, \"type\");\n const delay = Reflect.get(value, \"delay\");\n\n if (typeof type === \"string\" && typeof delay === \"number\") return { type, delay };\n }\n\n return null;\n}\n\n/**\n * The jobs `defineJob()` registered, read from the app's `@warlock.js/queue`\n * (`registeredJobs()` / `queueOf()`). Empty when the app has no queue package.\n */\nexport async function collectJobs(\n importFromApp: AppModuleImporter,\n warnings: InspectWarning[],\n): Promise<InspectJob[]> {\n let queue: unknown;\n\n try {\n queue = await importFromApp(\"@warlock.js/queue\");\n } catch (error) {\n warnings.push({\n code: null,\n message: `@warlock.js/queue could not be loaded: ${errorMessage(error)}`,\n source: \"jobs\",\n });\n return [];\n }\n\n if (typeof queue !== \"object\" || queue === null) return [];\n\n const registered = Reflect.get(queue, \"registeredJobs\");\n const queueOf = Reflect.get(queue, \"queueOf\");\n\n if (typeof registered !== \"function\") return [];\n\n const jobs: unknown = registered();\n\n if (!Array.isArray(jobs)) return [];\n\n return jobs\n .filter((job): job is object => typeof job === \"object\" && job !== null)\n .map((job) => {\n const queueName: unknown =\n typeof queueOf === \"function\" ? queueOf(job) : Reflect.get(job, \"queue\");\n\n return {\n name: stringField(job, \"name\") ?? \"anonymous\",\n queue: typeof queueName === \"string\" ? queueName : \"default\",\n attempts: numberOrNull(Reflect.get(job, \"attempts\")),\n backoff: backoffOf(Reflect.get(job, \"backoff\")),\n removeOnComplete: retentionOf(Reflect.get(job, \"removeOnComplete\")),\n removeOnFail: retentionOf(Reflect.get(job, \"removeOnFail\")),\n };\n })\n .sort((first, second) => first.name.localeCompare(second.name));\n}\n\nfunction isoOrNull(value: unknown): string | null {\n if (typeof value !== \"object\" || value === null) return null;\n\n const toISOString = Reflect.get(value, \"toISOString\");\n\n if (typeof toISOString !== \"function\") return null;\n\n const iso: unknown = toISOString.call(value);\n\n return typeof iso === \"string\" ? iso : null;\n}\n\n/**\n * The tasks on the app's `@warlock.js/scheduler` scheduler (`scheduler.list()`):\n * name, cron expression, interval settings and next run. Empty when absent.\n */\nexport async function collectSchedules(\n importFromApp: AppModuleImporter,\n warnings: InspectWarning[],\n): Promise<InspectSchedule[]> {\n let module: unknown;\n\n try {\n module = await importFromApp(\"@warlock.js/scheduler\");\n } catch (error) {\n warnings.push({\n code: null,\n message: `@warlock.js/scheduler could not be loaded: ${errorMessage(error)}`,\n source: \"schedules\",\n });\n return [];\n }\n\n if (typeof module !== \"object\" || module === null) return [];\n\n const scheduler: unknown = Reflect.get(module, \"scheduler\");\n const list =\n typeof scheduler === \"object\" && scheduler !== null\n ? Reflect.get(scheduler, \"list\")\n : undefined;\n\n if (typeof list !== \"function\") return [];\n\n const tasks: unknown = list.call(scheduler);\n\n if (!Array.isArray(tasks)) return [];\n\n return tasks\n .filter((task): task is object => typeof task === \"object\" && task !== null)\n .map((task) => {\n const intervals: unknown = Reflect.get(task, \"intervals\");\n\n return {\n name: stringField(task, \"name\") ?? \"anonymous\",\n cron: stringField(task, \"cronExpression\"),\n intervals:\n typeof intervals === \"object\" && intervals !== null\n ? Object.fromEntries(Object.entries(intervals))\n : {},\n nextRun: isoOrNull(Reflect.get(task, \"nextRun\")),\n };\n })\n .sort((first, second) => first.name.localeCompare(second.name));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { connectorsManager } from "../../connectors/connectors-manager.mjs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import ts from "typescript";
|
|
5
|
+
|
|
6
|
+
//#region ../../packages/core/src/tooling/inspect/collect-pages.ts
|
|
7
|
+
function isInstalledPage(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && typeof Reflect.get(value, "path") === "string" && typeof Reflect.get(value, "file") === "string";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The pages the `web` connector installed, read through its public
|
|
12
|
+
* `getInstalledPages()` without importing `@warlock.js/web`. `undefined` when
|
|
13
|
+
* no such connector is registered (an API-only app).
|
|
14
|
+
*/
|
|
15
|
+
function installedPagesFromConnectors() {
|
|
16
|
+
const web = connectorsManager.list().find((connector) => connector.name === "web");
|
|
17
|
+
const read = web ? Reflect.get(web, "getInstalledPages") : void 0;
|
|
18
|
+
if (typeof read !== "function") return void 0;
|
|
19
|
+
const pages = read.call(web);
|
|
20
|
+
return Array.isArray(pages) ? pages : void 0;
|
|
21
|
+
}
|
|
22
|
+
function toPosix(file) {
|
|
23
|
+
return file.split(path.sep).join("/");
|
|
24
|
+
}
|
|
25
|
+
function relativeTo(cwd, file) {
|
|
26
|
+
return toPosix(path.isAbsolute(file) ? path.relative(cwd, file) : file);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The page's layout chain, outermost first: every `layout.tsx` from the web
|
|
30
|
+
* root (the nearest ancestor holding `root.tsx`, else `src/`) down to the
|
|
31
|
+
* page's own directory — the rule `@warlock.js/web` applies.
|
|
32
|
+
*/
|
|
33
|
+
function layoutChainOf(pageFile, cwd) {
|
|
34
|
+
const srcRoot = path.join(cwd, "src");
|
|
35
|
+
const directories = [];
|
|
36
|
+
let current = path.dirname(pageFile);
|
|
37
|
+
while (current.startsWith(srcRoot)) {
|
|
38
|
+
directories.unshift(current);
|
|
39
|
+
if (existsSync(path.join(current, "root.tsx")) || current === srcRoot) break;
|
|
40
|
+
const parent = path.dirname(current);
|
|
41
|
+
if (parent === current) break;
|
|
42
|
+
current = parent;
|
|
43
|
+
}
|
|
44
|
+
return directories.map((directory) => path.join(directory, "layout.tsx")).filter((candidate) => existsSync(candidate));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether a module's source exports a binding named `name`, read with the
|
|
48
|
+
* TypeScript parser (the page files are TSX that Node cannot import directly).
|
|
49
|
+
*/
|
|
50
|
+
function exportsName(file, name) {
|
|
51
|
+
let source;
|
|
52
|
+
try {
|
|
53
|
+
source = readFileSync(file, "utf8");
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const sourceFile = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, false, ts.ScriptKind.TSX);
|
|
58
|
+
for (const statement of sourceFile.statements) {
|
|
59
|
+
const exported = ts.canHaveModifiers(statement) ? (ts.getModifiers(statement) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) : false;
|
|
60
|
+
if (exported && ts.isVariableStatement(statement)) {
|
|
61
|
+
if (statement.declarationList.declarations.some((declaration) => ts.isIdentifier(declaration.name) && declaration.name.text === name)) return true;
|
|
62
|
+
}
|
|
63
|
+
if (exported && ts.isFunctionDeclaration(statement) && statement.name?.text === name) return true;
|
|
64
|
+
if (ts.isExportDeclaration(statement) && statement.exportClause && ts.isNamedExports(statement.exportClause) && statement.exportClause.elements.some((element) => element.name.text === name)) return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Describe the installed pages: route path and name, page file, layout chain,
|
|
70
|
+
* the files on that chain exporting a `loader`, actions and guard.
|
|
71
|
+
*
|
|
72
|
+
* @param pages The connector's installed page records; see {@link installedPagesFromConnectors}.
|
|
73
|
+
*/
|
|
74
|
+
function collectPages(pages, cwd, warnings) {
|
|
75
|
+
if (!pages) return [];
|
|
76
|
+
const collected = [];
|
|
77
|
+
for (const page of pages) {
|
|
78
|
+
if (!isInstalledPage(page)) {
|
|
79
|
+
warnings.push({
|
|
80
|
+
code: null,
|
|
81
|
+
message: "A page record has no path or file.",
|
|
82
|
+
source: "pages"
|
|
83
|
+
});
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const pageFile = path.isAbsolute(page.file) ? page.file : path.join(cwd, page.file);
|
|
87
|
+
const layouts = layoutChainOf(pageFile, cwd);
|
|
88
|
+
const loaders = [...layouts, pageFile].filter((file) => exportsName(file, "loader"));
|
|
89
|
+
const actions = Array.isArray(page.actions) ? page.actions.filter((action) => typeof action === "string") : [];
|
|
90
|
+
collected.push({
|
|
91
|
+
path: page.path,
|
|
92
|
+
name: typeof page.name === "string" && page.name.length > 0 ? page.name : null,
|
|
93
|
+
file: relativeTo(cwd, pageFile),
|
|
94
|
+
layouts: layouts.map((file) => relativeTo(cwd, file)),
|
|
95
|
+
loaders: loaders.map((file) => relativeTo(cwd, file)),
|
|
96
|
+
actions: [...actions].sort(),
|
|
97
|
+
guard: typeof page.guard === "string" ? page.guard : null
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return collected.sort((first, second) => {
|
|
101
|
+
if (first.path !== second.path) return first.path < second.path ? -1 : 1;
|
|
102
|
+
return first.file.localeCompare(second.file);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { collectPages, installedPagesFromConnectors };
|
|
108
|
+
//# sourceMappingURL=collect-pages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-pages.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/inspect/collect-pages.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport ts from \"typescript\";\nimport { connectorsManager } from \"../../connectors/connectors-manager\";\nimport type { InspectPage, InspectWarning } from \"./inspect-report.types\";\n\n/** The fields of `@warlock.js/web`'s installed page record that inspect reads. */\ntype InstalledPageLike = {\n path: string;\n name?: unknown;\n file: string;\n actions?: unknown;\n guard?: unknown;\n};\n\nfunction isInstalledPage(value: unknown): value is InstalledPageLike {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof Reflect.get(value, \"path\") === \"string\" &&\n typeof Reflect.get(value, \"file\") === \"string\"\n );\n}\n\n/**\n * The pages the `web` connector installed, read through its public\n * `getInstalledPages()` without importing `@warlock.js/web`. `undefined` when\n * no such connector is registered (an API-only app).\n */\nexport function installedPagesFromConnectors(): unknown[] | undefined {\n const web = connectorsManager.list().find((connector) => connector.name === \"web\");\n const read = web ? Reflect.get(web, \"getInstalledPages\") : undefined;\n\n if (typeof read !== \"function\") return undefined;\n\n const pages: unknown = read.call(web);\n\n return Array.isArray(pages) ? pages : undefined;\n}\n\nfunction toPosix(file: string): string {\n return file.split(path.sep).join(\"/\");\n}\n\nfunction relativeTo(cwd: string, file: string): string {\n return toPosix(path.isAbsolute(file) ? path.relative(cwd, file) : file);\n}\n\n/**\n * The page's layout chain, outermost first: every `layout.tsx` from the web\n * root (the nearest ancestor holding `root.tsx`, else `src/`) down to the\n * page's own directory — the rule `@warlock.js/web` applies.\n */\nexport function layoutChainOf(pageFile: string, cwd: string): string[] {\n const srcRoot = path.join(cwd, \"src\");\n const directories: string[] = [];\n let current = path.dirname(pageFile);\n\n while (current.startsWith(srcRoot)) {\n directories.unshift(current);\n\n if (existsSync(path.join(current, \"root.tsx\")) || current === srcRoot) break;\n\n const parent = path.dirname(current);\n\n if (parent === current) break;\n\n current = parent;\n }\n\n return directories\n .map((directory) => path.join(directory, \"layout.tsx\"))\n .filter((candidate) => existsSync(candidate));\n}\n\n/**\n * Whether a module's source exports a binding named `name`, read with the\n * TypeScript parser (the page files are TSX that Node cannot import directly).\n */\nexport function exportsName(file: string, name: string): boolean {\n let source: string;\n\n try {\n source = readFileSync(file, \"utf8\");\n } catch {\n return false;\n }\n\n const sourceFile = ts.createSourceFile(\n file,\n source,\n ts.ScriptTarget.Latest,\n false,\n ts.ScriptKind.TSX,\n );\n\n for (const statement of sourceFile.statements) {\n const exported = ts.canHaveModifiers(statement)\n ? (ts.getModifiers(statement) ?? []).some(\n (modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword,\n )\n : false;\n\n if (exported && ts.isVariableStatement(statement)) {\n if (\n statement.declarationList.declarations.some(\n (declaration) => ts.isIdentifier(declaration.name) && declaration.name.text === name,\n )\n ) {\n return true;\n }\n }\n\n if (exported && ts.isFunctionDeclaration(statement) && statement.name?.text === name) {\n return true;\n }\n\n if (\n ts.isExportDeclaration(statement) &&\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some((element) => element.name.text === name)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Describe the installed pages: route path and name, page file, layout chain,\n * the files on that chain exporting a `loader`, actions and guard.\n *\n * @param pages The connector's installed page records; see {@link installedPagesFromConnectors}.\n */\nexport function collectPages(\n pages: readonly unknown[] | undefined,\n cwd: string,\n warnings: InspectWarning[],\n): InspectPage[] {\n if (!pages) return [];\n\n const collected: InspectPage[] = [];\n\n for (const page of pages) {\n if (!isInstalledPage(page)) {\n warnings.push({ code: null, message: \"A page record has no path or file.\", source: \"pages\" });\n continue;\n }\n\n const pageFile = path.isAbsolute(page.file) ? page.file : path.join(cwd, page.file);\n const layouts = layoutChainOf(pageFile, cwd);\n const loaders = [...layouts, pageFile].filter((file) => exportsName(file, \"loader\"));\n const actions = Array.isArray(page.actions)\n ? page.actions.filter((action): action is string => typeof action === \"string\")\n : [];\n\n collected.push({\n path: page.path,\n name: typeof page.name === \"string\" && page.name.length > 0 ? page.name : null,\n file: relativeTo(cwd, pageFile),\n layouts: layouts.map((file) => relativeTo(cwd, file)),\n loaders: loaders.map((file) => relativeTo(cwd, file)),\n actions: [...actions].sort(),\n guard: typeof page.guard === \"string\" ? page.guard : null,\n });\n }\n\n return collected.sort((first, second) => {\n if (first.path !== second.path) return first.path < second.path ? -1 : 1;\n\n return first.file.localeCompare(second.file);\n });\n}\n"],"mappings":"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"}
|