gitnexus 1.6.10-rc.99 → 1.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +77 -2
- package/dist/core/index-freshness.js +109 -2
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +65 -19
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +14 -2
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +19 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +598 -16
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +77 -32
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/query.js +15 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +211 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.js +29 -0
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +39 -1
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +39 -6
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +87 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +267 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +214 -29
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +309 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/error-D9MtuG9s.js +1 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +16 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java binding for the language-agnostic constant resolver (#2391 core).
|
|
3
|
+
*
|
|
4
|
+
* Supplies the two Java-specific pieces the shared fold in
|
|
5
|
+
* `constant-resolver.ts` needs — {@link resolveJavaImport} (import-specifier →
|
|
6
|
+
* file, honoring JVM package/classpath rules) and
|
|
7
|
+
* {@link extractJavaModuleConstants} (tree → {@link ModuleConstants}) — plus a
|
|
8
|
+
* pre-bound {@link resolveJavaConstant} wrapper so callers stay
|
|
9
|
+
* language-oblivious. The reusable fold, the cycle guard, and the depth cap
|
|
10
|
+
* all live in the agnostic core.
|
|
11
|
+
*
|
|
12
|
+
* Java constant shape (one per type declaration; nested classes flatten into
|
|
13
|
+
* the same file-level namespace, mirroring how `Outer.CONST` and a top-level
|
|
14
|
+
* `CONST` are indistinguishable at the fold layer):
|
|
15
|
+
*
|
|
16
|
+
* public class ApiPathConstants {
|
|
17
|
+
* public static final String DIAGNOSIS_SAVE_V1 = "/api/v1/diagnosis/add";
|
|
18
|
+
* public static final String API_CIS_SAVE_SUMMARY = API_CIS_V1 + "summary/save";
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* Reference shapes at annotation sites this binding resolves:
|
|
22
|
+
* @PostMapping(ApiPathConstants.DIAGNOSIS_SAVE_V1) // qualified
|
|
23
|
+
* @PostMapping(com.winning.opt.X.ApiPathConstants.Y) // FQN-qualified
|
|
24
|
+
* @PostMapping(DIAGNOSIS_SAVE_V1) // static-imported
|
|
25
|
+
* @PostMapping(API_CIS_V1 + "summary/save") // inline concat
|
|
26
|
+
*
|
|
27
|
+
* Which ANNOTATIONS count as routes is a separate question this module has no
|
|
28
|
+
* say in: `spring-shared.ts` holds an exact-name map, so a vendor alias like
|
|
29
|
+
* `@WinPostMapping` yields no route on this base regardless of how its value
|
|
30
|
+
* folds (#2883). Folding and alias recognition compose; neither implies the
|
|
31
|
+
* other.
|
|
32
|
+
*
|
|
33
|
+
* Import shapes consumed:
|
|
34
|
+
* import com.winning.opt.diagnosis.api.constants.ApiPathConstants;
|
|
35
|
+
* import static com.winning.opt.diagnosis.api.constants.ApiPathConstants.API_CIS_V1;
|
|
36
|
+
*
|
|
37
|
+
* Keying (KTD4 parity with the Python binding): the repo map is keyed by
|
|
38
|
+
* unique POSIX file path. A Java import `com.a.b.CONSTS` resolves to the file
|
|
39
|
+
* whose path ends with `com/a/b/CONSTS.java`; when 2+ files share that suffix
|
|
40
|
+
* the import is ambiguous and returns null (skip floor), never a wrong path.
|
|
41
|
+
*/
|
|
42
|
+
import { unquoteSpringLiteral } from './spring-shared.js';
|
|
43
|
+
import { MAX_FOLD_LENGTH, } from './constant-resolver.js';
|
|
44
|
+
/**
|
|
45
|
+
* Cheap content gate: can this Java file DEFINE a string constant that a route
|
|
46
|
+
* annotation might reference?
|
|
47
|
+
*
|
|
48
|
+
* Exported so BOTH sides of the pipeline use the same predicate and cannot
|
|
49
|
+
* disagree about which files carry constants — the ingestion provider
|
|
50
|
+
* (`languages/java.ts`, as `moduleConstantHeuristic`) and the group extractor's
|
|
51
|
+
* `prepareRepo` pre-pass (`group/extractors/http-patterns/java.ts`). They used
|
|
52
|
+
* to spell it differently, and the two spellings disagreed on a constant
|
|
53
|
+
* INTERFACE: the group admitted it and published a provider contract at the
|
|
54
|
+
* folded path, while ingestion rejected the file and emitted no Route node for
|
|
55
|
+
* it — an R4 parity break in the losing direction, since ingestion is the side
|
|
56
|
+
* that drives the graph and `api_impact`.
|
|
57
|
+
*
|
|
58
|
+
* Arms:
|
|
59
|
+
* - a `static` … `String NAME =` declaration, with the modifier run matched as
|
|
60
|
+
* a span so every legal order works (`static public final String`,
|
|
61
|
+
* `public final static String`) and so `java.lang.String` — which the
|
|
62
|
+
* extractor accepts — is admitted too.
|
|
63
|
+
* - an `interface` declaration carrying a String assignment — interface fields
|
|
64
|
+
* are implicitly `public static final` (JLS 9.3), so a pure constant
|
|
65
|
+
* interface has neither keyword and no import. The assignment conjunct keeps
|
|
66
|
+
* a file whose PROSE merely mentions "interface " from costing a parse.
|
|
67
|
+
*/
|
|
68
|
+
// `static` … `String NAME =` on one declaration. The modifier run is matched as
|
|
69
|
+
// a span rather than as the adjacent pair `static final`, because the extractor
|
|
70
|
+
// scans modifiers INDEPENDENTLY (`isStaticFinal`) and Java lets them appear in
|
|
71
|
+
// any order — `static public final String`, `public final static String` — and
|
|
72
|
+
// because the type may be written out as `java.lang.String`, which the
|
|
73
|
+
// extractor also accepts. A gate narrower than the extractor it feeds is the
|
|
74
|
+
// same defect class as the ingestion/group divergence this predicate exists to
|
|
75
|
+
// prevent, just one layer down.
|
|
76
|
+
//
|
|
77
|
+
// The span excludes `;{}()` so it cannot jump a statement or block boundary: a
|
|
78
|
+
// local `String s = "x"` inside `static void f() { … }` is not matched, because
|
|
79
|
+
// reaching it from `static` crosses `(`, `)` and `{`. `final` is not required
|
|
80
|
+
// even though the extractor requires it — the gate may be wider than the
|
|
81
|
+
// extractor, never narrower.
|
|
82
|
+
const STATIC_STRING_CONSTANT_RE = /\bstatic\b[^;{}()]{0,80}\bString\s+\w+\s*=/;
|
|
83
|
+
const INTERFACE_DECL_RE = /\binterface\s+\w/;
|
|
84
|
+
const STRING_ASSIGNMENT_RE = /\bString\s+\w+\s*=/;
|
|
85
|
+
export function isJavaConstantFile(source) {
|
|
86
|
+
if (STATIC_STRING_CONSTANT_RE.test(source))
|
|
87
|
+
return true;
|
|
88
|
+
// The interface arm is a bare word match, so on its own it admits any file
|
|
89
|
+
// whose PROSE mentions "interface " — and every admitted file costs the group
|
|
90
|
+
// side a full extra parse. Requiring a String assignment as well keeps every
|
|
91
|
+
// shape `extractJavaModuleConstants` accepts in an interface body (bare
|
|
92
|
+
// `String`, `java.lang.String`, no space before `=`, multi-declarator) while
|
|
93
|
+
// dropping the comment-only matches.
|
|
94
|
+
return INTERFACE_DECL_RE.test(source) && STRING_ASSIGNMENT_RE.test(source);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The Java {@link ImportResolver}: map a fully-qualified import specifier to
|
|
98
|
+
* the unique file key it refers to, or null when it cannot be pinned to
|
|
99
|
+
* exactly one file.
|
|
100
|
+
*
|
|
101
|
+
* `com.winning.opt.X.ApiPathConstants` → the file key ending in
|
|
102
|
+
* `com/winning/opt/X/ApiPathConstants.java`. Because the repo map is
|
|
103
|
+
* file-path-keyed and Maven multi-module trees repeat package roots across
|
|
104
|
+
* modules (`winning-opt-a/.../api/constants/ApiPathConstants.java` and
|
|
105
|
+
* `winning-opt-b/.../api/constants/ApiPathConstants.java`), suffix matching
|
|
106
|
+
* stays UNIQUE-suffix: an import whose full package+class path matches N files
|
|
107
|
+
* in N different modules cannot be pinned, so it returns null — the skip floor
|
|
108
|
+
* this module promises, never a wrong path.
|
|
109
|
+
*
|
|
110
|
+
* A nearest-shared-directory tie-break was tried here and removed on review:
|
|
111
|
+
* javac resolves duplicate FQNs by CLASSPATH ORDER, not directory proximity, so
|
|
112
|
+
* a `src/test` fixture copy or a module that merely sits closer in the tree can
|
|
113
|
+
* outrank the real dependency and yield a silently wrong literal. In a resolver
|
|
114
|
+
* whose whole contract is skip-or-correct, a plausible guess is the one answer
|
|
115
|
+
* that cannot be allowed.
|
|
116
|
+
*/
|
|
117
|
+
export const resolveJavaImport = (_importingFileKey, moduleSpec, repoKeys) => {
|
|
118
|
+
// A static import `a.b.C.CONST` names the class as all-but-last segment;
|
|
119
|
+
// a plain import `a.b.C` names the class as last segment. Both resolve to
|
|
120
|
+
// a file ending `a/b/C.java`; treating the whole spec as a path and
|
|
121
|
+
// trimming the last segment when the direct hit fails covers both shapes.
|
|
122
|
+
const asPath = moduleSpec.replace(/\./g, '/');
|
|
123
|
+
const classFile = `${asPath}.java`;
|
|
124
|
+
// Exact package-path suffix match, unique or nothing.
|
|
125
|
+
let hit = null;
|
|
126
|
+
for (const key of repoKeys) {
|
|
127
|
+
if (key === classFile || key.endsWith(`/${classFile}`)) {
|
|
128
|
+
if (hit !== null)
|
|
129
|
+
return null; // 2+ modules carry this FQN — unresolvable
|
|
130
|
+
hit = key;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return hit;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Is `node` a Java string literal (`"..."`), and if so what value does the
|
|
137
|
+
* route layer give it?
|
|
138
|
+
*
|
|
139
|
+
* tree-sitter-java splits a `string_literal` AROUND its `escape_sequence`
|
|
140
|
+
* children, so joining `string_fragment`s alone silently DELETES every escape:
|
|
141
|
+
* `"/user/{id:\\d+}"` — the standard Spring path-variable regex constraint —
|
|
142
|
+
* folded to `/user/{id:d+}`, and a pure-escape literal (`"\\t"`) folded to the
|
|
143
|
+
* empty string. Slicing the quotes off the raw text keeps the source spelling,
|
|
144
|
+
* which is precisely what the LITERAL path does
|
|
145
|
+
* ({@link unquoteSpringLiteral}) — so `@GetMapping(ApiPaths.USER_REGEX)` and
|
|
146
|
+
* `@GetMapping("/user/{id:\\d+}")` now emit the same path for the same Java
|
|
147
|
+
* source instead of two spellings the graph cannot reconcile. Same
|
|
148
|
+
* `string_fragment`-join trap as the NestJS one in #3017.
|
|
149
|
+
*/
|
|
150
|
+
function stringLiteralValue(node) {
|
|
151
|
+
if (node.type !== 'string_literal')
|
|
152
|
+
return null;
|
|
153
|
+
// A Java text block is also a `string_literal` here, and `unquoteSpringLiteral`
|
|
154
|
+
// has a `"""` arm that would hand back the raw block — leading newline and
|
|
155
|
+
// incidental indentation included, both of which Java strips. Nothing
|
|
156
|
+
// downstream normalizes that, so it would publish a Route at a path like
|
|
157
|
+
// "\n /api/v1/x\n ". The old fragment-join returned '' here, which
|
|
158
|
+
// floored to skip; keep that floor rather than trade it for a wrong path.
|
|
159
|
+
if (node.text.startsWith('"""'))
|
|
160
|
+
return null;
|
|
161
|
+
return unquoteSpringLiteral(node.text);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Flatten a qualified-name expression (`ApiPaths`, `com.example.ApiPaths`) to
|
|
165
|
+
* its dotted text, or null when any segment is not a plain identifier (calls,
|
|
166
|
+
* `this`, array access, generics — not a static constant shape).
|
|
167
|
+
*/
|
|
168
|
+
function flattenQualifiedIdentifier(node) {
|
|
169
|
+
if (node.type === 'identifier')
|
|
170
|
+
return node.text;
|
|
171
|
+
if (node.type === 'field_access') {
|
|
172
|
+
const object = node.childForFieldName('object');
|
|
173
|
+
const field = node.childForFieldName('field');
|
|
174
|
+
if (object && field) {
|
|
175
|
+
const head = flattenQualifiedIdentifier(object);
|
|
176
|
+
return head === null ? null : `${head}.${field.text}`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Parse a Java constant initializer into an operand list, or null when it is
|
|
183
|
+
* not a foldable string expression. Handles a bare string literal, a bare
|
|
184
|
+
* identifier (`X = Y`), qualified/static-import-free references
|
|
185
|
+
* (`X = CONSTS.Y` — recorded as ONE ref named `CONSTS.Y`), and
|
|
186
|
+
* left-associative `+` chains of the three. Everything else — numbers, calls,
|
|
187
|
+
* ternaries, method refs, `String.format`, enum constants — returns null,
|
|
188
|
+
* which makes the constant unresolvable (→ skip floor), never a wrong value.
|
|
189
|
+
*/
|
|
190
|
+
export function parseJavaConstOperands(node, depth = 0) {
|
|
191
|
+
if (!node)
|
|
192
|
+
return null;
|
|
193
|
+
if (depth > 64)
|
|
194
|
+
return null;
|
|
195
|
+
if (node.type === 'string_literal') {
|
|
196
|
+
const value = stringLiteralValue(node);
|
|
197
|
+
return value === null ? null : [{ kind: 'literal', value }];
|
|
198
|
+
}
|
|
199
|
+
if (node.type === 'identifier') {
|
|
200
|
+
return [{ kind: 'ref', name: node.text }];
|
|
201
|
+
}
|
|
202
|
+
// `CONSTS.FIELD` — field_access in tree-sitter-java for expressions. The
|
|
203
|
+
// object side may itself be a chain (`com.example.ApiPaths` parses as
|
|
204
|
+
// nested field_access), so flatten recursively: every segment must be a
|
|
205
|
+
// plain identifier/keyword to qualify (a call `f().X`, `this.X`, or an
|
|
206
|
+
// array access object side is not a constant shape → null, skip floor).
|
|
207
|
+
if (node.type === 'field_access') {
|
|
208
|
+
const object = node.childForFieldName('object');
|
|
209
|
+
const field = node.childForFieldName('field');
|
|
210
|
+
if (object && field) {
|
|
211
|
+
const objectName = flattenQualifiedIdentifier(object);
|
|
212
|
+
if (objectName !== null)
|
|
213
|
+
return [{ kind: 'ref', name: `${objectName}.${field.text}` }];
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
if (node.type === 'binary_expression') {
|
|
218
|
+
const isPlus = (node.children ?? []).some((c) => c.type === '+');
|
|
219
|
+
if (!isPlus)
|
|
220
|
+
return null;
|
|
221
|
+
const left = parseJavaConstOperands(node.childForFieldName('left'), depth + 1);
|
|
222
|
+
const right = parseJavaConstOperands(node.childForFieldName('right'), depth + 1);
|
|
223
|
+
if (left === null || right === null)
|
|
224
|
+
return null;
|
|
225
|
+
return [...left, ...right];
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Extract the file-level string constants and import bindings of one parsed
|
|
231
|
+
* Java file into the {@link ModuleConstants} shape the resolver consumes.
|
|
232
|
+
*
|
|
233
|
+
* Constants: every `static final String NAME = …` field of every type
|
|
234
|
+
* declaration in the file (nested classes included — their simple names
|
|
235
|
+
* would collide at the fold layer, but qualified refs carry the class name
|
|
236
|
+
* so nesting only matters for same-name fields, which flatten last-wins).
|
|
237
|
+
* Interface constants (`String NAME = "…"`) are implicitly static final and
|
|
238
|
+
* are collected too.
|
|
239
|
+
*
|
|
240
|
+
* References to OTHER constants via qualified names (`ApiPathConstants.X`)
|
|
241
|
+
* are stored as refs named `ApiPathConstants.X`; at the fold layer such a ref
|
|
242
|
+
* resolves through the import map (`ApiPathConstants` → module) followed by
|
|
243
|
+
* field lookup in the target file's OWN class-name-qualified namespace. To
|
|
244
|
+
* support that, constant names are ALSO recorded under
|
|
245
|
+
* `<DeclaringClass>.<FIELD>` (both spellings share one entry).
|
|
246
|
+
*
|
|
247
|
+
* Last-wins in source order; a non-foldable rebind (`X = compute()`) drops X
|
|
248
|
+
* to unresolvable rather than keeping a stale literal.
|
|
249
|
+
*/
|
|
250
|
+
export function extractJavaModuleConstants(tree) {
|
|
251
|
+
const literals = new Map();
|
|
252
|
+
const exprs = new Map();
|
|
253
|
+
const imports = new Map();
|
|
254
|
+
// Pass 1: imports (both shapes).
|
|
255
|
+
const walkImports = (node) => {
|
|
256
|
+
if (node.type === 'import_declaration') {
|
|
257
|
+
// import a.b.C; | import static a.b.C; | import static a.b.C.F;
|
|
258
|
+
const isStatic = node.children.some((c) => c.type === 'static' && c.text === 'static');
|
|
259
|
+
const scoped = node.children.find((c) => c.type === 'scoped_identifier');
|
|
260
|
+
if (scoped) {
|
|
261
|
+
const text = scoped.text;
|
|
262
|
+
const lastDot = text.lastIndexOf('.');
|
|
263
|
+
const fqn = text.slice(0, lastDot);
|
|
264
|
+
const name = text.slice(lastDot + 1);
|
|
265
|
+
if (isStatic) {
|
|
266
|
+
// import static a.b.C.F → local F from module a.b.C, original F.
|
|
267
|
+
imports.set(name, { module: fqn, originalName: name });
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// import a.b.C → module IS the class FQN; originalName is the class
|
|
271
|
+
// simple name. resolveJavaImport maps `a.b.C` → `a/b/C.java`.
|
|
272
|
+
imports.set(name, { module: text, originalName: name });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
for (const child of node.children ?? [])
|
|
277
|
+
walkImports(child);
|
|
278
|
+
};
|
|
279
|
+
walkImports(tree.rootNode);
|
|
280
|
+
// Pass 2: constants. A field declaration is a constant when it is
|
|
281
|
+
// `static final` (explicit) or inside an interface (implicit).
|
|
282
|
+
const isStaticFinal = (modifiers) => {
|
|
283
|
+
if (!modifiers)
|
|
284
|
+
return false;
|
|
285
|
+
let sawStatic = false;
|
|
286
|
+
let sawFinal = false;
|
|
287
|
+
for (const m of modifiers.children ?? []) {
|
|
288
|
+
if (m.type === 'static')
|
|
289
|
+
sawStatic = true;
|
|
290
|
+
if (m.type === 'final')
|
|
291
|
+
sawFinal = true;
|
|
292
|
+
}
|
|
293
|
+
return sawStatic && sawFinal;
|
|
294
|
+
};
|
|
295
|
+
const collectFieldConstants = (classBody, insideInterface, declaringClass) => {
|
|
296
|
+
for (const member of classBody.children ?? []) {
|
|
297
|
+
// tree-sitter-java: interface fields are `constant_declaration`, class
|
|
298
|
+
// fields are `field_declaration`. Both carry `variable_declarator`s.
|
|
299
|
+
if (member.type !== 'field_declaration' && member.type !== 'constant_declaration')
|
|
300
|
+
continue;
|
|
301
|
+
const mods = member.children.find((c) => c.type === 'modifiers');
|
|
302
|
+
if (!insideInterface && !isStaticFinal(mods))
|
|
303
|
+
continue;
|
|
304
|
+
// Type must be String (java.lang.String is implicit-imported).
|
|
305
|
+
const typeNode = member.childForFieldName('type');
|
|
306
|
+
if (!typeNode)
|
|
307
|
+
continue;
|
|
308
|
+
const typeText = typeNode.text;
|
|
309
|
+
if (typeText !== 'String' && typeText !== 'java.lang.String')
|
|
310
|
+
continue;
|
|
311
|
+
const declarators = member.children.filter((c) => c.type === 'variable_declarator');
|
|
312
|
+
for (const decl of declarators) {
|
|
313
|
+
const nameNode = decl.childForFieldName('name');
|
|
314
|
+
const valueNode = decl.childForFieldName('value');
|
|
315
|
+
if (!nameNode)
|
|
316
|
+
continue;
|
|
317
|
+
const name = nameNode.text;
|
|
318
|
+
const operands = parseJavaConstOperands(valueNode);
|
|
319
|
+
// Same-name shadowing across nested types (legal Java, unlike
|
|
320
|
+
// same-class redeclaration): a later binding must REPLACE the earlier
|
|
321
|
+
// flattened simple-name entry — including dropping it to unresolvable
|
|
322
|
+
// when the new initializer is not foldable (`X = compute()`) — rather
|
|
323
|
+
// than leave the stale outer literal resolvable. Skip floor, mirroring
|
|
324
|
+
// Python #2391's rebind-drop. Qualified `Class.FIELD` aliases are
|
|
325
|
+
// per-type-keyed but same-named nested types can still collide, so
|
|
326
|
+
// they get the same replace/drop treatment.
|
|
327
|
+
const qname = declaringClass ? `${declaringClass}.${name}` : null;
|
|
328
|
+
if (operands === null) {
|
|
329
|
+
literals.delete(name);
|
|
330
|
+
exprs.delete(name);
|
|
331
|
+
// …and the static IMPORT of the same simple name. A local
|
|
332
|
+
// `static final String` shadows `import static a.b.C.PATH` inside
|
|
333
|
+
// that class (JLS 6.4.1), so the correct answer for a non-foldable
|
|
334
|
+
// rebind is "unresolvable" — leaving the import alive makes the fold
|
|
335
|
+
// fall through it (computeFold: literals → exprs → imports) and
|
|
336
|
+
// return the IMPORTED value, i.e. a wrong path where the skip floor
|
|
337
|
+
// is owed. #2393's Python defect, reproduced for Java.
|
|
338
|
+
//
|
|
339
|
+
// The delete is file-scoped because these maps are (see the header:
|
|
340
|
+
// nested types flatten into one file-level namespace). So a SIBLING
|
|
341
|
+
// top-level class in the same file that legitimately uses the import
|
|
342
|
+
// loses it too and floors to skip, where javac would resolve it.
|
|
343
|
+
// That direction is the acceptable one — a missing route, not a wrong
|
|
344
|
+
// one — and the shape (two top-level classes, one shadowing a static
|
|
345
|
+
// import with a non-foldable initializer) is vanishingly rare next to
|
|
346
|
+
// the wrong-value it prevents.
|
|
347
|
+
imports.delete(name);
|
|
348
|
+
if (qname) {
|
|
349
|
+
literals.delete(qname);
|
|
350
|
+
exprs.delete(qname);
|
|
351
|
+
}
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
const literalValue = operands.length === 1 && operands[0].kind === 'literal'
|
|
355
|
+
? operands[0].value
|
|
356
|
+
: null;
|
|
357
|
+
if (literalValue !== null) {
|
|
358
|
+
literals.set(name, literalValue);
|
|
359
|
+
exprs.delete(name);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
exprs.set(name, operands);
|
|
363
|
+
literals.delete(name);
|
|
364
|
+
}
|
|
365
|
+
// Qualified alias: `CONSTS.X` refs (folded refs carry the class name).
|
|
366
|
+
if (qname) {
|
|
367
|
+
if (literalValue !== null) {
|
|
368
|
+
literals.set(qname, literalValue);
|
|
369
|
+
exprs.delete(qname);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
exprs.set(qname, operands);
|
|
373
|
+
literals.delete(qname);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const walkTypes = (node, insideInterface) => {
|
|
380
|
+
for (const child of node.children ?? []) {
|
|
381
|
+
const isInterface = child.type === 'interface_declaration';
|
|
382
|
+
// Enums and records are ordinary type declarations for constant
|
|
383
|
+
// purposes — their fields need an explicit `static final` (JLS 8.9/8.10),
|
|
384
|
+
// unlike an interface's implicitly-constant ones. They used to be only
|
|
385
|
+
// RECURSED into, never collected, so a `static final String` declared
|
|
386
|
+
// directly in an enum or record was silently absent from the map.
|
|
387
|
+
const isTypeDecl = isInterface ||
|
|
388
|
+
child.type === 'class_declaration' ||
|
|
389
|
+
child.type === 'enum_declaration' ||
|
|
390
|
+
child.type === 'record_declaration';
|
|
391
|
+
if (!isTypeDecl) {
|
|
392
|
+
walkTypes(child, insideInterface);
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const className = child.childForFieldName('name')?.text ?? null;
|
|
396
|
+
const body = child.children.find((c) => c.type === 'class_body' || c.type === 'interface_body' || c.type === 'enum_body');
|
|
397
|
+
if (!body)
|
|
398
|
+
continue;
|
|
399
|
+
// An enum's members hang one level deeper, under `enum_body_declarations`
|
|
400
|
+
// (the `enum_body` itself holds only the enum constants).
|
|
401
|
+
const memberBody = body.children.find((c) => c.type === 'enum_body_declarations') ?? body;
|
|
402
|
+
// Recompute implicit interface semantics at each type boundary: a
|
|
403
|
+
// class nested in an interface is a normal class whose fields need
|
|
404
|
+
// explicit `static final` (JLS 9.5 — only the interface's own fields
|
|
405
|
+
// are implicitly public static final). Propagating the outer
|
|
406
|
+
// `insideInterface` flag in would harvest mutable nested fields as
|
|
407
|
+
// constants and let a same-name nested field shadow a real interface
|
|
408
|
+
// constant with a stale value.
|
|
409
|
+
if (className)
|
|
410
|
+
collectFieldConstants(memberBody, isInterface, className);
|
|
411
|
+
// Recurse over the WHOLE body, not just `memberBody`: an enum's constants
|
|
412
|
+
// are siblings of `enum_body_declarations`, so narrowing here dropped any
|
|
413
|
+
// type nested inside an enum-constant body whenever the enum also had
|
|
414
|
+
// member declarations. For a class/interface/record the two are the same
|
|
415
|
+
// node; for an enum `body` is a strict superset, and the extra visit to
|
|
416
|
+
// `enum_body_declarations` collects nothing twice (collectFieldConstants
|
|
417
|
+
// is still called on `memberBody` alone).
|
|
418
|
+
walkTypes(body, isInterface);
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
walkTypes(tree.rootNode, false);
|
|
422
|
+
return { literals, exprs, imports: imports };
|
|
423
|
+
}
|
|
424
|
+
function newFoldState(repo) {
|
|
425
|
+
const constantKeys = new Set();
|
|
426
|
+
for (const [key, mc] of repo) {
|
|
427
|
+
if (mc.literals.size > 0 || mc.exprs.size > 0)
|
|
428
|
+
constantKeys.add(key);
|
|
429
|
+
}
|
|
430
|
+
return { repo, constantKeys, visited: new Set(), memo: new Map() };
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Resolve a single Java constant referenced in `fileKey` to its literal string
|
|
434
|
+
* value, folding `+` concatenation and following import chains via
|
|
435
|
+
* {@link resolveJavaImport}, or null when it cannot be fully folded.
|
|
436
|
+
*
|
|
437
|
+
* `name` may be simple (`DIAGNOSIS_SAVE_V1`, resolved via static import or
|
|
438
|
+
* same-file constant) or qualified (`ApiPathConstants.DIAGNOSIS_SAVE_V1`,
|
|
439
|
+
* resolved via the class import + the target file's qualified alias).
|
|
440
|
+
*/
|
|
441
|
+
export function resolveJavaConstant(fileKey, name, repo, depth = 0) {
|
|
442
|
+
return resolveWithState(fileKey, name, newFoldState(repo), depth);
|
|
443
|
+
}
|
|
444
|
+
function resolveWithState(fileKey, name, state, depth) {
|
|
445
|
+
if (depth > 32)
|
|
446
|
+
return null;
|
|
447
|
+
const guard = `${fileKey}::${name}`;
|
|
448
|
+
const memoized = state.memo.get(guard);
|
|
449
|
+
if (memoized !== undefined)
|
|
450
|
+
return memoized;
|
|
451
|
+
if (state.visited.has(guard))
|
|
452
|
+
return null; // cycle: `name` is on the active stack
|
|
453
|
+
state.visited.add(guard);
|
|
454
|
+
try {
|
|
455
|
+
const result = computeJavaFold(fileKey, name, state, depth);
|
|
456
|
+
if (result !== null)
|
|
457
|
+
state.memo.set(guard, result);
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
finally {
|
|
461
|
+
state.visited.delete(guard);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
function computeJavaFold(fileKey, name, state, depth) {
|
|
465
|
+
const { repo, constantKeys } = state;
|
|
466
|
+
// Qualified ref (`ApiPathConstants.FIELD`): constants and imports are keyed by
|
|
467
|
+
// their IN-FILE name, so a dotted name never hits directly. Split head.tail:
|
|
468
|
+
// resolve the head through the importing file's class import, then look the
|
|
469
|
+
// tail up in the target file — first as the class-qualified alias `Head.TAIL`
|
|
470
|
+
// (what extractJavaModuleConstants records), then as a bare `TAIL` (same-file
|
|
471
|
+
// nested/interface constant).
|
|
472
|
+
const dot = name.indexOf('.');
|
|
473
|
+
if (dot > 0) {
|
|
474
|
+
const head = name.slice(0, dot);
|
|
475
|
+
const tail = name.slice(dot + 1);
|
|
476
|
+
const imp = repo.get(fileKey)?.imports.get(head);
|
|
477
|
+
if (imp) {
|
|
478
|
+
const targetFile = resolveJavaImport(fileKey, imp.module, constantKeys);
|
|
479
|
+
if (targetFile !== null) {
|
|
480
|
+
const qualified = resolveWithState(targetFile, `${head}.${tail}`, state, depth + 1);
|
|
481
|
+
if (qualified !== null)
|
|
482
|
+
return qualified;
|
|
483
|
+
const bare = resolveWithState(targetFile, tail, state, depth + 1);
|
|
484
|
+
if (bare !== null)
|
|
485
|
+
return bare;
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
// Un-imported qualified name (FQN form `com.a.b.C.FIELD`): try resolving
|
|
490
|
+
// the longest dotted prefix as a class import target.
|
|
491
|
+
const parts = name.split('.');
|
|
492
|
+
for (let cut = parts.length - 2; cut >= 1; cut--) {
|
|
493
|
+
const fqn = parts.slice(0, cut + 1).join('.');
|
|
494
|
+
const targetFile = resolveJavaImport(fileKey, fqn, constantKeys);
|
|
495
|
+
if (targetFile !== null) {
|
|
496
|
+
const field = parts.slice(cut + 1).join('.');
|
|
497
|
+
const declaring = parts[cut];
|
|
498
|
+
const qualified = resolveWithState(targetFile, `${declaring}.${field}`, state, depth + 1);
|
|
499
|
+
if (qualified !== null)
|
|
500
|
+
return qualified;
|
|
501
|
+
return resolveWithState(targetFile, field, state, depth + 1);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// No import bound the head and no FQN prefix resolved — fall through. A
|
|
505
|
+
// dotted name is ALSO a valid key in this file's own maps:
|
|
506
|
+
// `extractJavaModuleConstants` records every constant under
|
|
507
|
+
// `<DeclaringClass>.<FIELD>` as well as its simple name, so a same-file
|
|
508
|
+
// qualified reference (`ApiPaths.X` inside ApiPaths.java) resolves below.
|
|
509
|
+
}
|
|
510
|
+
// Name lookup: literals, then same-file expressions, then the import chase.
|
|
511
|
+
// Reached for a bare name and for a dotted name that named no import.
|
|
512
|
+
// Expressions are folded HERE rather than handed to the agnostic core because
|
|
513
|
+
// an operand of a Java initializer may itself be a QUALIFIED ref
|
|
514
|
+
// (`X = BConsts.Y + "/tail"`) and the core only knows bare names: it looks
|
|
515
|
+
// `BConsts.Y` up in maps keyed by simple name, misses, and floors the whole
|
|
516
|
+
// chain to null. Recursing through this function gives every operand the same
|
|
517
|
+
// qualified treatment the entry-point name got.
|
|
518
|
+
const mc = repo.get(fileKey);
|
|
519
|
+
if (!mc)
|
|
520
|
+
return null;
|
|
521
|
+
const literal = mc.literals.get(name);
|
|
522
|
+
if (literal !== undefined)
|
|
523
|
+
return literal;
|
|
524
|
+
const expr = mc.exprs.get(name);
|
|
525
|
+
if (expr !== undefined)
|
|
526
|
+
return foldOperands(fileKey, expr, state, depth + 1);
|
|
527
|
+
const imp = mc.imports.get(name);
|
|
528
|
+
if (imp !== undefined) {
|
|
529
|
+
const targetFile = resolveJavaImport(fileKey, imp.module, constantKeys);
|
|
530
|
+
if (targetFile === null)
|
|
531
|
+
return null;
|
|
532
|
+
return resolveWithState(targetFile, imp.originalName, state, depth + 1);
|
|
533
|
+
}
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Concatenate an operand list, resolving each `ref` through the qualified-aware
|
|
538
|
+
* walk so `Class.CONST` works at every position, not just at the entry point.
|
|
539
|
+
*
|
|
540
|
+
* Bounded by {@link MAX_FOLD_LENGTH}: the depth cap bounds RECURSION but not
|
|
541
|
+
* OUTPUT, which grows multiplicatively (`X = A + A; A = B + B; …`), so a
|
|
542
|
+
* pathological chain would build a gigabyte-scale string before any cap fired.
|
|
543
|
+
* Overrun floors to null (#2393).
|
|
544
|
+
*/
|
|
545
|
+
function foldOperands(fileKey, operands, state, depth) {
|
|
546
|
+
let out = '';
|
|
547
|
+
for (const op of operands) {
|
|
548
|
+
if (op.kind === 'literal') {
|
|
549
|
+
out += op.value;
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
const piece = resolveWithState(fileKey, op.name, state, depth);
|
|
553
|
+
if (piece === null)
|
|
554
|
+
return null;
|
|
555
|
+
out += piece;
|
|
556
|
+
}
|
|
557
|
+
if (out.length > MAX_FOLD_LENGTH)
|
|
558
|
+
return null;
|
|
559
|
+
}
|
|
560
|
+
return out;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Fold an inline operand list (e.g. `API_CIS_V1 + "summary/save"`) against
|
|
564
|
+
* `fileKey`, or null when any piece is unresolvable (skip floor).
|
|
565
|
+
*/
|
|
566
|
+
export function foldJavaOperands(fileKey, operands, repo) {
|
|
567
|
+
const out = foldOperands(fileKey, operands, newFoldState(repo), 0);
|
|
568
|
+
return out === '' ? null : out;
|
|
569
|
+
}
|