codesift-mcp 0.3.0 → 0.5.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 +215 -23
- 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/help.d.ts.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/platform.d.ts.map +1 -1
- package/dist/cli/platform.js +12 -14
- package/dist/cli/platform.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +27 -3
- 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 +521 -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 +39 -38
- 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 +334 -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 +209 -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/parse-cache.d.ts +39 -0
- package/dist/parser/parse-cache.d.ts.map +1 -0
- package/dist/parser/parse-cache.js +87 -0
- package/dist/parser/parse-cache.js.map +1 -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 +93 -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 +38 -2
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +2444 -195
- 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/search/tool-ranker.d.ts +90 -0
- package/dist/search/tool-ranker.d.ts.map +1 -0
- package/dist/search/tool-ranker.js +420 -0
- package/dist/search/tool-ranker.js.map +1 -0
- 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 +47 -14
- 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/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +4 -1
- package/dist/storage/usage-tracker.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-actions.d.ts +54 -0
- package/dist/tools/astro-actions.d.ts.map +1 -0
- package/dist/tools/astro-actions.js +561 -0
- package/dist/tools/astro-actions.js.map +1 -0
- package/dist/tools/astro-audit.d.ts +87 -0
- package/dist/tools/astro-audit.d.ts.map +1 -0
- package/dist/tools/astro-audit.js +345 -0
- package/dist/tools/astro-audit.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-content-collections.d.ts +44 -0
- package/dist/tools/astro-content-collections.d.ts.map +1 -0
- package/dist/tools/astro-content-collections.js +630 -0
- package/dist/tools/astro-content-collections.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +63 -0
- package/dist/tools/astro-islands.d.ts.map +1 -0
- package/dist/tools/astro-islands.js +255 -0
- package/dist/tools/astro-islands.js.map +1 -0
- package/dist/tools/astro-migration.d.ts +31 -0
- package/dist/tools/astro-migration.d.ts.map +1 -0
- package/dist/tools/astro-migration.js +378 -0
- package/dist/tools/astro-migration.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/async-correctness.d.ts +26 -0
- package/dist/tools/async-correctness.d.ts.map +1 -0
- package/dist/tools/async-correctness.js +166 -0
- package/dist/tools/async-correctness.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/django-view-security-tools.d.ts +32 -0
- package/dist/tools/django-view-security-tools.d.ts.map +1 -0
- package/dist/tools/django-view-security-tools.js +184 -0
- package/dist/tools/django-view-security-tools.js.map +1 -0
- package/dist/tools/fastapi-depends.d.ts +63 -0
- package/dist/tools/fastapi-depends.d.ts.map +1 -0
- package/dist/tools/fastapi-depends.js +191 -0
- package/dist/tools/fastapi-depends.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 +94 -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 +112 -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 +70 -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 +102 -0
- package/dist/tools/hono-dead-routes.js.map +1 -0
- package/dist/tools/hono-entry-resolver.d.ts +27 -0
- package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
- package/dist/tools/hono-entry-resolver.js +31 -0
- package/dist/tools/hono-entry-resolver.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 +59 -0
- package/dist/tools/hono-inline-analyze.js.map +1 -0
- package/dist/tools/hono-middleware-chain.d.ts +40 -0
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
- package/dist/tools/hono-middleware-chain.js +121 -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 +118 -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 +76 -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 +49 -0
- package/dist/tools/hono-rpc-types.js.map +1 -0
- package/dist/tools/hono-security.d.ts +31 -0
- package/dist/tools/hono-security.d.ts.map +1 -0
- package/dist/tools/hono-security.js +269 -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 +64 -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 +207 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -0
- package/dist/tools/nest-ext-tools.js +752 -0
- package/dist/tools/nest-ext-tools.js.map +1 -0
- package/dist/tools/nest-tools.d.ts +198 -0
- package/dist/tools/nest-tools.d.ts.map +1 -0
- package/dist/tools/nest-tools.js +1142 -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-readers.d.ts +101 -0
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-component-readers.js +287 -0
- package/dist/tools/nextjs-component-readers.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +51 -0
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-component-tools.js +212 -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 +60 -0
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-framework-audit-tools.js +394 -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-readers.d.ts +81 -0
- package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-route-readers.js +340 -0
- package/dist/tools/nextjs-route-readers.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +36 -0
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
- package/dist/tools/nextjs-route-tools.js +175 -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 +651 -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 +185 -0
- package/dist/tools/php-tools.d.ts.map +1 -0
- package/dist/tools/php-tools.js +645 -0
- package/dist/tools/php-tools.js.map +1 -0
- package/dist/tools/plan-turn-tools.d.ts +89 -0
- package/dist/tools/plan-turn-tools.d.ts.map +1 -0
- package/dist/tools/plan-turn-tools.js +508 -0
- package/dist/tools/plan-turn-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 +116 -7
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +595 -218
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pydantic-models.d.ts +46 -0
- package/dist/tools/pydantic-models.d.ts.map +1 -0
- package/dist/tools/pydantic-models.js +249 -0
- package/dist/tools/pydantic-models.js.map +1 -0
- 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-audit.d.ts +40 -0
- package/dist/tools/python-audit.d.ts.map +1 -0
- package/dist/tools/python-audit.js +244 -0
- package/dist/tools/python-audit.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-constants-tools.d.ts +44 -0
- package/dist/tools/python-constants-tools.d.ts.map +1 -0
- package/dist/tools/python-constants-tools.js +525 -0
- package/dist/tools/python-constants-tools.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 +263 -0
- package/dist/tools/react-tools.d.ts.map +1 -0
- package/dist/tools/react-tools.js +839 -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 +5 -4
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +157 -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/search-tools.d.ts +3 -2
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +16 -3
- package/dist/tools/search-tools.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 +274 -0
- package/dist/tools/sql-tools.d.ts.map +1 -0
- package/dist/tools/sql-tools.js +1160 -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 +75 -4
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint-tools.d.ts +43 -0
- package/dist/tools/taint-tools.d.ts.map +1 -0
- package/dist/tools/taint-tools.js +922 -0
- package/dist/tools/taint-tools.js.map +1 -0
- 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 +42 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +248 -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 +4 -3
- package/rules/codesift.md +71 -5
- package/rules/codesift.mdc +71 -5
- package/rules/codex.md +71 -5
- package/rules/gemini.md +71 -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,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route readers: AST-based route segment config extraction,
|
|
3
|
+
* rendering strategy classification, and single-file parsing.
|
|
4
|
+
*
|
|
5
|
+
* These readers are pure helpers with no orchestration logic. They are used by
|
|
6
|
+
* `nextjs-route-tools.ts` (orchestrator) and re-exported from it for backward
|
|
7
|
+
* compatibility with existing consumers and tests. Split follows the T2/T3
|
|
8
|
+
* reader + orchestrator precedent.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from "node:fs/promises";
|
|
11
|
+
import { relative, basename } from "node:path";
|
|
12
|
+
import { cachedParseFile as parseFile } from "../utils/nextjs-audit-cache.js";
|
|
13
|
+
import { computeLayoutChain, deriveUrlPath, extractFetchCalls, scanDirective, } from "../utils/nextjs.js";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Route segment config reader (AST initializer extraction)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const KNOWN_CONFIG_NAMES = new Set([
|
|
18
|
+
"dynamic",
|
|
19
|
+
"revalidate",
|
|
20
|
+
"runtime",
|
|
21
|
+
"fetchCache",
|
|
22
|
+
"preferredRegion",
|
|
23
|
+
"maxDuration",
|
|
24
|
+
"dynamicParams",
|
|
25
|
+
]);
|
|
26
|
+
const DYNAMIC_VALUES = new Set(["auto", "force-dynamic", "force-static", "error"]);
|
|
27
|
+
const RUNTIME_VALUES = new Set(["nodejs", "edge"]);
|
|
28
|
+
/**
|
|
29
|
+
* Read Next.js route segment config exports from an AST.
|
|
30
|
+
*
|
|
31
|
+
* Recognizes:
|
|
32
|
+
* export const dynamic = "force-dynamic"
|
|
33
|
+
* export const revalidate = 60 | false
|
|
34
|
+
* export const runtime = "edge"
|
|
35
|
+
* export async function generateStaticParams() {...}
|
|
36
|
+
*
|
|
37
|
+
* Non-literal initializers (Identifier, BinaryExpression, etc.) set a
|
|
38
|
+
* `_non_literal` flag and leave the corresponding value `undefined`.
|
|
39
|
+
*
|
|
40
|
+
* @internal exported for unit testing
|
|
41
|
+
*/
|
|
42
|
+
export function readRouteSegmentConfig(tree, _source) {
|
|
43
|
+
const config = { has_generate_static_params: false };
|
|
44
|
+
const root = tree.rootNode;
|
|
45
|
+
for (const exportNode of root.descendantsOfType("export_statement")) {
|
|
46
|
+
// `export const X = Y` → lexical_declaration > variable_declarator
|
|
47
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
48
|
+
const nameNode = decl.childForFieldName("name") ?? decl.namedChild(0);
|
|
49
|
+
if (nameNode?.type !== "identifier")
|
|
50
|
+
continue;
|
|
51
|
+
const name = nameNode.text;
|
|
52
|
+
if (!KNOWN_CONFIG_NAMES.has(name))
|
|
53
|
+
continue;
|
|
54
|
+
const value = decl.childForFieldName("value") ?? decl.namedChild(1);
|
|
55
|
+
if (!value)
|
|
56
|
+
continue;
|
|
57
|
+
readConfigValue(config, name, value);
|
|
58
|
+
}
|
|
59
|
+
// `export async function generateStaticParams() {...}` / `export function ...`
|
|
60
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
61
|
+
const nameNode = fn.childForFieldName("name") ?? fn.namedChild(0);
|
|
62
|
+
if (nameNode?.type === "identifier" && nameNode.text === "generateStaticParams") {
|
|
63
|
+
config.has_generate_static_params = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
function readConfigValue(config, name, value) {
|
|
70
|
+
// String literal
|
|
71
|
+
if (value.type === "string") {
|
|
72
|
+
const frag = value.namedChild(0);
|
|
73
|
+
const text = frag?.type === "string_fragment" ? frag.text : value.text.slice(1, -1);
|
|
74
|
+
if (name === "dynamic" && DYNAMIC_VALUES.has(text)) {
|
|
75
|
+
config.dynamic = text;
|
|
76
|
+
}
|
|
77
|
+
else if (name === "runtime" && RUNTIME_VALUES.has(text)) {
|
|
78
|
+
config.runtime = text;
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Number literal
|
|
83
|
+
if (value.type === "number") {
|
|
84
|
+
const num = parseFloat(value.text);
|
|
85
|
+
if (!Number.isNaN(num) && name === "revalidate") {
|
|
86
|
+
config.revalidate = num;
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Boolean false literal
|
|
91
|
+
if (value.type === "false") {
|
|
92
|
+
if (name === "revalidate")
|
|
93
|
+
config.revalidate = false;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (value.type === "true") {
|
|
97
|
+
// `revalidate = true` is not a valid Next.js value — ignore
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Any other initializer (Identifier, BinaryExpression, CallExpression, ...)
|
|
101
|
+
// is "non-literal". Flag it so callers know the value is unknowable at
|
|
102
|
+
// static-analysis time.
|
|
103
|
+
if (name === "dynamic")
|
|
104
|
+
config.dynamic_non_literal = true;
|
|
105
|
+
else if (name === "revalidate")
|
|
106
|
+
config.revalidate_non_literal = true;
|
|
107
|
+
else if (name === "runtime")
|
|
108
|
+
config.runtime_non_literal = true;
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Rendering strategy classification
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Map a route segment config (+ optional Pages Router signals) to a
|
|
115
|
+
* rendering strategy.
|
|
116
|
+
*
|
|
117
|
+
* Priority (App Router): runtime=edge > force-dynamic > force-static >
|
|
118
|
+
* revalidate > generateStaticParams > default (static).
|
|
119
|
+
*
|
|
120
|
+
* Pages Router: getServerSideProps → ssr; getStaticProps + revalidate → isr;
|
|
121
|
+
* getStaticProps → static; otherwise unknown.
|
|
122
|
+
*
|
|
123
|
+
* @internal exported for unit testing
|
|
124
|
+
*/
|
|
125
|
+
export function classifyRendering(config, router, pagesSignals) {
|
|
126
|
+
if (router === "pages") {
|
|
127
|
+
if (pagesSignals?.hasGetServerSideProps)
|
|
128
|
+
return "ssr";
|
|
129
|
+
if (pagesSignals?.hasGetStaticProps) {
|
|
130
|
+
return pagesSignals.hasRevalidateInReturn ? "isr" : "static";
|
|
131
|
+
}
|
|
132
|
+
return "unknown";
|
|
133
|
+
}
|
|
134
|
+
// App Router priority
|
|
135
|
+
if (config.runtime === "edge")
|
|
136
|
+
return "edge";
|
|
137
|
+
if (config.dynamic === "force-dynamic")
|
|
138
|
+
return "ssr";
|
|
139
|
+
if (config.dynamic === "force-static")
|
|
140
|
+
return "static";
|
|
141
|
+
if (typeof config.revalidate === "number" && config.revalidate > 0)
|
|
142
|
+
return "isr";
|
|
143
|
+
if (config.has_generate_static_params)
|
|
144
|
+
return "static";
|
|
145
|
+
// Next.js 15 default: static
|
|
146
|
+
return "static";
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// parseRouteFile — process a single route file into a NextjsRouteEntry
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
const HTTP_METHODS = new Set([
|
|
152
|
+
"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS",
|
|
153
|
+
]);
|
|
154
|
+
const APP_CONVENTION_TYPES = {
|
|
155
|
+
page: "page",
|
|
156
|
+
route: "route",
|
|
157
|
+
layout: "layout",
|
|
158
|
+
loading: "loading",
|
|
159
|
+
error: "error",
|
|
160
|
+
"not-found": "not-found",
|
|
161
|
+
"global-error": "global-error",
|
|
162
|
+
default: "default",
|
|
163
|
+
template: "template",
|
|
164
|
+
};
|
|
165
|
+
/** Derive a route file's `type` field from its path. */
|
|
166
|
+
function deriveRouteType(filePath, router) {
|
|
167
|
+
const name = basename(filePath).replace(/\.[jt]sx?$/, "");
|
|
168
|
+
if (router === "pages") {
|
|
169
|
+
if (name === "_app")
|
|
170
|
+
return "app";
|
|
171
|
+
if (name === "_document")
|
|
172
|
+
return "document";
|
|
173
|
+
if (name === "_error")
|
|
174
|
+
return "error_page";
|
|
175
|
+
// default for pages/ files: treat api/* as route, otherwise page
|
|
176
|
+
return filePath.includes("/api/") ? "route" : "page";
|
|
177
|
+
}
|
|
178
|
+
// App Router
|
|
179
|
+
if (filePath.includes("/@"))
|
|
180
|
+
return "parallel";
|
|
181
|
+
if (/\/\(\.{1,3}\)/.test(filePath))
|
|
182
|
+
return "intercepting";
|
|
183
|
+
return APP_CONVENTION_TYPES[name] ?? "page";
|
|
184
|
+
}
|
|
185
|
+
/** Detect Pages Router data-fetching signals via exported function/const names. */
|
|
186
|
+
function detectPagesRouterSignals(tree) {
|
|
187
|
+
const signals = {};
|
|
188
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
189
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
190
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
191
|
+
if (name === "getServerSideProps")
|
|
192
|
+
signals.hasGetServerSideProps = true;
|
|
193
|
+
if (name === "getStaticProps")
|
|
194
|
+
signals.hasGetStaticProps = true;
|
|
195
|
+
}
|
|
196
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
197
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
198
|
+
if (name === "getServerSideProps")
|
|
199
|
+
signals.hasGetServerSideProps = true;
|
|
200
|
+
if (name === "getStaticProps")
|
|
201
|
+
signals.hasGetStaticProps = true;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return signals;
|
|
205
|
+
}
|
|
206
|
+
/** Detect `export const metadata = {...}` or `export function generateMetadata`. */
|
|
207
|
+
function detectMetadataExport(tree) {
|
|
208
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
209
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
210
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
211
|
+
if (name === "metadata")
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
215
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
216
|
+
if (name === "generateMetadata")
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
/** Collect HTTP method names from top-level exports of a route.ts file. */
|
|
223
|
+
function extractHttpMethods(tree) {
|
|
224
|
+
const methods = new Set();
|
|
225
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
226
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
227
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
228
|
+
if (name && HTTP_METHODS.has(name))
|
|
229
|
+
methods.add(name);
|
|
230
|
+
}
|
|
231
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
232
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
233
|
+
if (name && HTTP_METHODS.has(name))
|
|
234
|
+
methods.add(name);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return [...methods];
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Process a single route file into a `NextjsRouteEntry`.
|
|
241
|
+
*
|
|
242
|
+
* @internal exported for unit testing
|
|
243
|
+
*/
|
|
244
|
+
export async function parseRouteFile(filePath, repoRoot, router) {
|
|
245
|
+
const relPath = relative(repoRoot, filePath);
|
|
246
|
+
const type = deriveRouteType(relPath, router);
|
|
247
|
+
const url_path = deriveUrlPath(relPath, router);
|
|
248
|
+
const source = await readFile(filePath, "utf8");
|
|
249
|
+
const tree = await parseFile(filePath, source);
|
|
250
|
+
if (!tree) {
|
|
251
|
+
return {
|
|
252
|
+
url_path,
|
|
253
|
+
file_path: relPath,
|
|
254
|
+
router,
|
|
255
|
+
type,
|
|
256
|
+
rendering: "unknown",
|
|
257
|
+
config: { has_generate_static_params: false },
|
|
258
|
+
has_metadata: false,
|
|
259
|
+
layout_chain: [],
|
|
260
|
+
middleware_applies: false,
|
|
261
|
+
is_client_component: false,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const config = readRouteSegmentConfig(tree, source);
|
|
265
|
+
const has_metadata = detectMetadataExport(tree);
|
|
266
|
+
let methods;
|
|
267
|
+
if (type === "route") {
|
|
268
|
+
methods = extractHttpMethods(tree);
|
|
269
|
+
}
|
|
270
|
+
const pagesSignals = router === "pages" ? detectPagesRouterSignals(tree) : undefined;
|
|
271
|
+
let rendering = classifyRendering(config, router, pagesSignals);
|
|
272
|
+
// Q2 — detect runtime SSR triggers (cookies/headers/fetch no-store) and
|
|
273
|
+
// upgrade `static` → `ssr` when present, capturing a human-readable reason.
|
|
274
|
+
let rendering_reason;
|
|
275
|
+
if (router === "app") {
|
|
276
|
+
if (rendering === "ssr") {
|
|
277
|
+
// Already SSR — explain why.
|
|
278
|
+
if (config.dynamic === "force-dynamic") {
|
|
279
|
+
rendering_reason = "dynamic='force-dynamic' config export";
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const fetches = extractFetchCalls(tree, source);
|
|
283
|
+
const noStore = fetches.find((f) => f.callee === "fetch" && f.cacheOption === "no-store");
|
|
284
|
+
if (noStore) {
|
|
285
|
+
rendering_reason = `fetch with cache:'no-store' at line ${noStore.line}`;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
const dynamicCall = fetches.find((f) => f.callee === "cookies" || f.callee === "headers");
|
|
289
|
+
if (dynamicCall) {
|
|
290
|
+
rendering_reason = `${dynamicCall.callee}() called at line ${dynamicCall.line}`;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
rendering_reason = "unknown SSR trigger";
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else if (rendering === "static") {
|
|
299
|
+
// Maybe upgrade: presence of cookies/headers/fetch no-store implies SSR.
|
|
300
|
+
const fetches = extractFetchCalls(tree, source);
|
|
301
|
+
const noStore = fetches.find((f) => f.callee === "fetch" && f.cacheOption === "no-store");
|
|
302
|
+
if (noStore) {
|
|
303
|
+
rendering = "ssr";
|
|
304
|
+
rendering_reason = `fetch with cache:'no-store' at line ${noStore.line}`;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
const dynamicCall = fetches.find((f) => f.callee === "cookies" || f.callee === "headers");
|
|
308
|
+
if (dynamicCall) {
|
|
309
|
+
rendering = "ssr";
|
|
310
|
+
rendering_reason = `${dynamicCall.callee}() called at line ${dynamicCall.line}`;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const directive = await scanDirective(filePath);
|
|
316
|
+
const is_client_component = directive === "use client";
|
|
317
|
+
const layout_chain = router === "app"
|
|
318
|
+
? await computeLayoutChain(relPath, repoRoot)
|
|
319
|
+
: [];
|
|
320
|
+
const entry = {
|
|
321
|
+
url_path,
|
|
322
|
+
file_path: relPath,
|
|
323
|
+
router,
|
|
324
|
+
type,
|
|
325
|
+
rendering,
|
|
326
|
+
config,
|
|
327
|
+
has_metadata,
|
|
328
|
+
layout_chain,
|
|
329
|
+
middleware_applies: false, // filled in by orchestrator (Task 30)
|
|
330
|
+
is_client_component,
|
|
331
|
+
};
|
|
332
|
+
if (methods !== undefined) {
|
|
333
|
+
entry.methods = methods;
|
|
334
|
+
}
|
|
335
|
+
if (rendering_reason !== undefined) {
|
|
336
|
+
entry.rendering_reason = rendering_reason;
|
|
337
|
+
}
|
|
338
|
+
return entry;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=nextjs-route-readers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-readers.js","sourceRoot":"","sources":["../../src/tools/nextjs-route-readers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route map: enumerate all route files (App Router + Pages Router),
|
|
3
|
+
* classify rendering strategy from route segment config, and detect hybrid
|
|
4
|
+
* conflicts where the same URL is served by both routers.
|
|
5
|
+
*
|
|
6
|
+
* This file is the orchestrator. AST reader helpers (`readRouteSegmentConfig`,
|
|
7
|
+
* `classifyRendering`, `parseRouteFile`) live in `nextjs-route-readers.ts` and
|
|
8
|
+
* are re-exported from here for backward compatibility.
|
|
9
|
+
*/
|
|
10
|
+
import type { NextjsRouteEntry, NextjsRouteConflict } from "./nextjs-route-readers.js";
|
|
11
|
+
export { readRouteSegmentConfig, classifyRendering, parseRouteFile, } from "./nextjs-route-readers.js";
|
|
12
|
+
export type { RenderingStrategy, RouteEntryType, RouteSegmentConfig, NextjsRouteEntry, NextjsRouteConflict, PagesRouterSignals, } from "./nextjs-route-readers.js";
|
|
13
|
+
export interface NextjsRouteMapResult {
|
|
14
|
+
routes: NextjsRouteEntry[];
|
|
15
|
+
conflicts: NextjsRouteConflict[];
|
|
16
|
+
middleware: {
|
|
17
|
+
file: string;
|
|
18
|
+
matchers: string[];
|
|
19
|
+
} | null;
|
|
20
|
+
workspaces_scanned: string[];
|
|
21
|
+
scan_errors: string[];
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
truncated_at?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface NextjsRouteMapOptions {
|
|
26
|
+
workspace?: string | undefined;
|
|
27
|
+
router?: "app" | "pages" | "both" | undefined;
|
|
28
|
+
include_metadata?: boolean | undefined;
|
|
29
|
+
max_routes?: number | undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Enumerate all Next.js routes (App + Pages Router) with rendering strategy
|
|
33
|
+
* classification and hybrid conflict detection.
|
|
34
|
+
*/
|
|
35
|
+
export declare function nextjsRouteMap(repo: string, options?: NextjsRouteMapOptions): Promise<NextjsRouteMapResult>;
|
|
36
|
+
//# sourceMappingURL=nextjs-route-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-route-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGvF,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAMnC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAgBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAoJ/B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route map: enumerate all route files (App Router + Pages Router),
|
|
3
|
+
* classify rendering strategy from route segment config, and detect hybrid
|
|
4
|
+
* conflicts where the same URL is served by both routers.
|
|
5
|
+
*
|
|
6
|
+
* This file is the orchestrator. AST reader helpers (`readRouteSegmentConfig`,
|
|
7
|
+
* `classifyRendering`, `parseRouteFile`) live in `nextjs-route-readers.ts` and
|
|
8
|
+
* are re-exported from here for backward compatibility.
|
|
9
|
+
*/
|
|
10
|
+
import { relative, join } from "node:path";
|
|
11
|
+
import { discoverWorkspaces, traceMiddleware } from "../utils/nextjs.js";
|
|
12
|
+
import { cachedWalkDirectory as walkDirectory } from "../utils/nextjs-audit-cache.js";
|
|
13
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
14
|
+
import { parseRouteFile } from "./nextjs-route-readers.js";
|
|
15
|
+
// Re-export reader APIs so existing consumers continue to import from this file.
|
|
16
|
+
export { readRouteSegmentConfig, classifyRendering, parseRouteFile, } from "./nextjs-route-readers.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Orchestrator
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const APP_CONVENTION_RE = /^(page|layout|loading|error|not-found|global-error|default|template|route)\.[jt]sx?$/;
|
|
21
|
+
const ROUTE_EXTS = new Set([".tsx", ".jsx", ".ts", ".js"]);
|
|
22
|
+
const DEFAULT_MAX_ROUTES = 1000;
|
|
23
|
+
const ROUTE_PARSE_CONCURRENCY = 10;
|
|
24
|
+
/** Whether a file in `app/` is a canonical convention route file. */
|
|
25
|
+
function isAppConventionFile(name) {
|
|
26
|
+
return APP_CONVENTION_RE.test(name);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Enumerate all Next.js routes (App + Pages Router) with rendering strategy
|
|
30
|
+
* classification and hybrid conflict detection.
|
|
31
|
+
*/
|
|
32
|
+
export async function nextjsRouteMap(repo, options) {
|
|
33
|
+
if (process.env.CODESIFT_DISABLE_TOOLS?.includes("nextjs_route_map")) {
|
|
34
|
+
throw new Error("nextjs_route_map is disabled via CODESIFT_DISABLE_TOOLS");
|
|
35
|
+
}
|
|
36
|
+
const index = await getCodeIndex(repo);
|
|
37
|
+
if (!index) {
|
|
38
|
+
throw new Error(`Repository not found: ${repo}. Run index_folder first.`);
|
|
39
|
+
}
|
|
40
|
+
const projectRoot = index.root;
|
|
41
|
+
// Resolve workspaces
|
|
42
|
+
let workspaceRoots;
|
|
43
|
+
if (options?.workspace) {
|
|
44
|
+
workspaceRoots = [join(projectRoot, options.workspace)];
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const discovered = await discoverWorkspaces(projectRoot);
|
|
48
|
+
workspaceRoots = discovered.length > 0
|
|
49
|
+
? discovered.map((w) => w.root)
|
|
50
|
+
: [projectRoot];
|
|
51
|
+
}
|
|
52
|
+
const routerFilter = options?.router ?? "both";
|
|
53
|
+
const maxRoutes = options?.max_routes ?? DEFAULT_MAX_ROUTES;
|
|
54
|
+
const routes = [];
|
|
55
|
+
const scan_errors = [];
|
|
56
|
+
const workspaces_scanned = [];
|
|
57
|
+
let truncated = false;
|
|
58
|
+
let truncated_at;
|
|
59
|
+
// Middleware: use the first workspace's middleware.ts (single-app case).
|
|
60
|
+
// traceMiddleware accepts a URL path for matching — we pass "/" as a probe
|
|
61
|
+
// so we can still return the file + matchers fields.
|
|
62
|
+
let middleware = null;
|
|
63
|
+
for (const wsRoot of workspaceRoots) {
|
|
64
|
+
workspaces_scanned.push(wsRoot);
|
|
65
|
+
// Collect candidate files
|
|
66
|
+
const appCandidates = [];
|
|
67
|
+
const pagesCandidates = [];
|
|
68
|
+
if (routerFilter === "app" || routerFilter === "both") {
|
|
69
|
+
for (const appDir of ["app", "src/app"]) {
|
|
70
|
+
try {
|
|
71
|
+
const walked = await walkDirectory(join(wsRoot, appDir), {
|
|
72
|
+
followSymlinks: true,
|
|
73
|
+
fileFilter: (ext, name) => {
|
|
74
|
+
if (!ROUTE_EXTS.has(ext))
|
|
75
|
+
return false;
|
|
76
|
+
return name ? isAppConventionFile(name) : false;
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
appCandidates.push(...walked);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
scan_errors.push(`${appDir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (routerFilter === "pages" || routerFilter === "both") {
|
|
87
|
+
for (const pagesDir of ["pages", "src/pages"]) {
|
|
88
|
+
try {
|
|
89
|
+
const walked = await walkDirectory(join(wsRoot, pagesDir), {
|
|
90
|
+
followSymlinks: true,
|
|
91
|
+
fileFilter: (ext) => ROUTE_EXTS.has(ext),
|
|
92
|
+
});
|
|
93
|
+
pagesCandidates.push(...walked);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
scan_errors.push(`${pagesDir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const wsMiddleware = await traceMiddleware(wsRoot, "/").catch(() => null);
|
|
101
|
+
if (wsMiddleware && !middleware) {
|
|
102
|
+
middleware = { file: wsMiddleware.file, matchers: wsMiddleware.matchers };
|
|
103
|
+
}
|
|
104
|
+
// Process each router's candidates. Apply the global max_routes cap.
|
|
105
|
+
const workspaceFiles = [
|
|
106
|
+
...appCandidates.map((p) => ({ path: p, router: "app" })),
|
|
107
|
+
...pagesCandidates.map((p) => ({ path: p, router: "pages" })),
|
|
108
|
+
];
|
|
109
|
+
for (let i = 0; i < workspaceFiles.length; i += ROUTE_PARSE_CONCURRENCY) {
|
|
110
|
+
if (routes.length >= maxRoutes) {
|
|
111
|
+
truncated = true;
|
|
112
|
+
truncated_at = maxRoutes;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
const chunk = workspaceFiles.slice(i, i + ROUTE_PARSE_CONCURRENCY);
|
|
116
|
+
const entries = await Promise.all(chunk.map(async ({ path, router }) => {
|
|
117
|
+
try {
|
|
118
|
+
// Parse relative to workspace root so deriveUrlPath sees `app/…`
|
|
119
|
+
const entry = await parseRouteFile(path, wsRoot, router);
|
|
120
|
+
// Re-anchor file_path to the repo root for display
|
|
121
|
+
entry.file_path = relative(projectRoot, path);
|
|
122
|
+
// Fill middleware_applies per route
|
|
123
|
+
if (wsMiddleware) {
|
|
124
|
+
const perRoute = await traceMiddleware(wsRoot, entry.url_path).catch(() => null);
|
|
125
|
+
entry.middleware_applies = perRoute?.applies ?? false;
|
|
126
|
+
}
|
|
127
|
+
return entry;
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const rel = relative(projectRoot, path);
|
|
131
|
+
scan_errors.push(`${rel}: ${err instanceof Error ? err.message : String(err)}`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
135
|
+
for (const entry of entries) {
|
|
136
|
+
if (entry === null)
|
|
137
|
+
continue;
|
|
138
|
+
if (routes.length >= maxRoutes) {
|
|
139
|
+
truncated = true;
|
|
140
|
+
truncated_at = maxRoutes;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
routes.push(entry);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Detect hybrid conflicts: same url_path appears in both routers
|
|
148
|
+
const byPath = new Map();
|
|
149
|
+
for (const route of routes) {
|
|
150
|
+
const bucket = byPath.get(route.url_path) ?? {};
|
|
151
|
+
if (route.router === "app" && !bucket.app)
|
|
152
|
+
bucket.app = route.file_path;
|
|
153
|
+
if (route.router === "pages" && !bucket.pages)
|
|
154
|
+
bucket.pages = route.file_path;
|
|
155
|
+
byPath.set(route.url_path, bucket);
|
|
156
|
+
}
|
|
157
|
+
const conflicts = [];
|
|
158
|
+
for (const [url_path, bucket] of byPath.entries()) {
|
|
159
|
+
if (bucket.app && bucket.pages) {
|
|
160
|
+
conflicts.push({ url_path, app: bucket.app, pages: bucket.pages });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const result = {
|
|
164
|
+
routes,
|
|
165
|
+
conflicts,
|
|
166
|
+
middleware,
|
|
167
|
+
workspaces_scanned,
|
|
168
|
+
scan_errors,
|
|
169
|
+
truncated,
|
|
170
|
+
};
|
|
171
|
+
if (truncated_at !== undefined)
|
|
172
|
+
result.truncated_at = truncated_at;
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=nextjs-route-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-tools.js","sourceRoot":"","sources":["../../src/tools/nextjs-route-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST readers for Next.js Server Actions security audit (T2).
|
|
3
|
+
*
|
|
4
|
+
* Each reader is a focused, pure function that extracts a specific signal
|
|
5
|
+
* from a parsed tree-sitter Tree. The orchestrator in `nextjs-security-tools.ts`
|
|
6
|
+
* composes them into a per-action audit.
|
|
7
|
+
*/
|
|
8
|
+
import type Parser from "web-tree-sitter";
|
|
9
|
+
import type { AuthGuardInfo, InputValidationInfo, RateLimitingInfo } from "./nextjs-security-tools.js";
|
|
10
|
+
export interface ServerActionFn {
|
|
11
|
+
name: string;
|
|
12
|
+
file: string;
|
|
13
|
+
line: number;
|
|
14
|
+
isAsync: boolean;
|
|
15
|
+
bodyNode: Parser.SyntaxNode | null;
|
|
16
|
+
fnNode: Parser.SyntaxNode;
|
|
17
|
+
}
|
|
18
|
+
export declare function extractServerActionFunctions(tree: Parser.Tree, _source: string, file: string): ServerActionFn[];
|
|
19
|
+
export declare function detectAuthGuard(fn: ServerActionFn): AuthGuardInfo;
|
|
20
|
+
export declare function detectInputValidation(fn: ServerActionFn, tree: Parser.Tree, source: string): InputValidationInfo;
|
|
21
|
+
export declare function detectRateLimiting(fn: ServerActionFn, _tree: Parser.Tree, _source: string): RateLimitingInfo;
|
|
22
|
+
//# sourceMappingURL=nextjs-security-readers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-security-readers.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-security-readers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AA+BpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,cAAc,EAAE,CAwGlB;AAmBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,aAAa,CAiGjE;AAMD,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,MAAM,EAAE,MAAM,GACb,mBAAmB,CAiCrB;AAcD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,CAAC,IAAI,EAClB,OAAO,EAAE,MAAM,GACd,gBAAgB,CAWlB"}
|