gitnexus 1.6.10-rc.99 → 1.6.10
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 +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +77 -2
- package/dist/core/index-freshness.js +109 -2
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +65 -19
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +14 -2
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +19 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +598 -16
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +77 -32
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/query.js +15 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +211 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.js +29 -0
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +39 -1
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +39 -6
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +87 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +267 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +214 -29
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +309 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/error-D9MtuG9s.js +1 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +16 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NestJS decorator routes for the indexer.
|
|
3
|
+
*
|
|
4
|
+
* A NestJS endpoint is declared across two decorators: `@Controller('venues')`
|
|
5
|
+
* on the class supplies the prefix, and `@Get('search')` on a method supplies
|
|
6
|
+
* the verb and the remainder. Neither half is a route on its own, which is why
|
|
7
|
+
* a pattern that only looks at one of them finds nothing.
|
|
8
|
+
*
|
|
9
|
+
* Until this existed, TypeScript's `extractDecoratorRoutes` hook was dispatch
|
|
10
|
+
* guards plus static data route tables only, so a NestJS repo produced
|
|
11
|
+
* essentially no `Route` nodes. That is not a quiet gap: `route_map`,
|
|
12
|
+
* `api_impact` and `shape_check` all read `Route` nodes and answer "no routes
|
|
13
|
+
* matching …" when there are none — so `api_impact`, whose documented job is to
|
|
14
|
+
* be run BEFORE modifying a route handler, reported every live endpoint as
|
|
15
|
+
* non-existent, and a not-found reads as a safe change (#3009).
|
|
16
|
+
*
|
|
17
|
+
* The extraction mirrors `spring.ts`, which solves the identical shape for
|
|
18
|
+
* `@RequestMapping` + `@GetMapping`: collect class-level prefixes keyed by class
|
|
19
|
+
* node id, then walk method decorators and attach the prefix of their enclosing
|
|
20
|
+
* class. As there, the prefix travels on `ExtractedDecoratorRoute.prefix` and
|
|
21
|
+
* the routes phase performs the join via `normalizeExtractedRoutePath`, so
|
|
22
|
+
* NestJS routes are keyed identically to every other framework's.
|
|
23
|
+
*
|
|
24
|
+
* The multi-path form `@Get(['a', 'b'])` mounts the handler at BOTH paths, so
|
|
25
|
+
* it emits both routes: N paths is N elements of the returned
|
|
26
|
+
* `ExtractedDecoratorRoute[]`, which is already how this layer spells N routes
|
|
27
|
+
* — the same representation `spring.ts` reaches for `@GetMapping({"/a","/b"})`,
|
|
28
|
+
* and the reason neither needs a special case downstream. The CLASS-level array
|
|
29
|
+
* (`@Controller(['a', 'b'])`) is DECLINED rather than cross-multiplied over the
|
|
30
|
+
* class's methods, again matching `spring.ts`: there an array-form class prefix
|
|
31
|
+
* only ever suppresses the class, with the cross-product tracked in #2280.
|
|
32
|
+
*
|
|
33
|
+
* Known limitation: the URLs produced here are CONTROLLER-RELATIVE. A global
|
|
34
|
+
* prefix (`app.setGlobalPrefix('api')`) and URI versioning are applied by the
|
|
35
|
+
* bootstrap file, not by any decorator this file can see, so neither is
|
|
36
|
+
* reflected — a route served at `/api/v1/venues/search` is stored as
|
|
37
|
+
* `/venues/search`. The module's "drop rather than guess" floor is unavailable
|
|
38
|
+
* for it: the evidence lives in a different file, so honouring it would mean
|
|
39
|
+
* dropping every Nest route in every repo. `spring.ts` has the same hole for
|
|
40
|
+
* `server.servlet.context-path`; `ExtractedDecoratorRoute.prefix` is the
|
|
41
|
+
* channel a cross-file follow-up would use, the way FastAPI resolves its mount.
|
|
42
|
+
*/
|
|
43
|
+
import type Parser from 'tree-sitter';
|
|
44
|
+
import type { ExtractedDecoratorRoute } from '../workers/parse-worker.js';
|
|
45
|
+
/**
|
|
46
|
+
* Extract NestJS routes from one parsed TypeScript/JavaScript file.
|
|
47
|
+
*
|
|
48
|
+
* A method decorator is only believed when its enclosing class carries a
|
|
49
|
+
* `@Controller`. `@Get`/`@Post`/`@Delete` are common identifiers, and without
|
|
50
|
+
* that requirement any unrelated library using the same decorator names would
|
|
51
|
+
* mint phantom endpoints.
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractNestRoutes(tree: Parser.Tree, filePath: string, lineOffset?: number): ExtractedDecoratorRoute[];
|
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NestJS decorator routes for the indexer.
|
|
3
|
+
*
|
|
4
|
+
* A NestJS endpoint is declared across two decorators: `@Controller('venues')`
|
|
5
|
+
* on the class supplies the prefix, and `@Get('search')` on a method supplies
|
|
6
|
+
* the verb and the remainder. Neither half is a route on its own, which is why
|
|
7
|
+
* a pattern that only looks at one of them finds nothing.
|
|
8
|
+
*
|
|
9
|
+
* Until this existed, TypeScript's `extractDecoratorRoutes` hook was dispatch
|
|
10
|
+
* guards plus static data route tables only, so a NestJS repo produced
|
|
11
|
+
* essentially no `Route` nodes. That is not a quiet gap: `route_map`,
|
|
12
|
+
* `api_impact` and `shape_check` all read `Route` nodes and answer "no routes
|
|
13
|
+
* matching …" when there are none — so `api_impact`, whose documented job is to
|
|
14
|
+
* be run BEFORE modifying a route handler, reported every live endpoint as
|
|
15
|
+
* non-existent, and a not-found reads as a safe change (#3009).
|
|
16
|
+
*
|
|
17
|
+
* The extraction mirrors `spring.ts`, which solves the identical shape for
|
|
18
|
+
* `@RequestMapping` + `@GetMapping`: collect class-level prefixes keyed by class
|
|
19
|
+
* node id, then walk method decorators and attach the prefix of their enclosing
|
|
20
|
+
* class. As there, the prefix travels on `ExtractedDecoratorRoute.prefix` and
|
|
21
|
+
* the routes phase performs the join via `normalizeExtractedRoutePath`, so
|
|
22
|
+
* NestJS routes are keyed identically to every other framework's.
|
|
23
|
+
*
|
|
24
|
+
* The multi-path form `@Get(['a', 'b'])` mounts the handler at BOTH paths, so
|
|
25
|
+
* it emits both routes: N paths is N elements of the returned
|
|
26
|
+
* `ExtractedDecoratorRoute[]`, which is already how this layer spells N routes
|
|
27
|
+
* — the same representation `spring.ts` reaches for `@GetMapping({"/a","/b"})`,
|
|
28
|
+
* and the reason neither needs a special case downstream. The CLASS-level array
|
|
29
|
+
* (`@Controller(['a', 'b'])`) is DECLINED rather than cross-multiplied over the
|
|
30
|
+
* class's methods, again matching `spring.ts`: there an array-form class prefix
|
|
31
|
+
* only ever suppresses the class, with the cross-product tracked in #2280.
|
|
32
|
+
*
|
|
33
|
+
* Known limitation: the URLs produced here are CONTROLLER-RELATIVE. A global
|
|
34
|
+
* prefix (`app.setGlobalPrefix('api')`) and URI versioning are applied by the
|
|
35
|
+
* bootstrap file, not by any decorator this file can see, so neither is
|
|
36
|
+
* reflected — a route served at `/api/v1/venues/search` is stored as
|
|
37
|
+
* `/venues/search`. The module's "drop rather than guess" floor is unavailable
|
|
38
|
+
* for it: the evidence lives in a different file, so honouring it would mean
|
|
39
|
+
* dropping every Nest route in every repo. `spring.ts` has the same hole for
|
|
40
|
+
* `server.servlet.context-path`; `ExtractedDecoratorRoute.prefix` is the
|
|
41
|
+
* channel a cross-file follow-up would use, the way FastAPI resolves its mount.
|
|
42
|
+
*/
|
|
43
|
+
import { plainString, propertyName } from './data-route-table.js';
|
|
44
|
+
import { isDev } from '../utils/env.js';
|
|
45
|
+
import { logger } from '../../logger.js';
|
|
46
|
+
/**
|
|
47
|
+
* NestJS method decorators → HTTP verb. A Map rather than an object literal
|
|
48
|
+
* because the lookup key is an arbitrary decorator name read out of source: a
|
|
49
|
+
* plain object answers `@toString()` with `Object.prototype.toString`, which is
|
|
50
|
+
* truthy and would be emitted verbatim as the route's httpMethod.
|
|
51
|
+
*/
|
|
52
|
+
const NEST_METHOD_DECORATORS = new Map([
|
|
53
|
+
['Get', 'GET'],
|
|
54
|
+
['Post', 'POST'],
|
|
55
|
+
['Put', 'PUT'],
|
|
56
|
+
['Patch', 'PATCH'],
|
|
57
|
+
['Delete', 'DELETE'],
|
|
58
|
+
['Head', 'HEAD'],
|
|
59
|
+
['Options', 'OPTIONS'],
|
|
60
|
+
['All', '*'],
|
|
61
|
+
// `@Sse` mounts a real GET endpoint that streams; it is as much a route as
|
|
62
|
+
// `@Get`. `@Search` is deliberately absent — `normalizeRouteMethod` rejects
|
|
63
|
+
// SEARCH as non-standard and would key the route by URL alone, colliding
|
|
64
|
+
// with every other verb on that path.
|
|
65
|
+
['Sse', 'GET'],
|
|
66
|
+
]);
|
|
67
|
+
/**
|
|
68
|
+
* Class node types that can carry a `@Controller`. `export abstract class C`
|
|
69
|
+
* parses as `abstract_class_declaration`, a DIFFERENT node type — and a
|
|
70
|
+
* decorated abstract base sharing CRUD routes with its subclasses is ordinary
|
|
71
|
+
* Nest, so matching `class_declaration` alone silently drops the whole
|
|
72
|
+
* controller rather than one route.
|
|
73
|
+
*/
|
|
74
|
+
const CLASS_DECLARATION_TYPES = new Set([
|
|
75
|
+
'class_declaration',
|
|
76
|
+
'abstract_class_declaration',
|
|
77
|
+
]);
|
|
78
|
+
/**
|
|
79
|
+
* Cheap parse-free gate. Every JS/TS file in every repo reaches this hook, so
|
|
80
|
+
* skip the walk unless the file could plausibly declare a controller. A file
|
|
81
|
+
* without the substring cannot produce a route here, because a `@Controller`
|
|
82
|
+
* decorator is REQUIRED before any method decorator is believed (see below).
|
|
83
|
+
*/
|
|
84
|
+
const CONTROLLER_HINT = '@Controller';
|
|
85
|
+
/** The decorator's name — `Controller` for `@Controller('x')`, `Get` for `@Get()`. */
|
|
86
|
+
function decoratorName(decorator) {
|
|
87
|
+
const inner = decorator.namedChild(0);
|
|
88
|
+
if (!inner)
|
|
89
|
+
return null;
|
|
90
|
+
// `@Get()` is a call_expression; a bare `@Injectable` is a plain identifier.
|
|
91
|
+
if (inner.type === 'identifier')
|
|
92
|
+
return inner.text;
|
|
93
|
+
if (inner.type === 'call_expression') {
|
|
94
|
+
const fn = inner.childForFieldName('function');
|
|
95
|
+
return fn?.type === 'identifier' ? fn.text : null;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The literal path(s) a decorator call mounts, one entry per path — or `['']`
|
|
101
|
+
* when the decorator takes no argument (`@Controller()` / `@Get()` — both legal
|
|
102
|
+
* and both meaning "no path segment of my own").
|
|
103
|
+
*
|
|
104
|
+
* A list rather than a single string because `@Get(['a', 'b'])` mounts the
|
|
105
|
+
* handler at two URLs, and two routes is what the caller's output contract
|
|
106
|
+
* already says that in: `ExtractedDecoratorRoute[]`. No new field, and no
|
|
107
|
+
* special case at the emit site — the same shape `spring.ts` gets for free from
|
|
108
|
+
* a query that matches one element at a time.
|
|
109
|
+
*
|
|
110
|
+
* Returns `null` when an argument IS present but is not a readable literal.
|
|
111
|
+
* That is deliberately distinct from `['']`: a computed prefix
|
|
112
|
+
* (`@Controller(ROUTES.VENUES)`) whose value we cannot read must drop the route
|
|
113
|
+
* rather than silently mount it at the wrong URL. `route_map` presents its
|
|
114
|
+
* output as fact, and a wrong path is worse than a missing one. `[]` is a third
|
|
115
|
+
* answer and means neither of those: `@Get([])` is legal, knowably mounts
|
|
116
|
+
* nothing, and so emits nothing — it must never be read as the unknowable case,
|
|
117
|
+
* which is the one that suppresses a whole controller.
|
|
118
|
+
*
|
|
119
|
+
* Reading one literal is delegated to `plainString`, the same judge the
|
|
120
|
+
* data-route-table extractor uses, so both agree on what is readable. Filtering
|
|
121
|
+
* `string_fragment` children and joining them looks equivalent and is not:
|
|
122
|
+
* tree-sitter SPLITS a literal around each `escape_sequence`, and the join then
|
|
123
|
+
* DELETES the escape rather than decoding it. `@Get(':id(\\d+)')` — the ordinary
|
|
124
|
+
* spelling of a Nest regex param, whose value is `:id(\d+)` — came out as
|
|
125
|
+
* `:id(d+)`, and `@Get('/v\u0069ews')` came out as `/vews`. Both are paths the
|
|
126
|
+
* app never serves, i.e. the wrong-URL outcome the paragraph above forbids.
|
|
127
|
+
*/
|
|
128
|
+
function decoratorLiteralPaths(decorator) {
|
|
129
|
+
const call = decorator.namedChild(0);
|
|
130
|
+
// A Nest route decorator is a FACTORY: `@Get()` invokes it and returns the
|
|
131
|
+
// decorator that registers the route. A BARE `@Get` is the factory itself,
|
|
132
|
+
// never applied, so Nest registers nothing — emitting a route for it would
|
|
133
|
+
// publish a URL the app does not serve. The same holds one level up for a
|
|
134
|
+
// bare `@Controller`, which registers no controller.
|
|
135
|
+
//
|
|
136
|
+
// `@Get()` with no ARGUMENT is different and still a real pathless route:
|
|
137
|
+
// what distinguishes them is the call, not the argument list. That case falls
|
|
138
|
+
// through to the `!first` branch below.
|
|
139
|
+
if (call?.type !== 'call_expression')
|
|
140
|
+
return null;
|
|
141
|
+
const first = call.childForFieldName('arguments')?.namedChild(0);
|
|
142
|
+
if (!first)
|
|
143
|
+
return [''];
|
|
144
|
+
// The object form belongs to `@Controller` alone — a verb decorator takes
|
|
145
|
+
// `string | string[]`, so Nest mounts nothing for `@Get({ path: 'a' })`.
|
|
146
|
+
// Reading it as a route would mint a URL the app never serves, which is the
|
|
147
|
+
// invented fact this module refuses; an unreadable shape drops instead.
|
|
148
|
+
if (first.type === 'object' && decoratorName(decorator) !== 'Controller')
|
|
149
|
+
return null;
|
|
150
|
+
return literalPaths(first);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The paths carried by one decorator ARGUMENT node, split out from
|
|
154
|
+
* {@link decoratorLiteralPaths} only so the object form can re-enter it: Nest
|
|
155
|
+
* accepts an array inside `{ path: … }` as well, and reusing the same judge is
|
|
156
|
+
* what keeps `@Controller({ path: ['a', 'b'] })` from being read by a second,
|
|
157
|
+
* laxer set of rules that has drifted from this one.
|
|
158
|
+
*/
|
|
159
|
+
function literalPaths(node) {
|
|
160
|
+
// `@Controller({ path: 'cats', version: '1' })` is the documented form for
|
|
161
|
+
// URI/header versioning, and its path is a plain literal sitting right there.
|
|
162
|
+
// Worth reading rather than dropping, because the asymmetry is severe: an
|
|
163
|
+
// unreadable METHOD path costs one route, an unreadable PREFIX costs every
|
|
164
|
+
// route on the class.
|
|
165
|
+
if (node.type === 'object') {
|
|
166
|
+
// But a `path` pair only PROVES the mount when nothing else in the object
|
|
167
|
+
// can replace it, and the first match proves nothing on its own:
|
|
168
|
+
// `{ path: 'cats', ...options }` mounts wherever `options.path` says, and
|
|
169
|
+
// `{ path: 'cats', path: 'dogs' }` mounts at `dogs` — last write wins in
|
|
170
|
+
// both. Either one publishes `/cats`, a URL the app never serves, and it
|
|
171
|
+
// looks exactly like a correct one, which is the wrong-answer-dressed-as-
|
|
172
|
+
// fact this module refuses. So the object is read only when EVERY member is
|
|
173
|
+
// a named, non-repeated pair. That whole-entry fail-closed walk is the
|
|
174
|
+
// shape `routeFromObject` uses in `data-route-table.ts`.
|
|
175
|
+
const values = new Map();
|
|
176
|
+
for (const child of node.namedChildren) {
|
|
177
|
+
// Skipped FIRST. A comment between two pairs is ordinary formatting; run
|
|
178
|
+
// through the not-a-pair test below it would refuse the object and cost
|
|
179
|
+
// the class every route it has, over a comment.
|
|
180
|
+
if (child.type === 'comment')
|
|
181
|
+
continue;
|
|
182
|
+
// `spread_element` (`{ ...options }`), `shorthand_property_identifier`
|
|
183
|
+
// (`{ path }`) and `method_definition` (`{ getFoo() {} }`) all land here
|
|
184
|
+
// — probed and identical across the three grammars this extractor runs
|
|
185
|
+
// under. None offers a key/value this file can read, and the first can
|
|
186
|
+
// introduce or overwrite `path` from a value declared elsewhere.
|
|
187
|
+
if (child.type !== 'pair')
|
|
188
|
+
return null;
|
|
189
|
+
const key = child.childForFieldName('key');
|
|
190
|
+
const value = child.childForFieldName('value');
|
|
191
|
+
if (key === null || value === null)
|
|
192
|
+
return null;
|
|
193
|
+
// Compared through `propertyName`, the same judge used to READ the key —
|
|
194
|
+
// so `{ path: … }` and `{ 'path': … }` are one key and collide as
|
|
195
|
+
// duplicates. Comparing raw key text instead makes them two distinct
|
|
196
|
+
// keys, and `{ path: 'cats', 'path': 'dogs' }` silently mounts the loser.
|
|
197
|
+
const name = propertyName(key);
|
|
198
|
+
// No readable name means a computed key (`{ [dynamicKey]: 'b' }`), which
|
|
199
|
+
// could evaluate to `path` and take the mount with it — refused, not
|
|
200
|
+
// ignored. A repeated key is refused wherever it appears, not only on
|
|
201
|
+
// `path`: a duplicate anywhere is evidence the object is not the fixed
|
|
202
|
+
// literal it reads as, and cost is one controller against a wrong URL.
|
|
203
|
+
if (name === null || values.has(name))
|
|
204
|
+
return null;
|
|
205
|
+
values.set(name, value);
|
|
206
|
+
}
|
|
207
|
+
// Deliberately NOT `containsExecutingExpression` (data-route-table.ts): that
|
|
208
|
+
// guards whole-entry declarativeness for a static route table, a different
|
|
209
|
+
// invariant. Here only `path` has to be provable, so a non-literal value on
|
|
210
|
+
// an unrelated key — `{ path: 'a', scope: Scope.REQUEST }`, ordinary Nest —
|
|
211
|
+
// stays benign and keeps its controller.
|
|
212
|
+
const path = values.get('path');
|
|
213
|
+
// A missing `path` keeps the existing drop and must never read as `''`:
|
|
214
|
+
// `@Controller({ version: '1' })` mounts at a prefix this decorator does
|
|
215
|
+
// not state, and `''` would publish every one of its methods at the root.
|
|
216
|
+
return path === undefined ? null : literalPaths(path);
|
|
217
|
+
}
|
|
218
|
+
// `array` is the node type in all three grammars this extractor runs under —
|
|
219
|
+
// tree-sitter-typescript's `typescript` and `tsx`, and tree-sitter-javascript
|
|
220
|
+
// — probed rather than assumed, because a name that differs in one of them
|
|
221
|
+
// would silently restore the old drop for that grammar alone.
|
|
222
|
+
if (node.type === 'array') {
|
|
223
|
+
const paths = [];
|
|
224
|
+
for (const element of node.namedChildren) {
|
|
225
|
+
const value = plainString(element);
|
|
226
|
+
// One unreadable element poisons the whole array. Emitting the readable
|
|
227
|
+
// ones would present a partial mapping as a complete one — the endpoint
|
|
228
|
+
// behind `ROUTES.ADMIN` would be missing from a controller that otherwise
|
|
229
|
+
// looks fully covered, which is the same wrong-answer-dressed-as-fact this
|
|
230
|
+
// module refuses above, only harder to notice.
|
|
231
|
+
if (value === null)
|
|
232
|
+
return null;
|
|
233
|
+
paths.push(value);
|
|
234
|
+
}
|
|
235
|
+
return paths;
|
|
236
|
+
}
|
|
237
|
+
const value = plainString(node);
|
|
238
|
+
return value === null ? null : [value];
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Decorators that immediately precede `node` among its parent's named children.
|
|
242
|
+
* In tree-sitter-typescript a decorator is a SIBLING placed before the thing it
|
|
243
|
+
* decorates — at `export_statement`/`program` level for a class — and
|
|
244
|
+
* decorators stack.
|
|
245
|
+
*
|
|
246
|
+
* Walks the sibling chain rather than indexing into `parent.namedChildren`,
|
|
247
|
+
* which is the same uncached-getter trap {@link collectClassRoutes} documents:
|
|
248
|
+
* a class's parent is usually `program`, so reading the list marshals every
|
|
249
|
+
* top-level statement in the file, once per class. That is quadratic in
|
|
250
|
+
* top-level statements — measured 200ms for a file of 800 classes, against
|
|
251
|
+
* 0.9ms for this form.
|
|
252
|
+
*/
|
|
253
|
+
function precedingDecorators(node) {
|
|
254
|
+
const out = [];
|
|
255
|
+
for (let sibling = node.previousNamedSibling; sibling; sibling = sibling.previousNamedSibling) {
|
|
256
|
+
// A comment between the decorators and the thing they decorate is ordinary
|
|
257
|
+
// (`@Post('x')` then a JSDoc block then the method) and must not terminate
|
|
258
|
+
// the stack — doing so makes the whole decorated route invisible.
|
|
259
|
+
if (sibling.type === 'comment')
|
|
260
|
+
continue;
|
|
261
|
+
if (sibling.type !== 'decorator')
|
|
262
|
+
break;
|
|
263
|
+
out.push(sibling);
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Leading `decorator` children of a node, stopping at the first child that is
|
|
269
|
+
* neither a decorator nor a comment. Comments are skipped for the same reason
|
|
270
|
+
* as in {@link precedingDecorators}: a doc block sitting between `@Controller`
|
|
271
|
+
* and the class must not hide the decorator.
|
|
272
|
+
*/
|
|
273
|
+
function leadingDecorators(node) {
|
|
274
|
+
const out = [];
|
|
275
|
+
for (const child of node.namedChildren) {
|
|
276
|
+
if (child.type === 'comment')
|
|
277
|
+
continue;
|
|
278
|
+
if (child.type !== 'decorator')
|
|
279
|
+
break;
|
|
280
|
+
out.push(child);
|
|
281
|
+
}
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Cap on the decorator text quoted in the dropped-controller log. Long enough
|
|
286
|
+
* to identify the shape, short enough not to dump a wrapped multi-line
|
|
287
|
+
* decorator into the operator's terminal.
|
|
288
|
+
*/
|
|
289
|
+
const DROPPED_CONTROLLER_LOG_LIMIT = 160;
|
|
290
|
+
/**
|
|
291
|
+
* Every decorator attached to a class, across the two shapes the grammar
|
|
292
|
+
* produces — which differ by whether the class is exported:
|
|
293
|
+
*
|
|
294
|
+
* `@Controller('a') class A {}` → decorator is a CHILD of class_declaration
|
|
295
|
+
* `@Controller('a') export class A {}` → decorator is a child of export_statement,
|
|
296
|
+
* i.e. a SIBLING of the class_declaration
|
|
297
|
+
*
|
|
298
|
+
* Checking only one of them silently drops half of all controllers, so collect
|
|
299
|
+
* from both, plus the sibling position for the class itself. There is no fourth
|
|
300
|
+
* source: both grammars fold a class's decorators INTO the `export_statement`
|
|
301
|
+
* production, so an `export_statement` never has one as a preceding sibling.
|
|
302
|
+
*/
|
|
303
|
+
function classDecorators(classNode) {
|
|
304
|
+
const out = [...leadingDecorators(classNode), ...precedingDecorators(classNode)];
|
|
305
|
+
const wrapper = classNode.parent;
|
|
306
|
+
if (wrapper?.type === 'export_statement')
|
|
307
|
+
out.push(...leadingDecorators(wrapper));
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* The `@Controller(...)` prefix for a class, or undefined when it has none.
|
|
312
|
+
* One string, not a list: a class-level array (`@Controller(['a', 'b'])`) is
|
|
313
|
+
* DECLINED here, exactly as `spring.ts` declines an array-form
|
|
314
|
+
* `@RequestMapping` — it detects the shape only to suppress the class, leaving
|
|
315
|
+
* the prefix × method cross-product to #2280. Collapsing to `null` is that
|
|
316
|
+
* suppression, and this parity is deliberate, not an oversight: the two
|
|
317
|
+
* extractors solve the same shape and should not disagree about which half of
|
|
318
|
+
* it is supported.
|
|
319
|
+
*/
|
|
320
|
+
function controllerPrefix(classNode, filePath) {
|
|
321
|
+
for (const decorator of classDecorators(classNode)) {
|
|
322
|
+
if (decoratorName(decorator) !== 'Controller')
|
|
323
|
+
continue;
|
|
324
|
+
const paths = decoratorLiteralPaths(decorator);
|
|
325
|
+
// `@Controller([])` lands here too and needs no answer of its own: a
|
|
326
|
+
// controller mounted at no path serves no route, so "emit nothing for this
|
|
327
|
+
// class" is what both readings of it come to.
|
|
328
|
+
if (paths === null || paths.length !== 1) {
|
|
329
|
+
// The single funnel for EVERY whole-controller drop — an unreadable
|
|
330
|
+
// constant (`@Controller(ROUTES.VENUES)`), a multi-path array, an
|
|
331
|
+
// unreadable array element, and an options object whose `path` another
|
|
332
|
+
// member could override all return null here. Reporting at the refusal
|
|
333
|
+
// sites instead would make the rarest cause the loudest, and leave the
|
|
334
|
+
// motivating one from this module's own header silent.
|
|
335
|
+
//
|
|
336
|
+
// `isDev` at `info`, not `debug`: the logger's base level IS `info`, so
|
|
337
|
+
// an isDev-gated `debug` is gated twice and stays silent in exactly the
|
|
338
|
+
// dev run it exists for. Same shape the routes phase uses.
|
|
339
|
+
if (isDev) {
|
|
340
|
+
const shape = decorator.text.replace(/\s+/g, ' ');
|
|
341
|
+
logger.info(`🗺️ NestJS: dropped @Controller in ${filePath} — its prefix is not provable: ${shape.length > DROPPED_CONTROLLER_LOG_LIMIT
|
|
342
|
+
? `${shape.slice(0, DROPPED_CONTROLLER_LOG_LIMIT)}…`
|
|
343
|
+
: shape}`);
|
|
344
|
+
}
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
return paths[0];
|
|
348
|
+
}
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Extract NestJS routes from one parsed TypeScript/JavaScript file.
|
|
353
|
+
*
|
|
354
|
+
* A method decorator is only believed when its enclosing class carries a
|
|
355
|
+
* `@Controller`. `@Get`/`@Post`/`@Delete` are common identifiers, and without
|
|
356
|
+
* that requirement any unrelated library using the same decorator names would
|
|
357
|
+
* mint phantom endpoints.
|
|
358
|
+
*/
|
|
359
|
+
export function extractNestRoutes(tree, filePath, lineOffset = 0) {
|
|
360
|
+
if (!tree.rootNode.text.includes(CONTROLLER_HINT))
|
|
361
|
+
return [];
|
|
362
|
+
const out = [];
|
|
363
|
+
const visit = (node) => {
|
|
364
|
+
if (CLASS_DECLARATION_TYPES.has(node.type)) {
|
|
365
|
+
const prefix = controllerPrefix(node, filePath);
|
|
366
|
+
// `undefined` — not a controller at all. `null` — a controller whose
|
|
367
|
+
// prefix could not be read, so its routes' URLs are unknowable.
|
|
368
|
+
if (prefix !== undefined) {
|
|
369
|
+
if (prefix !== null)
|
|
370
|
+
collectClassRoutes(node, prefix, filePath, lineOffset, out);
|
|
371
|
+
return; // a controller's methods are handled here; don't re-walk them
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
for (const child of node.namedChildren)
|
|
375
|
+
visit(child);
|
|
376
|
+
};
|
|
377
|
+
visit(tree.rootNode);
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Modifiers that take a `method_definition` out of Nest's handler set.
|
|
382
|
+
*
|
|
383
|
+
* Nest's `RequestMapping` writes the handler onto the class PROTOTYPE's
|
|
384
|
+
* `descriptor.value`, and `RouterExplorer` scans prototype instance methods for
|
|
385
|
+
* that metadata. A `static` method lives on the constructor and is never
|
|
386
|
+
* scanned; an accessor's descriptor carries `get`/`set` and no `value` to
|
|
387
|
+
* register. A verb decorator on any of the three therefore mounts NOTHING, so a
|
|
388
|
+
* route minted from one is a URL the app does not serve — the invented fact
|
|
389
|
+
* this module refuses everywhere else.
|
|
390
|
+
*/
|
|
391
|
+
const NON_HANDLER_MODIFIERS = new Set(['static', 'get', 'set']);
|
|
392
|
+
/** Longest entry above — the cheap gate that keeps `.trim()` off a method body. */
|
|
393
|
+
const LONGEST_NON_HANDLER_MODIFIER = 6;
|
|
394
|
+
/**
|
|
395
|
+
* Whether Nest could register this `method_definition` as a request handler.
|
|
396
|
+
*
|
|
397
|
+
* Reads `children`, NOT `namedChildren`, and that is the whole difficulty:
|
|
398
|
+
* `static`, `get` and `set` are ANONYMOUS tokens in all three grammars this
|
|
399
|
+
* extractor runs under, so they never appear among named children. A static
|
|
400
|
+
* method, a getter, a setter and a plain method expose the IDENTICAL
|
|
401
|
+
* `namedChildren` (`property_identifier`, `formal_parameters`,
|
|
402
|
+
* `statement_block`) — probed, not assumed — so the module's usual
|
|
403
|
+
* `namedChildren` idiom cannot see the modifier at all and every one of the
|
|
404
|
+
* three reads as an ordinary handler.
|
|
405
|
+
*
|
|
406
|
+
* Matches on child TEXT, not node type, and skips the `name` field — the same
|
|
407
|
+
* two rules `hasKeyword` in `field-extractors/configs/helpers.ts` applies, and
|
|
408
|
+
* that the TS/JS captures and method extractor already use for this question.
|
|
409
|
+
* The text rule is load-bearing: `static` reaches the tree as an anonymous
|
|
410
|
+
* token in some grammar versions and a keyword node in others, so a
|
|
411
|
+
* `child.type === 'static'` test silently stops firing on a grammar bump — here
|
|
412
|
+
* that would readmit exactly the phantom routes this function removes, with the
|
|
413
|
+
* suite still green. Skipping `name` is what keeps a method literally called
|
|
414
|
+
* `get()` or `static()` from reading as a modifier.
|
|
415
|
+
*
|
|
416
|
+
* Open-coded rather than calling `hasKeyword` three times, which was measured
|
|
417
|
+
* at 13.96us per method against 4.30us here: that helper takes ONE keyword, so
|
|
418
|
+
* three keywords is three full passes, and it calls `.text.trim()` on every
|
|
419
|
+
* child including `statement_block` — the whole method body. `.some()` does not
|
|
420
|
+
* rescue it, since a real handler matches nothing and pays all three. The
|
|
421
|
+
* length guard keeps `.trim()` off a multi-KB body; no modifier exceeds it.
|
|
422
|
+
*
|
|
423
|
+
* The scan is bounded by one method's own children (a handful), so it is not
|
|
424
|
+
* the uncached-getter trap {@link collectClassRoutes} documents — that one bites
|
|
425
|
+
* when a PARENT's child list is re-marshalled once per member.
|
|
426
|
+
*/
|
|
427
|
+
function isRequestHandler(member) {
|
|
428
|
+
const nameNode = member.childForFieldName('name');
|
|
429
|
+
for (const child of member.children) {
|
|
430
|
+
if (child === nameNode)
|
|
431
|
+
continue;
|
|
432
|
+
const text = child.text;
|
|
433
|
+
if (text.length <= LONGEST_NON_HANDLER_MODIFIER && NON_HANDLER_MODIFIERS.has(text.trim())) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return true;
|
|
438
|
+
}
|
|
439
|
+
function collectClassRoutes(classNode, prefix, filePath, lineOffset, out) {
|
|
440
|
+
const body = classNode.childForFieldName('body');
|
|
441
|
+
if (!body)
|
|
442
|
+
return;
|
|
443
|
+
// ONE forward pass over the body, accumulating the decorator run and flushing
|
|
444
|
+
// it at each method. Calling `precedingDecorators` per method instead is
|
|
445
|
+
// quadratic in methods-per-controller for a reason that is invisible in the
|
|
446
|
+
// source: `namedChildren` is an UNCACHED getter in node-tree-sitter, so every
|
|
447
|
+
// call re-marshals the entire class body into fresh JS objects before the
|
|
448
|
+
// `findIndex`. Measured here, 800 methods cost 362ms (450us/method, up from
|
|
449
|
+
// 42us/method at 50); a single pass is flat. `spring.ts` never had this
|
|
450
|
+
// because a Java annotation is a child of the declaration it annotates.
|
|
451
|
+
const pending = [];
|
|
452
|
+
for (const member of body.namedChildren) {
|
|
453
|
+
if (member.type === 'decorator') {
|
|
454
|
+
pending.push(member);
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
// Same reason as in `precedingDecorators`: a JSDoc block between a
|
|
458
|
+
// decorator stack and its method must not hide the route (a real
|
|
459
|
+
// controller shape, pinned by the suite). Known limitation of that skip: a
|
|
460
|
+
// decorator ORPHANED by a commented-out handler is then absorbed onto the
|
|
461
|
+
// NEXT method, minting a phantom route with the wrong handler. There is no
|
|
462
|
+
// AST fix — an orphan followed by a comment is indistinguishable from a
|
|
463
|
+
// stack whose method happens to be documented — and losing every
|
|
464
|
+
// documented route is the worse trade, so it is made deliberately.
|
|
465
|
+
if (member.type === 'comment')
|
|
466
|
+
continue;
|
|
467
|
+
// tree-sitter-javascript makes a method decorator a CHILD of the
|
|
468
|
+
// `method_definition`, not a preceding sibling as in tree-sitter-typescript
|
|
469
|
+
// — and this extractor is registered on the JavaScript provider too, which
|
|
470
|
+
// already advertises `framework: 'nestjs'`. Reading only siblings meant
|
|
471
|
+
// every `.js` Nest controller emitted nothing. On TypeScript the first
|
|
472
|
+
// named child is the method name, so `leadingDecorators` contributes
|
|
473
|
+
// nothing there and no route is collected twice.
|
|
474
|
+
//
|
|
475
|
+
// A static member, a getter and a setter are decorated exactly like a
|
|
476
|
+
// handler and registered as none, so they contribute no decorators (see
|
|
477
|
+
// `isRequestHandler`). They still fall THROUGH to the `pending.length = 0`
|
|
478
|
+
// below rather than `continue` past it: skipping the clear would hand their
|
|
479
|
+
// decorator run to the next method, trading a phantom route for a
|
|
480
|
+
// misattributed one — the strictly worse of the two, since it corrupts a
|
|
481
|
+
// route that is otherwise correct.
|
|
482
|
+
const decorators = member.type === 'method_definition' && isRequestHandler(member)
|
|
483
|
+
? [...pending, ...leadingDecorators(member)]
|
|
484
|
+
: [];
|
|
485
|
+
for (const decorator of decorators) {
|
|
486
|
+
const name = decoratorName(decorator);
|
|
487
|
+
if (name === null)
|
|
488
|
+
continue;
|
|
489
|
+
const httpMethod = NEST_METHOD_DECORATORS.get(name);
|
|
490
|
+
if (httpMethod === undefined)
|
|
491
|
+
continue;
|
|
492
|
+
const routePaths = decoratorLiteralPaths(decorator);
|
|
493
|
+
if (routePaths === null)
|
|
494
|
+
continue; // unreadable → skip
|
|
495
|
+
const handlerName = member.childForFieldName('name')?.text;
|
|
496
|
+
// One route per path. `@Get(['a', 'b'])` mounts the handler at both, and
|
|
497
|
+
// everything else about the two is identical — same verb, same handler,
|
|
498
|
+
// same line — so the loop is the whole of the multi-path support. An
|
|
499
|
+
// empty array falls out as zero iterations without a special case.
|
|
500
|
+
for (const routePath of routePaths) {
|
|
501
|
+
out.push({
|
|
502
|
+
filePath,
|
|
503
|
+
// A pathless `@Get()` is the controller's index route and carries no
|
|
504
|
+
// segment of its own. Emit '/' rather than '': `claim()` in
|
|
505
|
+
// call-processor short-circuits on a falsy routePath, so an empty
|
|
506
|
+
// string would still produce the Route node but silently lose its
|
|
507
|
+
// handler symbol — the route would exist with nothing attached to it.
|
|
508
|
+
// Both spellings normalize to the same URL against the prefix.
|
|
509
|
+
routePath: routePath === '' ? '/' : routePath,
|
|
510
|
+
httpMethod,
|
|
511
|
+
decoratorName: name,
|
|
512
|
+
lineNumber: member.startPosition.row + 1 + lineOffset,
|
|
513
|
+
prefix: prefix === '' ? null : prefix,
|
|
514
|
+
...(handlerName === undefined ? {} : { handlerName }),
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// Anything that is not a decorator or a comment ends the run — including
|
|
519
|
+
// the method that just consumed it, so a decorated FIELD's stack is never
|
|
520
|
+
// absorbed onto the method after it.
|
|
521
|
+
pending.length = 0;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
@@ -25,6 +25,17 @@ import type Parser from 'tree-sitter';
|
|
|
25
25
|
* separately.
|
|
26
26
|
*/
|
|
27
27
|
export declare const METHOD_ANNOTATION_TO_HTTP: Record<string, string>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a method-level Spring mapping annotation to its HTTP method(s).
|
|
30
|
+
*
|
|
31
|
+
* Shortcut annotations have one implicit verb. `@RequestMapping` may declare
|
|
32
|
+
* one or more static `RequestMethod.X` values; when its `method` member is
|
|
33
|
+
* absent or an empty array, `'*'` preserves Spring's method-agnostic semantics.
|
|
34
|
+
* A present but non-static method expression yields no methods (fail closed).
|
|
35
|
+
*/
|
|
36
|
+
export declare function springAnnotationHttpMethods(annotationName: string, annotationText: string): readonly string[];
|
|
37
|
+
/** Intersect class- and method-level Spring mapping constraints. */
|
|
38
|
+
export declare function intersectSpringHttpMethods(classMethods: readonly string[], methodMethods: readonly string[]): readonly string[];
|
|
28
39
|
/**
|
|
29
40
|
* A named annotation argument contributes a route only when its member key is
|
|
30
41
|
* `path` or `value`; a positional argument (no key node) always qualifies.
|