gitnexus 1.6.10-rc.98 → 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/class-extractors/configs/jvm.js +6 -6
- 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 +129 -44
- 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 +16 -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 +311 -16
- 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/jvm.js +2 -2
- 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 +322 -16
- package/dist/core/ingestion/utils/ast-helpers.js +727 -150
- 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 -3
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -435
- package/dist/storage/repo-manager.js +312 -215
- 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
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Strategy lives in configs/python.ts.
|
|
6
6
|
* This file contains the shared internal helper used by the strategy and tests.
|
|
7
7
|
*/
|
|
8
|
+
import { getPythonFileIndex, importerBarePrefixes, importerDirOf, pythonSegmentAbsent, } from './python-file-index.js';
|
|
8
9
|
import { tryResolveWithExtensions } from './utils.js';
|
|
9
10
|
/**
|
|
10
11
|
* Resolve a Python import to a file path (low-level helper).
|
|
@@ -43,8 +44,24 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
|
|
|
43
44
|
const pathLike = importPath.replace(/\./g, '/');
|
|
44
45
|
if (pathLike.includes('/'))
|
|
45
46
|
return null;
|
|
46
|
-
//
|
|
47
|
-
|
|
47
|
+
// O(1) proof of absence, before any probing. Every probe below — the two
|
|
48
|
+
// proximity probes and the two per ancestor step — has the shape
|
|
49
|
+
// `<X>/<pathLike>.py` or `<X>/<pathLike>/__init__.py`, and
|
|
50
|
+
// `pythonSegmentAbsent` answers "no file in the workspace has EITHER shape,
|
|
51
|
+
// for any prefix" in two Map lookups on the index the dotted tiers already
|
|
52
|
+
// build. That is `true` for `os`, `sys`, `django` and every other
|
|
53
|
+
// distribution the repo does not vendor — i.e. for most imports in most
|
|
54
|
+
// Python repos — and it retires the whole walk for them instead of running
|
|
55
|
+
// it to the workspace root. It is exact, not a filter: a miss here means
|
|
56
|
+
// every probe the walk would have issued was guaranteed to miss.
|
|
57
|
+
const index = getPythonFileIndex(allFiles);
|
|
58
|
+
if (pythonSegmentAbsent(index, pathLike))
|
|
59
|
+
return null;
|
|
60
|
+
// One derivation, shared with the index's other per-directory memo — see
|
|
61
|
+
// `importerDirOf`. It replaced `split('/').slice(0, -1).join('/')`: identical
|
|
62
|
+
// for every input (a path with no separator has no directory, which is `''`
|
|
63
|
+
// both ways) without the per-import array of one element per path component.
|
|
64
|
+
const importerDir = importerDirOf(currentFile);
|
|
48
65
|
// Proximity check — only applies when the importer lives in a subdirectory.
|
|
49
66
|
// Root-level importers (importerDir === '') skip straight to the ancestor
|
|
50
67
|
// walk below, which handles the root case correctly (prefix becomes '').
|
|
@@ -59,10 +76,12 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
|
|
|
59
76
|
// importer's directory to find the module in an ancestor, preferring the closest match.
|
|
60
77
|
// This prevents cross-language misresolution (e.g., Python `from middleware import X`
|
|
61
78
|
// resolving to a TypeScript middleware.ts via suffix matching). Issue #417.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
//
|
|
80
|
+
// The prefixes come from `importerBarePrefixes`, built ONCE per importer
|
|
81
|
+
// directory per pass and stored in the same index consulted above. Rebuilding
|
|
82
|
+
// them here — `dirParts.slice(0, i).join('/')`, one array and one string per
|
|
83
|
+
// path component — was the last per-import ancestor walk left after #2913.
|
|
84
|
+
for (const prefix of importerBarePrefixes(index, importerDir)) {
|
|
66
85
|
if (allFiles.has(`${prefix}${pathLike}/__init__.py`))
|
|
67
86
|
return `${prefix}${pathLike}/__init__.py`;
|
|
68
87
|
if (allFiles.has(`${prefix}${pathLike}.py`))
|
|
@@ -11,4 +11,4 @@ import type { SuffixIndex } from './utils.js';
|
|
|
11
11
|
* require_relative paths are pre-normalized to './' prefix by the caller.
|
|
12
12
|
* require paths use suffix matching (gem-style paths like 'json', 'net/http').
|
|
13
13
|
*/
|
|
14
|
-
export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
|
|
14
|
+
export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: readonly string[], allFileList: readonly string[], index?: SuffixIndex): string | null;
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
* Resolve Rust use-path to a file (low-level helper).
|
|
9
9
|
* Handles crate::, super::, self:: prefixes and :: path separators.
|
|
10
10
|
*/
|
|
11
|
-
export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles:
|
|
11
|
+
export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles: ReadonlySet<string>): string | null;
|
|
12
12
|
/**
|
|
13
13
|
* Try to resolve a Rust module path to a file.
|
|
14
14
|
* Tries: path.rs, path/mod.rs, and with the last segment stripped
|
|
15
15
|
* (last segment might be a symbol name, not a module).
|
|
16
16
|
*/
|
|
17
|
-
export declare function tryRustModulePath(modulePath: string, allFiles:
|
|
17
|
+
export declare function tryRustModulePath(modulePath: string, allFiles: ReadonlySet<string>): string | null;
|
|
@@ -20,7 +20,7 @@ export declare const RESOLVE_CACHE_CAP = 100000;
|
|
|
20
20
|
* Java wildcards and Go package imports are handled by the scope-resolution
|
|
21
21
|
* phase because they resolve to multiple files.
|
|
22
22
|
*/
|
|
23
|
-
export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: string[], normalizedFileList: string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
|
|
23
|
+
export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: readonly string[], normalizedFileList: readonly string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
|
|
24
24
|
/**
|
|
25
25
|
* Standard single-file resolution (TS/JS/C/C++ and fallback for other languages).
|
|
26
26
|
* Handles relative imports, tsconfig path aliases, and suffix matching.
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Extracted from import-resolution.ts to co-locate types with their consumers.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
import type { SwiftPackageConfig } from '../language-config.js';
|
|
6
|
+
import type { ImportConfigs } from '../language-config.js';
|
|
8
7
|
import type { SuffixIndex } from './utils.js';
|
|
9
8
|
import type { SupportedLanguages } from '../../../_shared/index.js';
|
|
10
9
|
/**
|
|
@@ -21,16 +20,6 @@ export type ImportResult = {
|
|
|
21
20
|
files: string[];
|
|
22
21
|
dirSuffix: string;
|
|
23
22
|
} | null;
|
|
24
|
-
/** Bundled language-specific configs loaded once per ingestion run. */
|
|
25
|
-
export interface ImportConfigs {
|
|
26
|
-
tsconfigPaths: TsconfigPaths | null;
|
|
27
|
-
goModule: GoModuleConfig | null;
|
|
28
|
-
composerConfig: ComposerConfig | null;
|
|
29
|
-
swiftPackageConfig: SwiftPackageConfig | null;
|
|
30
|
-
csharpConfigs: CSharpProjectConfig[];
|
|
31
|
-
/** In-repo namespace evidence gating C# suffix-fallback resolution (#1881). */
|
|
32
|
-
csharpNamespaces?: CSharpNamespaceEvidence;
|
|
33
|
-
}
|
|
34
23
|
/** Pre-built lookup structures for import resolution. Build once, reuse across chunks. */
|
|
35
24
|
export interface ImportResolutionContext {
|
|
36
25
|
allFilePaths: Set<string>;
|
|
@@ -18,15 +18,74 @@ export declare function tryResolveWithExtensions(basePath: string, allFiles: Rea
|
|
|
18
18
|
* etc.
|
|
19
19
|
*/
|
|
20
20
|
export interface SuffixIndex {
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Exact suffix lookup (case-sensitive).
|
|
23
|
+
*
|
|
24
|
+
* The map behind this is built on the FIRST call and memoized — see
|
|
25
|
+
* `buildSuffixIndex`. All three maps are deferred; a consumer pays only for
|
|
26
|
+
* the questions it actually asks.
|
|
27
|
+
*/
|
|
22
28
|
get(suffix: string): string | undefined;
|
|
23
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Case-insensitive suffix lookup.
|
|
31
|
+
*
|
|
32
|
+
* Deferred like `get`, and — when `get` was asked first — DERIVED from that
|
|
33
|
+
* map rather than traversed for a second time. See `buildSuffixIndex`.
|
|
34
|
+
*/
|
|
24
35
|
getInsensitive(suffix: string): string | undefined;
|
|
25
|
-
/**
|
|
26
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Get all files in a directory suffix.
|
|
38
|
+
*
|
|
39
|
+
* `dirSuffix` is matched as a SEGMENT-aligned directory suffix — every
|
|
40
|
+
* returned file is a direct child of a directory `D` with
|
|
41
|
+
* `D === dirSuffix || D.endsWith('/' + dirSuffix)`. Callers may rely on this
|
|
42
|
+
* and skip a direct-child re-check; `import-resolvers/csharp.ts` step 2 does
|
|
43
|
+
* exactly that. It bounds what may be RETURNED, not what must be found: an
|
|
44
|
+
* implementation is free to answer with fewer files, and the root-anchored
|
|
45
|
+
* index in `languages/php/import-target.ts` answers only the `D === dirSuffix`
|
|
46
|
+
* arm.
|
|
47
|
+
*
|
|
48
|
+
* `readonly` is the CONTRACT, and it is the contract for every implementation
|
|
49
|
+
* of this interface, not a description of any one of them: an implementation
|
|
50
|
+
* is free to return its own bucket by reference, so callers must treat the
|
|
51
|
+
* result as shared and never `sort`/`splice` it in place. The compiler now
|
|
52
|
+
* refuses that at the call site. Whether a given implementation shares or
|
|
53
|
+
* copies is its own business and documented where it is built —
|
|
54
|
+
* `buildSuffixIndex` shares, the root-anchored parity index in
|
|
55
|
+
* `languages/php/import-target.ts` returns a filtered copy.
|
|
56
|
+
*
|
|
57
|
+
* Implementations that memoize should note the directory map behind this may
|
|
58
|
+
* be built on the FIRST call rather than up front, so a caller that never
|
|
59
|
+
* asks a directory question never pays for it — see `buildSuffixIndex`.
|
|
60
|
+
*/
|
|
61
|
+
getFilesInDir(dirSuffix: string, extension: string): readonly string[];
|
|
27
62
|
}
|
|
28
|
-
export
|
|
63
|
+
export interface SuffixIndexOptions {
|
|
64
|
+
/**
|
|
65
|
+
* Promise from the caller that `normalizedFileList[i] === normalizedFileList[i].toLowerCase()`
|
|
66
|
+
* for every `i` — i.e. the "normalized" list is a LOWERCASED file list, not
|
|
67
|
+
* merely a slash-normalized one.
|
|
68
|
+
*
|
|
69
|
+
* `import-resolvers/pass-cache.ts` is the one caller that can make it: it
|
|
70
|
+
* builds `normalizedFileList` as `allFileList.map((f) => f.toLowerCase())`.
|
|
71
|
+
* Every suffix of an all-lowercase path is itself lowercase, so
|
|
72
|
+
* `suffix.toLowerCase() === suffix` and the case-folded map came out a
|
|
73
|
+
* byte-identical copy of the exact one — same keys, same values, same
|
|
74
|
+
* insertion order. Measured 14.00 MiB at 32 000 paths, 29.8% of the retained
|
|
75
|
+
* `ImportPassCache` — and one `ImportPassCache` is built per ts-family
|
|
76
|
+
* adapter per pass, so the waste was carried once for each of them.
|
|
77
|
+
*
|
|
78
|
+
* With this set, `getInsensitive` reads the exact map directly instead. It is
|
|
79
|
+
* the same map the derivation below would have produced, so this is a skipped
|
|
80
|
+
* copy and not a second lookup rule — see `getLowerMap`.
|
|
81
|
+
*
|
|
82
|
+
* Setting it over a list that is NOT all-lowercase is a behaviour change, not
|
|
83
|
+
* an optimization: `getInsensitive` would then answer case-sensitively.
|
|
84
|
+
*/
|
|
85
|
+
readonly alreadyLowercased?: boolean;
|
|
86
|
+
}
|
|
87
|
+
export declare function buildSuffixIndex(normalizedFileList: readonly string[], allFileList: readonly string[], options?: SuffixIndexOptions): SuffixIndex;
|
|
29
88
|
/**
|
|
30
89
|
* Suffix-based resolution using index. O(1) per lookup instead of O(files).
|
|
31
90
|
*/
|
|
32
|
-
export declare function suffixResolve(pathParts: string[], normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
|
|
91
|
+
export declare function suffixResolve(pathParts: string[], normalizedFileList: readonly string[], allFileList: readonly string[], index?: SuffixIndex): string | null;
|
|
@@ -64,53 +64,232 @@ export function tryResolveWithExtensions(basePath, allFiles) {
|
|
|
64
64
|
}
|
|
65
65
|
return null;
|
|
66
66
|
}
|
|
67
|
-
export function buildSuffixIndex(normalizedFileList, allFileList) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
67
|
+
export function buildSuffixIndex(normalizedFileList, allFileList, options) {
|
|
68
|
+
const alreadyLowercased = options?.alreadyLowercased === true;
|
|
69
|
+
/**
|
|
70
|
+
* Map: normalized suffix -> original file path.
|
|
71
|
+
*
|
|
72
|
+
* DEFERRED, like `dirMap` below and for the same reason (#2903 extended to
|
|
73
|
+
* the two suffix maps). Several consumers on the ScopeResolver path ask only
|
|
74
|
+
* ONE of the two suffix questions and were paying for both:
|
|
75
|
+
*
|
|
76
|
+
* - `languages/java/import-target.ts` and the no-csproj leg of
|
|
77
|
+
* `languages/csharp/import-target.ts` call `get` and never
|
|
78
|
+
* `getInsensitive` — measured 49.98 MiB dead of a 100.82 MiB Java index
|
|
79
|
+
* at 32 000 paths (49.6%), against a gated ceiling of 146.9 MiB;
|
|
80
|
+
* - `languages/php/import-target.ts` calls `getInsensitive` and never `get`
|
|
81
|
+
* — 34.49 MiB of 69.85 MiB (49.4%).
|
|
82
|
+
*
|
|
83
|
+
* Ruby, the csproj leg of C#, `group/extractors/include-extractor.ts` and
|
|
84
|
+
* `suffixResolve` below read both, and all four read `get` FIRST (they are
|
|
85
|
+
* written `get(s) || getInsensitive(s)`), which is what makes the derivation
|
|
86
|
+
* in `getLowerMap` the cheap order rather than the expensive one.
|
|
87
|
+
*/
|
|
88
|
+
let exactMap = null;
|
|
89
|
+
const getExactMap = () => {
|
|
90
|
+
if (exactMap !== null)
|
|
91
|
+
return exactMap;
|
|
92
|
+
const built = new Map();
|
|
93
|
+
for (let i = 0; i < normalizedFileList.length; i++) {
|
|
94
|
+
const normalized = normalizedFileList[i];
|
|
95
|
+
const original = allFileList[i];
|
|
96
|
+
// Index all suffixes: "a/b/c.java" -> ["c.java", "b/c.java", "a/b/c.java"].
|
|
97
|
+
//
|
|
98
|
+
// Walked as slash offsets into `normalized` rather than as
|
|
99
|
+
// `normalized.split('/')` + `parts.slice(j).join('/')`: the slice of the
|
|
100
|
+
// ORIGINAL string is byte-identical to the re-joined parts (no separator
|
|
101
|
+
// is invented or dropped — verified over 361 865 suffix strings including
|
|
102
|
+
// leading, doubled and trailing slashes), and it allocates one string
|
|
103
|
+
// instead of a parts array, a slice array and a joined string per suffix.
|
|
104
|
+
// Measured 357.4 ms -> 264.5 ms at 32 000 paths.
|
|
105
|
+
let slash = normalized.lastIndexOf('/');
|
|
106
|
+
while (slash >= 0) {
|
|
107
|
+
const suffix = normalized.slice(slash + 1);
|
|
108
|
+
// Only store first match (longest path wins for ambiguous suffixes)
|
|
109
|
+
if (!built.has(suffix))
|
|
110
|
+
built.set(suffix, original);
|
|
111
|
+
// A path may begin with '/', whose suffix is the whole string below.
|
|
112
|
+
if (slash === 0)
|
|
113
|
+
break;
|
|
114
|
+
slash = normalized.lastIndexOf('/', slash - 1);
|
|
84
115
|
}
|
|
85
|
-
|
|
86
|
-
if (!
|
|
87
|
-
|
|
116
|
+
// j = 0 — the whole path, which the slash walk cannot emit.
|
|
117
|
+
if (!built.has(normalized))
|
|
118
|
+
built.set(normalized, original);
|
|
119
|
+
}
|
|
120
|
+
exactMap = built;
|
|
121
|
+
return built;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Map: lowercase suffix -> original file path.
|
|
125
|
+
*
|
|
126
|
+
* Deferred, and when the exact map already exists DERIVED from it instead of
|
|
127
|
+
* traversed for: one pass over that map's DISTINCT keys rather than a second
|
|
128
|
+
* pass over every (file × depth) suffix. Measured 330.3 ms total (200.6 build
|
|
129
|
+
* + 129.7 derive) against 388.8 ms for the single fused traversal that built
|
|
130
|
+
* both eagerly — so the two-map consumers get cheaper too, which per-map
|
|
131
|
+
* laziness on its own does not (407.1 ms, a second full traversal).
|
|
132
|
+
*
|
|
133
|
+
* The derivation is EQUAL, not approximate, and the argument is short. Let
|
|
134
|
+
* the fused loop's global order be the pairs (suffix, file) it visited. For a
|
|
135
|
+
* lowercase key L, let p be the first position whose suffix lowercases to L —
|
|
136
|
+
* the entry today's `lowerMap` keeps. Nothing before p carries that suffix
|
|
137
|
+
* spelled ANY way, so p is also the first occurrence of its exact spelling
|
|
138
|
+
* and is therefore in the exact map, holding that same file. Exact-map
|
|
139
|
+
* insertion order is by first-occurrence position, so among the exact keys
|
|
140
|
+
* folding to L, p's is reached first and first-wins keeps it. Insertion order
|
|
141
|
+
* of the derived map is the order of those p's, which is the order today's
|
|
142
|
+
* `lowerMap` inserts L. Verified rather than only argued: byte-equal keys,
|
|
143
|
+
* values and order over 968 418 entries across bench-shaped, PascalCase,
|
|
144
|
+
* case-colliding, deep-monorepo, Unicode-adversarial and 400 seeded-fuzz
|
|
145
|
+
* corpora.
|
|
146
|
+
*
|
|
147
|
+
* When `getInsensitive` is asked FIRST (PHP), there is nothing to derive
|
|
148
|
+
* from, so it is built straight — one traversal, one map, which is the point.
|
|
149
|
+
* Asking `get` afterwards would then cost the second traversal; no consumer
|
|
150
|
+
* does, and the fallback stays correct if one ever starts.
|
|
151
|
+
*/
|
|
152
|
+
let lowerMap = null;
|
|
153
|
+
const getLowerMap = () => {
|
|
154
|
+
// Over an already-lowercased file list the derivation is the identity, so
|
|
155
|
+
// the exact map IS the case-folded map. Skip the copy.
|
|
156
|
+
if (alreadyLowercased)
|
|
157
|
+
return getExactMap();
|
|
158
|
+
if (lowerMap !== null)
|
|
159
|
+
return lowerMap;
|
|
160
|
+
const built = new Map();
|
|
161
|
+
if (exactMap !== null) {
|
|
162
|
+
for (const [suffix, original] of exactMap) {
|
|
163
|
+
const lower = suffix.toLowerCase();
|
|
164
|
+
if (!built.has(lower))
|
|
165
|
+
built.set(lower, original);
|
|
166
|
+
}
|
|
167
|
+
lowerMap = built;
|
|
168
|
+
return built;
|
|
169
|
+
}
|
|
170
|
+
for (let i = 0; i < normalizedFileList.length; i++) {
|
|
171
|
+
const normalized = normalizedFileList[i];
|
|
172
|
+
const original = allFileList[i];
|
|
173
|
+
let slash = normalized.lastIndexOf('/');
|
|
174
|
+
while (slash >= 0) {
|
|
175
|
+
const lower = normalized.slice(slash + 1).toLowerCase();
|
|
176
|
+
if (!built.has(lower))
|
|
177
|
+
built.set(lower, original);
|
|
178
|
+
if (slash === 0)
|
|
179
|
+
break;
|
|
180
|
+
slash = normalized.lastIndexOf('/', slash - 1);
|
|
88
181
|
}
|
|
182
|
+
const whole = normalized.toLowerCase();
|
|
183
|
+
if (!built.has(whole))
|
|
184
|
+
built.set(whole, original);
|
|
89
185
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
186
|
+
lowerMap = built;
|
|
187
|
+
return built;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Map: `${directory suffix}:${extension}` -> file paths in that directory.
|
|
191
|
+
*
|
|
192
|
+
* DEFERRED, not dropped (#2903). This is the array-valued map of the three
|
|
193
|
+
* and by far the most expensive: one entry — and one array push — per file
|
|
194
|
+
* per directory component, so O(files × depth) in entries AND in array
|
|
195
|
+
* churn. Measured on the 32k-path arms of `bench/import-target/`, it is
|
|
196
|
+
* ~15% of the retained C# index and ~19% of the retained Ruby one.
|
|
197
|
+
*
|
|
198
|
+
* Only `getFilesInDir` reads it, and only four call sites reach that:
|
|
199
|
+
* `import-resolvers/{php,csharp,jvm}.ts` and `import-resolvers/configs/
|
|
200
|
+
* python.ts`. Every other consumer of this index — `workspace-file-index.ts`
|
|
201
|
+
* serving Ruby, `languages/typescript/scope-resolver.ts`,
|
|
202
|
+
* `languages/vue/import-target.ts`, `group/extractors/include-extractor.ts`
|
|
203
|
+
* — asks only suffix questions and was paying the whole footprint for a map
|
|
204
|
+
* it never touched. Since these indexes are now retained for a whole
|
|
205
|
+
* resolution pass rather than rebuilt per import (#2877-#2880), that is
|
|
206
|
+
* retained memory against the #2649 kernel-scale OOM constraint.
|
|
207
|
+
*
|
|
208
|
+
* `null` until the first `getFilesInDir`; the MAP is memoized, not the
|
|
209
|
+
* decision to build it, so a repeated miss cannot rebuild it. Building it
|
|
210
|
+
* later is behaviour-identical because it is a pure function of
|
|
211
|
+
* `normalizedFileList` / `allFileList`, and it retains nothing new: every
|
|
212
|
+
* production caller already holds both arrays alive alongside the index
|
|
213
|
+
* (`WorkspaceFileIndex.normalized`/`.all`, the TS and Vue `PassCache`s,
|
|
214
|
+
* `IncludeExtractor.extract`'s locals).
|
|
215
|
+
*/
|
|
216
|
+
let dirMap = null;
|
|
217
|
+
const getDirMap = () => {
|
|
218
|
+
if (dirMap !== null)
|
|
219
|
+
return dirMap;
|
|
220
|
+
const built = new Map();
|
|
221
|
+
for (let i = 0; i < normalizedFileList.length; i++) {
|
|
222
|
+
const normalized = normalizedFileList[i];
|
|
223
|
+
const original = allFileList[i];
|
|
224
|
+
const lastSlash = normalized.lastIndexOf('/');
|
|
225
|
+
// A file at the repo root is in no directory suffix.
|
|
226
|
+
if (lastSlash < 0)
|
|
227
|
+
continue;
|
|
228
|
+
// The file name from its last '.', or the WHOLE file name when it carries
|
|
229
|
+
// none — `substring(-1)` clamps to 0, which is what the `parts` form
|
|
230
|
+
// (`fileName.substring(fileName.lastIndexOf('.'))`) spelled. A '.' in a
|
|
231
|
+
// DIRECTORY is not an extension, hence `dot > lastSlash` rather than
|
|
232
|
+
// `dot >= 0`.
|
|
233
|
+
const dot = normalized.lastIndexOf('.');
|
|
234
|
+
const ext = dot > lastSlash ? normalized.slice(dot) : normalized.slice(lastSlash + 1);
|
|
235
|
+
// Every directory suffix of `normalized.slice(0, lastSlash)`, shortest
|
|
236
|
+
// first — the order `for (j = dirParts.length - 1; j >= 0; j--)` emitted,
|
|
237
|
+
// and load-bearing: `php.ts` returns `candidates[0]` of a bucket, so a
|
|
238
|
+
// reordered bucket is a behaviour change, not a wash.
|
|
239
|
+
//
|
|
240
|
+
// Walked as slash offsets into `normalized`, the same rewrite `getExactMap`
|
|
241
|
+
// above documents and for the same reason — a slice of the ORIGINAL string
|
|
242
|
+
// is byte-identical to the re-joined parts, and it allocates one string per
|
|
243
|
+
// suffix instead of a parts array, a slice array and a joined string per
|
|
244
|
+
// suffix. This is the map where it pays most: one entry, one array push AND
|
|
245
|
+
// one key per file per directory component, the "by far the most expensive"
|
|
246
|
+
// of the three. Measured 226.9 ms -> 173.1 ms at 32 000 paths averaging
|
|
247
|
+
// ~10 directory components (min of 9, both loops alternating in one
|
|
248
|
+
// process). Verified rather than argued, over a 32 000-path corpus
|
|
249
|
+
// carrying absolute paths, doubled separators (`a//b`), backslash paths,
|
|
250
|
+
// root-level and extensionless files, dotted directories and trailing
|
|
251
|
+
// separators: 272 956 keys and 329 361 bucket entries came out with
|
|
252
|
+
// identical key sets in identical INSERTION order and identical buckets
|
|
253
|
+
// element-for-element, and 767 732 probes of the built index — every
|
|
254
|
+
// emitted (directory, extension) pair plus a wrong-extension and a
|
|
255
|
+
// one-level-deeper miss for each — answered exactly as the `parts` form's
|
|
256
|
+
// map did. 0 differences.
|
|
257
|
+
//
|
|
258
|
+
// `slash < 0` is the whole directory, which no slash search can emit and
|
|
259
|
+
// the only suffix a one-component directory has.
|
|
260
|
+
let start = lastSlash;
|
|
261
|
+
while (start >= 0) {
|
|
262
|
+
const slash = start > 0 ? normalized.lastIndexOf('/', start - 1) : -1;
|
|
263
|
+
const key = `${normalized.slice(slash + 1, lastSlash)}:${ext}`;
|
|
264
|
+
let list = built.get(key);
|
|
101
265
|
if (!list) {
|
|
102
266
|
list = [];
|
|
103
|
-
|
|
267
|
+
built.set(key, list);
|
|
104
268
|
}
|
|
105
269
|
list.push(original);
|
|
270
|
+
start = slash;
|
|
106
271
|
}
|
|
107
272
|
}
|
|
108
|
-
|
|
273
|
+
dirMap = built;
|
|
274
|
+
return built;
|
|
275
|
+
};
|
|
109
276
|
return {
|
|
110
|
-
get: (suffix) =>
|
|
111
|
-
getInsensitive: (suffix) =>
|
|
277
|
+
get: (suffix) => getExactMap().get(suffix),
|
|
278
|
+
getInsensitive: (suffix) => getLowerMap().get(suffix.toLowerCase()),
|
|
279
|
+
// THIS implementation shares: it hands back `dirMap`'s own bucket rather
|
|
280
|
+
// than a copy. The map is built on first query and then held for the whole
|
|
281
|
+
// pass, so the window in which a mutating caller could corrupt later
|
|
282
|
+
// imports is the whole pass — which is why the interface makes the result
|
|
283
|
+
// `readonly` and the compiler refuses the mutation at the call site.
|
|
284
|
+
//
|
|
285
|
+
// Sharing beats copying because no caller keeps the array: two only measure
|
|
286
|
+
// it and two build a fresh array from it, so a defensive copy would
|
|
287
|
+
// allocate a whole bucket per import on the path this index exists to keep
|
|
288
|
+
// flat. `package-dir-index.ts` reached the same conclusion the same way —
|
|
289
|
+
// read-only containers, plus one copy where a bucket genuinely LEAVES
|
|
290
|
+
// (`sortedRootFiles`), which is the case `configs/swift.ts` is in.
|
|
112
291
|
getFilesInDir: (dirSuffix, extension) => {
|
|
113
|
-
return
|
|
292
|
+
return getDirMap().get(`${dirSuffix}:${extension}`) || [];
|
|
114
293
|
},
|
|
115
294
|
};
|
|
116
295
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-file-set workspace index for the import-target resolvers that need the
|
|
3
|
+
* shared `SuffixIndex` (C#, Java, PHP, Ruby).
|
|
4
|
+
*
|
|
5
|
+
* The scope-resolution orchestrator passes the SAME `allFilePaths` Set object to
|
|
6
|
+
* every `resolveImportTarget` call in a pass (`pipeline/run.ts` builds it once),
|
|
7
|
+
* so memoizing on the Set's identity in a `WeakMap` turns the per-import
|
|
8
|
+
* "materialize two arrays + build a suffix index" cost into a one-time build.
|
|
9
|
+
*
|
|
10
|
+
* IMPORTANT for callers: the Set must be passed THROUGH, never copied. A
|
|
11
|
+
* defensive `new Set(allFilePaths)` in an adapter hands a fresh `WeakMap` key
|
|
12
|
+
* per call and silently restores the O(imports × files) behaviour — the exact
|
|
13
|
+
* bug PR #1918 shipped and had to fix in review (P1).
|
|
14
|
+
*
|
|
15
|
+
* Three layers guard that, and they guard different things:
|
|
16
|
+
* - ADAPTER BOUNDARY, where the defensive-copy hazard actually lives:
|
|
17
|
+
* `test/integration/*-import-index-reuse.test.ts` resolves through
|
|
18
|
+
* `<lang>ScopeResolver.resolveImportTarget` — the orchestrator adapter — and
|
|
19
|
+
* pins the EXACT number of times a run traverses the file set, one file per
|
|
20
|
+
* covered language over that language's own corpus. (The expected count is
|
|
21
|
+
* per language and legitimately differs: it is however many times the
|
|
22
|
+
* adapter derives something from the Set — two indexes, or an index plus the
|
|
23
|
+
* mutable copy the ts-family context wants.) All of them count traversals
|
|
24
|
+
* of a `CountingSet` (`test/helpers/counting-file-set.ts`): one instrument,
|
|
25
|
+
* no production surface, and it catches both the per-import rebuild and a
|
|
26
|
+
* scan reintroduced beside a reused index (#2909).
|
|
27
|
+
* - EVERY REGISTERED LANGUAGE, at the same boundary but as one property rather
|
|
28
|
+
* than one corpus per language: `test/unit/scope-resolution/import-target-index-reuse.contract.test.ts`
|
|
29
|
+
* drives each entry of `SCOPE_RESOLVERS` and asserts the traversal count for
|
|
30
|
+
* many imports equals the count for two. A new language cannot skip it, and
|
|
31
|
+
* the enforcement is a test rather than a roster anyone maintains: that
|
|
32
|
+
* file's inventory arm compares `SCOPE_RESOLVERS`' keys against its own
|
|
33
|
+
* fixture table and fails on a registered resolver that has neither a
|
|
34
|
+
* fixture nor an exemption, and its next arm pins the exemption map empty.
|
|
35
|
+
* - RESOLVER LEVEL: `test/unit/scope-resolution/import-target-index-parity.test.ts`
|
|
36
|
+
* calls the resolvers directly, so it never crosses the adapter boundary and
|
|
37
|
+
* a copy there leaves it green. What it catches is a rescan reintroduced
|
|
38
|
+
* INSIDE a resolver, by counting how many times the Set is iterated.
|
|
39
|
+
*/
|
|
40
|
+
import { type SuffixIndex } from './utils.js';
|
|
41
|
+
/**
|
|
42
|
+
* `normalized` and `all` are `readonly string[]`, and — like
|
|
43
|
+
* `SuffixIndex.getFilesInDir` — that is the CONTRACT rather than a description
|
|
44
|
+
* of the arrays: they are built once and then held for the whole pass, so an
|
|
45
|
+
* in-place `sort`/`splice`/`reverse` would corrupt every later import in that
|
|
46
|
+
* pass, and these two are the largest shared arrays here (one element per file,
|
|
47
|
+
* read by C#, Java, PHP and Ruby). `readonly` on the field is what makes the
|
|
48
|
+
* compiler refuse the mutation at the call site instead of leaving it to a
|
|
49
|
+
* comment. `ImportPassCache` (`pass-cache.ts`) states the same contract the
|
|
50
|
+
* same way for the ts-family lists.
|
|
51
|
+
*
|
|
52
|
+
* The positional pairing is load-bearing too and depends on it: `csharp.ts`
|
|
53
|
+
* caches POSITIONS into `normalized` and reads the answer out of `all`, so a
|
|
54
|
+
* reordering of either array alone silently re-points every cached position.
|
|
55
|
+
*/
|
|
56
|
+
export interface WorkspaceFileIndex {
|
|
57
|
+
/** Every path, backslashes normalized to `/`. Parallel to `all`. */
|
|
58
|
+
readonly normalized: readonly string[];
|
|
59
|
+
/** Every path, exactly as it appears in the Set. Parallel to `normalized`. */
|
|
60
|
+
readonly all: readonly string[];
|
|
61
|
+
/** Segment-suffix → first file (in Set iteration order) carrying that suffix. */
|
|
62
|
+
readonly index: SuffixIndex;
|
|
63
|
+
/**
|
|
64
|
+
* Normalized path → first raw path that normalizes to it. Answers "is there a
|
|
65
|
+
* file whose WHOLE path is X", which `index.get(X)` cannot: the suffix map
|
|
66
|
+
* conflates a whole-path hit with a `…/X` suffix hit, and C#'s
|
|
67
|
+
* `resolveDirectMatch` lets a whole-path match win over an earlier suffix
|
|
68
|
+
* match.
|
|
69
|
+
*/
|
|
70
|
+
readonly normToRaw: Map<string, string>;
|
|
71
|
+
}
|
|
72
|
+
export declare const getWorkspaceFileIndex: (key: ReadonlySet<string>) => WorkspaceFileIndex;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-file-set workspace index for the import-target resolvers that need the
|
|
3
|
+
* shared `SuffixIndex` (C#, Java, PHP, Ruby).
|
|
4
|
+
*
|
|
5
|
+
* The scope-resolution orchestrator passes the SAME `allFilePaths` Set object to
|
|
6
|
+
* every `resolveImportTarget` call in a pass (`pipeline/run.ts` builds it once),
|
|
7
|
+
* so memoizing on the Set's identity in a `WeakMap` turns the per-import
|
|
8
|
+
* "materialize two arrays + build a suffix index" cost into a one-time build.
|
|
9
|
+
*
|
|
10
|
+
* IMPORTANT for callers: the Set must be passed THROUGH, never copied. A
|
|
11
|
+
* defensive `new Set(allFilePaths)` in an adapter hands a fresh `WeakMap` key
|
|
12
|
+
* per call and silently restores the O(imports × files) behaviour — the exact
|
|
13
|
+
* bug PR #1918 shipped and had to fix in review (P1).
|
|
14
|
+
*
|
|
15
|
+
* Three layers guard that, and they guard different things:
|
|
16
|
+
* - ADAPTER BOUNDARY, where the defensive-copy hazard actually lives:
|
|
17
|
+
* `test/integration/*-import-index-reuse.test.ts` resolves through
|
|
18
|
+
* `<lang>ScopeResolver.resolveImportTarget` — the orchestrator adapter — and
|
|
19
|
+
* pins the EXACT number of times a run traverses the file set, one file per
|
|
20
|
+
* covered language over that language's own corpus. (The expected count is
|
|
21
|
+
* per language and legitimately differs: it is however many times the
|
|
22
|
+
* adapter derives something from the Set — two indexes, or an index plus the
|
|
23
|
+
* mutable copy the ts-family context wants.) All of them count traversals
|
|
24
|
+
* of a `CountingSet` (`test/helpers/counting-file-set.ts`): one instrument,
|
|
25
|
+
* no production surface, and it catches both the per-import rebuild and a
|
|
26
|
+
* scan reintroduced beside a reused index (#2909).
|
|
27
|
+
* - EVERY REGISTERED LANGUAGE, at the same boundary but as one property rather
|
|
28
|
+
* than one corpus per language: `test/unit/scope-resolution/import-target-index-reuse.contract.test.ts`
|
|
29
|
+
* drives each entry of `SCOPE_RESOLVERS` and asserts the traversal count for
|
|
30
|
+
* many imports equals the count for two. A new language cannot skip it, and
|
|
31
|
+
* the enforcement is a test rather than a roster anyone maintains: that
|
|
32
|
+
* file's inventory arm compares `SCOPE_RESOLVERS`' keys against its own
|
|
33
|
+
* fixture table and fails on a registered resolver that has neither a
|
|
34
|
+
* fixture nor an exemption, and its next arm pins the exemption map empty.
|
|
35
|
+
* - RESOLVER LEVEL: `test/unit/scope-resolution/import-target-index-parity.test.ts`
|
|
36
|
+
* calls the resolvers directly, so it never crosses the adapter boundary and
|
|
37
|
+
* a copy there leaves it green. What it catches is a rescan reintroduced
|
|
38
|
+
* INSIDE a resolver, by counting how many times the Set is iterated.
|
|
39
|
+
*/
|
|
40
|
+
import { perFileSet } from './per-file-set.js';
|
|
41
|
+
import { buildSuffixIndex } from './utils.js';
|
|
42
|
+
export const getWorkspaceFileIndex = perFileSet((allFilePaths) => {
|
|
43
|
+
const all = [...allFilePaths];
|
|
44
|
+
const normalized = all.map((f) => f.replace(/\\/g, '/'));
|
|
45
|
+
const normToRaw = new Map();
|
|
46
|
+
for (let i = 0; i < normalized.length; i++) {
|
|
47
|
+
// First wins, mirroring the `for (const raw of allFilePaths)` scans this
|
|
48
|
+
// replaces: they returned on the first match in iteration order.
|
|
49
|
+
if (!normToRaw.has(normalized[i]))
|
|
50
|
+
normToRaw.set(normalized[i], all[i]);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
normalized,
|
|
54
|
+
all,
|
|
55
|
+
index: buildSuffixIndex(normalized, all),
|
|
56
|
+
normToRaw,
|
|
57
|
+
};
|
|
58
|
+
});
|