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,539 @@
|
|
|
1
|
+
import type { SpringArgumentFact } from './argument-facts.js';
|
|
2
|
+
import type { SpringMessageProducerTemplate } from './message-producers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolution of Spring async messaging DESTINATIONS — the broker address a
|
|
5
|
+
* `@KafkaListener` reads from or a `kafkaTemplate.send(...)` writes to.
|
|
6
|
+
*
|
|
7
|
+
* The capture layer records the destination argument exactly as written and
|
|
8
|
+
* resolves nothing (see `argument-facts.ts`). This module is the other half:
|
|
9
|
+
* it decides WHICH argument names the destination, then walks a four-step
|
|
10
|
+
* cascade to turn that argument's source text into an address. It is pure —
|
|
11
|
+
* no graph, no filesystem, no parser — so every rule below is unit-testable
|
|
12
|
+
* against a string, and `pipeline-phases/spring-destinations.ts` is left with
|
|
13
|
+
* only node and edge emission.
|
|
14
|
+
*
|
|
15
|
+
* ── THE INVARIANT THIS MODULE EXISTS TO PROTECT ──────────────────────────
|
|
16
|
+
*
|
|
17
|
+
* An address that could NOT be resolved must never become a shared identity.
|
|
18
|
+
* Two unrelated services that each merely write
|
|
19
|
+
*
|
|
20
|
+
* @KafkaListener(topics = "${app.topic}")
|
|
21
|
+
*
|
|
22
|
+
* have said nothing about each other. If the graph keyed a destination node on
|
|
23
|
+
* that placeholder text, they would land on one node and READ AS CONNECTED —
|
|
24
|
+
* and a false edge is worse than a missing one, because a missing edge is
|
|
25
|
+
* visible as a gap while a false one enters reports as a fact.
|
|
26
|
+
*
|
|
27
|
+
* So this module never returns a placeholder, a constant name, or any other
|
|
28
|
+
* unresolved spelling as an `address`. An unresolved candidate comes back as
|
|
29
|
+
* `{ kind: 'unresolved', reason }` with no address at all, and the phase keys
|
|
30
|
+
* such a node by its SOURCE LOCATION. A status flag would not have been
|
|
31
|
+
* enough: the two services would still share whatever key the node was minted
|
|
32
|
+
* from. Only withholding the key prevents the join.
|
|
33
|
+
*
|
|
34
|
+
* ── REFUSAL IS DATA ──────────────────────────────────────────────────────
|
|
35
|
+
*
|
|
36
|
+
* Every path that declines to produce an address records WHY, from a closed
|
|
37
|
+
* set ({@link SpringDestinationRefusal}). The measure of this feature is the
|
|
38
|
+
* unresolved fraction, so a silent `continue` would hide precisely the number
|
|
39
|
+
* that says whether it works.
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Broker family behind a destination, as far as the syntax can attest.
|
|
43
|
+
*
|
|
44
|
+
* Part of the `Destination` node IDENTITY, not merely a label on it: the phase
|
|
45
|
+
* keys a resolved node by `(broker, address)` via the framework-neutral
|
|
46
|
+
* `ingestion/destination-key.ts`, so two brokers claiming one address are two
|
|
47
|
+
* ordinary nodes. Adding or renaming a member here therefore re-keys every node
|
|
48
|
+
* it applies to, which a full re-index absorbs and an incremental one does not
|
|
49
|
+
* — the destination layer is delete-alled and rebuilt graph-wide on every
|
|
50
|
+
* incremental writeback for exactly this class of reason.
|
|
51
|
+
*
|
|
52
|
+
* A member is only added when the SYNTAX attests to it. A guess here becomes a
|
|
53
|
+
* guess in the identity, and the cost of a wrong one is a real pair split in
|
|
54
|
+
* two (see `destinationNodeKey` for why that cost is nonetheless the cheaper
|
|
55
|
+
* of the two failures available).
|
|
56
|
+
*/
|
|
57
|
+
export type SpringDestinationBroker = 'kafka' | 'rabbit' | 'jms' | 'pulsar' | 'sqs' | 'stream' | 'integration';
|
|
58
|
+
/**
|
|
59
|
+
* Why a candidate produced no address. Closed set: each member is a distinct,
|
|
60
|
+
* countable diagnosis, and no path may decline without naming one.
|
|
61
|
+
*
|
|
62
|
+
* Members are split rather than merged wherever the two causes are different
|
|
63
|
+
* FACTS about the repository. The unresolved fraction is only useful if its
|
|
64
|
+
* breakdown says what to go and fix, and a bucket that means "either the
|
|
65
|
+
* capture could not read this or the source really did write it that way"
|
|
66
|
+
* answers neither question.
|
|
67
|
+
*/
|
|
68
|
+
export type SpringDestinationRefusal =
|
|
69
|
+
/** The annotation is a recognized listener but its arguments were never read
|
|
70
|
+
* — a CAPTURE limitation, not a statement about the source. */
|
|
71
|
+
'annotation-arguments-unavailable'
|
|
72
|
+
/** The annotation's argument list was read and it was EMPTY: `@KafkaListener`
|
|
73
|
+
* with no elements at all. A real source-level gap, and deliberately not the
|
|
74
|
+
* same bucket as `annotation-arguments-unavailable` — see
|
|
75
|
+
* `SpringNonHttpHandlerAnnotationFact.args`, which keeps absent and `[]`
|
|
76
|
+
* apart precisely so a consumer of the fact does not have to guess. */
|
|
77
|
+
| 'annotation-arguments-empty'
|
|
78
|
+
/** Recognized listener, argument list present, no element names a destination. */
|
|
79
|
+
| 'no-destination-argument'
|
|
80
|
+
/** `@KafkaListeners({@KafkaListener(...), ...})` and its siblings. The
|
|
81
|
+
* container's single argument is a list of NESTED annotations, and capture
|
|
82
|
+
* does not descend into them, so their destinations are unreadable here.
|
|
83
|
+
* Recorded rather than skipped: a repository using repeated-listener
|
|
84
|
+
* containers loses real destinations, and that has to show up in the count
|
|
85
|
+
* instead of looking like a repository with no listeners. */
|
|
86
|
+
| 'repeated-listener-container'
|
|
87
|
+
/** `@KafkaListener(topicPattern = ...)` — a regex over topics, not an address. */
|
|
88
|
+
| 'topic-pattern'
|
|
89
|
+
/** A destination form this module deliberately does not read, e.g.
|
|
90
|
+
* `@RabbitListener(bindings = @QueueBinding(...))` or `topicPartitions`. */
|
|
91
|
+
| 'unsupported-annotation-argument'
|
|
92
|
+
/** A Kotlin trailing-lambda call: the publish has no argument list at all. */
|
|
93
|
+
| 'producer-arguments-unavailable'
|
|
94
|
+
/** The call's arity matches none of the overloads that carry a destination. */
|
|
95
|
+
| 'producer-arity-unrecognized'
|
|
96
|
+
/** The call used NAMED arguments and none of them names a destination
|
|
97
|
+
* parameter this module knows. Selecting by position instead would read
|
|
98
|
+
* whatever the author happened to write first — see
|
|
99
|
+
* {@link selectProducerDestinationArguments}. */
|
|
100
|
+
| 'producer-named-argument-unrecognized'
|
|
101
|
+
/** `rabbitTemplate.convertAndSend(message)` — default exchange, empty routing
|
|
102
|
+
* key. There is no address in the source to record. */
|
|
103
|
+
| 'rabbit-default-exchange'
|
|
104
|
+
/** The argument in the destination position is not shaped like an address
|
|
105
|
+
* (not a string literal, not a constant reference) — most often because the
|
|
106
|
+
* overload actually taken has the payload there. */
|
|
107
|
+
| 'producer-argument-not-address-shaped'
|
|
108
|
+
/** Two overloads fit the call, they disagree about which slot is the address,
|
|
109
|
+
* and the argument is spelled the same way under both readings. The
|
|
110
|
+
* archetype is `convertAndSend("orders.rk", "body", correlationData)`: it is
|
|
111
|
+
* `(exchange, routingKey, message)` with the address `"body"`, or
|
|
112
|
+
* `(routingKey, message, correlationData)` with the address `"orders.rk"`
|
|
113
|
+
* and `"body"` as a String PAYLOAD. Both are real overloads spelled
|
|
114
|
+
* (String, String, ref).
|
|
115
|
+
*
|
|
116
|
+
* Distinct from `producer-argument-not-address-shaped`, which says the slot
|
|
117
|
+
* cannot hold an address at all. This one says it can, twice, and the module
|
|
118
|
+
* will not pick — a payload published as an address joins a consumer of a
|
|
119
|
+
* queue that happens to be named after the payload's text. */
|
|
120
|
+
| 'ambiguous-producer-overload'
|
|
121
|
+
/** `topics = {}` / `topics = []` / `arrayOf()`. */
|
|
122
|
+
| 'empty-destination-list'
|
|
123
|
+
/** The element is an expression this module will not evaluate — a
|
|
124
|
+
* concatenation, a call, a ternary. */
|
|
125
|
+
| 'not-a-literal-or-constant'
|
|
126
|
+
/** A constant reference no constant resolver could fold to a string. */
|
|
127
|
+
| 'unresolved-constant'
|
|
128
|
+
/** `#{...}` — a SpEL expression, evaluated by the container against beans and
|
|
129
|
+
* the environment at RUNTIME. `#{@kafkaProps.ordersTopic}` is the archetypal
|
|
130
|
+
* unresolvable address: nothing in the source says what it evaluates to, and
|
|
131
|
+
* two services that merely wrote the same expression have said nothing about
|
|
132
|
+
* each other. */
|
|
133
|
+
| 'spel-expression'
|
|
134
|
+
/** An unescaped `$` interpolation in a language whose string literals
|
|
135
|
+
* interpolate. In Kotlin `"orders-$env"` and `"orders-${env}"` are STRING
|
|
136
|
+
* TEMPLATES evaluated at runtime, not addresses and not Spring placeholders
|
|
137
|
+
* — the escaped `"\${app.topic}"` is how a Spring placeholder has to be
|
|
138
|
+
* written there. Java does not interpolate, so `$` is an ordinary character
|
|
139
|
+
* and this never fires for it. */
|
|
140
|
+
| 'unescaped-interpolation'
|
|
141
|
+
/** `${key}` with no default. The KEY is recorded; the VALUE is deliberately
|
|
142
|
+
* absent from the graph (config values may hold credentials — see the header
|
|
143
|
+
* of `pipeline-phases/spring-config.ts`), so this can never resolve here. */
|
|
144
|
+
| 'unresolved-config-key'
|
|
145
|
+
/** `${key:default}`. The default IS written in the source, and it is kept on
|
|
146
|
+
* the node — but it is not an IDENTITY. It holds only while the key is not
|
|
147
|
+
* overridden in configuration, and configuration VALUES are deliberately
|
|
148
|
+
* absent from this graph, so the code cannot know whether it holds. Keying
|
|
149
|
+
* on it merges every service that copy-pasted the same fallback: `${a:events}`
|
|
150
|
+
* and `${b:events}` are two different addresses that happen to share a
|
|
151
|
+
* default. Both the key and the default text survive as properties, so the
|
|
152
|
+
* case stays countable and distinguishable from a bare `${key}`. */
|
|
153
|
+
| 'overridable-config-default'
|
|
154
|
+
/** `${}` — a placeholder that names no key. There is nothing to record and
|
|
155
|
+
* nothing to look up; kept separate so an empty key never reaches the
|
|
156
|
+
* `Property` lookup as if it were a real one. */
|
|
157
|
+
| 'empty-config-key'
|
|
158
|
+
/** A string literal that is empty or nothing but whitespace. An empty address
|
|
159
|
+
* addresses nothing, and letting it through would give every such site one
|
|
160
|
+
* shared `''` identity — the same false join the placeholder rule prevents. */
|
|
161
|
+
| 'empty-literal-address'
|
|
162
|
+
/** A constant reference that folded to an empty or whitespace-only string.
|
|
163
|
+
* Same outcome as `empty-literal-address`, different repository fact: there
|
|
164
|
+
* the source wrote `""`, here a constant declaration did. */
|
|
165
|
+
| 'empty-constant-address';
|
|
166
|
+
/**
|
|
167
|
+
* How an address was arrived at, kept on the node for provenance.
|
|
168
|
+
*
|
|
169
|
+
* There is deliberately no `config-default` member. A `${key:default}` does not
|
|
170
|
+
* resolve — see `overridable-config-default` — so no address can be reached
|
|
171
|
+
* that way.
|
|
172
|
+
*/
|
|
173
|
+
export type SpringDestinationVia = 'literal' | 'constant' | 'specification';
|
|
174
|
+
export type SpringDestinationRole = 'consumer' | 'producer';
|
|
175
|
+
/**
|
|
176
|
+
* One argument element that has been ACCEPTED as naming a destination, before
|
|
177
|
+
* any attempt to resolve it. An array-valued argument yields one candidate per
|
|
178
|
+
* element: `topics = ["a", "b"]` really is two destinations, and each gets its
|
|
179
|
+
* own node and its own edge (see the phase for why no group node is minted).
|
|
180
|
+
*/
|
|
181
|
+
export interface SpringDestinationCandidate {
|
|
182
|
+
readonly role: SpringDestinationRole;
|
|
183
|
+
/** Annotation simple name (`KafkaListener`) or producer template (`kafka`). */
|
|
184
|
+
readonly source: string;
|
|
185
|
+
readonly broker: SpringDestinationBroker;
|
|
186
|
+
/** Index of the argument this element came from, in source order. */
|
|
187
|
+
readonly argIndex: number;
|
|
188
|
+
/** Argument name when the call/annotation named it (`topics`, `queues`). */
|
|
189
|
+
readonly argName?: string;
|
|
190
|
+
/** Index within an array-valued argument; `0` for a scalar. */
|
|
191
|
+
readonly elementIndex: number;
|
|
192
|
+
/** The element's source text, exactly as captured. */
|
|
193
|
+
readonly rawText: string;
|
|
194
|
+
/** Companion provenance that is not itself an address — currently only the
|
|
195
|
+
* Rabbit exchange that accompanies a routing key. */
|
|
196
|
+
readonly exchange?: string;
|
|
197
|
+
}
|
|
198
|
+
/** A candidate that was declined before resolution was even attempted. */
|
|
199
|
+
export interface SpringDestinationRefusalRecord {
|
|
200
|
+
readonly role: SpringDestinationRole;
|
|
201
|
+
readonly source: string;
|
|
202
|
+
readonly broker: SpringDestinationBroker;
|
|
203
|
+
readonly reason: SpringDestinationRefusal;
|
|
204
|
+
/** Source text that provoked the refusal, when there was one. */
|
|
205
|
+
readonly rawText?: string;
|
|
206
|
+
readonly argIndex?: number;
|
|
207
|
+
readonly argName?: string;
|
|
208
|
+
}
|
|
209
|
+
export interface SpringDestinationSelection {
|
|
210
|
+
readonly candidates: readonly SpringDestinationCandidate[];
|
|
211
|
+
readonly refusals: readonly SpringDestinationRefusalRecord[];
|
|
212
|
+
}
|
|
213
|
+
export type SpringDestinationResolution = {
|
|
214
|
+
readonly kind: 'resolved';
|
|
215
|
+
readonly address: string;
|
|
216
|
+
readonly via: SpringDestinationVia;
|
|
217
|
+
} | {
|
|
218
|
+
readonly kind: 'unresolved';
|
|
219
|
+
readonly reason: SpringDestinationRefusal;
|
|
220
|
+
/** Configuration key named by an unresolvable `${...}` placeholder. Lets
|
|
221
|
+
* the phase link the node to the `Property` nodes for that key without
|
|
222
|
+
* ever learning the key's value. */
|
|
223
|
+
readonly configKey?: string;
|
|
224
|
+
/** Default text of a `${key:default}`, exactly as the source wrote it.
|
|
225
|
+
* Kept as PROVENANCE only — it is never an address and never a key, for
|
|
226
|
+
* the reason `overridable-config-default` gives. */
|
|
227
|
+
readonly configDefault?: string;
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* The cascade's pluggable steps plus the one language capability it needs.
|
|
231
|
+
*
|
|
232
|
+
* The steps are supplied by the phase, which owns the language-specific
|
|
233
|
+
* machinery; keeping them as callbacks is what lets this module stay
|
|
234
|
+
* language-neutral and testable with a plain map.
|
|
235
|
+
*/
|
|
236
|
+
export interface SpringDestinationResolvers {
|
|
237
|
+
/**
|
|
238
|
+
* Whether the owning language INTERPOLATES string literals — Kotlin does,
|
|
239
|
+
* Java does not. A capability, deliberately not a language name: shared
|
|
240
|
+
* ingestion code may not branch on a language (see AGENTS.md), and the
|
|
241
|
+
* capability is also the thing that actually matters. Supplied alongside
|
|
242
|
+
* `getSpringMessagingFacts` by the provider and threaded in by the phase.
|
|
243
|
+
*
|
|
244
|
+
* When true, an unescaped `$` inside a literal is a runtime template and the
|
|
245
|
+
* candidate is refused. When false (the default) `$` is an ordinary
|
|
246
|
+
* character and `"${app.topic}"` is a Spring placeholder.
|
|
247
|
+
*/
|
|
248
|
+
readonly interpolatesStringLiterals?: boolean;
|
|
249
|
+
/**
|
|
250
|
+
* Step 2 — fold a constant reference (`Topics.ORDERS`, `ORDERS`) to its
|
|
251
|
+
* string value, or `null` when it cannot be folded. Backed by
|
|
252
|
+
* `resolveJavaConstant` / `resolveKotlinConstant`.
|
|
253
|
+
*/
|
|
254
|
+
readonly constant?: (name: string) => string | null;
|
|
255
|
+
/**
|
|
256
|
+
* Step 4 — SEAM, DELIBERATELY NOT IMPLEMENTED.
|
|
257
|
+
*
|
|
258
|
+
* Some destinations are named nowhere in the source: the address lives in a
|
|
259
|
+
* published API specification (AsyncAPI / springwolf) that the service
|
|
260
|
+
* generates, and the code only names a binding. Resolving those means reading
|
|
261
|
+
* an artifact that is not a source file, deciding which specification belongs
|
|
262
|
+
* to which module, and trusting a generated document — a different problem
|
|
263
|
+
* from the three syntactic steps above, with a different failure mode.
|
|
264
|
+
*
|
|
265
|
+
* The hook exists so that work has a defined place to land and so the cascade
|
|
266
|
+
* order is fixed now rather than renegotiated later. Nothing supplies it
|
|
267
|
+
* today, so step 4 is a no-op and such destinations stay unresolved with the
|
|
268
|
+
* reason the earlier step recorded.
|
|
269
|
+
*
|
|
270
|
+
* ── STILL UNSUPPLIED, AND NOW FOR A REASON RATHER THAN FOR WANT OF A READER ──
|
|
271
|
+
*
|
|
272
|
+
* `core/ingestion/asyncapi/document.ts` reads AsyncAPI 3.x documents, and
|
|
273
|
+
* `pipeline-phases/spring-destinations.ts` emits what they state as
|
|
274
|
+
* destinations of their own. It does NOT feed this hook, and the gap is a
|
|
275
|
+
* decision:
|
|
276
|
+
*
|
|
277
|
+
* A document names addresses; it does not name the method that uses one. To
|
|
278
|
+
* hand an address to THIS candidate, something has to choose which of the
|
|
279
|
+
* document's operations belongs to it. Partitioning by (broker, action) is
|
|
280
|
+
* the only division both sides agree on, and it is a weak one: a service with
|
|
281
|
+
* several listeners on one broker puts them all in one bucket. Any bucket
|
|
282
|
+
* holding more than one operation forces a heuristic, and a wrong heuristic
|
|
283
|
+
* puts a REAL address on a joining node under the wrong site — a false
|
|
284
|
+
* connection wearing the clothes of a resolved one, which is the exact
|
|
285
|
+
* outcome this module's keying rule exists to prevent. Only a bucket of size
|
|
286
|
+
* one is a fact rather than a guess.
|
|
287
|
+
*
|
|
288
|
+
* Two things would change that, and neither is a heuristic: a document whose
|
|
289
|
+
* operations carry the implementing symbol, or a configuration source that
|
|
290
|
+
* answers the `${key}` this candidate already recorded. The second is the
|
|
291
|
+
* stronger of the two — a key-to-value lookup is exact where a document match
|
|
292
|
+
* is a guess — and it wants its own resolver rather than this one, because
|
|
293
|
+
* what it needs is the placeholder key, not the candidate.
|
|
294
|
+
*/
|
|
295
|
+
readonly specification?: (candidate: SpringDestinationCandidate) => string | null;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Choose the destination-bearing arguments of one listener annotation.
|
|
299
|
+
*
|
|
300
|
+
* Returns `null` when the annotation is not a broker listener at all — that is
|
|
301
|
+
* not a refusal, there was nothing to refuse. A recognized annotation always
|
|
302
|
+
* returns a selection, even when every path in it declined, so the caller can
|
|
303
|
+
* count what was seen against what resolved.
|
|
304
|
+
*/
|
|
305
|
+
export declare function selectConsumerDestinationArguments(annotationName: string, args: readonly SpringArgumentFact[] | undefined): SpringDestinationSelection | null;
|
|
306
|
+
/**
|
|
307
|
+
* Choose the destination-bearing arguments of one messaging-template publish.
|
|
308
|
+
*
|
|
309
|
+
* A NAME beats a position, arity decides where it can decide, and shape decides
|
|
310
|
+
* where it cannot.
|
|
311
|
+
*
|
|
312
|
+
* When any argument is passed by name, {@link PRODUCER_DESTINATION_PARAMETERS}
|
|
313
|
+
* decides — position is not consulted at all, because a named argument list
|
|
314
|
+
* need not be in parameter order. When the slot this module would have read
|
|
315
|
+
* positionally is itself named with something it does not recognize, that is a
|
|
316
|
+
* contradiction and the publish is refused rather than read.
|
|
317
|
+
*
|
|
318
|
+
* `KafkaTemplate.send` and `StreamBridge.send` put the destination first in
|
|
319
|
+
* every multi-argument positional overload they have, so once such a call has
|
|
320
|
+
* two or more arguments its slot 0 is the destination and nothing further needs
|
|
321
|
+
* deciding. Those slots use the PERMISSIVE gate ({@link isAddressShaped}): a
|
|
322
|
+
* bare identifier is let through to the cascade, which refuses it by name if no
|
|
323
|
+
* constant folds. That keeps `unresolved-constant` — a thing we tried to
|
|
324
|
+
* resolve — distinct from `producer-argument-not-address-shaped`, a thing we
|
|
325
|
+
* declined to read at all.
|
|
326
|
+
*
|
|
327
|
+
* The `convertAndSend` families are different. Both admit trailing
|
|
328
|
+
* `MessagePostProcessor` and `CorrelationData` parameters, and arity does not
|
|
329
|
+
* separate the overloads in EITHER direction:
|
|
330
|
+
*
|
|
331
|
+
* jms (destination, message) 2 vs (message, postProcessor) 2
|
|
332
|
+
* rabbit (routingKey, message) 2 vs (message, postProcessor) 2
|
|
333
|
+
* rabbit (exchange, routingKey, message) 3 vs (routingKey, message, pp) 3
|
|
334
|
+
* vs (routingKey, message, correlation) 3
|
|
335
|
+
* rabbit (exchange, routingKey, message, pp) 4 vs (routingKey, message, pp, corr) 4
|
|
336
|
+
*
|
|
337
|
+
* So the tie is broken by the STRICT gate ({@link isConfidentAddressShape}) — a
|
|
338
|
+
* string literal, a qualified reference, or a screaming-snake constant, all of
|
|
339
|
+
* which a payload variable is not. A lowercase bare identifier is NOT confident
|
|
340
|
+
* evidence, so `convertAndSend(topic, payload)` is refused rather than read:
|
|
341
|
+
* the same spelling is how a payload variable looks, and nothing in the syntax
|
|
342
|
+
* separates them. That refusal is the deliberate cost. A refusal is counted and
|
|
343
|
+
* recoverable; a wrong address enters reports as a fact.
|
|
344
|
+
*
|
|
345
|
+
* There is NO positional fallback at rabbit arity 3+. An earlier revision fell
|
|
346
|
+
* back to accepting slot 0 when slot 1 was not confident, which turned the
|
|
347
|
+
* ordinary `convertAndSend(EXCHANGE, routingKey, event)` — routing key in a
|
|
348
|
+
* variable — into a destination whose address was the EXCHANGE NAME. That is
|
|
349
|
+
* the worst possible outcome: an address that looks entirely plausible and can
|
|
350
|
+
* join a `@RabbitListener(queues = "orders")` that has nothing to do with it.
|
|
351
|
+
*
|
|
352
|
+
* ── THE ONE AMBIGUITY, REFUSED RATHER THAN GUESSED ───────────────────────
|
|
353
|
+
*
|
|
354
|
+
* `convertAndSend("orders.rk", "body", correlationData)` fits two overloads at
|
|
355
|
+
* once and they disagree about which slot is the address:
|
|
356
|
+
*
|
|
357
|
+
* (exchange, routingKey, message) → the address is `"body"`
|
|
358
|
+
* (routingKey, message, correlationData) → the address is `"orders.rk"`
|
|
359
|
+
*
|
|
360
|
+
* Both are real, both are spelled (String, String, ref), and no rule over the
|
|
361
|
+
* syntax separates them. Picking either one publishes the OTHER reading's
|
|
362
|
+
* payload as an address, where a consumer of a queue named after that text
|
|
363
|
+
* joins a publisher that never wrote to it. So neither is picked: the call is
|
|
364
|
+
* refused as `ambiguous-producer-overload` and yields no candidate and no edge.
|
|
365
|
+
*
|
|
366
|
+
* The refusal is narrow on purpose, because over-refusing here costs the
|
|
367
|
+
* ordinary case, and a suppression that eats correct results is the more
|
|
368
|
+
* expensive mistake. It fires ONLY on a STRING LITERAL in slot 1, at the
|
|
369
|
+
* arities where a competing overload exists:
|
|
370
|
+
*
|
|
371
|
+
* - A literal is no evidence at all. An address and a payload are BOTH
|
|
372
|
+
* ordinarily written as literals, so the spelling distinguishes nothing.
|
|
373
|
+
* - A CONSTANT or QUALIFIED reference is evidence, which is the whole premise
|
|
374
|
+
* of {@link isConfidentAddressShape}: `ORDERS_ROUTING_KEY` and
|
|
375
|
+
* `Topics.ORDERS_KEY` are how a configured NAME is written, not how a
|
|
376
|
+
* payload computed at the call site is. Those keep resolving.
|
|
377
|
+
* - Arity 5 has no competing overload at all —
|
|
378
|
+
* `(exchange, routingKey, message, pp, correlationData)` is the only
|
|
379
|
+
* five-argument form — so slot 1 there is the routing key whatever it is
|
|
380
|
+
* spelled like, and the refusal must not reach it.
|
|
381
|
+
* - A NAMED argument settles the reading outright, and the name-beats-position
|
|
382
|
+
* pre-pass above has already returned by then.
|
|
383
|
+
*/
|
|
384
|
+
export declare function selectProducerDestinationArguments(fact: {
|
|
385
|
+
readonly template: SpringMessageProducerTemplate;
|
|
386
|
+
readonly methodName: string;
|
|
387
|
+
readonly args?: readonly SpringArgumentFact[];
|
|
388
|
+
}): SpringDestinationSelection;
|
|
389
|
+
/**
|
|
390
|
+
* Split an array-valued destination argument into its elements.
|
|
391
|
+
*
|
|
392
|
+
* Both languages hand this module ONE unsplit string per argument: capture
|
|
393
|
+
* records an argument's source text, and `topics = {"a", "b"}` is a single
|
|
394
|
+
* argument whose text happens to be a list. So the list is parsed here, in the
|
|
395
|
+
* three spellings the two languages use — Java `{…}`, Kotlin `[…]`, and Kotlin
|
|
396
|
+
* `arrayOf(…)`.
|
|
397
|
+
*
|
|
398
|
+
* Anything else comes back as a single element, unchanged: a scalar argument,
|
|
399
|
+
* and equally an expression that merely starts with a brace. The split tracks
|
|
400
|
+
* nesting and string literals, so a comma inside a literal or inside a nested
|
|
401
|
+
* call does not split the list.
|
|
402
|
+
*
|
|
403
|
+
* Returns `[]` for an empty list, which the caller must distinguish from a
|
|
404
|
+
* one-element list — `topics = {}` names no destination at all.
|
|
405
|
+
*/
|
|
406
|
+
export declare function splitSpringDestinationList(text: string): readonly string[];
|
|
407
|
+
/**
|
|
408
|
+
* Unquote a string literal to its value, or `null` when the text is not a
|
|
409
|
+
* single literal.
|
|
410
|
+
*
|
|
411
|
+
* Escapes are undone only for the sequences that can appear inside a
|
|
412
|
+
* destination: `\"`, `\\`, and Kotlin's `\$`. That last one matters more than it
|
|
413
|
+
* looks — a Spring placeholder written in Kotlin MUST escape the dollar
|
|
414
|
+
* (`"\${app.topic}"`) or the compiler reads it as a string template, so without
|
|
415
|
+
* undoing it every Kotlin placeholder would fail the `${` test below and be
|
|
416
|
+
* misfiled as a plain literal address named `\${app.topic}`.
|
|
417
|
+
*
|
|
418
|
+
* The unescaping is also why {@link hasUnescapedStringInterpolation} has to run
|
|
419
|
+
* against the RAW text: once `\$` has become `$`, the escaped placeholder and
|
|
420
|
+
* the runtime template are the same string.
|
|
421
|
+
*/
|
|
422
|
+
export declare function parseSpringStringLiteral(text: string): string | null;
|
|
423
|
+
/**
|
|
424
|
+
* Whether a string literal contains an UNESCAPED interpolation, for a language
|
|
425
|
+
* whose literals interpolate.
|
|
426
|
+
*
|
|
427
|
+
* Only meaningful for such a language; Java never calls it. In Kotlin:
|
|
428
|
+
*
|
|
429
|
+
* "orders-$env" template — the value is decided at runtime
|
|
430
|
+
* "orders-${env}" template — NOT a Spring placeholder
|
|
431
|
+
* "\${app.topic}" escaped — this is how a Spring placeholder is written
|
|
432
|
+
* """orders-$env""" template — raw strings interpolate and cannot escape
|
|
433
|
+
*
|
|
434
|
+
* Reads the RAW literal text on purpose: {@link parseSpringStringLiteral}
|
|
435
|
+
* resolves `\$` to `$`, after which the second and third rows above are the
|
|
436
|
+
* same string and the distinction is gone. A raw (`"""`) literal has no
|
|
437
|
+
* backslash escapes at all — `${'$'}` is the only way to write a dollar there —
|
|
438
|
+
* so every `$` in one is an interpolation.
|
|
439
|
+
*/
|
|
440
|
+
export declare function hasUnescapedStringInterpolation(text: string): boolean;
|
|
441
|
+
/**
|
|
442
|
+
* PERMISSIVE gate — true when the text could name an address: a string literal,
|
|
443
|
+
* or any reference a constant resolver could plausibly fold. Says nothing about
|
|
444
|
+
* whether that reference actually resolves; the cascade decides that and
|
|
445
|
+
* records `unresolved-constant` when it does not.
|
|
446
|
+
*
|
|
447
|
+
* Used where the overload set already fixes which slot holds the destination.
|
|
448
|
+
*/
|
|
449
|
+
export declare function isAddressShaped(text: string): boolean;
|
|
450
|
+
/**
|
|
451
|
+
* STRICT gate — true only when the spelling is confident evidence of an
|
|
452
|
+
* address, not merely compatible with one.
|
|
453
|
+
*
|
|
454
|
+
* The difference from {@link isAddressShaped} is the lowercase bare identifier.
|
|
455
|
+
* `convertAndSend(topic, payload)` and `convertAndSend(message, processor)` are
|
|
456
|
+
* the same syntax; only a human reading the names can tell which slot is the
|
|
457
|
+
* destination, and a name is not something this module is willing to rank as
|
|
458
|
+
* evidence. So a bare `topic` fails here and the publish is refused, while
|
|
459
|
+
* `"orders"`, `Topics.ORDERS` and `ORDERS_TOPIC` pass.
|
|
460
|
+
*
|
|
461
|
+
* Used ONLY at the arities where a trailing `MessagePostProcessor` overload
|
|
462
|
+
* collides with the destination-carrying one. Everywhere else the permissive
|
|
463
|
+
* gate applies, so this stricter rule costs nothing outside the ambiguity.
|
|
464
|
+
*/
|
|
465
|
+
export declare function isConfidentAddressShape(text: string): boolean;
|
|
466
|
+
export interface SpringPlaceholderResult {
|
|
467
|
+
/** True when the text contained no `${…}` at all. */
|
|
468
|
+
readonly plain: boolean;
|
|
469
|
+
/** Key of the FIRST placeholder, in source order. Present whenever `plain`
|
|
470
|
+
* is false; the empty string when the placeholder named no key (`${}`). */
|
|
471
|
+
readonly key?: string;
|
|
472
|
+
/** Default text of that placeholder, exactly as written, when it had one.
|
|
473
|
+
* Absent for a bare `${key}`. The empty string for `${key:}`, which is a
|
|
474
|
+
* default that was written and is empty. */
|
|
475
|
+
readonly defaultValue?: string;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Read the FIRST Spring property placeholder out of an already-unquoted value.
|
|
479
|
+
*
|
|
480
|
+
* NOTHING IS SUBSTITUTED, and that is the rule, not an omission.
|
|
481
|
+
*
|
|
482
|
+
* `${key}` cannot resolve: the value lives in a configuration file this index
|
|
483
|
+
* deliberately does not read into the graph (values may hold credentials — see
|
|
484
|
+
* `pipeline-phases/spring-config.ts`). The KEY comes back instead, so the
|
|
485
|
+
* caller can link the node to the `Property` nodes for that key without ever
|
|
486
|
+
* learning its value.
|
|
487
|
+
*
|
|
488
|
+
* `${key:default}` cannot resolve EITHER, which is a correction to this
|
|
489
|
+
* module's original rule. The default is written in the source, so reading it
|
|
490
|
+
* is legitimate and it is returned — but it is provenance, never an identity.
|
|
491
|
+
* A default holds only while the key is not overridden, and whether it is
|
|
492
|
+
* overridden is a fact about configuration VALUES, which are absent from this
|
|
493
|
+
* graph by design. Substituting it made `${a.topic:events}` and
|
|
494
|
+
* `${b.topic:events}` one node and reported a producer/consumer pair between
|
|
495
|
+
* two services that shared nothing but a copy-pasted fallback. The same
|
|
496
|
+
* reasoning applies to any placeholder-derived value: a value the configuration
|
|
497
|
+
* can override is not an identity.
|
|
498
|
+
*
|
|
499
|
+
* Only the first placeholder is read because there is nothing to do with the
|
|
500
|
+
* rest — the value is already unresolvable, and the first key is the one a
|
|
501
|
+
* reader would look up. A nested default (`${a:${b}}`) needs no special case
|
|
502
|
+
* under this rule: `a` is the key and `${b}` is the default text, both reported
|
|
503
|
+
* as written.
|
|
504
|
+
*/
|
|
505
|
+
export declare function resolveSpringPlaceholders(value: string): SpringPlaceholderResult;
|
|
506
|
+
/**
|
|
507
|
+
* Resolve one candidate to an address, or to a named refusal.
|
|
508
|
+
*
|
|
509
|
+
* Four steps, in this order, each of which may decline:
|
|
510
|
+
*
|
|
511
|
+
* 1. literal — `"orders.v1"`, including one element of an array form.
|
|
512
|
+
* 2. constant — `Topics.ORDERS`, through the supplied constant resolver.
|
|
513
|
+
* 3. configuration — neither `${app.topic}` nor `${app.topic:orders}`
|
|
514
|
+
* resolves; the key, and the default text when there is
|
|
515
|
+
* one, are reported instead.
|
|
516
|
+
* 4. specification — the deferred seam; see {@link SpringDestinationResolvers}.
|
|
517
|
+
*
|
|
518
|
+
* Steps 1 and 2 both feed step 3: a literal may be a placeholder, and so may
|
|
519
|
+
* the value a constant folds to (`static final String TOPIC = "${app.topic}"`
|
|
520
|
+
* is an ordinary way to write one). Skipping step 3 after step 2 would file
|
|
521
|
+
* that constant's placeholder text as a resolved address — the exact false
|
|
522
|
+
* identity this module exists to prevent, arrived at one step later.
|
|
523
|
+
*
|
|
524
|
+
* Two classes of text are rejected BEFORE step 3, because they are not
|
|
525
|
+
* addresses in any configuration: a SpEL expression, which the container
|
|
526
|
+
* evaluates against live beans, and an unescaped string-template interpolation
|
|
527
|
+
* in a language that interpolates. Order matters between them and the
|
|
528
|
+
* placeholder rule — `"#{'${app.topics}'.split(',')}"` contains a `${` and
|
|
529
|
+
* would otherwise be filed under a configuration key that is not really what
|
|
530
|
+
* it is.
|
|
531
|
+
*
|
|
532
|
+
* WHITESPACE. An address is kept exactly as the source wrote it, `" orders "`
|
|
533
|
+
* included, so `" orders "` is its own node and does not join `"orders"`. That
|
|
534
|
+
* is a missing connection rather than a false one, which is the trade this
|
|
535
|
+
* module makes everywhere. The emptiness test below trims, because a
|
|
536
|
+
* whitespace-only address addresses nothing — the two rules disagree on
|
|
537
|
+
* purpose, and this is the statement of it.
|
|
538
|
+
*/
|
|
539
|
+
export declare function resolveSpringDestination(candidate: SpringDestinationCandidate, resolvers?: SpringDestinationResolvers): SpringDestinationResolution;
|