gitnexus 1.6.11-rc.8 → 1.6.11
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 +95 -26
- package/dist/_shared/graph/types.d.ts +81 -2
- package/dist/_shared/graph/types.d.ts.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.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -1
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +1 -0
- package/dist/_shared/languages.js.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 +4 -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.js +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +4 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +10 -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/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/types.d.ts +15 -0
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +4 -0
- package/dist/cli/ai-context.js +90 -14
- package/dist/cli/analyze-config.js +14 -0
- package/dist/cli/analyze-options.d.ts +14 -0
- package/dist/cli/analyze-watch.d.ts +20 -0
- package/dist/cli/analyze-watch.js +434 -0
- package/dist/cli/analyze.js +27 -9
- package/dist/cli/auto-sync.d.ts +1 -0
- package/dist/cli/auto-sync.js +107 -0
- package/dist/cli/command-banner.d.ts +15 -0
- package/dist/cli/command-banner.js +42 -0
- package/dist/cli/detect-changes-format.js +21 -0
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.js +14 -0
- package/dist/cli/group.js +7 -1
- package/dist/cli/help-i18n.js +4 -0
- package/dist/cli/i18n/en.d.ts +18 -3
- package/dist/cli/i18n/en.js +18 -3
- package/dist/cli/i18n/resources.d.ts +33 -3
- package/dist/cli/i18n/zh-CN.d.ts +15 -0
- package/dist/cli/i18n/zh-CN.js +18 -3
- package/dist/cli/index.js +34 -7
- package/dist/cli/mcp.d.ts +15 -0
- package/dist/cli/mcp.js +44 -0
- package/dist/cli/optional-grammars.d.ts +3 -2
- package/dist/cli/optional-grammars.js +19 -3
- package/dist/cli/setup.js +41 -15
- package/dist/cli/update-notice.d.ts +34 -0
- package/dist/cli/update-notice.js +91 -0
- package/dist/cli/update.d.ts +21 -0
- package/dist/cli/update.js +93 -0
- package/dist/cli/watch.d.ts +1 -20
- package/dist/cli/watch.js +5 -371
- package/dist/core/analysis-feature-registry.d.ts +2 -0
- package/dist/core/analysis-feature-registry.js +15 -0
- package/dist/core/analyzer-identity.js +21 -3
- package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
- package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
- package/dist/core/auto-sync/config.d.ts +33 -0
- package/dist/core/auto-sync/config.js +320 -0
- package/dist/core/auto-sync/index.d.ts +6 -0
- package/dist/core/auto-sync/index.js +6 -0
- package/dist/core/auto-sync/path-security.d.ts +9 -0
- package/dist/core/auto-sync/path-security.js +251 -0
- package/dist/core/auto-sync/repo.d.ts +1 -0
- package/dist/core/auto-sync/repo.js +6 -0
- package/dist/core/auto-sync/runner.d.ts +44 -0
- package/dist/core/auto-sync/runner.js +428 -0
- package/dist/core/auto-sync/starter.d.ts +50 -0
- package/dist/core/auto-sync/starter.js +497 -0
- package/dist/core/auto-sync/state.d.ts +37 -0
- package/dist/core/auto-sync/state.js +119 -0
- package/dist/core/group/config-parser.js +8 -1
- package/dist/core/group/cross-impact.d.ts +3 -0
- package/dist/core/group/cross-impact.js +36 -4
- package/dist/core/group/extractors/http-patterns/java.js +22 -8
- package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
- package/dist/core/group/extractors/http-patterns/node.js +145 -8
- package/dist/core/group/extractors/http-patterns/python.js +11 -7
- package/dist/core/group/extractors/http-route-extractor.js +63 -17
- package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
- package/dist/core/group/group-lock.js +5 -6
- package/dist/core/group/normalization.d.ts +38 -1
- package/dist/core/group/normalization.js +59 -3
- package/dist/core/group/service.d.ts +11 -0
- package/dist/core/group/service.js +13 -1
- package/dist/core/group/storage.js +2 -2
- package/dist/core/group/sync.d.ts +24 -1
- package/dist/core/group/sync.js +46 -8
- package/dist/core/group/types.d.ts +13 -0
- package/dist/core/incremental/derived-writeback.d.ts +36 -0
- package/dist/core/incremental/derived-writeback.js +68 -0
- package/dist/core/incremental/spring-config-drift.d.ts +12 -0
- package/dist/core/incremental/spring-config-drift.js +46 -0
- package/dist/core/incremental/subgraph-extract.d.ts +7 -4
- package/dist/core/incremental/subgraph-extract.js +30 -5
- package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
- package/dist/core/ingestion/asyncapi/document.js +758 -0
- package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
- package/dist/core/ingestion/asyncapi/protocol.js +203 -0
- package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
- package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
- package/dist/core/ingestion/call-processor.js +3 -1
- package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
- package/dist/core/ingestion/class-extractors/generic.js +4 -1
- package/dist/core/ingestion/class-types.d.ts +6 -2
- package/dist/core/ingestion/destination-key.d.ts +59 -0
- package/dist/core/ingestion/destination-key.js +61 -0
- package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
- package/dist/core/ingestion/entry-point-scoring.js +8 -44
- package/dist/core/ingestion/export-detection.d.ts +37 -0
- package/dist/core/ingestion/export-detection.js +60 -0
- package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
- package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
- package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
- package/dist/core/ingestion/field-extractors/generic.js +12 -1
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
- package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
- package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
- package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
- package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
- package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
- package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
- package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
- package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
- package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
- package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
- package/dist/core/ingestion/import-resolvers/zig.js +193 -0
- package/dist/core/ingestion/language-config.d.ts +177 -0
- package/dist/core/ingestion/language-config.js +719 -0
- package/dist/core/ingestion/language-provider.d.ts +178 -1
- package/dist/core/ingestion/language-provider.js +22 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
- package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
- package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
- package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
- package/dist/core/ingestion/languages/java/captures.js +22 -1
- package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
- package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
- package/dist/core/ingestion/languages/java/spring-di.js +44 -2
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
- package/dist/core/ingestion/languages/java.js +18 -8
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
- package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
- package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
- package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
- package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
- package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
- package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
- package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
- package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
- package/dist/core/ingestion/languages/kotlin.js +24 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/rust/query.js +8 -8
- package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
- package/dist/core/ingestion/languages/zig/captures.js +2070 -0
- package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
- package/dist/core/ingestion/languages/zig/index.js +4 -0
- package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
- package/dist/core/ingestion/languages/zig/interpret.js +176 -0
- package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
- package/dist/core/ingestion/languages/zig/query.js +426 -0
- package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
- package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
- package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
- package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
- package/dist/core/ingestion/languages/zig.d.ts +32 -0
- package/dist/core/ingestion/languages/zig.js +130 -0
- package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
- package/dist/core/ingestion/method-extractors/generic.js +16 -4
- package/dist/core/ingestion/method-types.d.ts +10 -4
- package/dist/core/ingestion/model/field-registry.d.ts +3 -3
- package/dist/core/ingestion/model/field-registry.js +11 -7
- package/dist/core/ingestion/model/method-registry.d.ts +3 -3
- package/dist/core/ingestion/model/method-registry.js +13 -8
- package/dist/core/ingestion/model/registration-table.js +3 -0
- package/dist/core/ingestion/model/type-registry.js +8 -4
- package/dist/core/ingestion/pipeline-phases/di.js +47 -14
- package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
- package/dist/core/ingestion/pipeline-phases/index.js +1 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
- package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
- package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
- package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
- package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
- package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
- package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
- package/dist/core/ingestion/pipeline.d.ts +30 -1
- package/dist/core/ingestion/pipeline.js +52 -14
- package/dist/core/ingestion/resolve-references.js +5 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
- package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
- package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
- package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
- package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
- package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
- package/dist/core/ingestion/route-extractors/spring.js +9 -5
- package/dist/core/ingestion/scope-extractor.js +8 -0
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
- package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
- package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
- package/dist/core/ingestion/tree-sitter-queries.js +161 -0
- package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
- package/dist/core/ingestion/type-extractors/zig.js +17 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
- package/dist/core/ingestion/utils/ast-helpers.js +124 -6
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
- package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
- package/dist/core/ingestion/utils/test-file-path.js +87 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
- package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
- package/dist/core/ingestion/workers/parse-worker.js +85 -14
- package/dist/core/install-context.d.ts +4 -0
- package/dist/core/install-context.js +152 -0
- package/dist/core/lbug/csv-generator.d.ts +10 -1
- package/dist/core/lbug/csv-generator.js +92 -22
- package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
- package/dist/core/lbug/graph-emit-sink.js +4 -2
- package/dist/core/lbug/lbug-adapter.d.ts +100 -5
- package/dist/core/lbug/lbug-adapter.js +236 -24
- package/dist/core/lbug/schema.d.ts +6 -5
- package/dist/core/lbug/schema.js +84 -22
- package/dist/core/net/url-guard.d.ts +6 -0
- package/dist/core/net/url-guard.js +147 -0
- package/dist/core/package-version.d.ts +5 -0
- package/dist/core/package-version.js +10 -0
- package/dist/core/run-analyze.d.ts +21 -4
- package/dist/core/run-analyze.js +426 -117
- package/dist/core/search/fts-indexes.d.ts +19 -1
- package/dist/core/search/fts-indexes.js +28 -1
- package/dist/core/tree-sitter/parser-loader.js +16 -0
- package/dist/core/update-cache.d.ts +39 -0
- package/dist/core/update-cache.js +141 -0
- package/dist/core/update-check.d.ts +31 -0
- package/dist/core/update-check.js +274 -0
- package/dist/mcp/local/local-backend.d.ts +27 -13
- package/dist/mcp/local/local-backend.js +148 -60
- package/dist/mcp/repository-policy.d.ts +5 -1
- package/dist/mcp/repository-policy.js +48 -4
- package/dist/mcp/resources.js +10 -1
- package/dist/mcp/server.js +8 -9
- package/dist/mcp/tools.js +32 -22
- package/dist/server/analyze-launch.d.ts +2 -0
- package/dist/server/analyze-launch.js +2 -0
- package/dist/server/analyze-worker-protocol.d.ts +6 -1
- package/dist/server/analyze-worker.d.ts +1 -0
- package/dist/server/analyze-worker.js +38 -20
- package/dist/server/api.d.ts +5 -1
- package/dist/server/api.js +105 -88
- package/dist/server/git-clone.d.ts +40 -16
- package/dist/server/git-clone.js +253 -199
- package/dist/server/grep-params.d.ts +18 -0
- package/dist/server/grep-params.js +83 -0
- package/dist/server/grep-scan.d.ts +23 -0
- package/dist/server/grep-scan.js +107 -0
- package/dist/server/grep-worker.d.ts +1 -0
- package/dist/server/grep-worker.js +12 -0
- package/dist/server/mcp-http.d.ts +8 -0
- package/dist/server/mcp-http.js +16 -1
- package/dist/server/update-controller.d.ts +29 -0
- package/dist/server/update-controller.js +82 -0
- package/dist/storage/file-lock.d.ts +15 -0
- package/dist/storage/file-lock.js +155 -0
- package/dist/storage/fs-atomic.d.ts +24 -0
- package/dist/storage/fs-atomic.js +86 -2
- package/dist/storage/global-dir.d.ts +2 -0
- package/dist/storage/global-dir.js +6 -0
- package/dist/storage/parse-cache.d.ts +45 -7
- package/dist/storage/parse-cache.js +189 -42
- package/dist/storage/parsedfile-store.d.ts +41 -60
- package/dist/storage/parsedfile-store.js +247 -171
- package/dist/storage/repo-manager.d.ts +10 -4
- package/dist/storage/repo-manager.js +35 -25
- package/dist/storage/repo-meta.d.ts +34 -0
- package/dist/storage/v8-sidecar.d.ts +48 -0
- package/dist/storage/v8-sidecar.js +347 -0
- package/dist/types/pipeline.d.ts +14 -0
- package/dist/utils/process-identity.d.ts +2 -0
- package/dist/utils/process-identity.js +35 -0
- package/package.json +10 -4
- package/scripts/assert-web-assets.mjs +35 -0
- package/scripts/build-web.js +72 -0
- package/scripts/build.js +31 -28
- package/scripts/cross-platform-tests.ts +5 -0
- package/skills/gitnexus-cli.md +5 -1
- package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
- package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
- package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
- package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
- package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
- package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
- package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
- package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
- package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
- package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
- package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
- package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
- package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
- package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
- package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
- package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
- package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
- package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
- package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
- package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
- package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
- package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
- package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
- package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
- package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
- package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
- package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
- package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
- package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
- package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
- package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
- package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
- package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
- package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
- package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
- package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
- package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
- package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
- package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
- package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
- package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
- package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
- package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
- package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
- package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
- package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
- package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
- package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
- package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
- package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
- package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
- package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
- package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
- package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
- package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
- package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
- package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
- package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
- package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
- package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
- package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
- package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
- package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
- package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
- package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
- package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
- package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
- package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
- package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
- package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
- package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
- package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
- package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
- package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
- package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
- package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
- package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
- package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
- package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
- package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
- package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
- package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
- package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
- package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
- package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
- package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
- package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
- package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
- package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
- package/web/assets/src-Df5C1Nz4.js +1 -0
- package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
- package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
- package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
- package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
- package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
- package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
- package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
- package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
- package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
- package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
- package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
- package/web/index.html +19 -17
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
- package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
- package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
- package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
- package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
- package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
- package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
- package/web/assets/src-C5sx_gMp.js +0 -1
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
- /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ParsedFile, Range, ScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
3
|
+
import type { DiInjectionMatch } from '../../di-extractors/index.js';
|
|
4
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
5
|
+
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
6
|
+
export interface SpringDynamicLookupFact {
|
|
7
|
+
readonly ownerScopeId: ScopeId;
|
|
8
|
+
readonly ownerRange: Range;
|
|
9
|
+
readonly receiverName: string;
|
|
10
|
+
readonly methodName: string;
|
|
11
|
+
readonly targetTypeName: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function springDynamicLookupCardinality(receiverName: string, methodName: string): DiInjectionMatch['cardinality'] | null;
|
|
14
|
+
export interface SpringDynamicLookupMetadataAdapter {
|
|
15
|
+
getFacts(filePath: string): readonly SpringDynamicLookupFact[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Attach AST-captured programmatic Spring lookups to the framework-neutral DI
|
|
19
|
+
* resolver. Java/Kotlin own syntax capture; this shared JVM/Spring seam owns
|
|
20
|
+
* import-aware type binding and metadata attachment.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createSpringDynamicLookupMetadataAttacher(adapter: SpringDynamicLookupMetadataAdapter): (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, indexes: ScopeResolutionIndexes) => void;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { SPRING_DI_INJECTION_SITES_PROPERTY } from '../../di-extractors/spring.js';
|
|
2
|
+
import { resolveCallerGraphId, resolveDefGraphId, } from '../../scope-resolution/graph-bridge/ids.js';
|
|
3
|
+
import { isClassLike, lookupBindingsAt } from '../../scope-resolution/scope/walkers.js';
|
|
4
|
+
const COLLECTION_LOOKUP_METHODS = new Set(['getBeans', 'getBeansOfType']);
|
|
5
|
+
const SINGLE_LOOKUP_METHODS = new Set(['getBean']);
|
|
6
|
+
/**
|
|
7
|
+
* Distinctive utility names plus conventional Spring context variable names.
|
|
8
|
+
* Generic locals remain recall-oriented because repositories often omit the
|
|
9
|
+
* third-party context type from the index; AST call/class-literal gates and
|
|
10
|
+
* import-aware target resolution prevent the raw-text false-positive class.
|
|
11
|
+
*/
|
|
12
|
+
const KNOWN_RECEIVERS = new Set([
|
|
13
|
+
'SpringContextUtil',
|
|
14
|
+
'SpringContextHolder',
|
|
15
|
+
'SpringBeanUtil',
|
|
16
|
+
'ApplicationContextProvider',
|
|
17
|
+
'BeanFactoryProvider',
|
|
18
|
+
'ApplicationContext',
|
|
19
|
+
'BeanFactory',
|
|
20
|
+
'ListableBeanFactory',
|
|
21
|
+
'applicationContext',
|
|
22
|
+
'context',
|
|
23
|
+
'ctx',
|
|
24
|
+
'appContext',
|
|
25
|
+
'beanFactory',
|
|
26
|
+
]);
|
|
27
|
+
export function springDynamicLookupCardinality(receiverName, methodName) {
|
|
28
|
+
const receiverSimpleName = receiverName.slice(receiverName.lastIndexOf('.') + 1);
|
|
29
|
+
if (!KNOWN_RECEIVERS.has(receiverSimpleName))
|
|
30
|
+
return null;
|
|
31
|
+
if (COLLECTION_LOOKUP_METHODS.has(methodName))
|
|
32
|
+
return 'collection';
|
|
33
|
+
if (SINGLE_LOOKUP_METHODS.has(methodName))
|
|
34
|
+
return 'single';
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function visibleTypeDefinitions(fact, indexes) {
|
|
38
|
+
const simpleName = fact.targetTypeName.slice(fact.targetTypeName.lastIndexOf('.') + 1);
|
|
39
|
+
let scopeId = fact.ownerScopeId;
|
|
40
|
+
while (scopeId !== null) {
|
|
41
|
+
const visible = lookupBindingsAt(scopeId, simpleName, indexes)
|
|
42
|
+
.map(({ def }) => def)
|
|
43
|
+
.filter((def) => isClassLike(def.type))
|
|
44
|
+
.filter((def) => !fact.targetTypeName.includes('.') || def.qualifiedName === fact.targetTypeName);
|
|
45
|
+
if (visible.length > 0) {
|
|
46
|
+
const unique = new Map(visible.map((def) => [def.nodeId, def]));
|
|
47
|
+
return [...unique.values()];
|
|
48
|
+
}
|
|
49
|
+
scopeId = indexes.scopeTree.getScope(scopeId)?.parent ?? null;
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
function resolveTargetTypeName(graph, fact, callerLanguage, nodeLookup, indexes) {
|
|
54
|
+
const graphIds = new Set();
|
|
55
|
+
for (const definition of visibleTypeDefinitions(fact, indexes)) {
|
|
56
|
+
const graphId = resolveDefGraphId(definition.filePath, definition, nodeLookup);
|
|
57
|
+
if (graphId === undefined)
|
|
58
|
+
continue;
|
|
59
|
+
const node = graph.getNode(graphId);
|
|
60
|
+
if ((node?.label === 'Class' ||
|
|
61
|
+
node?.label === 'Interface' ||
|
|
62
|
+
node?.label === 'Record' ||
|
|
63
|
+
node?.label === 'Enum') &&
|
|
64
|
+
node.properties.language === callerLanguage) {
|
|
65
|
+
graphIds.add(graphId);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (graphIds.size !== 1)
|
|
69
|
+
return undefined;
|
|
70
|
+
const targetId = graphIds.values().next().value;
|
|
71
|
+
if (targetId === undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
const target = graph.getNode(targetId);
|
|
74
|
+
if (target === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
const qualifiedName = target.properties.qualifiedName;
|
|
77
|
+
return typeof qualifiedName === 'string' ? qualifiedName : target.properties.name;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Attach AST-captured programmatic Spring lookups to the framework-neutral DI
|
|
81
|
+
* resolver. Java/Kotlin own syntax capture; this shared JVM/Spring seam owns
|
|
82
|
+
* import-aware type binding and metadata attachment.
|
|
83
|
+
*/
|
|
84
|
+
export function createSpringDynamicLookupMetadataAttacher(adapter) {
|
|
85
|
+
return (graph, parsedFiles, nodeLookup, indexes) => {
|
|
86
|
+
for (const parsed of parsedFiles) {
|
|
87
|
+
for (const fact of adapter.getFacts(parsed.filePath)) {
|
|
88
|
+
const cardinality = springDynamicLookupCardinality(fact.receiverName, fact.methodName);
|
|
89
|
+
if (cardinality === null)
|
|
90
|
+
continue;
|
|
91
|
+
const callerId = resolveCallerGraphId(fact.ownerScopeId, indexes, nodeLookup, {
|
|
92
|
+
startLine: fact.ownerRange.startLine,
|
|
93
|
+
startCol: fact.ownerRange.startCol,
|
|
94
|
+
});
|
|
95
|
+
if (callerId === undefined)
|
|
96
|
+
continue;
|
|
97
|
+
const caller = graph.getNode(callerId);
|
|
98
|
+
if (caller === undefined ||
|
|
99
|
+
(caller.label !== 'Function' &&
|
|
100
|
+
caller.label !== 'Method' &&
|
|
101
|
+
caller.label !== 'Constructor')) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const targetTypeName = resolveTargetTypeName(graph, fact, caller.properties.language, nodeLookup, indexes);
|
|
105
|
+
if (targetTypeName === undefined)
|
|
106
|
+
continue;
|
|
107
|
+
const match = {
|
|
108
|
+
targetTypeName,
|
|
109
|
+
cardinality,
|
|
110
|
+
edgeSource: 'site',
|
|
111
|
+
reason: `Spring dynamic lookup: ${fact.receiverName}.${fact.methodName}(${fact.targetTypeName})`,
|
|
112
|
+
};
|
|
113
|
+
// Singular lookups intentionally use the shared DI selection policy:
|
|
114
|
+
// a unique/@Primary candidate wins; unresolved multiplicity is an
|
|
115
|
+
// explicit 0.5-confidence fan-out rather than a guessed runtime winner.
|
|
116
|
+
const existing = caller.properties[SPRING_DI_INJECTION_SITES_PROPERTY];
|
|
117
|
+
caller.properties[SPRING_DI_INJECTION_SITES_PROPERTY] = [
|
|
118
|
+
...(Array.isArray(existing) ? existing : []),
|
|
119
|
+
match,
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Range, ScopeId } from '../../../../_shared/index.js';
|
|
2
|
+
import type { SpringArgumentFact } from './argument-facts.js';
|
|
3
|
+
/**
|
|
4
|
+
* Outbound side of Spring messaging: the template calls that publish to a
|
|
5
|
+
* broker destination, mirroring the inbound `@KafkaListener` / `@RabbitListener`
|
|
6
|
+
* family already recognized in `non-http-handlers.ts`.
|
|
7
|
+
*
|
|
8
|
+
* Recognition is purely syntactic and happens while the language's own scope
|
|
9
|
+
* query already has the call node in hand. The receiver's declared type is NOT
|
|
10
|
+
* consulted: at capture time the field may be inherited, injected from another
|
|
11
|
+
* file, or typed through an import that is not finalized yet. Matching on the
|
|
12
|
+
* receiver's simple name instead keeps the capture cheap and resolver-free; a
|
|
13
|
+
* later phase that owns type information can refine or discard a fact.
|
|
14
|
+
*/
|
|
15
|
+
export type SpringMessageProducerTemplate = 'kafka' | 'rabbit' | 'jms' | 'stream-bridge';
|
|
16
|
+
/**
|
|
17
|
+
* Cheap pre-filter usable before any receiver text is materialized. Both
|
|
18
|
+
* languages visit every member call, so the common case must cost one set
|
|
19
|
+
* lookup on the method name.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isSpringMessageProducerMethod(methodName: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Classify a `receiver.method(...)` call as a messaging producer, or `null`.
|
|
24
|
+
*
|
|
25
|
+
* `receiverName` is the receiver expression as written; only its last
|
|
26
|
+
* dot-separated segment participates, so `this.kafkaTemplate` and
|
|
27
|
+
* `outer.inner.kafkaTemplate` match while `templates.get("k")` does not.
|
|
28
|
+
*
|
|
29
|
+
* The PLAIN_IDENTIFIER gate runs BEFORE the fold and is load-bearing, because
|
|
30
|
+
* the last-dot split is textual: in `config.get("a.kafkaTemplate")` it yields
|
|
31
|
+
* `kafkaTemplate")`, which folds to something a name match would accept. Only
|
|
32
|
+
* an identifier survives the gate, which is also what rejects `templates["k"]`,
|
|
33
|
+
* `getTemplate()`, and a receiver whose dot is separated by a comment.
|
|
34
|
+
*
|
|
35
|
+
* The folded segment then matches case-insensitively when it CONTAINS the
|
|
36
|
+
* template type name, so every convention a template bean is really declared
|
|
37
|
+
* with is recognized — decorated by prefix (`orderKafkaTemplate`), by suffix
|
|
38
|
+
* (`kafkaTemplateDlq`, `kafkaTemplateV2`, `rabbitTemplate1`), or written as a
|
|
39
|
+
* constant (`KAFKA_TEMPLATE`, `STREAM_BRIDGE`). A suffix-only rule accepted
|
|
40
|
+
* one of those and silently dropped the rest, which are exactly the publishes
|
|
41
|
+
* this capture exists to find. A receiver named only `template` still does not
|
|
42
|
+
* match: without type information that would attribute any `send` in the
|
|
43
|
+
* repository to Kafka.
|
|
44
|
+
*
|
|
45
|
+
* The bare type name (`KafkaTemplate.send(...)`) contains itself and so is
|
|
46
|
+
* accepted. That is left as it is: the match is by NAME, a name equal to the
|
|
47
|
+
* type is the strongest evidence the rule has, and a later phase that owns type
|
|
48
|
+
* information can discard a static-looking receiver.
|
|
49
|
+
*
|
|
50
|
+
* A substring rule also lets ONE receiver satisfy TWO signatures, which a
|
|
51
|
+
* suffix rule could not: `KafkaTemplate` and `StreamBridge` both publish
|
|
52
|
+
* through `send`, and `RabbitTemplate` and `JmsTemplate` both through
|
|
53
|
+
* `convertAndSend`, so `streamBridgeKafkaTemplate.send(...)` matches two
|
|
54
|
+
* templates at once. Such a receiver yields NO fact. Nothing here can break the
|
|
55
|
+
* tie honestly: the receiver's TYPE is deliberately not resolved, and the name
|
|
56
|
+
* is not ranked evidence — neither the longest match, nor the last one, nor the
|
|
57
|
+
* order of this list says whether that bean is a KafkaTemplate fronted by a
|
|
58
|
+
* stream binding or a StreamBridge named after the broker behind it. Returning
|
|
59
|
+
* the first match published an arbitrary choice as a definite broker
|
|
60
|
+
* attribution, the one outcome a consumer cannot tell from a fact. Silence
|
|
61
|
+
* costs a rare publish and stays recoverable by a phase that owns types.
|
|
62
|
+
*/
|
|
63
|
+
export declare function springMessageProducerTemplateOf(receiverName: string, methodName: string): SpringMessageProducerTemplate | null;
|
|
64
|
+
export interface SpringMessageProducerFact {
|
|
65
|
+
/** Callable that performs the publish; the enclosing method or function. */
|
|
66
|
+
readonly ownerScopeId: ScopeId;
|
|
67
|
+
readonly ownerRange: Range;
|
|
68
|
+
readonly template: SpringMessageProducerTemplate;
|
|
69
|
+
/** Receiver expression as written, for example `this.orderKafkaTemplate`. */
|
|
70
|
+
readonly receiverName: string;
|
|
71
|
+
readonly methodName: string;
|
|
72
|
+
/**
|
|
73
|
+
* Call arguments in source order, or absent when the call site has no
|
|
74
|
+
* argument list at all (a Kotlin trailing-lambda call). An empty array means
|
|
75
|
+
* an empty argument list was written — a different fact from no list.
|
|
76
|
+
*/
|
|
77
|
+
readonly args?: readonly SpringArgumentFact[];
|
|
78
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const PRODUCER_SIGNATURES = [
|
|
2
|
+
{ template: 'kafka', typeName: 'KafkaTemplate', methodName: 'send' },
|
|
3
|
+
{ template: 'rabbit', typeName: 'RabbitTemplate', methodName: 'convertAndSend' },
|
|
4
|
+
{ template: 'jms', typeName: 'JmsTemplate', methodName: 'convertAndSend' },
|
|
5
|
+
{ template: 'stream-bridge', typeName: 'StreamBridge', methodName: 'send' },
|
|
6
|
+
];
|
|
7
|
+
const PRODUCER_METHOD_NAMES = new Set(PRODUCER_SIGNATURES.map((signature) => signature.methodName));
|
|
8
|
+
/** A receiver we can attribute; `templates["k"]` or `getTemplate()` cannot be. */
|
|
9
|
+
const PLAIN_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
10
|
+
/**
|
|
11
|
+
* Fold a receiver's simple name to the form the type-name match runs against.
|
|
12
|
+
*
|
|
13
|
+
* `_` and `$` are word separators in the spellings this has to accept, not part
|
|
14
|
+
* of the words: `KAFKA_TEMPLATE` and `kafka_template` are the same bean name as
|
|
15
|
+
* `kafkaTemplate`, written to the constant and snake conventions. Digits stay,
|
|
16
|
+
* because they are part of a name (`kafkaTemplate2`), never a separator.
|
|
17
|
+
*/
|
|
18
|
+
function foldReceiverName(receiverSimpleName) {
|
|
19
|
+
return receiverSimpleName.replace(/[_$]/g, '').toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Cheap pre-filter usable before any receiver text is materialized. Both
|
|
23
|
+
* languages visit every member call, so the common case must cost one set
|
|
24
|
+
* lookup on the method name.
|
|
25
|
+
*/
|
|
26
|
+
export function isSpringMessageProducerMethod(methodName) {
|
|
27
|
+
return PRODUCER_METHOD_NAMES.has(methodName);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Classify a `receiver.method(...)` call as a messaging producer, or `null`.
|
|
31
|
+
*
|
|
32
|
+
* `receiverName` is the receiver expression as written; only its last
|
|
33
|
+
* dot-separated segment participates, so `this.kafkaTemplate` and
|
|
34
|
+
* `outer.inner.kafkaTemplate` match while `templates.get("k")` does not.
|
|
35
|
+
*
|
|
36
|
+
* The PLAIN_IDENTIFIER gate runs BEFORE the fold and is load-bearing, because
|
|
37
|
+
* the last-dot split is textual: in `config.get("a.kafkaTemplate")` it yields
|
|
38
|
+
* `kafkaTemplate")`, which folds to something a name match would accept. Only
|
|
39
|
+
* an identifier survives the gate, which is also what rejects `templates["k"]`,
|
|
40
|
+
* `getTemplate()`, and a receiver whose dot is separated by a comment.
|
|
41
|
+
*
|
|
42
|
+
* The folded segment then matches case-insensitively when it CONTAINS the
|
|
43
|
+
* template type name, so every convention a template bean is really declared
|
|
44
|
+
* with is recognized — decorated by prefix (`orderKafkaTemplate`), by suffix
|
|
45
|
+
* (`kafkaTemplateDlq`, `kafkaTemplateV2`, `rabbitTemplate1`), or written as a
|
|
46
|
+
* constant (`KAFKA_TEMPLATE`, `STREAM_BRIDGE`). A suffix-only rule accepted
|
|
47
|
+
* one of those and silently dropped the rest, which are exactly the publishes
|
|
48
|
+
* this capture exists to find. A receiver named only `template` still does not
|
|
49
|
+
* match: without type information that would attribute any `send` in the
|
|
50
|
+
* repository to Kafka.
|
|
51
|
+
*
|
|
52
|
+
* The bare type name (`KafkaTemplate.send(...)`) contains itself and so is
|
|
53
|
+
* accepted. That is left as it is: the match is by NAME, a name equal to the
|
|
54
|
+
* type is the strongest evidence the rule has, and a later phase that owns type
|
|
55
|
+
* information can discard a static-looking receiver.
|
|
56
|
+
*
|
|
57
|
+
* A substring rule also lets ONE receiver satisfy TWO signatures, which a
|
|
58
|
+
* suffix rule could not: `KafkaTemplate` and `StreamBridge` both publish
|
|
59
|
+
* through `send`, and `RabbitTemplate` and `JmsTemplate` both through
|
|
60
|
+
* `convertAndSend`, so `streamBridgeKafkaTemplate.send(...)` matches two
|
|
61
|
+
* templates at once. Such a receiver yields NO fact. Nothing here can break the
|
|
62
|
+
* tie honestly: the receiver's TYPE is deliberately not resolved, and the name
|
|
63
|
+
* is not ranked evidence — neither the longest match, nor the last one, nor the
|
|
64
|
+
* order of this list says whether that bean is a KafkaTemplate fronted by a
|
|
65
|
+
* stream binding or a StreamBridge named after the broker behind it. Returning
|
|
66
|
+
* the first match published an arbitrary choice as a definite broker
|
|
67
|
+
* attribution, the one outcome a consumer cannot tell from a fact. Silence
|
|
68
|
+
* costs a rare publish and stays recoverable by a phase that owns types.
|
|
69
|
+
*/
|
|
70
|
+
export function springMessageProducerTemplateOf(receiverName, methodName) {
|
|
71
|
+
if (!isSpringMessageProducerMethod(methodName))
|
|
72
|
+
return null;
|
|
73
|
+
const receiverSimpleName = receiverName.slice(receiverName.lastIndexOf('.') + 1).trim();
|
|
74
|
+
if (!PLAIN_IDENTIFIER.test(receiverSimpleName))
|
|
75
|
+
return null;
|
|
76
|
+
const folded = foldReceiverName(receiverSimpleName);
|
|
77
|
+
let matched = null;
|
|
78
|
+
for (const signature of PRODUCER_SIGNATURES) {
|
|
79
|
+
if (signature.methodName !== methodName)
|
|
80
|
+
continue;
|
|
81
|
+
if (!folded.includes(signature.typeName.toLowerCase()))
|
|
82
|
+
continue;
|
|
83
|
+
// A second match makes the receiver ambiguous; see above for why it is not
|
|
84
|
+
// resolved by preferring one of them.
|
|
85
|
+
if (matched !== null)
|
|
86
|
+
return null;
|
|
87
|
+
matched = signature.template;
|
|
88
|
+
}
|
|
89
|
+
return matched;
|
|
90
|
+
}
|
|
@@ -2,12 +2,41 @@ import type { ParsedFile, Range, ScopeId } from '../../../../_shared/index.js';
|
|
|
2
2
|
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
3
3
|
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
4
4
|
import type { GraphNodeLookup } from '../../scope-resolution/graph-bridge/node-lookup.js';
|
|
5
|
+
import type { SpringArgumentFact } from './argument-facts.js';
|
|
5
6
|
export declare const SPRING_NON_HTTP_HANDLER_ENTRY_POINT_MULTIPLIER = 3;
|
|
6
7
|
export type SpringNonHttpHandlerKind = 'scheduled' | 'event' | 'message' | 'xxl-job';
|
|
7
8
|
export interface SpringNonHttpHandlerAnnotationFact {
|
|
8
9
|
readonly name: string;
|
|
9
10
|
/** Kotlin use-site targets describe generated/property elements, not the callable. */
|
|
10
11
|
readonly useSiteTarget?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Annotation arguments in source order. An empty array always means an empty
|
|
14
|
+
* list was written (`@Scheduled()`), which is a different fact from absence —
|
|
15
|
+
* but absence has TWO causes, and only one of them is a statement about the
|
|
16
|
+
* source. Either the annotation was written without an argument list
|
|
17
|
+
* (`@Scheduled`), or arguments were never read for this callable.
|
|
18
|
+
*
|
|
19
|
+
* They are read only for a callable that carries a handler annotation. Java
|
|
20
|
+
* produces facts for no other callable, so there absence does mean "no list
|
|
21
|
+
* was written". Kotlin also produces a fact for a merely annotated function —
|
|
22
|
+
* it captures those without a name prefilter so an import alias cannot hide a
|
|
23
|
+
* handler — and on those facts arguments are absent however the annotation
|
|
24
|
+
* was written.
|
|
25
|
+
*
|
|
26
|
+
* The values keep their source spelling, with one deliberate exception:
|
|
27
|
+
* `normalizeSpringFactText` trims them and collapses whitespace around the
|
|
28
|
+
* dots of a multi-line expression, so `Destinations.ORDERS` and the same
|
|
29
|
+
* reference wrapped across lines produce equal facts. Without that, source
|
|
30
|
+
* formatting — including the enclosing block's indentation, which is not a
|
|
31
|
+
* property of the expression at all — would leak into the data and make two
|
|
32
|
+
* spellings of one destination compare unequal downstream.
|
|
33
|
+
*
|
|
34
|
+
* Nothing else is touched. `@KafkaListener(topics = ...)` and
|
|
35
|
+
* `@RabbitListener(queues = ...)` name the destination differently, and a
|
|
36
|
+
* destination may be a literal, a constant reference, or a `${...}`
|
|
37
|
+
* placeholder; resolving any of those belongs to a later phase.
|
|
38
|
+
*/
|
|
39
|
+
readonly args?: readonly SpringArgumentFact[];
|
|
11
40
|
}
|
|
12
41
|
export interface SpringNonHttpHandlerFact<Annotation extends SpringNonHttpHandlerAnnotationFact = SpringNonHttpHandlerAnnotationFact> {
|
|
13
42
|
readonly ownerScopeId: ScopeId;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Return the configured vendor prefixes as a canonical, duplicate-free set. */
|
|
2
|
+
export declare function springVendorPrefixes(): ReadonlySet<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Stable metadata value for the route semantics controlled by the prefix list.
|
|
5
|
+
* Sorting makes equivalent lists independent of declaration order.
|
|
6
|
+
*/
|
|
7
|
+
export declare function springVendorPrefixesKey(): string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const DEFAULT_SPRING_VENDOR_PREFIXES = 'Win';
|
|
2
|
+
let cachedRawValue;
|
|
3
|
+
let cachedPrefixes;
|
|
4
|
+
/** Return the configured vendor prefixes as a canonical, duplicate-free set. */
|
|
5
|
+
export function springVendorPrefixes() {
|
|
6
|
+
const rawValue = process.env.GITNEXUS_SPRING_VENDOR_PREFIXES ?? DEFAULT_SPRING_VENDOR_PREFIXES;
|
|
7
|
+
if (cachedPrefixes && cachedRawValue === rawValue)
|
|
8
|
+
return cachedPrefixes;
|
|
9
|
+
cachedRawValue = rawValue;
|
|
10
|
+
cachedPrefixes = new Set(rawValue
|
|
11
|
+
.split(',')
|
|
12
|
+
.map((prefix) => prefix.trim())
|
|
13
|
+
.filter(Boolean));
|
|
14
|
+
return cachedPrefixes;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Stable metadata value for the route semantics controlled by the prefix list.
|
|
18
|
+
* Sorting makes equivalent lists independent of declaration order.
|
|
19
|
+
*/
|
|
20
|
+
export function springVendorPrefixesKey() {
|
|
21
|
+
return JSON.stringify([...springVendorPrefixes()].sort());
|
|
22
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig import resolution.
|
|
3
|
+
*
|
|
4
|
+
* Local-file imports (`@import("./foo.zig")`, `@import("foo.zig")`) resolve
|
|
5
|
+
* relative to the importer. Bare names (`@import("bar")`) resolve through
|
|
6
|
+
* build.zig.zon `.path` deps when a parsed ZigBuildZonConfig is available
|
|
7
|
+
* (see language-config.ts `loadZigBuildConfig`). Everything unresolvable —
|
|
8
|
+
* `std`, `builtin`, `root`, `.url`-based deps — returns an empty result so
|
|
9
|
+
* it doesn't produce ghost import edges.
|
|
10
|
+
*/
|
|
11
|
+
import type { ImportResolutionConfig, ImportResolverStrategy } from '../types.js';
|
|
12
|
+
export declare const zigImportStrategy: ImportResolverStrategy;
|
|
13
|
+
export declare const zigImportConfig: ImportResolutionConfig;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig import resolution.
|
|
3
|
+
*
|
|
4
|
+
* Local-file imports (`@import("./foo.zig")`, `@import("foo.zig")`) resolve
|
|
5
|
+
* relative to the importer. Bare names (`@import("bar")`) resolve through
|
|
6
|
+
* build.zig.zon `.path` deps when a parsed ZigBuildZonConfig is available
|
|
7
|
+
* (see language-config.ts `loadZigBuildConfig`). Everything unresolvable —
|
|
8
|
+
* `std`, `builtin`, `root`, `.url`-based deps — returns an empty result so
|
|
9
|
+
* it doesn't produce ghost import edges.
|
|
10
|
+
*/
|
|
11
|
+
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
12
|
+
import { resolveZigImportInternal } from '../zig.js';
|
|
13
|
+
const stripQuotes = (s) => s.replace(/^['"]|['"]$/g, '');
|
|
14
|
+
export const zigImportStrategy = (rawImportPath, filePath, ctx) => {
|
|
15
|
+
// tree-sitter-zig captures the string with surrounding quotes.
|
|
16
|
+
const stripped = stripQuotes(rawImportPath);
|
|
17
|
+
const resolved = resolveZigImportInternal(filePath, stripped, ctx.allFilePaths, ctx.configs.zigBuildZon ?? null);
|
|
18
|
+
// Unresolvable (stdlib / builtin / .url dep / missing file): stop the
|
|
19
|
+
// chain with an empty result rather than falling through to suffix
|
|
20
|
+
// matching, which could ghost-match an unrelated same-named file.
|
|
21
|
+
return { kind: 'files', files: resolved ? [resolved] : [] };
|
|
22
|
+
};
|
|
23
|
+
export const zigImportConfig = {
|
|
24
|
+
language: SupportedLanguages.Zig,
|
|
25
|
+
strategies: [zigImportStrategy],
|
|
26
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zig module import resolution — internal helpers.
|
|
3
|
+
*
|
|
4
|
+
* Zig imports take three shapes:
|
|
5
|
+
* const std = @import("std"); → stdlib, unresolvable
|
|
6
|
+
* const builtin = @import("builtin"); → compiler builtin, unresolvable
|
|
7
|
+
* const root = @import("root"); → user's main module, unresolvable here
|
|
8
|
+
* const foo = @import("./foo.zig"); → relative path
|
|
9
|
+
* const foo = @import("foo.zig"); → also relative (Zig treats unprefixed
|
|
10
|
+
* paths with a `.zig` extension as
|
|
11
|
+
* filesystem-relative to the importer)
|
|
12
|
+
* const lp = @import("lightpanda"); → the repo's OWN module, declared by
|
|
13
|
+
* its root build.zig (`b.addModule`)
|
|
14
|
+
* const bar = @import("bar"); → package dep declared in build.zig.zon
|
|
15
|
+
*
|
|
16
|
+
* Bare-name resolution is handled when a parsed ZigBuildZonConfig is
|
|
17
|
+
* supplied (see `loadZigBuildConfig`). The import table of the build module
|
|
18
|
+
* the importer belongs to comes first (`buildModules` — per-module
|
|
19
|
+
* `addImport` aliases, see `zigModulesContaining`), then the root
|
|
20
|
+
* build.zig's named modules flattened repo-wide (`rootModules`, name → root
|
|
21
|
+
* file — a repo with no build.zig.zon still resolves them). `.url`-based deps unpack into a build cache outside
|
|
22
|
+
* the repo and so are returned as null; `.path`-based deps are resolved
|
|
23
|
+
* through the root the dep's own build.zig declares, then the conventional
|
|
24
|
+
* `<dep_root>/src/root.zig`, `<dep_root>/src/<name>.zig`,
|
|
25
|
+
* `<dep_root>/src/main.zig` layouts.
|
|
26
|
+
*/
|
|
27
|
+
import { type ZigBuildZonConfig } from '../language-config.js';
|
|
28
|
+
/** Resolve a Zig @import argument to a file path in the repository.
|
|
29
|
+
* Returns null when the import is a stdlib / builtin / root reference,
|
|
30
|
+
* an unresolvable build.zig.zon package dep, or genuinely unresolvable.
|
|
31
|
+
*
|
|
32
|
+
* `buildZon` (optional) supplies the parsed `.dependencies` map from
|
|
33
|
+
* build.zig.zon. */
|
|
34
|
+
export declare function resolveZigImportInternal(currentFile: string, importPath: string, allFiles: ReadonlySet<string>, buildZon?: ZigBuildZonConfig | null): string | null;
|