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
|
@@ -0,0 +1,1033 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript/TypeScript binding for the language-agnostic constant resolver.
|
|
3
|
+
*
|
|
4
|
+
* Supplies the two JS-specific pieces the shared fold in `constant-resolver.ts`
|
|
5
|
+
* needs — {@link resolveJsImport} (import specifier → file key, honoring
|
|
6
|
+
* relative paths, extensionless imports, directory `index` files and bare
|
|
7
|
+
* alias-style specifiers) and {@link extractJsModuleFacts} (tree →
|
|
8
|
+
* {@link ModuleConstants} plus the export/HTTP-client facts below) — mirroring
|
|
9
|
+
* how `python-const-resolver.ts` binds the same core for Python (#2391).
|
|
10
|
+
*
|
|
11
|
+
* Two JS-shaped facts the Python binding has no analogue for:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Object-literal path tables.** Python route constants are module-level
|
|
14
|
+
* scalars (`API_V1 = "/v1"`); the JS convention is one frozen table —
|
|
15
|
+
* `export const API_ROUTE_PATH = { LINKS: "/links", … } as const` — read at
|
|
16
|
+
* the call site as `API_ROUTE_PATH.LINKS`. The extractor flattens such a
|
|
17
|
+
* table into DOTTED literal keys (`API_ROUTE_PATH.LINKS` → `/links`) so the
|
|
18
|
+
* agnostic fold, which does a plain `literals.get(name)`, resolves a member
|
|
19
|
+
* reference with no changes to the core.
|
|
20
|
+
*
|
|
21
|
+
* 2. **Export aliasing.** `export default routeApiClient` and
|
|
22
|
+
* `export { a as b }` mean the name an importer writes is often not the
|
|
23
|
+
* name the defining file bound. {@link JsModuleFacts.exports} maps the
|
|
24
|
+
* EXPORTED name (including `default`) to the local one so a cross-file
|
|
25
|
+
* chase lands on the right binding.
|
|
26
|
+
*
|
|
27
|
+
* Both stay in this binding — the shared core keeps knowing nothing about any
|
|
28
|
+
* language.
|
|
29
|
+
*
|
|
30
|
+
* Keying matches the Python binding: the repo map is keyed by unique POSIX file
|
|
31
|
+
* path, and an import that cannot be pinned to exactly one file resolves to
|
|
32
|
+
* `null` (skip) rather than an arbitrary winner. An unresolved path is a
|
|
33
|
+
* missing contract; a wrongly-resolved one is a false cross-repo link, which is
|
|
34
|
+
* strictly worse.
|
|
35
|
+
*/
|
|
36
|
+
import { MAX_FOLD_LENGTH, resolveConstant as foldConstant, } from './constant-resolver.js';
|
|
37
|
+
/** Extensions an extensionless JS/TS import may resolve to, in resolution order. */
|
|
38
|
+
const JS_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'];
|
|
39
|
+
/**
|
|
40
|
+
* Bound on the re-export chase in {@link resolveJsMemberPath}. Mirrors the
|
|
41
|
+
* fold's own `MAX_RESOLVE_DEPTH`: a barrel that re-exports through more hops
|
|
42
|
+
* than this floors to `null` (skip), never to a guess.
|
|
43
|
+
*/
|
|
44
|
+
const MAX_REEXPORT_HOPS = 8;
|
|
45
|
+
/** The synthetic local name a bare `export default <expr>` binds to. */
|
|
46
|
+
const DEFAULT_LOCAL = '__default__';
|
|
47
|
+
function buildBasenameIndex(repoKeys) {
|
|
48
|
+
const index = new Map();
|
|
49
|
+
for (const key of repoKeys) {
|
|
50
|
+
const base = key.slice(key.lastIndexOf('/') + 1);
|
|
51
|
+
const bucket = index.get(base);
|
|
52
|
+
if (bucket)
|
|
53
|
+
bucket.push(key);
|
|
54
|
+
else
|
|
55
|
+
index.set(base, [key]);
|
|
56
|
+
}
|
|
57
|
+
return index;
|
|
58
|
+
}
|
|
59
|
+
/** Build the {@link JsRepoFacts} projections from per-file facts. */
|
|
60
|
+
export function buildJsRepoFacts(byFile) {
|
|
61
|
+
const constants = new Map();
|
|
62
|
+
for (const [key, value] of byFile)
|
|
63
|
+
constants.set(key, value.constants);
|
|
64
|
+
const keys = new Set(byFile.keys());
|
|
65
|
+
const index = buildBasenameIndex(keys);
|
|
66
|
+
const memo = new Map();
|
|
67
|
+
const resolveImport = (importingFileKey, moduleSpec, repoKeys) => {
|
|
68
|
+
// Only the relative arm reads `importingFileKey`, but keying on both is a
|
|
69
|
+
// string concat and keeps the memo correct if that ever stops being true.
|
|
70
|
+
//
|
|
71
|
+
// `repoKeys` is deliberately NOT part of the key: every caller inside this
|
|
72
|
+
// module passes `facts.keys`, which is fixed for the lifetime of these
|
|
73
|
+
// facts and is the set `index` was built from. A caller passing a different
|
|
74
|
+
// set would get an answer computed against `facts.keys` — so don't.
|
|
75
|
+
const memoKey = `${importingFileKey}\u0000${moduleSpec}`;
|
|
76
|
+
const cached = memo.get(memoKey);
|
|
77
|
+
if (cached !== undefined)
|
|
78
|
+
return cached;
|
|
79
|
+
const resolved = resolveImportWith(index, importingFileKey, moduleSpec, repoKeys);
|
|
80
|
+
memo.set(memoKey, resolved);
|
|
81
|
+
return resolved;
|
|
82
|
+
};
|
|
83
|
+
return { byFile, constants, keys, resolveImport };
|
|
84
|
+
}
|
|
85
|
+
function dirOf(fileKey) {
|
|
86
|
+
const slash = fileKey.lastIndexOf('/');
|
|
87
|
+
return slash >= 0 ? fileKey.slice(0, slash) : '';
|
|
88
|
+
}
|
|
89
|
+
/** Collapse `a/b/../c` and `./` segments in a POSIX-ish path. */
|
|
90
|
+
function normalizePosix(path) {
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const seg of path.split('/')) {
|
|
93
|
+
if (seg === '' || seg === '.')
|
|
94
|
+
continue;
|
|
95
|
+
if (seg === '..') {
|
|
96
|
+
if (out.length > 0 && out[out.length - 1] !== '..')
|
|
97
|
+
out.pop();
|
|
98
|
+
else
|
|
99
|
+
out.push('..');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
out.push(seg);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out.join('/');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Candidate file keys for a module path with no extension: the path itself
|
|
109
|
+
* (already-suffixed imports), each known extension, and the directory-`index`
|
|
110
|
+
* forms. Order matters only for the relative case, where the first existing
|
|
111
|
+
* candidate wins — matching bundler/`tsc` resolution order closely enough that
|
|
112
|
+
* a repo with both `x.ts` and `x.js` picks the TypeScript source.
|
|
113
|
+
*/
|
|
114
|
+
function candidatesFor(modPath) {
|
|
115
|
+
const out = [modPath];
|
|
116
|
+
for (const ext of JS_EXTENSIONS)
|
|
117
|
+
out.push(`${modPath}${ext}`);
|
|
118
|
+
for (const ext of JS_EXTENSIONS)
|
|
119
|
+
out.push(`${modPath}/index${ext}`);
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The MODULE a repo key denotes: the key without its extension, and without a
|
|
124
|
+
* trailing `/index`.
|
|
125
|
+
*
|
|
126
|
+
* `x/routes.ts` and `x/routes/index.ts` are two spellings of the same module
|
|
127
|
+
* `x/routes` — Node and `tsc` both pick the file over the directory, so a tail
|
|
128
|
+
* matching both is not ambiguous, it just has a precedence order. Two
|
|
129
|
+
* DIFFERENT identities sharing one tail is the real ambiguity, and that is what
|
|
130
|
+
* {@link resolveImportWith} refuses.
|
|
131
|
+
*/
|
|
132
|
+
function moduleIdentityOf(key) {
|
|
133
|
+
for (const ext of JS_EXTENSIONS) {
|
|
134
|
+
if (!key.endsWith(ext))
|
|
135
|
+
continue;
|
|
136
|
+
const withoutExt = key.slice(0, -ext.length);
|
|
137
|
+
return withoutExt.endsWith('/index') ? withoutExt.slice(0, -'/index'.length) : withoutExt;
|
|
138
|
+
}
|
|
139
|
+
return key;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The JS/TS {@link ImportResolver}.
|
|
143
|
+
*
|
|
144
|
+
* Relative specifiers (`./api-routes`, `../shared/api-routes`) resolve against
|
|
145
|
+
* the importing file's directory and must hit an existing key exactly.
|
|
146
|
+
*
|
|
147
|
+
* An alias-style specifier (`@/api-modules/shared/api-routes`, `~/x/y`) or a
|
|
148
|
+
* multi-segment bare one is matched by UNIQUE PATH SUFFIX, the same strategy
|
|
149
|
+
* the Python binding uses for absolute imports. This deliberately resolves
|
|
150
|
+
* aliases without reading `tsconfig.json`: an alias prefix is arbitrary (`@/`,
|
|
151
|
+
* `~/`, `#app/`, any `paths` key), but the segments AFTER it are a real path
|
|
152
|
+
* tail, and matching that tail against the indexed file set answers the
|
|
153
|
+
* question directly.
|
|
154
|
+
*
|
|
155
|
+
* Two rules keep that from inventing resolutions:
|
|
156
|
+
*
|
|
157
|
+
* - **A tail claimed by two distinct modules returns `null`**, checked across
|
|
158
|
+
* EVERY candidate extension rather than within one. Returning on the first
|
|
159
|
+
* extension that matched let precedence pre-empt the guard, so a `.ts`/`.tsx`
|
|
160
|
+
* or `.ts`/`.js` collision — every Next.js repo — picked an arbitrary winner
|
|
161
|
+
* while this docstring promised a skip.
|
|
162
|
+
* - **A single-segment bare specifier never matches a repo file.** `axios`,
|
|
163
|
+
* `lodash` and the Node builtin `http` are npm/runtime modules, not ours to
|
|
164
|
+
* resolve; without this, a repo holding `src/lib/http.ts` "proved" that
|
|
165
|
+
* `import http from 'http'` was an axios client. An alias tail always has a
|
|
166
|
+
* sigil or a `/`, so this costs the feature nothing.
|
|
167
|
+
*/
|
|
168
|
+
function resolveImportWith(index, importingFileKey, moduleSpec, repoKeys) {
|
|
169
|
+
if (moduleSpec === '')
|
|
170
|
+
return null;
|
|
171
|
+
if (moduleSpec.startsWith('./') || moduleSpec.startsWith('../')) {
|
|
172
|
+
const base = dirOf(importingFileKey);
|
|
173
|
+
const joined = normalizePosix(`${base}/${moduleSpec}`);
|
|
174
|
+
// A `../` chain that climbs above the repo root leaves a leading `..`
|
|
175
|
+
// segment; that import escapes the indexed tree and cannot be pinned.
|
|
176
|
+
if (joined === '' || joined.startsWith('..'))
|
|
177
|
+
return null;
|
|
178
|
+
for (const candidate of candidatesFor(joined)) {
|
|
179
|
+
if (repoKeys.has(candidate))
|
|
180
|
+
return candidate;
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
// Strip a leading alias sigil so `@/a/b` and `~/a/b` reduce to the tail
|
|
185
|
+
// `a/b`. A scoped package (`@scope/pkg`) keeps its `@` and simply fails to
|
|
186
|
+
// match any repo file below, which is the desired outcome.
|
|
187
|
+
const aliased = /^[@~#]\//.test(moduleSpec);
|
|
188
|
+
const tail = aliased ? moduleSpec.slice(2) : moduleSpec;
|
|
189
|
+
if (tail === '' || tail.startsWith('.'))
|
|
190
|
+
return null;
|
|
191
|
+
if (!aliased && !tail.includes('/'))
|
|
192
|
+
return null; // bare npm package / Node builtin
|
|
193
|
+
let winner = null;
|
|
194
|
+
let winnerRank = Number.POSITIVE_INFINITY;
|
|
195
|
+
let identity = null;
|
|
196
|
+
const candidates = candidatesFor(tail);
|
|
197
|
+
for (let rank = 0; rank < candidates.length; rank++) {
|
|
198
|
+
const candidate = candidates[rank];
|
|
199
|
+
const bucket = index.get(candidate.slice(candidate.lastIndexOf('/') + 1));
|
|
200
|
+
if (bucket === undefined)
|
|
201
|
+
continue;
|
|
202
|
+
for (const key of bucket) {
|
|
203
|
+
if (key !== candidate && !key.endsWith(`/${candidate}`))
|
|
204
|
+
continue;
|
|
205
|
+
const keyIdentity = moduleIdentityOf(key);
|
|
206
|
+
if (identity === null)
|
|
207
|
+
identity = keyIdentity;
|
|
208
|
+
else if (identity !== keyIdentity)
|
|
209
|
+
return null; // two modules share this tail
|
|
210
|
+
if (rank < winnerRank) {
|
|
211
|
+
winner = key;
|
|
212
|
+
winnerRank = rank;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return winner;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Standalone {@link ImportResolver} — the same rules as {@link resolveImportWith}
|
|
220
|
+
* with the basename index built on the spot.
|
|
221
|
+
*
|
|
222
|
+
* Production goes through `JsRepoFacts.resolveImport`, which holds one index
|
|
223
|
+
* for the whole repo and memoizes; this export exists so the resolution rules
|
|
224
|
+
* can be exercised directly against a key set.
|
|
225
|
+
*/
|
|
226
|
+
export const resolveJsImport = (importingFileKey, moduleSpec, repoKeys) => resolveImportWith(buildBasenameIndex(repoKeys), importingFileKey, moduleSpec, repoKeys);
|
|
227
|
+
/** Unwrap TS `x as const` / `x satisfies T` to the underlying expression. */
|
|
228
|
+
function unwrapTsExpression(node) {
|
|
229
|
+
let cur = node;
|
|
230
|
+
while (cur.type === 'as_expression' || cur.type === 'satisfies_expression') {
|
|
231
|
+
const inner = cur.namedChild(0);
|
|
232
|
+
if (!inner)
|
|
233
|
+
break;
|
|
234
|
+
cur = inner;
|
|
235
|
+
}
|
|
236
|
+
return cur;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* The literal string a node denotes, or `null` when it is not a plain literal.
|
|
240
|
+
* A template string counts only when it has no `${…}` substitution — an
|
|
241
|
+
* interpolated one is an expression, handled by {@link parseJsConstOperands}.
|
|
242
|
+
*/
|
|
243
|
+
function literalStringOf(node) {
|
|
244
|
+
const n = unwrapTsExpression(node);
|
|
245
|
+
if (n.type === 'string') {
|
|
246
|
+
const fragments = n.namedChildren.filter((c) => c.type === 'string_fragment');
|
|
247
|
+
if (fragments.length === 0)
|
|
248
|
+
return n.namedChildren.length === 0 ? '' : null;
|
|
249
|
+
return fragments.map((f) => f.text).join('');
|
|
250
|
+
}
|
|
251
|
+
if (n.type === 'template_string') {
|
|
252
|
+
if (n.namedChildren.some((c) => c.type === 'template_substitution'))
|
|
253
|
+
return null;
|
|
254
|
+
const fragments = n.namedChildren.filter((c) => c.type === 'string_fragment');
|
|
255
|
+
return fragments.map((f) => f.text).join('');
|
|
256
|
+
}
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
/** The static key a property name node denotes (`FOO`, `'foo'`, `"foo"`). */
|
|
260
|
+
function staticKeyOf(node) {
|
|
261
|
+
if (node.type === 'property_identifier' || node.type === 'identifier')
|
|
262
|
+
return node.text;
|
|
263
|
+
if (node.type === 'string')
|
|
264
|
+
return literalStringOf(node);
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Flatten an object literal into dotted `prefix.KEY` → literal entries.
|
|
269
|
+
* Nested objects recurse (`API.USERS.ME`); a computed key, a spread, or a
|
|
270
|
+
* non-string value is skipped — the table's other entries stay usable.
|
|
271
|
+
*/
|
|
272
|
+
function flattenObjectLiteral(obj, prefix, into, depth = 0) {
|
|
273
|
+
if (depth > MAX_REEXPORT_HOPS)
|
|
274
|
+
return;
|
|
275
|
+
for (const pair of obj.namedChildren) {
|
|
276
|
+
if (pair.type !== 'pair')
|
|
277
|
+
continue;
|
|
278
|
+
const keyNode = pair.childForFieldName('key');
|
|
279
|
+
const valueNode = pair.childForFieldName('value');
|
|
280
|
+
if (!keyNode || !valueNode)
|
|
281
|
+
continue;
|
|
282
|
+
const key = staticKeyOf(keyNode);
|
|
283
|
+
if (key === null)
|
|
284
|
+
continue;
|
|
285
|
+
const value = unwrapTsExpression(valueNode);
|
|
286
|
+
const literal = literalStringOf(value);
|
|
287
|
+
if (literal !== null) {
|
|
288
|
+
into.set(`${prefix}.${key}`, literal);
|
|
289
|
+
}
|
|
290
|
+
else if (value.type === 'object') {
|
|
291
|
+
flattenObjectLiteral(value, `${prefix}.${key}`, into, depth + 1);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Parse a `+`-concatenation / template string into an operand list the shared
|
|
297
|
+
* fold can resolve, or `null` when a term is not a string literal or a
|
|
298
|
+
* resolvable name reference.
|
|
299
|
+
*
|
|
300
|
+
* Handles the two shapes a JS route path is built with:
|
|
301
|
+
* `BASE + "/users"` → [ref BASE, literal /users]
|
|
302
|
+
* `` `${BASE}/users/${id}` `` → [ref BASE, literal /users/, ref id]
|
|
303
|
+
*
|
|
304
|
+
* A member reference inside either (`${API_ROUTE_PATH.LISTS}`) becomes a
|
|
305
|
+
* dotted `ref`, which the flattened table above resolves directly.
|
|
306
|
+
*/
|
|
307
|
+
export function parseJsConstOperands(node, depth = 0) {
|
|
308
|
+
if (depth > MAX_EXPR_DEPTH)
|
|
309
|
+
return null;
|
|
310
|
+
const n = unwrapTsExpression(node);
|
|
311
|
+
const literal = literalStringOf(n);
|
|
312
|
+
if (literal !== null)
|
|
313
|
+
return [{ kind: 'literal', value: literal }];
|
|
314
|
+
if (n.type === 'identifier')
|
|
315
|
+
return [{ kind: 'ref', name: n.text }];
|
|
316
|
+
if (n.type === 'member_expression') {
|
|
317
|
+
const dotted = dottedNameOf(n);
|
|
318
|
+
return dotted === null ? null : [{ kind: 'ref', name: dotted }];
|
|
319
|
+
}
|
|
320
|
+
if (n.type === 'binary_expression') {
|
|
321
|
+
const operator = n.childForFieldName('operator');
|
|
322
|
+
if (operator?.text !== '+')
|
|
323
|
+
return null;
|
|
324
|
+
const left = n.childForFieldName('left');
|
|
325
|
+
const right = n.childForFieldName('right');
|
|
326
|
+
if (!left || !right)
|
|
327
|
+
return null;
|
|
328
|
+
const l = parseJsConstOperands(left, depth + 1);
|
|
329
|
+
const r = parseJsConstOperands(right, depth + 1);
|
|
330
|
+
return l === null || r === null ? null : [...l, ...r];
|
|
331
|
+
}
|
|
332
|
+
if (n.type === 'template_string') {
|
|
333
|
+
const out = [];
|
|
334
|
+
for (const child of n.namedChildren) {
|
|
335
|
+
if (child.type === 'string_fragment') {
|
|
336
|
+
out.push({ kind: 'literal', value: child.text });
|
|
337
|
+
}
|
|
338
|
+
else if (child.type === 'template_substitution') {
|
|
339
|
+
const inner = child.namedChild(0);
|
|
340
|
+
if (!inner)
|
|
341
|
+
return null;
|
|
342
|
+
const parsed = parseJsConstOperands(inner, depth + 1);
|
|
343
|
+
if (parsed === null)
|
|
344
|
+
return null;
|
|
345
|
+
out.push(...parsed);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* The dotted name a member expression denotes (`A.B.C`), or `null` for a
|
|
354
|
+
* computed / non-identifier chain (`A[key]`, `fn().B`) that has no stable
|
|
355
|
+
* textual key.
|
|
356
|
+
*/
|
|
357
|
+
export function dottedNameOf(node) {
|
|
358
|
+
const parts = [];
|
|
359
|
+
let cur = node;
|
|
360
|
+
while (cur && cur.type === 'member_expression') {
|
|
361
|
+
const property = cur.childForFieldName('property');
|
|
362
|
+
if (!property || property.type !== 'property_identifier')
|
|
363
|
+
return null;
|
|
364
|
+
parts.unshift(property.text);
|
|
365
|
+
cur = cur.childForFieldName('object');
|
|
366
|
+
}
|
|
367
|
+
if (!cur || cur.type !== 'identifier')
|
|
368
|
+
return null;
|
|
369
|
+
parts.unshift(cur.text);
|
|
370
|
+
return parts.join('.');
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* How many wrapping calls {@link bindsAxiosClient} will look through. A factory
|
|
374
|
+
* is one hop (`setupInterceptors(axios.create())`); a couple more costs nothing
|
|
375
|
+
* and bounds the walk.
|
|
376
|
+
*/
|
|
377
|
+
const MAX_CLIENT_WRAP_DEPTH = 4;
|
|
378
|
+
/** True when a node is `axios.create(...)`, allowing an aliased axios import. */
|
|
379
|
+
function isAxiosCreateCall(node, imports, axiosShadowed) {
|
|
380
|
+
if (node.type !== 'call_expression')
|
|
381
|
+
return false;
|
|
382
|
+
const fn = node.childForFieldName('function');
|
|
383
|
+
if (!fn || fn.type !== 'member_expression')
|
|
384
|
+
return false;
|
|
385
|
+
if (fn.childForFieldName('property')?.text !== 'create')
|
|
386
|
+
return false;
|
|
387
|
+
const object = fn.childForFieldName('object');
|
|
388
|
+
if (!object || object.type !== 'identifier')
|
|
389
|
+
return false;
|
|
390
|
+
// `import axios from 'axios'` is the overwhelming convention, but the local
|
|
391
|
+
// name is the importer's choice (`import ax from 'axios'`), so trust the
|
|
392
|
+
// module specifier over the spelling whenever the file declares one. The
|
|
393
|
+
// bare spelling is the fallback, and it is only evidence while the file has
|
|
394
|
+
// not bound that name to something else.
|
|
395
|
+
if (imports.get(object.text)?.module === 'axios')
|
|
396
|
+
return true;
|
|
397
|
+
return object.text === 'axios' && !axiosShadowed;
|
|
398
|
+
}
|
|
399
|
+
/** The module a `require('…')` initializer names, or `null` if it is not one. */
|
|
400
|
+
function requireSpecifierOf(node) {
|
|
401
|
+
const n = unwrapTsExpression(node);
|
|
402
|
+
if (n.type !== 'call_expression')
|
|
403
|
+
return null;
|
|
404
|
+
if (n.childForFieldName('function')?.text !== 'require')
|
|
405
|
+
return null;
|
|
406
|
+
const args = n.childForFieldName('arguments');
|
|
407
|
+
const first = args?.namedChild(0);
|
|
408
|
+
return first ? literalStringOf(first) : null;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Whether an initializer BINDS an axios instance — i.e. the instance is the
|
|
412
|
+
* VALUE of the binding, not merely present somewhere inside it.
|
|
413
|
+
*
|
|
414
|
+
* A direct `const api = axios.create(...)` is the textbook form, but the shape
|
|
415
|
+
* real applications ship is a factory that decorates the instance and hands it
|
|
416
|
+
* back:
|
|
417
|
+
*
|
|
418
|
+
* const routeApiClient = setupClientInterceptors({
|
|
419
|
+
* axiosInstance: axios.create({ baseURL: API_URL }),
|
|
420
|
+
* });
|
|
421
|
+
*
|
|
422
|
+
* Requiring the call to be the whole initializer would reject that — and it is
|
|
423
|
+
* the single binding every call site in such an app goes through. So a wrapping
|
|
424
|
+
* CALL whose result is bound counts, and the instance may be one of its
|
|
425
|
+
* arguments or a property of a directly-passed object literal.
|
|
426
|
+
*
|
|
427
|
+
* What does NOT count is the instance being an INGREDIENT of the bound value.
|
|
428
|
+
* The premise "an expression that builds an axios instance and binds the result
|
|
429
|
+
* is an HTTP client" is only true when the instance is the result; a plain
|
|
430
|
+
* subtree scan also admitted
|
|
431
|
+
*
|
|
432
|
+
* const registry = { http: axios.create(), version: 'v1' }; // object literal
|
|
433
|
+
* const client = MOCK ? memoryStore : axios.create(); // ternary branch
|
|
434
|
+
* new Map([['api', axios.create()]]); // constructor arg
|
|
435
|
+
* new LRUCache({ fetchMethod: axios.create().get }); // constructor arg
|
|
436
|
+
*
|
|
437
|
+
* and `.get`/`.delete` are the two most common non-HTTP method names in JS, so
|
|
438
|
+
* every one of those made an ordinary cache or registry an HTTP consumer. Those
|
|
439
|
+
* node types are simply not walked here.
|
|
440
|
+
*
|
|
441
|
+
* A nested function body is still skipped wherever it appears — a callback that
|
|
442
|
+
* builds its own client does not vouch for the outer name.
|
|
443
|
+
*/
|
|
444
|
+
function bindsAxiosClient(node, imports, axiosShadowed, depth = 0) {
|
|
445
|
+
if (depth > MAX_CLIENT_WRAP_DEPTH)
|
|
446
|
+
return false;
|
|
447
|
+
const n = unwrapTsExpression(node);
|
|
448
|
+
if (isAxiosCreateCall(n, imports, axiosShadowed))
|
|
449
|
+
return true;
|
|
450
|
+
// Transparent wrappers around the value itself.
|
|
451
|
+
if (n.type === 'await_expression' ||
|
|
452
|
+
n.type === 'parenthesized_expression' ||
|
|
453
|
+
n.type === 'non_null_expression') {
|
|
454
|
+
const inner = n.namedChild(0);
|
|
455
|
+
return inner !== null && bindsAxiosClient(inner, imports, axiosShadowed, depth + 1);
|
|
456
|
+
}
|
|
457
|
+
if (n.type !== 'call_expression')
|
|
458
|
+
return false;
|
|
459
|
+
const args = n.childForFieldName('arguments');
|
|
460
|
+
if (!args)
|
|
461
|
+
return false;
|
|
462
|
+
for (const arg of args.namedChildren) {
|
|
463
|
+
if (argumentHoldsAxiosClient(arg, imports, axiosShadowed, depth + 1))
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Whether a wrapping call's ARGUMENT carries the instance.
|
|
470
|
+
*
|
|
471
|
+
* Inside an argument the instance may sit in an options object at any nesting
|
|
472
|
+
* (`createClient({ transport: { instance: axios.create() } })`) or in a list of
|
|
473
|
+
* decorators (`compose([axios.create(), withAuth])`). That is safe because the
|
|
474
|
+
* bound value is still the call's RESULT. It is the mirror of what
|
|
475
|
+
* {@link bindsAxiosClient} refuses: an object, array, ternary or `new` as the
|
|
476
|
+
* bound value itself never reaches here.
|
|
477
|
+
*/
|
|
478
|
+
function argumentHoldsAxiosClient(node, imports, axiosShadowed, depth) {
|
|
479
|
+
if (depth > MAX_CLIENT_WRAP_DEPTH)
|
|
480
|
+
return false;
|
|
481
|
+
const n = unwrapTsExpression(node);
|
|
482
|
+
if (bindsAxiosClient(n, imports, axiosShadowed, depth))
|
|
483
|
+
return true;
|
|
484
|
+
if (n.type === 'object') {
|
|
485
|
+
for (const pair of n.namedChildren) {
|
|
486
|
+
if (pair.type !== 'pair')
|
|
487
|
+
continue;
|
|
488
|
+
const value = pair.childForFieldName('value');
|
|
489
|
+
if (value && argumentHoldsAxiosClient(value, imports, axiosShadowed, depth + 1))
|
|
490
|
+
return true;
|
|
491
|
+
}
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
if (n.type === 'array') {
|
|
495
|
+
for (const element of n.namedChildren) {
|
|
496
|
+
if (argumentHoldsAxiosClient(element, imports, axiosShadowed, depth + 1))
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Record one `name = value` binding into the accumulating facts.
|
|
504
|
+
* Shared by plain declarations and their `export const` form.
|
|
505
|
+
*/
|
|
506
|
+
function recordBinding(name, valueNode, literals, exprs, clients, imports, axiosShadowed) {
|
|
507
|
+
const value = unwrapTsExpression(valueNode);
|
|
508
|
+
if (bindsAxiosClient(value, imports, axiosShadowed)) {
|
|
509
|
+
clients.add(name);
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
// `const client = someOtherClient` — an alias. Recorded as a client-chase
|
|
513
|
+
// edge (below) and as a constant ref, since one of the two will resolve.
|
|
514
|
+
if (value.type === 'identifier') {
|
|
515
|
+
exprs.set(name, [{ kind: 'ref', name: value.text }]);
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
if (value.type === 'object') {
|
|
519
|
+
flattenObjectLiteral(value, name, literals);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
const literal = literalStringOf(value);
|
|
523
|
+
if (literal !== null) {
|
|
524
|
+
literals.set(name, literal);
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
const operands = parseJsConstOperands(value);
|
|
528
|
+
if (operands !== null)
|
|
529
|
+
exprs.set(name, operands);
|
|
530
|
+
}
|
|
531
|
+
/** Record every `variable_declarator` in a declaration node. */
|
|
532
|
+
function recordDeclaration(decl, literals, exprs, clients, imports, axiosShadowed, exports) {
|
|
533
|
+
for (const declarator of decl.namedChildren) {
|
|
534
|
+
if (declarator.type !== 'variable_declarator')
|
|
535
|
+
continue;
|
|
536
|
+
const nameNode = declarator.childForFieldName('name');
|
|
537
|
+
const valueNode = declarator.childForFieldName('value');
|
|
538
|
+
if (!nameNode || nameNode.type !== 'identifier' || !valueNode)
|
|
539
|
+
continue;
|
|
540
|
+
recordBinding(nameNode.text, valueNode, literals, exprs, clients, imports, axiosShadowed);
|
|
541
|
+
exports?.set(nameNode.text, nameNode.text);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
/** Record one `import … from 'm'` statement's local bindings. */
|
|
545
|
+
function recordImportStatement(stmt, imports) {
|
|
546
|
+
const source = stmt.childForFieldName('source');
|
|
547
|
+
const moduleSpec = source ? literalStringOf(source) : null;
|
|
548
|
+
if (moduleSpec === null)
|
|
549
|
+
return;
|
|
550
|
+
for (const clause of stmt.namedChildren) {
|
|
551
|
+
if (clause.type !== 'import_clause')
|
|
552
|
+
continue;
|
|
553
|
+
for (const spec of clause.namedChildren) {
|
|
554
|
+
// `import Default from 'm'`
|
|
555
|
+
if (spec.type === 'identifier') {
|
|
556
|
+
imports.set(spec.text, { module: moduleSpec, originalName: 'default' });
|
|
557
|
+
}
|
|
558
|
+
else if (spec.type === 'namespace_import') {
|
|
559
|
+
const alias = spec.namedChild(0);
|
|
560
|
+
// `import * as NS from 'm'` — `NS.X` resolves to the target's `X`.
|
|
561
|
+
if (alias)
|
|
562
|
+
imports.set(alias.text, { module: moduleSpec, originalName: '*' });
|
|
563
|
+
}
|
|
564
|
+
else if (spec.type === 'named_imports') {
|
|
565
|
+
for (const named of spec.namedChildren) {
|
|
566
|
+
if (named.type !== 'import_specifier')
|
|
567
|
+
continue;
|
|
568
|
+
const nameNode = named.childForFieldName('name');
|
|
569
|
+
const aliasNode = named.childForFieldName('alias');
|
|
570
|
+
if (!nameNode)
|
|
571
|
+
continue;
|
|
572
|
+
const local = (aliasNode ?? nameNode).text;
|
|
573
|
+
imports.set(local, { module: moduleSpec, originalName: nameNode.text });
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Extract one file's {@link JsModuleFacts} from its parsed tree.
|
|
581
|
+
*
|
|
582
|
+
* Only TOP-LEVEL declarations are collected. A route table or an API client
|
|
583
|
+
* defined inside a function body is not a module constant, and treating it as
|
|
584
|
+
* one would let an unrelated same-named local shadow the real export.
|
|
585
|
+
*/
|
|
586
|
+
export function extractJsModuleFacts(tree) {
|
|
587
|
+
const literals = new Map();
|
|
588
|
+
const exprs = new Map();
|
|
589
|
+
const imports = new Map();
|
|
590
|
+
const exports = new Map();
|
|
591
|
+
const starExports = [];
|
|
592
|
+
const clients = new Set();
|
|
593
|
+
// Imports first. ES module bindings are hoisted — `const c = ax.create(…)`
|
|
594
|
+
// above `import ax from 'axios'` is legal and binds the same `ax` — but
|
|
595
|
+
// `bindsAxiosClient` consults `imports` as each declaration is recorded, so
|
|
596
|
+
// in source order an import declared later was simply not there yet and the
|
|
597
|
+
// client went unproven.
|
|
598
|
+
//
|
|
599
|
+
// CommonJS `const ax = require('axios')` is collected here too. It is the
|
|
600
|
+
// same binding by another spelling, and without it an aliased require
|
|
601
|
+
// resolved to nothing at all while the un-aliased one worked only because
|
|
602
|
+
// `axios` happens to be the name the spelling shortcut trusts.
|
|
603
|
+
let axiosShadowed = false;
|
|
604
|
+
for (const stmt of tree.rootNode.namedChildren) {
|
|
605
|
+
if (stmt.type === 'import_statement') {
|
|
606
|
+
recordImportStatement(stmt, imports);
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
const decl = stmt.type === 'export_statement' ? stmt.childForFieldName('declaration') : stmt;
|
|
610
|
+
if (decl === null ||
|
|
611
|
+
(decl.type !== 'lexical_declaration' && decl.type !== 'variable_declaration')) {
|
|
612
|
+
continue;
|
|
613
|
+
}
|
|
614
|
+
for (const declarator of decl.namedChildren) {
|
|
615
|
+
if (declarator.type !== 'variable_declarator')
|
|
616
|
+
continue;
|
|
617
|
+
const nameNode = declarator.childForFieldName('name');
|
|
618
|
+
const valueNode = declarator.childForFieldName('value');
|
|
619
|
+
if (!nameNode || nameNode.type !== 'identifier')
|
|
620
|
+
continue;
|
|
621
|
+
const required = valueNode === null ? null : requireSpecifierOf(valueNode);
|
|
622
|
+
if (required !== null) {
|
|
623
|
+
imports.set(nameNode.text, { module: required, originalName: 'default' });
|
|
624
|
+
}
|
|
625
|
+
else if (nameNode.text === 'axios') {
|
|
626
|
+
axiosShadowed = true;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
for (const stmt of tree.rootNode.namedChildren) {
|
|
631
|
+
if (stmt.type === 'lexical_declaration' || stmt.type === 'variable_declaration') {
|
|
632
|
+
recordDeclaration(stmt, literals, exprs, clients, imports, axiosShadowed, null);
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
if (stmt.type === 'import_statement')
|
|
636
|
+
continue; // hoisted above
|
|
637
|
+
if (stmt.type !== 'export_statement')
|
|
638
|
+
continue;
|
|
639
|
+
const source = stmt.childForFieldName('source');
|
|
640
|
+
const reexportFrom = source ? literalStringOf(source) : null;
|
|
641
|
+
const declaration = stmt.childForFieldName('declaration');
|
|
642
|
+
const value = stmt.childForFieldName('value');
|
|
643
|
+
// `export const X = …` / `export default <expr>`
|
|
644
|
+
if (declaration) {
|
|
645
|
+
if (declaration.type === 'lexical_declaration' ||
|
|
646
|
+
declaration.type === 'variable_declaration') {
|
|
647
|
+
recordDeclaration(declaration, literals, exprs, clients, imports, axiosShadowed, exports);
|
|
648
|
+
}
|
|
649
|
+
continue;
|
|
650
|
+
}
|
|
651
|
+
if (value) {
|
|
652
|
+
// `export default routeApiClient` / `export default axios.create(...)`
|
|
653
|
+
if (value.type === 'identifier') {
|
|
654
|
+
exports.set('default', value.text);
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
recordBinding(DEFAULT_LOCAL, value, literals, exprs, clients, imports, axiosShadowed);
|
|
658
|
+
exports.set('default', DEFAULT_LOCAL);
|
|
659
|
+
}
|
|
660
|
+
continue;
|
|
661
|
+
}
|
|
662
|
+
// `export * from './m'` / `export * as NS from './m'`. Neither has an
|
|
663
|
+
// export_clause; the namespace form additionally binds a local alias.
|
|
664
|
+
if (reexportFrom !== null && !stmt.namedChildren.some((c) => c.type === 'export_clause')) {
|
|
665
|
+
const namespaceAlias = stmt.namedChildren.find((c) => c.type === 'namespace_export');
|
|
666
|
+
const alias = namespaceAlias?.namedChild(0)?.text;
|
|
667
|
+
if (alias !== undefined) {
|
|
668
|
+
imports.set(alias, { module: reexportFrom, originalName: '*' });
|
|
669
|
+
exports.set(alias, alias);
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
starExports.push(reexportFrom);
|
|
673
|
+
}
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
// `export { a, b as c }` and `export { a } from './m'`
|
|
677
|
+
for (const clause of stmt.namedChildren) {
|
|
678
|
+
if (clause.type !== 'export_clause')
|
|
679
|
+
continue;
|
|
680
|
+
for (const spec of clause.namedChildren) {
|
|
681
|
+
if (spec.type !== 'export_specifier')
|
|
682
|
+
continue;
|
|
683
|
+
const nameNode = spec.childForFieldName('name');
|
|
684
|
+
const aliasNode = spec.childForFieldName('alias');
|
|
685
|
+
if (!nameNode)
|
|
686
|
+
continue;
|
|
687
|
+
const exported = (aliasNode ?? nameNode).text;
|
|
688
|
+
if (reexportFrom !== null) {
|
|
689
|
+
imports.set(exported, { module: reexportFrom, originalName: nameNode.text });
|
|
690
|
+
exports.set(exported, exported);
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
exports.set(exported, nameNode.text);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return { constants: { literals, exprs, imports }, exports, starExports, clients, axiosShadowed };
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Resolve a path reference at a call site to its literal string, or `null`.
|
|
702
|
+
*
|
|
703
|
+
* `ref` is the dotted name as written (`API_ROUTE_PATH.LINKS`, or a bare
|
|
704
|
+
* `BASE_PATH`). Resolution order:
|
|
705
|
+
*
|
|
706
|
+
* 1. The dotted name as a constant of the CURRENT file — hits when the table
|
|
707
|
+
* is declared in the same file (flattened to dotted literal keys).
|
|
708
|
+
* 2. The base name as an IMPORT of the current file — hop to the defining
|
|
709
|
+
* file and look the dotted name up there, re-hopping through barrels that
|
|
710
|
+
* re-export it, bounded by {@link MAX_REEXPORT_HOPS}.
|
|
711
|
+
*
|
|
712
|
+
* Returns `null` on anything it cannot fully fold, which leaves the call site
|
|
713
|
+
* exactly as unmatched as it is today — never a guessed path.
|
|
714
|
+
*/
|
|
715
|
+
export function resolveJsMemberPath(fileKey, ref, facts) {
|
|
716
|
+
const direct = foldConstant(fileKey, ref, facts.constants, facts.resolveImport, facts.keys);
|
|
717
|
+
if (direct !== null)
|
|
718
|
+
return direct;
|
|
719
|
+
const dot = ref.indexOf('.');
|
|
720
|
+
if (dot < 0)
|
|
721
|
+
return null;
|
|
722
|
+
const base = ref.slice(0, dot);
|
|
723
|
+
const member = ref.slice(dot + 1);
|
|
724
|
+
const binding = facts.byFile.get(fileKey)?.constants.imports.get(base);
|
|
725
|
+
if (!binding)
|
|
726
|
+
return null;
|
|
727
|
+
const targetKey = facts.resolveImport(fileKey, binding.module, facts.keys);
|
|
728
|
+
if (targetKey === null)
|
|
729
|
+
return null;
|
|
730
|
+
// `import * as NS from 'm'` — `NS.TABLE.KEY` addresses the target's own
|
|
731
|
+
// `TABLE.KEY`, so the namespace alias drops out of the reference entirely.
|
|
732
|
+
if (binding.originalName === '*') {
|
|
733
|
+
const nextDot = member.indexOf('.');
|
|
734
|
+
if (nextDot < 0)
|
|
735
|
+
return null;
|
|
736
|
+
return resolveExportedMember(targetKey, member.slice(0, nextDot), member.slice(nextDot + 1), facts, 0, new Set());
|
|
737
|
+
}
|
|
738
|
+
return resolveExportedMember(targetKey, binding.originalName, member, facts, 0, new Set());
|
|
739
|
+
}
|
|
740
|
+
/**
|
|
741
|
+
* Resolve `<exported>.<member>` against a module's PUBLIC surface, following
|
|
742
|
+
* whatever indirection stands between the name and its definition.
|
|
743
|
+
*
|
|
744
|
+
* Three ways a module can expose a name, tried in order:
|
|
745
|
+
* 1. it defines it (possibly under a different local name — `export { a as b }`)
|
|
746
|
+
* 2. it re-exports it explicitly (`export { a } from './m'`)
|
|
747
|
+
* 3. it re-exports a whole module (`export * from './m'`)
|
|
748
|
+
*
|
|
749
|
+
* The third is the one that matters in practice: application code imports a
|
|
750
|
+
* DIRECTORY (`@/api-modules/shared`), whose `index.ts` is nothing but
|
|
751
|
+
* `export * from './api-routes'`. Stopping at the barrel resolves nothing at
|
|
752
|
+
* all, so the star edges have to be walked. `seen` makes mutually-importing
|
|
753
|
+
* barrels terminate instead of recursing forever.
|
|
754
|
+
*/
|
|
755
|
+
function resolveExportedMember(fileKey, exported, member, facts, depth, seen) {
|
|
756
|
+
if (depth > MAX_REEXPORT_HOPS)
|
|
757
|
+
return null;
|
|
758
|
+
const guard = `${fileKey}::${exported}.${member}`;
|
|
759
|
+
if (seen.has(guard))
|
|
760
|
+
return null;
|
|
761
|
+
seen.add(guard);
|
|
762
|
+
const file = facts.byFile.get(fileKey);
|
|
763
|
+
if (!file)
|
|
764
|
+
return null;
|
|
765
|
+
const local = file.exports.get(exported) ?? exported;
|
|
766
|
+
const here = foldConstant(fileKey, `${local}.${member}`, facts.constants, facts.resolveImport, facts.keys);
|
|
767
|
+
if (here !== null)
|
|
768
|
+
return here;
|
|
769
|
+
const binding = file.constants.imports.get(exported);
|
|
770
|
+
if (binding) {
|
|
771
|
+
const targetKey = facts.resolveImport(fileKey, binding.module, facts.keys);
|
|
772
|
+
if (targetKey !== null) {
|
|
773
|
+
const viaImport = resolveExportedMember(targetKey, binding.originalName === '*' ? exported : binding.originalName, member, facts, depth + 1, seen);
|
|
774
|
+
if (viaImport !== null)
|
|
775
|
+
return viaImport;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
// Every star edge is walked, not just up to the first hit: two barrels
|
|
779
|
+
// re-exporting the same name is ambiguous in JS itself, so answering with
|
|
780
|
+
// whichever module happens to come first in `starExports` would be a guess
|
|
781
|
+
// dressed as a resolution.
|
|
782
|
+
let viaStar = null;
|
|
783
|
+
for (const spec of file.starExports) {
|
|
784
|
+
const targetKey = facts.resolveImport(fileKey, spec, facts.keys);
|
|
785
|
+
if (targetKey === null)
|
|
786
|
+
continue;
|
|
787
|
+
const found = resolveExportedMember(targetKey, exported, member, facts, depth + 1, seen);
|
|
788
|
+
if (found === null)
|
|
789
|
+
continue;
|
|
790
|
+
if (viaStar !== null && viaStar !== found)
|
|
791
|
+
return null;
|
|
792
|
+
viaStar = found;
|
|
793
|
+
}
|
|
794
|
+
return viaStar;
|
|
795
|
+
}
|
|
796
|
+
/** The local binding an exported name refers to in `fileKey` (identity if unaliased). */
|
|
797
|
+
function resolveExportLocal(facts, fileKey, exported) {
|
|
798
|
+
return facts.byFile.get(fileKey)?.exports.get(exported) ?? exported;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Recursion ceiling for the path-expression fold, and the matching term cap for
|
|
802
|
+
* a `+` chain.
|
|
803
|
+
*
|
|
804
|
+
* Nothing on this path was bounded before: `flattenConcat` recursed once per
|
|
805
|
+
* term, mutually with {@link foldTermOrPlaceholder}, on the SCAN side — which
|
|
806
|
+
* `prepareRepo`'s `try/catch` does not cover and which `HttpLanguagePlugin.scan`
|
|
807
|
+
* contractually may not throw from. ~6 400 concat terms (38 KB of source) threw
|
|
808
|
+
* `RangeError: Maximum call stack size exceeded` out of `extract()`, and
|
|
809
|
+
* `sync.ts` turns that into an unexplained "missing repo" with every contract of
|
|
810
|
+
* every kind — HTTP, gRPC, topics, includes — dropped for that repo and nothing
|
|
811
|
+
* logged. A hand-written route path is a handful of terms.
|
|
812
|
+
*/
|
|
813
|
+
const MAX_EXPR_DEPTH = 64;
|
|
814
|
+
const MAX_CONCAT_TERMS = 256;
|
|
815
|
+
/**
|
|
816
|
+
* Resolve one term of a partially-foldable path, re-emitting it as a
|
|
817
|
+
* `${…}` placeholder when it cannot be folded.
|
|
818
|
+
*
|
|
819
|
+
* The placeholder is deliberate, not a fallback wart: consumer-side path
|
|
820
|
+
* normalization rewrites `${…}` to `{param}`, which is exactly the right
|
|
821
|
+
* reading for a term that IS a runtime value (`${eventId}`). Re-emitting keeps
|
|
822
|
+
* a mixed path like `` `${API_ROUTE_PATH.LISTS}/${eventId}/add` `` resolvable to
|
|
823
|
+
* `/curator-lists/{param}/add` instead of collapsing its known prefix to
|
|
824
|
+
* `{param}/{param}/add`.
|
|
825
|
+
*/
|
|
826
|
+
function foldTermOrPlaceholder(fileKey, node, facts, depth) {
|
|
827
|
+
if (depth > MAX_EXPR_DEPTH)
|
|
828
|
+
return null;
|
|
829
|
+
const n = unwrapTsExpression(node);
|
|
830
|
+
const literal = literalStringOf(n);
|
|
831
|
+
if (literal !== null)
|
|
832
|
+
return { text: literal, concrete: true };
|
|
833
|
+
// A template nested inside a substitution — `` `${BASE}${`/${id}/unlike`}` ``
|
|
834
|
+
// is a real shape. Recursing keeps its literal segments; emitting it verbatim
|
|
835
|
+
// would collapse the whole inner template to one `{param}` and lose them.
|
|
836
|
+
if (n.type === 'template_string' || n.type === 'binary_expression') {
|
|
837
|
+
const nested = foldPathExpression(fileKey, n, facts, depth + 1);
|
|
838
|
+
if (nested !== null)
|
|
839
|
+
return { text: nested.text, concrete: nested.anchored };
|
|
840
|
+
}
|
|
841
|
+
const dotted = n.type === 'identifier' ? n.text : dottedNameOf(n);
|
|
842
|
+
if (dotted !== null) {
|
|
843
|
+
const resolved = resolveJsMemberPath(fileKey, dotted, facts);
|
|
844
|
+
if (resolved !== null)
|
|
845
|
+
return { text: resolved, concrete: true };
|
|
846
|
+
return { text: `\${${dotted}}`, concrete: false };
|
|
847
|
+
}
|
|
848
|
+
return { text: `\${${n.text}}`, concrete: false };
|
|
849
|
+
}
|
|
850
|
+
/** Flatten a left-nested `a + b + c` chain into its terms, or `null` if not all `+`. */
|
|
851
|
+
function flattenConcat(node, depth) {
|
|
852
|
+
if (depth > MAX_EXPR_DEPTH)
|
|
853
|
+
return null;
|
|
854
|
+
const n = unwrapTsExpression(node);
|
|
855
|
+
if (n.type !== 'binary_expression')
|
|
856
|
+
return [n];
|
|
857
|
+
// The LEFT spine is walked iteratively: `a + b + c + …` parses left-nested,
|
|
858
|
+
// so recursing once per term is one stack frame per term. Only a `+` on the
|
|
859
|
+
// right can still nest, and that recursion is depth-capped.
|
|
860
|
+
const reversed = [];
|
|
861
|
+
let cur = n;
|
|
862
|
+
for (;;) {
|
|
863
|
+
if (reversed.length > MAX_CONCAT_TERMS)
|
|
864
|
+
return null;
|
|
865
|
+
if (cur.childForFieldName('operator')?.text !== '+')
|
|
866
|
+
return null;
|
|
867
|
+
const left = cur.childForFieldName('left');
|
|
868
|
+
const right = cur.childForFieldName('right');
|
|
869
|
+
if (!left || !right)
|
|
870
|
+
return null;
|
|
871
|
+
reversed.push(right);
|
|
872
|
+
const nextLeft = unwrapTsExpression(left);
|
|
873
|
+
if (nextLeft.type !== 'binary_expression') {
|
|
874
|
+
reversed.push(nextLeft);
|
|
875
|
+
break;
|
|
876
|
+
}
|
|
877
|
+
cur = nextLeft;
|
|
878
|
+
}
|
|
879
|
+
const out = [];
|
|
880
|
+
for (let i = reversed.length - 1; i >= 0; i--) {
|
|
881
|
+
const term = reversed[i];
|
|
882
|
+
if (unwrapTsExpression(term).type !== 'binary_expression') {
|
|
883
|
+
out.push(term);
|
|
884
|
+
continue;
|
|
885
|
+
}
|
|
886
|
+
const nested = flattenConcat(term, depth + 1);
|
|
887
|
+
if (nested === null)
|
|
888
|
+
return null;
|
|
889
|
+
out.push(...nested);
|
|
890
|
+
if (out.length > MAX_CONCAT_TERMS)
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
return out;
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* The fold behind {@link resolveJsPathExpression}, carrying the recursion depth
|
|
897
|
+
* and reporting whether the result is anchored.
|
|
898
|
+
*
|
|
899
|
+
* `MAX_FOLD_LENGTH` is checked on the ACCUMULATED text, not per term. The
|
|
900
|
+
* shared core caps each folded constant at that length; joining an unbounded
|
|
901
|
+
* number of them made the cap a ~2048x amplifier instead of a ceiling (each
|
|
902
|
+
* `${A}` costs 4 source characters and can yield 8 192), and the result is not
|
|
903
|
+
* transient — it becomes `contractId` and `meta.path` in `contracts.json` and
|
|
904
|
+
* `bridge.lbug`. Measured 200 KB of source to 941 MB of heap before this.
|
|
905
|
+
*/
|
|
906
|
+
function foldPathExpression(fileKey, node, facts, depth) {
|
|
907
|
+
if (depth > MAX_EXPR_DEPTH)
|
|
908
|
+
return null;
|
|
909
|
+
const n = unwrapTsExpression(node);
|
|
910
|
+
const literal = literalStringOf(n);
|
|
911
|
+
if (literal !== null)
|
|
912
|
+
return { text: literal, anchored: true };
|
|
913
|
+
if (n.type === 'identifier' || n.type === 'member_expression') {
|
|
914
|
+
const dotted = n.type === 'identifier' ? n.text : dottedNameOf(n);
|
|
915
|
+
if (dotted === null)
|
|
916
|
+
return null;
|
|
917
|
+
const resolved = resolveJsMemberPath(fileKey, dotted, facts);
|
|
918
|
+
return resolved === null ? null : { text: resolved, anchored: true };
|
|
919
|
+
}
|
|
920
|
+
const terms = [];
|
|
921
|
+
if (n.type === 'template_string') {
|
|
922
|
+
for (const child of n.namedChildren) {
|
|
923
|
+
if (child.type === 'string_fragment') {
|
|
924
|
+
terms.push(child);
|
|
925
|
+
}
|
|
926
|
+
else if (child.type === 'template_substitution') {
|
|
927
|
+
const inner = child.namedChild(0);
|
|
928
|
+
if (inner === null)
|
|
929
|
+
return null;
|
|
930
|
+
terms.push(inner);
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
else if (n.type === 'binary_expression') {
|
|
935
|
+
const flattened = flattenConcat(n, depth);
|
|
936
|
+
if (flattened === null)
|
|
937
|
+
return null;
|
|
938
|
+
terms.push(...flattened);
|
|
939
|
+
}
|
|
940
|
+
else {
|
|
941
|
+
return null;
|
|
942
|
+
}
|
|
943
|
+
let out = '';
|
|
944
|
+
let anchored = null;
|
|
945
|
+
for (const term of terms) {
|
|
946
|
+
const folded = term.type === 'string_fragment'
|
|
947
|
+
? { text: term.text, concrete: true }
|
|
948
|
+
: foldTermOrPlaceholder(fileKey, term, facts, depth + 1);
|
|
949
|
+
if (folded === null)
|
|
950
|
+
return null;
|
|
951
|
+
if (anchored === null)
|
|
952
|
+
anchored = folded.concrete;
|
|
953
|
+
out += folded.text;
|
|
954
|
+
if (out.length > MAX_FOLD_LENGTH)
|
|
955
|
+
return null;
|
|
956
|
+
}
|
|
957
|
+
return anchored === null ? null : { text: out, anchored };
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Resolve the first argument of an HTTP call to a path string, or `null` when
|
|
961
|
+
* the expression is not a path shape this binding understands.
|
|
962
|
+
*
|
|
963
|
+
* Accepts a plain literal, a constant reference (`BASE_PATH`), a table member
|
|
964
|
+
* (`API_ROUTE_PATH.LINKS`), a template string, and a `+`-concatenation of any
|
|
965
|
+
* of those. Template and concat forms fold PARTIALLY — see
|
|
966
|
+
* {@link foldTermOrPlaceholder}.
|
|
967
|
+
*
|
|
968
|
+
* A reference that resolves to nothing returns `null` (skip), and so does a
|
|
969
|
+
* mixed expression whose leading term is unresolved — see {@link FoldedPath}.
|
|
970
|
+
*/
|
|
971
|
+
export function resolveJsPathExpression(fileKey, node, facts) {
|
|
972
|
+
const folded = foldPathExpression(fileKey, node, facts, 0);
|
|
973
|
+
return folded !== null && folded.anchored ? folded.text : null;
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* Whether `name`, as referenced in `fileKey`, holds an HTTP client instance.
|
|
977
|
+
*
|
|
978
|
+
* Chases local aliases and import/export hops so the common app shape —
|
|
979
|
+
* `axios.create()` in `lib/axios.config.ts`, `export default apiClient`,
|
|
980
|
+
* `import apiClient from '@/lib/axios.config'` at the call site — is proven
|
|
981
|
+
* rather than pattern-matched on the receiver's spelling.
|
|
982
|
+
*
|
|
983
|
+
* Deliberately conservative: an unproven receiver returns `false`, which keeps
|
|
984
|
+
* today's behavior for it. The alternative — trusting any identifier with an
|
|
985
|
+
* HTTP-verb method — would classify every Express `router.get('/x', handler)`
|
|
986
|
+
* provider as a consumer of itself.
|
|
987
|
+
*/
|
|
988
|
+
/**
|
|
989
|
+
* Whether `name`, as a receiver in `fileKey`, IS the axios module — as opposed
|
|
990
|
+
* to an instance built from it, which is {@link isHttpClientRef}'s question.
|
|
991
|
+
*
|
|
992
|
+
* Two ways to be it. The bare spelling `axios` predates the widened query — it
|
|
993
|
+
* is what the original `(#eq? @obj "axios")` pattern matched — so it stays
|
|
994
|
+
* trusted by default, and a file with no facts keeps exactly that behavior; it
|
|
995
|
+
* is withdrawn only where the file itself binds that name to something else.
|
|
996
|
+
* The other way is a declared import or `require` of `'axios'` under any local
|
|
997
|
+
* name, which is proof rather than convention and covers the aliased form the
|
|
998
|
+
* spelling rule cannot see.
|
|
999
|
+
*/
|
|
1000
|
+
export function isAxiosNamespace(fileKey, name, facts) {
|
|
1001
|
+
const file = facts.byFile.get(fileKey);
|
|
1002
|
+
if (file === undefined)
|
|
1003
|
+
return name === 'axios';
|
|
1004
|
+
if (file.constants.imports.get(name)?.module === 'axios')
|
|
1005
|
+
return true;
|
|
1006
|
+
return name === 'axios' && !file.axiosShadowed;
|
|
1007
|
+
}
|
|
1008
|
+
export function isHttpClientRef(fileKey, name, facts) {
|
|
1009
|
+
let currentKey = fileKey;
|
|
1010
|
+
let currentName = name;
|
|
1011
|
+
for (let hop = 0; hop < MAX_REEXPORT_HOPS; hop++) {
|
|
1012
|
+
const file = facts.byFile.get(currentKey);
|
|
1013
|
+
if (!file)
|
|
1014
|
+
return false;
|
|
1015
|
+
if (file.clients.has(currentName))
|
|
1016
|
+
return true;
|
|
1017
|
+
// Local alias: `const client = configuredClient`.
|
|
1018
|
+
const expr = file.constants.exprs.get(currentName);
|
|
1019
|
+
if (expr && expr.length === 1 && expr[0].kind === 'ref') {
|
|
1020
|
+
currentName = expr[0].name;
|
|
1021
|
+
continue;
|
|
1022
|
+
}
|
|
1023
|
+
const binding = file.constants.imports.get(currentName);
|
|
1024
|
+
if (!binding)
|
|
1025
|
+
return false;
|
|
1026
|
+
const targetKey = facts.resolveImport(currentKey, binding.module, facts.keys);
|
|
1027
|
+
if (targetKey === null)
|
|
1028
|
+
return false;
|
|
1029
|
+
currentKey = targetKey;
|
|
1030
|
+
currentName = resolveExportLocal(facts, targetKey, binding.originalName);
|
|
1031
|
+
}
|
|
1032
|
+
return false;
|
|
1033
|
+
}
|