codesift-mcp 0.3.0 → 0.4.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/README.md +143 -20
- package/dist/cache/hono-cache.d.ts +50 -0
- package/dist/cache/hono-cache.d.ts.map +1 -0
- package/dist/cache/hono-cache.js +132 -0
- package/dist/cache/hono-cache.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +17 -2
- package/dist/cli/setup.js.map +1 -1
- package/dist/formatters-shortening.d.ts +13 -0
- package/dist/formatters-shortening.d.ts.map +1 -1
- package/dist/formatters-shortening.js +131 -0
- package/dist/formatters-shortening.js.map +1 -1
- package/dist/formatters.d.ts +38 -0
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +498 -0
- package/dist/formatters.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +27 -26
- package/dist/instructions.js.map +1 -1
- package/dist/lsp/lsp-servers.d.ts.map +1 -1
- package/dist/lsp/lsp-servers.js +5 -0
- package/dist/lsp/lsp-servers.js.map +1 -1
- package/dist/lsp/lsp-tools.d.ts.map +1 -1
- package/dist/lsp/lsp-tools.js +1 -0
- package/dist/lsp/lsp-tools.js.map +1 -1
- package/dist/parser/astro-template.d.ts +47 -0
- package/dist/parser/astro-template.d.ts.map +1 -0
- package/dist/parser/astro-template.js +171 -0
- package/dist/parser/astro-template.js.map +1 -0
- package/dist/parser/extractors/_shared.d.ts +4 -0
- package/dist/parser/extractors/_shared.d.ts.map +1 -1
- package/dist/parser/extractors/_shared.js +8 -0
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/astro.d.ts +4 -5
- package/dist/parser/extractors/astro.d.ts.map +1 -1
- package/dist/parser/extractors/astro.js +102 -26
- package/dist/parser/extractors/astro.js.map +1 -1
- package/dist/parser/extractors/gradle-kts.d.ts +4 -0
- package/dist/parser/extractors/gradle-kts.d.ts.map +1 -0
- package/dist/parser/extractors/gradle-kts.js +246 -0
- package/dist/parser/extractors/gradle-kts.js.map +1 -0
- package/dist/parser/extractors/hono-inline-analyzer.d.ts +34 -0
- package/dist/parser/extractors/hono-inline-analyzer.d.ts.map +1 -0
- package/dist/parser/extractors/hono-inline-analyzer.js +465 -0
- package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -0
- package/dist/parser/extractors/hono-model.d.ts +196 -0
- package/dist/parser/extractors/hono-model.d.ts.map +1 -0
- package/dist/parser/extractors/hono-model.js +10 -0
- package/dist/parser/extractors/hono-model.js.map +1 -0
- package/dist/parser/extractors/hono.d.ts +118 -0
- package/dist/parser/extractors/hono.d.ts.map +1 -0
- package/dist/parser/extractors/hono.js +1527 -0
- package/dist/parser/extractors/hono.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts +4 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin.js +521 -0
- package/dist/parser/extractors/kotlin.js.map +1 -0
- package/dist/parser/extractors/php.d.ts +22 -0
- package/dist/parser/extractors/php.d.ts.map +1 -0
- package/dist/parser/extractors/php.js +326 -0
- package/dist/parser/extractors/php.js.map +1 -0
- package/dist/parser/extractors/python.d.ts.map +1 -1
- package/dist/parser/extractors/python.js +234 -11
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/sql.d.ts +33 -0
- package/dist/parser/extractors/sql.d.ts.map +1 -0
- package/dist/parser/extractors/sql.js +506 -0
- package/dist/parser/extractors/sql.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +166 -3
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/dist/parser/languages/tree-sitter-kotlin.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php_only.wasm +0 -0
- package/dist/parser/languages/tree-sitter-python.wasm +0 -0
- package/dist/parser/parser-manager.d.ts +32 -0
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +82 -3
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js +16 -0
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/register-tools.d.ts +37 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +2657 -191
- package/dist/register-tools.js.map +1 -1
- package/dist/search/reranker.js +1 -1
- package/dist/search/reranker.js.map +1 -1
- package/dist/server-helpers.d.ts.map +1 -1
- package/dist/server-helpers.js +11 -0
- package/dist/server-helpers.js.map +1 -1
- package/dist/server.js +28 -1
- package/dist/server.js.map +1 -1
- package/dist/storage/index-store.d.ts +15 -1
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +27 -1
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/session-state.d.ts +1 -1
- package/dist/storage/session-state.d.ts.map +1 -1
- package/dist/storage/session-state.js +6 -4
- package/dist/storage/session-state.js.map +1 -1
- package/dist/tools/agent-config-tools.d.ts +24 -0
- package/dist/tools/agent-config-tools.d.ts.map +1 -0
- package/dist/tools/agent-config-tools.js +119 -0
- package/dist/tools/agent-config-tools.js.map +1 -0
- package/dist/tools/architecture-tools.d.ts +23 -0
- package/dist/tools/architecture-tools.d.ts.map +1 -0
- package/dist/tools/architecture-tools.js +140 -0
- package/dist/tools/architecture-tools.js.map +1 -0
- package/dist/tools/astro-config.d.ts +33 -0
- package/dist/tools/astro-config.d.ts.map +1 -0
- package/dist/tools/astro-config.js +260 -0
- package/dist/tools/astro-config.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +61 -0
- package/dist/tools/astro-islands.d.ts.map +1 -0
- package/dist/tools/astro-islands.js +240 -0
- package/dist/tools/astro-islands.js.map +1 -0
- package/dist/tools/astro-routes.d.ts +49 -0
- package/dist/tools/astro-routes.d.ts.map +1 -0
- package/dist/tools/astro-routes.js +119 -0
- package/dist/tools/astro-routes.js.map +1 -0
- package/dist/tools/audit-tools.d.ts +38 -0
- package/dist/tools/audit-tools.d.ts.map +1 -0
- package/dist/tools/audit-tools.js +248 -0
- package/dist/tools/audit-tools.js.map +1 -0
- package/dist/tools/celery-tools.d.ts +38 -0
- package/dist/tools/celery-tools.d.ts.map +1 -0
- package/dist/tools/celery-tools.js +154 -0
- package/dist/tools/celery-tools.js.map +1 -0
- package/dist/tools/clone-tools.js +1 -1
- package/dist/tools/clone-tools.js.map +1 -1
- package/dist/tools/complexity-tools.d.ts +4 -0
- package/dist/tools/complexity-tools.d.ts.map +1 -1
- package/dist/tools/complexity-tools.js +78 -4
- package/dist/tools/complexity-tools.js.map +1 -1
- package/dist/tools/compose-tools.d.ts +60 -0
- package/dist/tools/compose-tools.d.ts.map +1 -0
- package/dist/tools/compose-tools.js +203 -0
- package/dist/tools/compose-tools.js.map +1 -0
- package/dist/tools/coupling-tools.d.ts +50 -0
- package/dist/tools/coupling-tools.d.ts.map +1 -0
- package/dist/tools/coupling-tools.js +262 -0
- package/dist/tools/coupling-tools.js.map +1 -0
- package/dist/tools/dependency-audit-tools.d.ts +65 -0
- package/dist/tools/dependency-audit-tools.d.ts.map +1 -0
- package/dist/tools/dependency-audit-tools.js +553 -0
- package/dist/tools/dependency-audit-tools.js.map +1 -0
- package/dist/tools/django-settings.d.ts +22 -0
- package/dist/tools/django-settings.d.ts.map +1 -0
- package/dist/tools/django-settings.js +301 -0
- package/dist/tools/django-settings.js.map +1 -0
- package/dist/tools/frequency-tools.js +1 -1
- package/dist/tools/frequency-tools.js.map +1 -1
- package/dist/tools/graph-tools.d.ts +8 -2
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +44 -3
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/hilt-tools.d.ts +55 -0
- package/dist/tools/hilt-tools.d.ts.map +1 -0
- package/dist/tools/hilt-tools.js +258 -0
- package/dist/tools/hilt-tools.js.map +1 -0
- package/dist/tools/hono-analyze-app.d.ts +48 -0
- package/dist/tools/hono-analyze-app.d.ts.map +1 -0
- package/dist/tools/hono-analyze-app.js +102 -0
- package/dist/tools/hono-analyze-app.js.map +1 -0
- package/dist/tools/hono-api-contract.d.ts +22 -0
- package/dist/tools/hono-api-contract.d.ts.map +1 -0
- package/dist/tools/hono-api-contract.js +80 -0
- package/dist/tools/hono-api-contract.js.map +1 -0
- package/dist/tools/hono-conditional-middleware.d.ts +27 -0
- package/dist/tools/hono-conditional-middleware.d.ts.map +1 -0
- package/dist/tools/hono-conditional-middleware.js +62 -0
- package/dist/tools/hono-conditional-middleware.js.map +1 -0
- package/dist/tools/hono-context-flow.d.ts +24 -0
- package/dist/tools/hono-context-flow.d.ts.map +1 -0
- package/dist/tools/hono-context-flow.js +78 -0
- package/dist/tools/hono-context-flow.js.map +1 -0
- package/dist/tools/hono-dead-routes.d.ts +26 -0
- package/dist/tools/hono-dead-routes.d.ts.map +1 -0
- package/dist/tools/hono-dead-routes.js +109 -0
- package/dist/tools/hono-dead-routes.js.map +1 -0
- package/dist/tools/hono-env-regression.d.ts +29 -0
- package/dist/tools/hono-env-regression.d.ts.map +1 -0
- package/dist/tools/hono-env-regression.js +157 -0
- package/dist/tools/hono-env-regression.js.map +1 -0
- package/dist/tools/hono-inline-analyze.d.ts +31 -0
- package/dist/tools/hono-inline-analyze.d.ts.map +1 -0
- package/dist/tools/hono-inline-analyze.js +67 -0
- package/dist/tools/hono-inline-analyze.js.map +1 -0
- package/dist/tools/hono-middleware-chain.d.ts +22 -0
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
- package/dist/tools/hono-middleware-chain.js +84 -0
- package/dist/tools/hono-middleware-chain.js.map +1 -0
- package/dist/tools/hono-modules.d.ts +22 -0
- package/dist/tools/hono-modules.d.ts.map +1 -0
- package/dist/tools/hono-modules.js +126 -0
- package/dist/tools/hono-modules.js.map +1 -0
- package/dist/tools/hono-response-types.d.ts +37 -0
- package/dist/tools/hono-response-types.d.ts.map +1 -0
- package/dist/tools/hono-response-types.js +84 -0
- package/dist/tools/hono-response-types.js.map +1 -0
- package/dist/tools/hono-rpc-types.d.ts +21 -0
- package/dist/tools/hono-rpc-types.d.ts.map +1 -0
- package/dist/tools/hono-rpc-types.js +57 -0
- package/dist/tools/hono-rpc-types.js.map +1 -0
- package/dist/tools/hono-security.d.ts +21 -0
- package/dist/tools/hono-security.d.ts.map +1 -0
- package/dist/tools/hono-security.js +98 -0
- package/dist/tools/hono-security.js.map +1 -0
- package/dist/tools/hono-visualize.d.ts +13 -0
- package/dist/tools/hono-visualize.d.ts.map +1 -0
- package/dist/tools/hono-visualize.js +72 -0
- package/dist/tools/hono-visualize.js.map +1 -0
- package/dist/tools/hotspot-tools.d.ts.map +1 -1
- package/dist/tools/hotspot-tools.js +9 -7
- package/dist/tools/hotspot-tools.js.map +1 -1
- package/dist/tools/index-tools.d.ts +17 -0
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +210 -10
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/kotlin-tools.d.ts +142 -0
- package/dist/tools/kotlin-tools.d.ts.map +1 -0
- package/dist/tools/kotlin-tools.js +572 -0
- package/dist/tools/kotlin-tools.js.map +1 -0
- package/dist/tools/legacy-hono-conventions.d.ts +14 -0
- package/dist/tools/legacy-hono-conventions.d.ts.map +1 -0
- package/dist/tools/legacy-hono-conventions.js +152 -0
- package/dist/tools/legacy-hono-conventions.js.map +1 -0
- package/dist/tools/migration-lint-tools.d.ts +26 -0
- package/dist/tools/migration-lint-tools.d.ts.map +1 -0
- package/dist/tools/migration-lint-tools.js +247 -0
- package/dist/tools/migration-lint-tools.js.map +1 -0
- package/dist/tools/model-tools.d.ts +30 -0
- package/dist/tools/model-tools.d.ts.map +1 -0
- package/dist/tools/model-tools.js +145 -0
- package/dist/tools/model-tools.js.map +1 -0
- package/dist/tools/nest-ext-tools.d.ts +92 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools.js +359 -0
- package/dist/tools/nest-ext-tools.js.map +1 -0
- package/dist/tools/nest-tools.d.ts +171 -0
- package/dist/tools/nest-tools.d.ts.map +1 -0
- package/dist/tools/nest-tools.js +1042 -0
- package/dist/tools/nest-tools.js.map +1 -0
- package/dist/tools/nextjs-api-contract-readers.d.ts +14 -0
- package/dist/tools/nextjs-api-contract-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-api-contract-readers.js +204 -0
- package/dist/tools/nextjs-api-contract-readers.js.map +1 -0
- package/dist/tools/nextjs-api-contract-tools.d.ts +57 -0
- package/dist/tools/nextjs-api-contract-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-api-contract-tools.js +144 -0
- package/dist/tools/nextjs-api-contract-tools.js.map +1 -0
- package/dist/tools/nextjs-boundary-tools.d.ts +39 -0
- package/dist/tools/nextjs-boundary-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-boundary-tools.js +152 -0
- package/dist/tools/nextjs-boundary-tools.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +121 -0
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-component-tools.js +460 -0
- package/dist/tools/nextjs-component-tools.js.map +1 -0
- package/dist/tools/nextjs-data-flow-tools.d.ts +42 -0
- package/dist/tools/nextjs-data-flow-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-data-flow-tools.js +158 -0
- package/dist/tools/nextjs-data-flow-tools.js.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts +37 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.js +211 -0
- package/dist/tools/nextjs-framework-audit-tools.js.map +1 -0
- package/dist/tools/nextjs-link-tools.d.ts +41 -0
- package/dist/tools/nextjs-link-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-link-tools.js +157 -0
- package/dist/tools/nextjs-link-tools.js.map +1 -0
- package/dist/tools/nextjs-metadata-tools.d.ts +74 -0
- package/dist/tools/nextjs-metadata-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-metadata-tools.js +252 -0
- package/dist/tools/nextjs-metadata-tools.js.map +1 -0
- package/dist/tools/nextjs-middleware-coverage-tools.d.ts +41 -0
- package/dist/tools/nextjs-middleware-coverage-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-middleware-coverage-tools.js +88 -0
- package/dist/tools/nextjs-middleware-coverage-tools.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +100 -0
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-route-tools.js +493 -0
- package/dist/tools/nextjs-route-tools.js.map +1 -0
- package/dist/tools/nextjs-security-readers.d.ts +22 -0
- package/dist/tools/nextjs-security-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-security-readers.js +318 -0
- package/dist/tools/nextjs-security-readers.js.map +1 -0
- package/dist/tools/nextjs-security-scoring.d.ts +15 -0
- package/dist/tools/nextjs-security-scoring.d.ts.map +1 -0
- package/dist/tools/nextjs-security-scoring.js +65 -0
- package/dist/tools/nextjs-security-scoring.js.map +1 -0
- package/dist/tools/nextjs-security-tools.d.ts +75 -0
- package/dist/tools/nextjs-security-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-security-tools.js +153 -0
- package/dist/tools/nextjs-security-tools.js.map +1 -0
- package/dist/tools/nextjs-tools.d.ts +15 -0
- package/dist/tools/nextjs-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-tools.js +15 -0
- package/dist/tools/nextjs-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts.map +1 -1
- package/dist/tools/outline-tools.js +20 -0
- package/dist/tools/outline-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts +8 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +561 -3
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/perf-tools.d.ts +32 -0
- package/dist/tools/perf-tools.d.ts.map +1 -0
- package/dist/tools/perf-tools.js +227 -0
- package/dist/tools/perf-tools.js.map +1 -0
- package/dist/tools/php-tools.d.ts +176 -0
- package/dist/tools/php-tools.d.ts.map +1 -0
- package/dist/tools/php-tools.js +543 -0
- package/dist/tools/php-tools.js.map +1 -0
- package/dist/tools/prisma-schema-tools.d.ts +44 -0
- package/dist/tools/prisma-schema-tools.d.ts.map +1 -0
- package/dist/tools/prisma-schema-tools.js +358 -0
- package/dist/tools/prisma-schema-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +115 -6
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +594 -217
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pyproject-tools.d.ts +23 -0
- package/dist/tools/pyproject-tools.d.ts.map +1 -0
- package/dist/tools/pyproject-tools.js +133 -0
- package/dist/tools/pyproject-tools.js.map +1 -0
- package/dist/tools/pytest-tools.d.ts +20 -0
- package/dist/tools/pytest-tools.d.ts.map +1 -0
- package/dist/tools/pytest-tools.js +106 -0
- package/dist/tools/pytest-tools.js.map +1 -0
- package/dist/tools/python-callers.d.ts +28 -0
- package/dist/tools/python-callers.d.ts.map +1 -0
- package/dist/tools/python-callers.js +110 -0
- package/dist/tools/python-callers.js.map +1 -0
- package/dist/tools/python-circular-imports.d.ts +19 -0
- package/dist/tools/python-circular-imports.d.ts.map +1 -0
- package/dist/tools/python-circular-imports.js +126 -0
- package/dist/tools/python-circular-imports.js.map +1 -0
- package/dist/tools/python-deps-analyzer.d.ts +46 -0
- package/dist/tools/python-deps-analyzer.d.ts.map +1 -0
- package/dist/tools/python-deps-analyzer.js +227 -0
- package/dist/tools/python-deps-analyzer.js.map +1 -0
- package/dist/tools/query-tools.d.ts +23 -0
- package/dist/tools/query-tools.d.ts.map +1 -0
- package/dist/tools/query-tools.js +256 -0
- package/dist/tools/query-tools.js.map +1 -0
- package/dist/tools/react-tools.d.ts +218 -0
- package/dist/tools/react-tools.d.ts.map +1 -0
- package/dist/tools/react-tools.js +714 -0
- package/dist/tools/react-tools.js.map +1 -0
- package/dist/tools/report-tools.js +47 -0
- package/dist/tools/report-tools.js.map +1 -1
- package/dist/tools/review-diff-tools.d.ts +2 -6
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +51 -66
- package/dist/tools/review-diff-tools.js.map +1 -1
- package/dist/tools/room-tools.d.ts +36 -0
- package/dist/tools/room-tools.d.ts.map +1 -0
- package/dist/tools/room-tools.js +147 -0
- package/dist/tools/room-tools.js.map +1 -0
- package/dist/tools/route-tools.d.ts +27 -1
- package/dist/tools/route-tools.d.ts.map +1 -1
- package/dist/tools/route-tools.js +744 -18
- package/dist/tools/route-tools.js.map +1 -1
- package/dist/tools/ruff-tools.d.ts +32 -0
- package/dist/tools/ruff-tools.d.ts.map +1 -0
- package/dist/tools/ruff-tools.js +114 -0
- package/dist/tools/ruff-tools.js.map +1 -0
- package/dist/tools/search-ranker.d.ts.map +1 -1
- package/dist/tools/search-ranker.js +7 -0
- package/dist/tools/search-ranker.js.map +1 -1
- package/dist/tools/serialization-tools.d.ts +24 -0
- package/dist/tools/serialization-tools.d.ts.map +1 -0
- package/dist/tools/serialization-tools.js +156 -0
- package/dist/tools/serialization-tools.js.map +1 -0
- package/dist/tools/sql-tools.d.ts +234 -0
- package/dist/tools/sql-tools.d.ts.map +1 -0
- package/dist/tools/sql-tools.js +1037 -0
- package/dist/tools/sql-tools.js.map +1 -0
- package/dist/tools/status-tools.d.ts +10 -0
- package/dist/tools/status-tools.d.ts.map +1 -0
- package/dist/tools/status-tools.js +32 -0
- package/dist/tools/status-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +19 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +78 -4
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/test-impact-tools.d.ts +29 -0
- package/dist/tools/test-impact-tools.d.ts.map +1 -0
- package/dist/tools/test-impact-tools.js +156 -0
- package/dist/tools/test-impact-tools.js.map +1 -0
- package/dist/tools/typecheck-tools.d.ts +39 -0
- package/dist/tools/typecheck-tools.d.ts.map +1 -0
- package/dist/tools/typecheck-tools.js +191 -0
- package/dist/tools/typecheck-tools.js.map +1 -0
- package/dist/tools/wiring-tools.d.ts +19 -0
- package/dist/tools/wiring-tools.d.ts.map +1 -0
- package/dist/tools/wiring-tools.js +147 -0
- package/dist/tools/wiring-tools.js.map +1 -0
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/framework-detect.d.ts +18 -2
- package/dist/utils/framework-detect.d.ts.map +1 -1
- package/dist/utils/framework-detect.js +150 -3
- package/dist/utils/framework-detect.js.map +1 -1
- package/dist/utils/import-graph.d.ts +36 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +212 -9
- package/dist/utils/import-graph.js.map +1 -1
- package/dist/utils/language-detect.d.ts +21 -0
- package/dist/utils/language-detect.d.ts.map +1 -0
- package/dist/utils/language-detect.js +183 -0
- package/dist/utils/language-detect.js.map +1 -0
- package/dist/utils/nextjs-ast-readers.d.ts +44 -0
- package/dist/utils/nextjs-ast-readers.d.ts.map +1 -0
- package/dist/utils/nextjs-ast-readers.js +341 -0
- package/dist/utils/nextjs-ast-readers.js.map +1 -0
- package/dist/utils/nextjs-audit-cache.d.ts +51 -0
- package/dist/utils/nextjs-audit-cache.d.ts.map +1 -0
- package/dist/utils/nextjs-audit-cache.js +116 -0
- package/dist/utils/nextjs-audit-cache.js.map +1 -0
- package/dist/utils/nextjs-metadata-readers.d.ts +65 -0
- package/dist/utils/nextjs-metadata-readers.d.ts.map +1 -0
- package/dist/utils/nextjs-metadata-readers.js +447 -0
- package/dist/utils/nextjs-metadata-readers.js.map +1 -0
- package/dist/utils/nextjs.d.ts +42 -0
- package/dist/utils/nextjs.d.ts.map +1 -0
- package/dist/utils/nextjs.js +284 -0
- package/dist/utils/nextjs.js.map +1 -0
- package/dist/utils/python-import-resolver.d.ts +42 -0
- package/dist/utils/python-import-resolver.d.ts.map +1 -0
- package/dist/utils/python-import-resolver.js +101 -0
- package/dist/utils/python-import-resolver.js.map +1 -0
- package/dist/utils/python-imports.d.ts +28 -0
- package/dist/utils/python-imports.d.ts.map +1 -0
- package/dist/utils/python-imports.js +117 -0
- package/dist/utils/python-imports.js.map +1 -0
- package/dist/utils/react-alias.d.ts +15 -0
- package/dist/utils/react-alias.d.ts.map +1 -0
- package/dist/utils/react-alias.js +31 -0
- package/dist/utils/react-alias.js.map +1 -0
- package/dist/utils/test-file.d.ts.map +1 -1
- package/dist/utils/test-file.js +7 -0
- package/dist/utils/test-file.js.map +1 -1
- package/dist/utils/walk.d.ts +22 -0
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js +70 -2
- package/dist/utils/walk.js.map +1 -1
- package/package.json +3 -2
- package/rules/codesift.md +33 -5
- package/rules/codesift.mdc +33 -5
- package/rules/codex.md +33 -5
- package/rules/gemini.md +33 -5
- package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/src/parser/languages/tree-sitter-kotlin.wasm +0 -0
- package/src/parser/languages/tree-sitter-php.wasm +0 -0
- package/src/parser/languages/tree-sitter-php_only.wasm +0 -0
- package/src/parser/languages/tree-sitter-python.wasm +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Maximum bytes to read when scanning for a directive. */
|
|
2
|
+
export declare const DIRECTIVE_WINDOW = 512;
|
|
3
|
+
/**
|
|
4
|
+
* Scan a file's first 512 bytes for a `"use client"` or `"use server"` directive.
|
|
5
|
+
* Returns the directive string or `null` if not found.
|
|
6
|
+
*/
|
|
7
|
+
export declare function scanDirective(filePath: string): Promise<"use client" | "use server" | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Derive a URL path from a file path relative to the repo root.
|
|
10
|
+
* Handles App Router route groups, dynamic segments, and Pages Router conventions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function deriveUrlPath(filePath: string, router: "app" | "pages"): string;
|
|
13
|
+
/**
|
|
14
|
+
* Discover Next.js workspaces in a monorepo by finding `next.config.*` files.
|
|
15
|
+
* Returns empty array for single-app projects (config at root only) or no config.
|
|
16
|
+
*/
|
|
17
|
+
export declare function discoverWorkspaces(repoRoot: string): Promise<{
|
|
18
|
+
root: string;
|
|
19
|
+
configFile: string;
|
|
20
|
+
}[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Walk up from `filePath` through ancestor directories collecting layout files.
|
|
23
|
+
* Returns relative paths from root to leaf order. Stops at the `app/` boundary.
|
|
24
|
+
* If `filePath` is itself a layout, it is excluded from the chain.
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeLayoutChain(filePath: string, repoRoot: string): Promise<string[]>;
|
|
27
|
+
export interface MiddlewareTraceResult {
|
|
28
|
+
file: string;
|
|
29
|
+
matchers: string[];
|
|
30
|
+
applies: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Find and analyze middleware.ts for the given repo root.
|
|
34
|
+
* Returns null if no middleware file exists.
|
|
35
|
+
* Uses tree-sitter AST to extract matcher config.
|
|
36
|
+
*/
|
|
37
|
+
export declare function traceMiddleware(repoRoot: string, urlPath: string): Promise<MiddlewareTraceResult | null>;
|
|
38
|
+
export { parseMetadataExport, extractFetchCalls } from "./nextjs-metadata-readers.js";
|
|
39
|
+
export type { MetadataFields, FetchCall, FetchCallee } from "./nextjs-metadata-readers.js";
|
|
40
|
+
export { extractZodSchema, extractLinkHrefs } from "./nextjs-ast-readers.js";
|
|
41
|
+
export type { ZodShape, ZodFieldType, LinkRef, LinkRefKind } from "./nextjs-ast-readers.js";
|
|
42
|
+
//# sourceMappingURL=nextjs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/utils/nextjs.ts"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAmCpC;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC,CAU7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CA0B/E;AAKD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAgCjD;AAID;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB;AA2BD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAsFvC;AAGD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { readFile, readdir, access } from "node:fs/promises";
|
|
2
|
+
import { join, dirname, relative, basename } from "node:path";
|
|
3
|
+
import picomatch from "picomatch";
|
|
4
|
+
import { parseFile } from "../parser/parser-manager.js";
|
|
5
|
+
/** Maximum bytes to read when scanning for a directive. */
|
|
6
|
+
export const DIRECTIVE_WINDOW = 512;
|
|
7
|
+
/**
|
|
8
|
+
* Strip BOM, shebangs, single-line comments, and block comments
|
|
9
|
+
* from the beginning of source text.
|
|
10
|
+
*/
|
|
11
|
+
function stripBomAndComments(text) {
|
|
12
|
+
let s = text;
|
|
13
|
+
// Strip BOM
|
|
14
|
+
if (s.charCodeAt(0) === 0xfeff)
|
|
15
|
+
s = s.slice(1);
|
|
16
|
+
// Strip shebang
|
|
17
|
+
if (s.startsWith("#!")) {
|
|
18
|
+
const nl = s.indexOf("\n");
|
|
19
|
+
s = nl >= 0 ? s.slice(nl + 1) : "";
|
|
20
|
+
}
|
|
21
|
+
// Iteratively strip leading comments
|
|
22
|
+
let changed = true;
|
|
23
|
+
while (changed) {
|
|
24
|
+
changed = false;
|
|
25
|
+
s = s.trimStart();
|
|
26
|
+
if (s.startsWith("//")) {
|
|
27
|
+
const nl = s.indexOf("\n");
|
|
28
|
+
s = nl >= 0 ? s.slice(nl + 1) : "";
|
|
29
|
+
changed = true;
|
|
30
|
+
}
|
|
31
|
+
else if (s.startsWith("/*")) {
|
|
32
|
+
const end = s.indexOf("*/");
|
|
33
|
+
if (end >= 0) {
|
|
34
|
+
s = s.slice(end + 2);
|
|
35
|
+
changed = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return s;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scan a file's first 512 bytes for a `"use client"` or `"use server"` directive.
|
|
43
|
+
* Returns the directive string or `null` if not found.
|
|
44
|
+
*/
|
|
45
|
+
export async function scanDirective(filePath) {
|
|
46
|
+
try {
|
|
47
|
+
const buf = await readFile(filePath, { encoding: "utf8", flag: "r" });
|
|
48
|
+
const head = buf.slice(0, DIRECTIVE_WINDOW);
|
|
49
|
+
const stripped = stripBomAndComments(head);
|
|
50
|
+
const match = stripped.match(/^\s*["'`](use (?:client|server))["'`]\s*;?/);
|
|
51
|
+
return match ? match[1] : null;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Derive a URL path from a file path relative to the repo root.
|
|
59
|
+
* Handles App Router route groups, dynamic segments, and Pages Router conventions.
|
|
60
|
+
*/
|
|
61
|
+
export function deriveUrlPath(filePath, router) {
|
|
62
|
+
let p = filePath;
|
|
63
|
+
// Strip leading src/ if present
|
|
64
|
+
if (p.startsWith("src/"))
|
|
65
|
+
p = p.slice(4);
|
|
66
|
+
if (router === "app") {
|
|
67
|
+
// Strip app/ prefix
|
|
68
|
+
p = p.replace(/^app\//, "");
|
|
69
|
+
// Strip convention file at end (page.tsx, layout.tsx, route.ts, etc.)
|
|
70
|
+
p = p.replace(/\/?(page|layout|route|loading|error|not-found|global-error|default|template)\.[jt]sx?$/, "");
|
|
71
|
+
// Strip route groups like (auth)
|
|
72
|
+
p = p.replace(/\([^)]+\)\/?/g, "");
|
|
73
|
+
// Clean up trailing slash
|
|
74
|
+
p = p.replace(/\/+$/, "");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Pages Router: strip pages/ prefix and file extension
|
|
78
|
+
p = p.replace(/^pages\//, "");
|
|
79
|
+
p = p.replace(/\.[jt]sx?$/, "");
|
|
80
|
+
// Strip index at end
|
|
81
|
+
if (p === "index" || p.endsWith("/index")) {
|
|
82
|
+
p = p.replace(/\/?index$/, "");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return p ? `/${p}` : "/";
|
|
86
|
+
}
|
|
87
|
+
const NEXT_CONFIG_RE = /^next\.config\.(js|mjs|cjs|ts)$/;
|
|
88
|
+
const SKIP_DIRS = new Set(["node_modules", ".git", "dist", ".next", "build"]);
|
|
89
|
+
/**
|
|
90
|
+
* Discover Next.js workspaces in a monorepo by finding `next.config.*` files.
|
|
91
|
+
* Returns empty array for single-app projects (config at root only) or no config.
|
|
92
|
+
*/
|
|
93
|
+
export async function discoverWorkspaces(repoRoot) {
|
|
94
|
+
const results = [];
|
|
95
|
+
async function scan(dir, depth) {
|
|
96
|
+
if (depth > 3)
|
|
97
|
+
return;
|
|
98
|
+
let entries;
|
|
99
|
+
try {
|
|
100
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
for (const entry of entries) {
|
|
106
|
+
if (entry.isDirectory()) {
|
|
107
|
+
if (SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))
|
|
108
|
+
continue;
|
|
109
|
+
await scan(join(dir, entry.name), depth + 1);
|
|
110
|
+
}
|
|
111
|
+
else if (entry.isFile() && NEXT_CONFIG_RE.test(entry.name)) {
|
|
112
|
+
results.push({
|
|
113
|
+
root: dir,
|
|
114
|
+
configFile: join(dir, entry.name),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
await scan(repoRoot, 0);
|
|
120
|
+
// Single config at root = not a monorepo
|
|
121
|
+
if (results.length === 1 && results[0].root === repoRoot) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
const LAYOUT_EXTENSIONS = ["tsx", "jsx", "ts", "js"];
|
|
127
|
+
/**
|
|
128
|
+
* Walk up from `filePath` through ancestor directories collecting layout files.
|
|
129
|
+
* Returns relative paths from root to leaf order. Stops at the `app/` boundary.
|
|
130
|
+
* If `filePath` is itself a layout, it is excluded from the chain.
|
|
131
|
+
*/
|
|
132
|
+
export async function computeLayoutChain(filePath, repoRoot) {
|
|
133
|
+
const chain = [];
|
|
134
|
+
const rel = filePath.startsWith("/") ? relative(repoRoot, filePath) : filePath;
|
|
135
|
+
const segments = rel.split("/");
|
|
136
|
+
// Find the app/ boundary index
|
|
137
|
+
const appIdx = segments.indexOf("app");
|
|
138
|
+
if (appIdx < 0)
|
|
139
|
+
return [];
|
|
140
|
+
// Walk from app/ directory down to the parent of the target file
|
|
141
|
+
// Skip the file's own directory if the file itself is a layout
|
|
142
|
+
const targetBasename = basename(rel);
|
|
143
|
+
const isLayout = /^layout\.[jt]sx?$/.test(targetBasename);
|
|
144
|
+
const targetDir = dirname(rel);
|
|
145
|
+
// Build paths from app/ to target's parent directory
|
|
146
|
+
for (let i = appIdx; i < segments.length - 1; i++) {
|
|
147
|
+
const dirPath = segments.slice(0, i + 1).join("/");
|
|
148
|
+
// If the target is a layout, skip its own directory
|
|
149
|
+
if (isLayout && dirPath === targetDir)
|
|
150
|
+
continue;
|
|
151
|
+
for (const ext of LAYOUT_EXTENSIONS) {
|
|
152
|
+
const layoutPath = join(dirPath, `layout.${ext}`);
|
|
153
|
+
const absPath = join(repoRoot, layoutPath);
|
|
154
|
+
try {
|
|
155
|
+
await access(absPath);
|
|
156
|
+
chain.push(layoutPath);
|
|
157
|
+
break; // Found a layout in this directory, move to next
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// No layout with this extension
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return chain;
|
|
165
|
+
}
|
|
166
|
+
/** Candidate middleware file paths relative to repo root. */
|
|
167
|
+
const MIDDLEWARE_CANDIDATES = [
|
|
168
|
+
"middleware.ts", "middleware.js",
|
|
169
|
+
"src/middleware.ts", "src/middleware.js",
|
|
170
|
+
];
|
|
171
|
+
/**
|
|
172
|
+
* Convert a Next.js matcher pattern to a picomatch-compatible glob.
|
|
173
|
+
* Next.js uses `:path*` syntax; picomatch uses `**`.
|
|
174
|
+
*/
|
|
175
|
+
function matcherToGlob(pattern) {
|
|
176
|
+
return pattern.replace(/:[\w]+\*/g, "**").replace(/:[\w]+/g, "*");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a URL path matches any of the provided Next.js matcher patterns.
|
|
180
|
+
*/
|
|
181
|
+
function matchesMatcher(patterns, urlPath) {
|
|
182
|
+
if (patterns.length === 0)
|
|
183
|
+
return true; // No matcher = match all
|
|
184
|
+
return patterns.some((p) => {
|
|
185
|
+
const glob = matcherToGlob(p);
|
|
186
|
+
return picomatch.isMatch(urlPath, glob);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Find and analyze middleware.ts for the given repo root.
|
|
191
|
+
* Returns null if no middleware file exists.
|
|
192
|
+
* Uses tree-sitter AST to extract matcher config.
|
|
193
|
+
*/
|
|
194
|
+
export async function traceMiddleware(repoRoot, urlPath) {
|
|
195
|
+
// Find middleware file
|
|
196
|
+
let mwFile = null;
|
|
197
|
+
let mwRelPath = null;
|
|
198
|
+
for (const candidate of MIDDLEWARE_CANDIDATES) {
|
|
199
|
+
const absPath = join(repoRoot, candidate);
|
|
200
|
+
try {
|
|
201
|
+
await access(absPath);
|
|
202
|
+
mwFile = absPath;
|
|
203
|
+
mwRelPath = candidate;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Not found
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (!mwFile || !mwRelPath)
|
|
211
|
+
return null;
|
|
212
|
+
// Parse the middleware file with tree-sitter
|
|
213
|
+
let source;
|
|
214
|
+
try {
|
|
215
|
+
source = await readFile(mwFile, "utf8");
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return { file: mwRelPath, matchers: [], applies: true };
|
|
219
|
+
}
|
|
220
|
+
const tree = await parseFile(mwFile, source);
|
|
221
|
+
if (!tree) {
|
|
222
|
+
return { file: mwRelPath, matchers: [], applies: true };
|
|
223
|
+
}
|
|
224
|
+
// Find `export const config = { matcher: ... }`
|
|
225
|
+
const exportStatements = tree.rootNode.descendantsOfType("export_statement");
|
|
226
|
+
let matchers = [];
|
|
227
|
+
let foundConfig = false;
|
|
228
|
+
for (const exportNode of exportStatements) {
|
|
229
|
+
const decl = exportNode.descendantsOfType("variable_declarator");
|
|
230
|
+
for (const d of decl) {
|
|
231
|
+
const nameNode = d.childForFieldName("name");
|
|
232
|
+
if (nameNode?.text !== "config")
|
|
233
|
+
continue;
|
|
234
|
+
foundConfig = true;
|
|
235
|
+
const init = d.childForFieldName("value");
|
|
236
|
+
if (!init)
|
|
237
|
+
continue;
|
|
238
|
+
// Find the `matcher` property inside the object
|
|
239
|
+
const pairs = init.descendantsOfType("pair");
|
|
240
|
+
for (const pair of pairs) {
|
|
241
|
+
const key = pair.childForFieldName("key");
|
|
242
|
+
if (key?.text !== "matcher")
|
|
243
|
+
continue;
|
|
244
|
+
const value = pair.childForFieldName("value");
|
|
245
|
+
if (!value)
|
|
246
|
+
continue;
|
|
247
|
+
if (value.type === "string") {
|
|
248
|
+
// Single string matcher
|
|
249
|
+
const text = value.text.slice(1, -1); // Remove quotes
|
|
250
|
+
matchers = [text];
|
|
251
|
+
}
|
|
252
|
+
else if (value.type === "array") {
|
|
253
|
+
// Array of matchers
|
|
254
|
+
const elements = value.namedChildren;
|
|
255
|
+
for (const el of elements) {
|
|
256
|
+
if (el.type === "string") {
|
|
257
|
+
matchers.push(el.text.slice(1, -1));
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Non-literal element — fail-open
|
|
261
|
+
matchers = ["<computed>"];
|
|
262
|
+
return { file: mwRelPath, matchers, applies: true };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
// Computed matcher (identifier, call expression, etc.)
|
|
268
|
+
matchers = ["<computed>"];
|
|
269
|
+
return { file: mwRelPath, matchers, applies: true };
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (!foundConfig) {
|
|
275
|
+
// No config export → match all routes (Next.js default)
|
|
276
|
+
return { file: mwRelPath, matchers: [], applies: true };
|
|
277
|
+
}
|
|
278
|
+
const applies = matchesMatcher(matchers, urlPath);
|
|
279
|
+
return { file: mwRelPath, matchers, applies };
|
|
280
|
+
}
|
|
281
|
+
// Re-export AST readers for backward compatibility
|
|
282
|
+
export { parseMetadataExport, extractFetchCalls } from "./nextjs-metadata-readers.js";
|
|
283
|
+
export { extractZodSchema, extractLinkHrefs } from "./nextjs-ast-readers.js";
|
|
284
|
+
//# sourceMappingURL=nextjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/utils/nextjs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python import resolution — pure functions, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Relative imports (`from . import X`, `from ..pkg import Y`) via dot
|
|
6
|
+
* counting and package-root walking
|
|
7
|
+
* - Absolute imports (`import X`, `from X.Y import Z`) via index lookup
|
|
8
|
+
* with automatic `src/` layout detection
|
|
9
|
+
* - `.py` and `__init__.py` resolution
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Walk upward from a file to find the innermost package root.
|
|
13
|
+
* A "package" is a directory containing `__init__.py`. The package root is
|
|
14
|
+
* the innermost ancestor directory (including the file's own directory) that
|
|
15
|
+
* contains `__init__.py`.
|
|
16
|
+
*
|
|
17
|
+
* If no ancestor has `__init__.py`, returns the file's directory.
|
|
18
|
+
* If the file is at repo root, returns "".
|
|
19
|
+
*/
|
|
20
|
+
export declare function findPackageRoot(filePath: string, indexedFiles: Set<string>): string;
|
|
21
|
+
/**
|
|
22
|
+
* Detect if the project uses a `src/` layout (e.g., `src/myapp/__init__.py`).
|
|
23
|
+
* Returns the layout root name (`"src"`) or `null` if no src layout detected.
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectSrcLayout(indexedFiles: string[]): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a Python import to a file path in the indexed tree.
|
|
28
|
+
*
|
|
29
|
+
* Algorithm:
|
|
30
|
+
* - If `level > 0` (relative import): walk up `level - 1` dirs from the
|
|
31
|
+
* importing file's package root, then resolve the remaining dotted path
|
|
32
|
+
* - If `level === 0` (absolute import): try each search root + dotted path,
|
|
33
|
+
* resolving to `.py` first, then `/__init__.py`, then null
|
|
34
|
+
*
|
|
35
|
+
* Returns the resolved file path (relative to repo root) or `null` if the
|
|
36
|
+
* import cannot be resolved to an indexed file (stdlib, third-party, etc.).
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolvePythonImport(imp: {
|
|
39
|
+
module: string;
|
|
40
|
+
level: number;
|
|
41
|
+
}, importerFile: string, indexedFiles: string[] | Set<string>, srcLayout?: string | null): string | null;
|
|
42
|
+
//# sourceMappingURL=python-import-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-import-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/python-import-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAMrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACtC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,GAAG,IAAI,CAgCf"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python import resolution — pure functions, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Relative imports (`from . import X`, `from ..pkg import Y`) via dot
|
|
6
|
+
* counting and package-root walking
|
|
7
|
+
* - Absolute imports (`import X`, `from X.Y import Z`) via index lookup
|
|
8
|
+
* with automatic `src/` layout detection
|
|
9
|
+
* - `.py` and `__init__.py` resolution
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Walk upward from a file to find the innermost package root.
|
|
13
|
+
* A "package" is a directory containing `__init__.py`. The package root is
|
|
14
|
+
* the innermost ancestor directory (including the file's own directory) that
|
|
15
|
+
* contains `__init__.py`.
|
|
16
|
+
*
|
|
17
|
+
* If no ancestor has `__init__.py`, returns the file's directory.
|
|
18
|
+
* If the file is at repo root, returns "".
|
|
19
|
+
*/
|
|
20
|
+
export function findPackageRoot(filePath, indexedFiles) {
|
|
21
|
+
const segments = filePath.split("/");
|
|
22
|
+
segments.pop(); // remove filename
|
|
23
|
+
// Walk from deepest dir upward; return first dir with __init__.py
|
|
24
|
+
for (let i = segments.length; i >= 1; i--) {
|
|
25
|
+
const dir = segments.slice(0, i).join("/");
|
|
26
|
+
if (indexedFiles.has(`${dir}/__init__.py`)) {
|
|
27
|
+
return dir;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// No package found — return file's directory (or "" for repo root)
|
|
31
|
+
return segments.join("/");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Detect if the project uses a `src/` layout (e.g., `src/myapp/__init__.py`).
|
|
35
|
+
* Returns the layout root name (`"src"`) or `null` if no src layout detected.
|
|
36
|
+
*/
|
|
37
|
+
export function detectSrcLayout(indexedFiles) {
|
|
38
|
+
for (const f of indexedFiles) {
|
|
39
|
+
const match = f.match(/^src\/([^/]+)\/__init__\.py$/);
|
|
40
|
+
if (match)
|
|
41
|
+
return "src";
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a Python import to a file path in the indexed tree.
|
|
47
|
+
*
|
|
48
|
+
* Algorithm:
|
|
49
|
+
* - If `level > 0` (relative import): walk up `level - 1` dirs from the
|
|
50
|
+
* importing file's package root, then resolve the remaining dotted path
|
|
51
|
+
* - If `level === 0` (absolute import): try each search root + dotted path,
|
|
52
|
+
* resolving to `.py` first, then `/__init__.py`, then null
|
|
53
|
+
*
|
|
54
|
+
* Returns the resolved file path (relative to repo root) or `null` if the
|
|
55
|
+
* import cannot be resolved to an indexed file (stdlib, third-party, etc.).
|
|
56
|
+
*/
|
|
57
|
+
export function resolvePythonImport(imp, importerFile, indexedFiles, srcLayout) {
|
|
58
|
+
const fileSet = indexedFiles instanceof Set ? indexedFiles : new Set(indexedFiles);
|
|
59
|
+
const { module, level } = imp;
|
|
60
|
+
if (level > 0) {
|
|
61
|
+
// Relative import
|
|
62
|
+
const packageRoot = findPackageRoot(importerFile, fileSet);
|
|
63
|
+
const packageSegments = packageRoot === "" ? [] : packageRoot.split("/");
|
|
64
|
+
// Walk up (level - 1) directories from package root
|
|
65
|
+
if (level - 1 > packageSegments.length)
|
|
66
|
+
return null;
|
|
67
|
+
const baseSegments = packageSegments.slice(0, packageSegments.length - (level - 1));
|
|
68
|
+
const moduleSegments = module === "" ? [] : module.split(".");
|
|
69
|
+
const fullPath = [...baseSegments, ...moduleSegments].join("/");
|
|
70
|
+
return tryResolve(fullPath, fileSet);
|
|
71
|
+
}
|
|
72
|
+
// Absolute import — try repo root first, then src/ layout
|
|
73
|
+
const moduleSegments = module.split(".");
|
|
74
|
+
const resolvedSrcLayout = srcLayout !== undefined ? srcLayout : detectSrcLayout([...fileSet]);
|
|
75
|
+
const searchRoots = ["", resolvedSrcLayout].filter((r) => r !== null);
|
|
76
|
+
for (const root of searchRoots) {
|
|
77
|
+
const base = root === "" ? moduleSegments.join("/") : `${root}/${moduleSegments.join("/")}`;
|
|
78
|
+
const resolved = tryResolve(base, fileSet);
|
|
79
|
+
if (resolved)
|
|
80
|
+
return resolved;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Try to resolve a path to an indexed file.
|
|
86
|
+
* Tries `.py` first, then `/__init__.py`.
|
|
87
|
+
*/
|
|
88
|
+
function tryResolve(basePath, fileSet) {
|
|
89
|
+
if (basePath === "")
|
|
90
|
+
return null;
|
|
91
|
+
// Try direct .py file
|
|
92
|
+
const asPyFile = `${basePath}.py`;
|
|
93
|
+
if (fileSet.has(asPyFile))
|
|
94
|
+
return asPyFile;
|
|
95
|
+
// Try as package __init__.py
|
|
96
|
+
const asInit = `${basePath}/__init__.py`;
|
|
97
|
+
if (fileSet.has(asInit))
|
|
98
|
+
return asInit;
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=python-import-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-import-resolver.js","sourceRoot":"","sources":["../../src/utils/python-import-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python import extraction via tree-sitter AST.
|
|
3
|
+
*
|
|
4
|
+
* Walks `import_statement`, `import_from_statement`, and `if TYPE_CHECKING`
|
|
5
|
+
* blocks to produce a flat list of raw import descriptors. Resolution to
|
|
6
|
+
* file paths is the resolver's job (see python-import-resolver.ts).
|
|
7
|
+
*
|
|
8
|
+
* Because this uses the AST (not regex), string literals and comments
|
|
9
|
+
* cannot produce false positives.
|
|
10
|
+
*/
|
|
11
|
+
import type Parser from "web-tree-sitter";
|
|
12
|
+
export interface PythonImportRef {
|
|
13
|
+
/** Dotted module path (empty string for `from . import X`) */
|
|
14
|
+
module: string;
|
|
15
|
+
/** Number of leading dots on relative imports (0 = absolute) */
|
|
16
|
+
level: number;
|
|
17
|
+
/** True if inside `if TYPE_CHECKING:` block */
|
|
18
|
+
is_type_only: boolean;
|
|
19
|
+
/** True for `from X import *` */
|
|
20
|
+
is_star: boolean;
|
|
21
|
+
/** Original source text for debugging */
|
|
22
|
+
raw: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract all Python imports from a parsed tree-sitter tree.
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractPythonImports(tree: Parser.Tree): PythonImportRef[];
|
|
28
|
+
//# sourceMappingURL=python-imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-imports.d.ts","sourceRoot":"","sources":["../../src/utils/python-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,eAAe,EAAE,CAoGnB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract all Python imports from a parsed tree-sitter tree.
|
|
3
|
+
*/
|
|
4
|
+
export function extractPythonImports(tree) {
|
|
5
|
+
const imports = [];
|
|
6
|
+
function walk(node, inTypeChecking) {
|
|
7
|
+
switch (node.type) {
|
|
8
|
+
case "if_statement": {
|
|
9
|
+
// Detect `if TYPE_CHECKING:` or `if typing.TYPE_CHECKING:`
|
|
10
|
+
const condition = node.childForFieldName("condition");
|
|
11
|
+
const conditionText = condition?.text ?? "";
|
|
12
|
+
const isTypeCheck = /\bTYPE_CHECKING\b/.test(conditionText);
|
|
13
|
+
// Walk the consequence with type_only flag if this is a TYPE_CHECKING block
|
|
14
|
+
const consequence = node.childForFieldName("consequence");
|
|
15
|
+
if (consequence) {
|
|
16
|
+
walk(consequence, inTypeChecking || isTypeCheck);
|
|
17
|
+
}
|
|
18
|
+
// Walk elif / else clauses (named "alternative") without type_only.
|
|
19
|
+
// Compare by start index since node refs from childForFieldName are
|
|
20
|
+
// distinct JS objects from the namedChildren array.
|
|
21
|
+
const conditionStart = condition?.startIndex;
|
|
22
|
+
const consequenceStart = consequence?.startIndex;
|
|
23
|
+
for (const child of node.namedChildren) {
|
|
24
|
+
if (child.startIndex === conditionStart)
|
|
25
|
+
continue;
|
|
26
|
+
if (child.startIndex === consequenceStart)
|
|
27
|
+
continue;
|
|
28
|
+
walk(child, inTypeChecking);
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
case "import_statement": {
|
|
33
|
+
// `import a`, `import a.b`, `import a, b, c`
|
|
34
|
+
// Children are `dotted_name` or `aliased_import` nodes
|
|
35
|
+
for (const child of node.namedChildren) {
|
|
36
|
+
let moduleName = null;
|
|
37
|
+
if (child.type === "dotted_name") {
|
|
38
|
+
moduleName = child.text;
|
|
39
|
+
}
|
|
40
|
+
else if (child.type === "aliased_import") {
|
|
41
|
+
const name = child.childForFieldName("name");
|
|
42
|
+
moduleName = name?.text ?? null;
|
|
43
|
+
}
|
|
44
|
+
if (moduleName) {
|
|
45
|
+
imports.push({
|
|
46
|
+
module: moduleName,
|
|
47
|
+
level: 0,
|
|
48
|
+
is_type_only: inTypeChecking,
|
|
49
|
+
is_star: false,
|
|
50
|
+
raw: node.text,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
case "import_from_statement": {
|
|
57
|
+
// `from X import Y`, `from . import Y`, `from ..X import Y`, `from X import *`
|
|
58
|
+
const moduleNameNode = node.childForFieldName("module_name");
|
|
59
|
+
let level = 0;
|
|
60
|
+
let module = "";
|
|
61
|
+
if (moduleNameNode) {
|
|
62
|
+
if (moduleNameNode.type === "relative_import") {
|
|
63
|
+
// Count leading dots and find optional dotted_name
|
|
64
|
+
level = countRelativeDots(moduleNameNode);
|
|
65
|
+
const dottedName = moduleNameNode.namedChildren.find((c) => c.type === "dotted_name");
|
|
66
|
+
module = dottedName?.text ?? "";
|
|
67
|
+
}
|
|
68
|
+
else if (moduleNameNode.type === "dotted_name") {
|
|
69
|
+
module = moduleNameNode.text;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Detect wildcard_import `import *`
|
|
73
|
+
const is_star = node.namedChildren.some((c) => c.type === "wildcard_import");
|
|
74
|
+
imports.push({
|
|
75
|
+
module,
|
|
76
|
+
level,
|
|
77
|
+
is_type_only: inTypeChecking,
|
|
78
|
+
is_star,
|
|
79
|
+
raw: node.text,
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
default: {
|
|
84
|
+
for (const child of node.namedChildren) {
|
|
85
|
+
walk(child, inTypeChecking);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
walk(tree.rootNode, false);
|
|
92
|
+
return imports;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Count the leading dots in a `relative_import` node.
|
|
96
|
+
* The dots appear as unnamed `import_prefix` child node or as separate
|
|
97
|
+
* "." tokens depending on grammar version.
|
|
98
|
+
*/
|
|
99
|
+
function countRelativeDots(relImport) {
|
|
100
|
+
// Walk all children (named + unnamed); each "." token represents one level
|
|
101
|
+
let dots = 0;
|
|
102
|
+
for (let i = 0; i < relImport.childCount; i++) {
|
|
103
|
+
const child = relImport.child(i);
|
|
104
|
+
if (!child)
|
|
105
|
+
continue;
|
|
106
|
+
if (child.type === "import_prefix") {
|
|
107
|
+
// Some grammar versions expose dots as an import_prefix node;
|
|
108
|
+
// count dots in its text
|
|
109
|
+
dots += (child.text.match(/\./g) ?? []).length;
|
|
110
|
+
}
|
|
111
|
+
else if (child.type === ".") {
|
|
112
|
+
dots += 1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return dots;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=python-imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-imports.js","sourceRoot":"","sources":["../../src/utils/python-imports.ts"],"names":[],"mappings":"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"}
|