cotx-engine 0.1.0
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/LICENSE +94 -0
- package/README.md +103 -0
- package/dist/commands/compile.d.ts +3 -0
- package/dist/commands/compile.js +93 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/context.d.ts +1 -0
- package/dist/commands/context.js +98 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/diff.d.ts +19 -0
- package/dist/commands/diff.js +127 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/impact.d.ts +3 -0
- package/dist/commands/impact.js +91 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +13 -0
- package/dist/commands/lint.js +290 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/map.d.ts +6 -0
- package/dist/commands/map.js +409 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/migrate.d.ts +16 -0
- package/dist/commands/migrate.js +150 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.js +47 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/rename.d.ts +5 -0
- package/dist/commands/rename.js +163 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/snapshot.d.ts +6 -0
- package/dist/commands/snapshot.js +48 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +72 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.js +163 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/write.d.ts +6 -0
- package/dist/commands/write.js +221 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/compiler/auto-describe.d.ts +13 -0
- package/dist/compiler/auto-describe.js +91 -0
- package/dist/compiler/auto-describe.js.map +1 -0
- package/dist/compiler/concept-compiler.d.ts +21 -0
- package/dist/compiler/concept-compiler.js +125 -0
- package/dist/compiler/concept-compiler.js.map +1 -0
- package/dist/compiler/contract-compiler.d.ts +16 -0
- package/dist/compiler/contract-compiler.js +90 -0
- package/dist/compiler/contract-compiler.js.map +1 -0
- package/dist/compiler/delta-detector.d.ts +8 -0
- package/dist/compiler/delta-detector.js +34 -0
- package/dist/compiler/delta-detector.js.map +1 -0
- package/dist/compiler/flow-compiler.d.ts +18 -0
- package/dist/compiler/flow-compiler.js +69 -0
- package/dist/compiler/flow-compiler.js.map +1 -0
- package/dist/compiler/module-compiler.d.ts +18 -0
- package/dist/compiler/module-compiler.js +420 -0
- package/dist/compiler/module-compiler.js.map +1 -0
- package/dist/compiler/stale-detector.d.ts +22 -0
- package/dist/compiler/stale-detector.js +79 -0
- package/dist/compiler/stale-detector.js.map +1 -0
- package/dist/config/ignore-service.d.ts +26 -0
- package/dist/config/ignore-service.js +366 -0
- package/dist/config/ignore-service.js.map +1 -0
- package/dist/core/analysis/cluster-enricher.d.ts +38 -0
- package/dist/core/analysis/cluster-enricher.js +169 -0
- package/dist/core/analysis/cluster-enricher.js.map +1 -0
- package/dist/core/analysis/community-processor.d.ts +39 -0
- package/dist/core/analysis/community-processor.js +319 -0
- package/dist/core/analysis/community-processor.js.map +1 -0
- package/dist/core/analysis/process-processor.d.ts +51 -0
- package/dist/core/analysis/process-processor.js +318 -0
- package/dist/core/analysis/process-processor.js.map +1 -0
- package/dist/core/bridge.d.ts +15 -0
- package/dist/core/bridge.js +63 -0
- package/dist/core/bridge.js.map +1 -0
- package/dist/core/export/json-exporter.d.ts +43 -0
- package/dist/core/export/json-exporter.js +13 -0
- package/dist/core/export/json-exporter.js.map +1 -0
- package/dist/core/graph/graph.d.ts +2 -0
- package/dist/core/graph/graph.js +79 -0
- package/dist/core/graph/graph.js.map +1 -0
- package/dist/core/graph/types.d.ts +25 -0
- package/dist/core/graph/types.js +2 -0
- package/dist/core/graph/types.js.map +1 -0
- package/dist/core/parser/ast-cache.d.ts +11 -0
- package/dist/core/parser/ast-cache.js +36 -0
- package/dist/core/parser/ast-cache.js.map +1 -0
- package/dist/core/parser/call-processor.d.ts +105 -0
- package/dist/core/parser/call-processor.js +1807 -0
- package/dist/core/parser/call-processor.js.map +1 -0
- package/dist/core/parser/call-routing.d.ts +55 -0
- package/dist/core/parser/call-routing.js +113 -0
- package/dist/core/parser/call-routing.js.map +1 -0
- package/dist/core/parser/call-sites/extract-language-call-site.d.ts +10 -0
- package/dist/core/parser/call-sites/extract-language-call-site.js +23 -0
- package/dist/core/parser/call-sites/extract-language-call-site.js.map +1 -0
- package/dist/core/parser/call-sites/java.d.ts +9 -0
- package/dist/core/parser/call-sites/java.js +31 -0
- package/dist/core/parser/call-sites/java.js.map +1 -0
- package/dist/core/parser/cluster-enricher.d.ts +38 -0
- package/dist/core/parser/cluster-enricher.js +169 -0
- package/dist/core/parser/cluster-enricher.js.map +1 -0
- package/dist/core/parser/community-processor.d.ts +39 -0
- package/dist/core/parser/community-processor.js +321 -0
- package/dist/core/parser/community-processor.js.map +1 -0
- package/dist/core/parser/constants.d.ts +16 -0
- package/dist/core/parser/constants.js +17 -0
- package/dist/core/parser/constants.js.map +1 -0
- package/dist/core/parser/entry-point-scoring.d.ts +57 -0
- package/dist/core/parser/entry-point-scoring.js +377 -0
- package/dist/core/parser/entry-point-scoring.js.map +1 -0
- package/dist/core/parser/export-detection.d.ts +57 -0
- package/dist/core/parser/export-detection.js +234 -0
- package/dist/core/parser/export-detection.js.map +1 -0
- package/dist/core/parser/field-extractor.d.ts +34 -0
- package/dist/core/parser/field-extractor.js +33 -0
- package/dist/core/parser/field-extractor.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.d.ts +16 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.js +129 -0
- package/dist/core/parser/field-extractors/configs/c-cpp.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/csharp.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/csharp.js +129 -0
- package/dist/core/parser/field-extractors/configs/csharp.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/dart.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/dart.js +93 -0
- package/dist/core/parser/field-extractors/configs/dart.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/go.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/go.js +66 -0
- package/dist/core/parser/field-extractors/configs/go.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/helpers.d.ts +40 -0
- package/dist/core/parser/field-extractors/configs/helpers.js +118 -0
- package/dist/core/parser/field-extractors/configs/helpers.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/jvm.d.ts +17 -0
- package/dist/core/parser/field-extractors/configs/jvm.js +139 -0
- package/dist/core/parser/field-extractors/configs/jvm.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/php.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/php.js +69 -0
- package/dist/core/parser/field-extractors/configs/php.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/python.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/python.js +92 -0
- package/dist/core/parser/field-extractors/configs/python.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/ruby.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/ruby.js +68 -0
- package/dist/core/parser/field-extractors/configs/ruby.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/rust.d.ts +12 -0
- package/dist/core/parser/field-extractors/configs/rust.js +58 -0
- package/dist/core/parser/field-extractors/configs/rust.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/swift.d.ts +15 -0
- package/dist/core/parser/field-extractors/configs/swift.js +75 -0
- package/dist/core/parser/field-extractors/configs/swift.js.map +1 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.d.ts +14 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.js +72 -0
- package/dist/core/parser/field-extractors/configs/typescript-javascript.js.map +1 -0
- package/dist/core/parser/field-extractors/generic.d.ts +61 -0
- package/dist/core/parser/field-extractors/generic.js +170 -0
- package/dist/core/parser/field-extractors/generic.js.map +1 -0
- package/dist/core/parser/field-extractors/typescript.d.ts +16 -0
- package/dist/core/parser/field-extractors/typescript.js +167 -0
- package/dist/core/parser/field-extractors/typescript.js.map +1 -0
- package/dist/core/parser/field-types.d.ts +46 -0
- package/dist/core/parser/field-types.js +2 -0
- package/dist/core/parser/field-types.js.map +1 -0
- package/dist/core/parser/filesystem-walker.d.ts +28 -0
- package/dist/core/parser/filesystem-walker.js +82 -0
- package/dist/core/parser/filesystem-walker.js.map +1 -0
- package/dist/core/parser/framework-detection.d.ts +149 -0
- package/dist/core/parser/framework-detection.js +782 -0
- package/dist/core/parser/framework-detection.js.map +1 -0
- package/dist/core/parser/heritage-processor.d.ts +52 -0
- package/dist/core/parser/heritage-processor.js +339 -0
- package/dist/core/parser/heritage-processor.js.map +1 -0
- package/dist/core/parser/import-processor.d.ts +33 -0
- package/dist/core/parser/import-processor.js +382 -0
- package/dist/core/parser/import-processor.js.map +1 -0
- package/dist/core/parser/import-resolvers/csharp.d.ts +19 -0
- package/dist/core/parser/import-resolvers/csharp.js +132 -0
- package/dist/core/parser/import-resolvers/csharp.js.map +1 -0
- package/dist/core/parser/import-resolvers/dart.d.ts +7 -0
- package/dist/core/parser/import-resolvers/dart.js +45 -0
- package/dist/core/parser/import-resolvers/dart.js.map +1 -0
- package/dist/core/parser/import-resolvers/go.d.ts +18 -0
- package/dist/core/parser/import-resolvers/go.js +62 -0
- package/dist/core/parser/import-resolvers/go.js.map +1 -0
- package/dist/core/parser/import-resolvers/jvm.d.ts +32 -0
- package/dist/core/parser/import-resolvers/jvm.js +160 -0
- package/dist/core/parser/import-resolvers/jvm.js.map +1 -0
- package/dist/core/parser/import-resolvers/php.d.ts +25 -0
- package/dist/core/parser/import-resolvers/php.js +81 -0
- package/dist/core/parser/import-resolvers/php.js.map +1 -0
- package/dist/core/parser/import-resolvers/python.d.ts +25 -0
- package/dist/core/parser/import-resolvers/python.js +85 -0
- package/dist/core/parser/import-resolvers/python.js.map +1 -0
- package/dist/core/parser/import-resolvers/ruby.d.ts +15 -0
- package/dist/core/parser/import-resolvers/ruby.js +21 -0
- package/dist/core/parser/import-resolvers/ruby.js.map +1 -0
- package/dist/core/parser/import-resolvers/rust.d.ts +18 -0
- package/dist/core/parser/import-resolvers/rust.js +119 -0
- package/dist/core/parser/import-resolvers/rust.js.map +1 -0
- package/dist/core/parser/import-resolvers/standard.d.ts +36 -0
- package/dist/core/parser/import-resolvers/standard.js +144 -0
- package/dist/core/parser/import-resolvers/standard.js.map +1 -0
- package/dist/core/parser/import-resolvers/swift.d.ts +7 -0
- package/dist/core/parser/import-resolvers/swift.js +25 -0
- package/dist/core/parser/import-resolvers/swift.js.map +1 -0
- package/dist/core/parser/import-resolvers/types.d.ts +44 -0
- package/dist/core/parser/import-resolvers/types.js +7 -0
- package/dist/core/parser/import-resolvers/types.js.map +1 -0
- package/dist/core/parser/import-resolvers/utils.d.ts +35 -0
- package/dist/core/parser/import-resolvers/utils.js +150 -0
- package/dist/core/parser/import-resolvers/utils.js.map +1 -0
- package/dist/core/parser/import-resolvers/vue.d.ts +8 -0
- package/dist/core/parser/import-resolvers/vue.js +10 -0
- package/dist/core/parser/import-resolvers/vue.js.map +1 -0
- package/dist/core/parser/language-config.d.ts +52 -0
- package/dist/core/parser/language-config.js +182 -0
- package/dist/core/parser/language-config.js.map +1 -0
- package/dist/core/parser/language-provider.d.ts +126 -0
- package/dist/core/parser/language-provider.js +25 -0
- package/dist/core/parser/language-provider.js.map +1 -0
- package/dist/core/parser/languages/c-cpp.d.ts +12 -0
- package/dist/core/parser/languages/c-cpp.js +312 -0
- package/dist/core/parser/languages/c-cpp.js.map +1 -0
- package/dist/core/parser/languages/csharp.d.ts +8 -0
- package/dist/core/parser/languages/csharp.js +127 -0
- package/dist/core/parser/languages/csharp.js.map +1 -0
- package/dist/core/parser/languages/dart.d.ts +12 -0
- package/dist/core/parser/languages/dart.js +91 -0
- package/dist/core/parser/languages/dart.js.map +1 -0
- package/dist/core/parser/languages/go.d.ts +11 -0
- package/dist/core/parser/languages/go.js +32 -0
- package/dist/core/parser/languages/go.js.map +1 -0
- package/dist/core/parser/languages/index.d.ts +38 -0
- package/dist/core/parser/languages/index.js +63 -0
- package/dist/core/parser/languages/index.js.map +1 -0
- package/dist/core/parser/languages/java.d.ts +9 -0
- package/dist/core/parser/languages/java.js +33 -0
- package/dist/core/parser/languages/java.js.map +1 -0
- package/dist/core/parser/languages/kotlin.d.ts +9 -0
- package/dist/core/parser/languages/kotlin.js +112 -0
- package/dist/core/parser/languages/kotlin.js.map +1 -0
- package/dist/core/parser/languages/php.d.ts +8 -0
- package/dist/core/parser/languages/php.js +226 -0
- package/dist/core/parser/languages/php.js.map +1 -0
- package/dist/core/parser/languages/python.d.ts +12 -0
- package/dist/core/parser/languages/python.js +66 -0
- package/dist/core/parser/languages/python.js.map +1 -0
- package/dist/core/parser/languages/ruby.d.ts +9 -0
- package/dist/core/parser/languages/ruby.js +109 -0
- package/dist/core/parser/languages/ruby.js.map +1 -0
- package/dist/core/parser/languages/rust.d.ts +12 -0
- package/dist/core/parser/languages/rust.js +121 -0
- package/dist/core/parser/languages/rust.js.map +1 -0
- package/dist/core/parser/languages/swift.d.ts +12 -0
- package/dist/core/parser/languages/swift.js +233 -0
- package/dist/core/parser/languages/swift.js.map +1 -0
- package/dist/core/parser/languages/typescript.d.ts +11 -0
- package/dist/core/parser/languages/typescript.js +169 -0
- package/dist/core/parser/languages/typescript.js.map +1 -0
- package/dist/core/parser/languages/vue.d.ts +13 -0
- package/dist/core/parser/languages/vue.js +65 -0
- package/dist/core/parser/languages/vue.js.map +1 -0
- package/dist/core/parser/markdown-processor.d.ts +17 -0
- package/dist/core/parser/markdown-processor.js +125 -0
- package/dist/core/parser/markdown-processor.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.js +276 -0
- package/dist/core/parser/method-extractors/configs/c-cpp.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/csharp.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/csharp.js +243 -0
- package/dist/core/parser/method-extractors/configs/csharp.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/dart.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/dart.js +263 -0
- package/dist/core/parser/method-extractors/configs/dart.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/go.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/go.js +120 -0
- package/dist/core/parser/method-extractors/configs/go.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/jvm.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/jvm.js +309 -0
- package/dist/core/parser/method-extractors/configs/jvm.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/php.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/php.js +243 -0
- package/dist/core/parser/method-extractors/configs/php.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/python.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/python.js +219 -0
- package/dist/core/parser/method-extractors/configs/python.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/ruby.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/ruby.js +201 -0
- package/dist/core/parser/method-extractors/configs/ruby.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/rust.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/rust.js +120 -0
- package/dist/core/parser/method-extractors/configs/rust.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/swift.d.ts +2 -0
- package/dist/core/parser/method-extractors/configs/swift.js +191 -0
- package/dist/core/parser/method-extractors/configs/swift.js.map +1 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.d.ts +3 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.js +231 -0
- package/dist/core/parser/method-extractors/configs/typescript-javascript.js.map +1 -0
- package/dist/core/parser/method-extractors/generic.d.ts +11 -0
- package/dist/core/parser/method-extractors/generic.js +162 -0
- package/dist/core/parser/method-extractors/generic.js.map +1 -0
- package/dist/core/parser/method-types.d.ts +110 -0
- package/dist/core/parser/method-types.js +2 -0
- package/dist/core/parser/method-types.js.map +1 -0
- package/dist/core/parser/mro-processor.d.ts +46 -0
- package/dist/core/parser/mro-processor.js +677 -0
- package/dist/core/parser/mro-processor.js.map +1 -0
- package/dist/core/parser/named-binding-processor.d.ts +18 -0
- package/dist/core/parser/named-binding-processor.js +43 -0
- package/dist/core/parser/named-binding-processor.js.map +1 -0
- package/dist/core/parser/named-bindings/csharp.d.ts +3 -0
- package/dist/core/parser/named-bindings/csharp.js +38 -0
- package/dist/core/parser/named-bindings/csharp.js.map +1 -0
- package/dist/core/parser/named-bindings/java.d.ts +3 -0
- package/dist/core/parser/named-bindings/java.js +30 -0
- package/dist/core/parser/named-bindings/java.js.map +1 -0
- package/dist/core/parser/named-bindings/kotlin.d.ts +3 -0
- package/dist/core/parser/named-bindings/kotlin.js +37 -0
- package/dist/core/parser/named-bindings/kotlin.js.map +1 -0
- package/dist/core/parser/named-bindings/php.d.ts +3 -0
- package/dist/core/parser/named-bindings/php.js +62 -0
- package/dist/core/parser/named-bindings/php.js.map +1 -0
- package/dist/core/parser/named-bindings/python.d.ts +3 -0
- package/dist/core/parser/named-bindings/python.js +50 -0
- package/dist/core/parser/named-bindings/python.js.map +1 -0
- package/dist/core/parser/named-bindings/rust.d.ts +3 -0
- package/dist/core/parser/named-bindings/rust.js +67 -0
- package/dist/core/parser/named-bindings/rust.js.map +1 -0
- package/dist/core/parser/named-bindings/types.d.ts +16 -0
- package/dist/core/parser/named-bindings/types.js +7 -0
- package/dist/core/parser/named-bindings/types.js.map +1 -0
- package/dist/core/parser/named-bindings/typescript.d.ts +3 -0
- package/dist/core/parser/named-bindings/typescript.js +59 -0
- package/dist/core/parser/named-bindings/typescript.js.map +1 -0
- package/dist/core/parser/parsing-processor.d.ts +23 -0
- package/dist/core/parser/parsing-processor.js +464 -0
- package/dist/core/parser/parsing-processor.js.map +1 -0
- package/dist/core/parser/pipeline.d.ts +17 -0
- package/dist/core/parser/pipeline.js +1405 -0
- package/dist/core/parser/pipeline.js.map +1 -0
- package/dist/core/parser/process-processor.d.ts +51 -0
- package/dist/core/parser/process-processor.js +318 -0
- package/dist/core/parser/process-processor.js.map +1 -0
- package/dist/core/parser/resolution-context.d.ts +58 -0
- package/dist/core/parser/resolution-context.js +136 -0
- package/dist/core/parser/resolution-context.js.map +1 -0
- package/dist/core/parser/route-extractors/expo.d.ts +1 -0
- package/dist/core/parser/route-extractors/expo.js +37 -0
- package/dist/core/parser/route-extractors/expo.js.map +1 -0
- package/dist/core/parser/route-extractors/middleware.d.ts +47 -0
- package/dist/core/parser/route-extractors/middleware.js +168 -0
- package/dist/core/parser/route-extractors/middleware.js.map +1 -0
- package/dist/core/parser/route-extractors/nextjs.d.ts +3 -0
- package/dist/core/parser/route-extractors/nextjs.js +77 -0
- package/dist/core/parser/route-extractors/nextjs.js.map +1 -0
- package/dist/core/parser/route-extractors/php.d.ts +7 -0
- package/dist/core/parser/route-extractors/php.js +23 -0
- package/dist/core/parser/route-extractors/php.js.map +1 -0
- package/dist/core/parser/route-extractors/response-shapes.d.ts +20 -0
- package/dist/core/parser/route-extractors/response-shapes.js +295 -0
- package/dist/core/parser/route-extractors/response-shapes.js.map +1 -0
- package/dist/core/parser/structure-processor.d.ts +2 -0
- package/dist/core/parser/structure-processor.js +37 -0
- package/dist/core/parser/structure-processor.js.map +1 -0
- package/dist/core/parser/symbol-table.d.ts +79 -0
- package/dist/core/parser/symbol-table.js +116 -0
- package/dist/core/parser/symbol-table.js.map +1 -0
- package/dist/core/parser/tree-sitter-queries.d.ts +16 -0
- package/dist/core/parser/tree-sitter-queries.js +1180 -0
- package/dist/core/parser/tree-sitter-queries.js.map +1 -0
- package/dist/core/parser/type-env.d.ts +81 -0
- package/dist/core/parser/type-env.js +1048 -0
- package/dist/core/parser/type-env.js.map +1 -0
- package/dist/core/parser/type-extractors/c-cpp.d.ts +7 -0
- package/dist/core/parser/type-extractors/c-cpp.js +533 -0
- package/dist/core/parser/type-extractors/c-cpp.js.map +1 -0
- package/dist/core/parser/type-extractors/csharp.d.ts +2 -0
- package/dist/core/parser/type-extractors/csharp.js +584 -0
- package/dist/core/parser/type-extractors/csharp.js.map +1 -0
- package/dist/core/parser/type-extractors/dart.d.ts +15 -0
- package/dist/core/parser/type-extractors/dart.js +370 -0
- package/dist/core/parser/type-extractors/dart.js.map +1 -0
- package/dist/core/parser/type-extractors/go.d.ts +2 -0
- package/dist/core/parser/type-extractors/go.js +514 -0
- package/dist/core/parser/type-extractors/go.js.map +1 -0
- package/dist/core/parser/type-extractors/jvm.d.ts +3 -0
- package/dist/core/parser/type-extractors/jvm.js +857 -0
- package/dist/core/parser/type-extractors/jvm.js.map +1 -0
- package/dist/core/parser/type-extractors/php.d.ts +2 -0
- package/dist/core/parser/type-extractors/php.js +535 -0
- package/dist/core/parser/type-extractors/php.js.map +1 -0
- package/dist/core/parser/type-extractors/python.d.ts +2 -0
- package/dist/core/parser/type-extractors/python.js +475 -0
- package/dist/core/parser/type-extractors/python.js.map +1 -0
- package/dist/core/parser/type-extractors/ruby.d.ts +2 -0
- package/dist/core/parser/type-extractors/ruby.js +378 -0
- package/dist/core/parser/type-extractors/ruby.js.map +1 -0
- package/dist/core/parser/type-extractors/rust.d.ts +2 -0
- package/dist/core/parser/type-extractors/rust.js +516 -0
- package/dist/core/parser/type-extractors/rust.js.map +1 -0
- package/dist/core/parser/type-extractors/shared.d.ts +131 -0
- package/dist/core/parser/type-extractors/shared.js +797 -0
- package/dist/core/parser/type-extractors/shared.js.map +1 -0
- package/dist/core/parser/type-extractors/swift.d.ts +2 -0
- package/dist/core/parser/type-extractors/swift.js +485 -0
- package/dist/core/parser/type-extractors/swift.js.map +1 -0
- package/dist/core/parser/type-extractors/types.d.ts +172 -0
- package/dist/core/parser/type-extractors/types.js +2 -0
- package/dist/core/parser/type-extractors/types.js.map +1 -0
- package/dist/core/parser/type-extractors/typescript.d.ts +2 -0
- package/dist/core/parser/type-extractors/typescript.js +662 -0
- package/dist/core/parser/type-extractors/typescript.js.map +1 -0
- package/dist/core/parser/utils/ast-helpers.d.ts +73 -0
- package/dist/core/parser/utils/ast-helpers.js +415 -0
- package/dist/core/parser/utils/ast-helpers.js.map +1 -0
- package/dist/core/parser/utils/call-analysis.d.ts +75 -0
- package/dist/core/parser/utils/call-analysis.js +575 -0
- package/dist/core/parser/utils/call-analysis.js.map +1 -0
- package/dist/core/parser/utils/event-loop.d.ts +5 -0
- package/dist/core/parser/utils/event-loop.js +6 -0
- package/dist/core/parser/utils/event-loop.js.map +1 -0
- package/dist/core/parser/utils/method-props.d.ts +8 -0
- package/dist/core/parser/utils/method-props.js +39 -0
- package/dist/core/parser/utils/method-props.js.map +1 -0
- package/dist/core/parser/utils/verbose.d.ts +1 -0
- package/dist/core/parser/utils/verbose.js +8 -0
- package/dist/core/parser/utils/verbose.js.map +1 -0
- package/dist/core/parser/vue-sfc-extractor.d.ts +44 -0
- package/dist/core/parser/vue-sfc-extractor.js +95 -0
- package/dist/core/parser/vue-sfc-extractor.js.map +1 -0
- package/dist/core/parser/workers/parse-worker.d.ts +171 -0
- package/dist/core/parser/workers/parse-worker.js +1724 -0
- package/dist/core/parser/workers/parse-worker.js.map +1 -0
- package/dist/core/parser/workers/worker-pool.d.ts +16 -0
- package/dist/core/parser/workers/worker-pool.js +124 -0
- package/dist/core/parser/workers/worker-pool.js.map +1 -0
- package/dist/core/shared/graph-types.d.ts +61 -0
- package/dist/core/shared/graph-types.js +5 -0
- package/dist/core/shared/graph-types.js.map +1 -0
- package/dist/core/shared/index.d.ts +4 -0
- package/dist/core/shared/index.js +4 -0
- package/dist/core/shared/index.js.map +1 -0
- package/dist/core/shared/language-detection.d.ts +22 -0
- package/dist/core/shared/language-detection.js +137 -0
- package/dist/core/shared/language-detection.js.map +1 -0
- package/dist/core/shared/languages.d.ts +23 -0
- package/dist/core/shared/languages.js +25 -0
- package/dist/core/shared/languages.js.map +1 -0
- package/dist/core/shared/pipeline.d.ts +15 -0
- package/dist/core/shared/pipeline.js +5 -0
- package/dist/core/shared/pipeline.js.map +1 -0
- package/dist/core/tree-sitter/parser-loader.d.ts +5 -0
- package/dist/core/tree-sitter/parser-loader.js +71 -0
- package/dist/core/tree-sitter/parser-loader.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/hash.d.ts +1 -0
- package/dist/lib/hash.js +6 -0
- package/dist/lib/hash.js.map +1 -0
- package/dist/lib/naming.d.ts +12 -0
- package/dist/lib/naming.js +28 -0
- package/dist/lib/naming.js.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +4 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/mcp/server.d.ts +26 -0
- package/dist/mcp/server.js +282 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +37 -0
- package/dist/mcp/tools.js +650 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/query/bm25.d.ts +19 -0
- package/dist/query/bm25.js +60 -0
- package/dist/query/bm25.js.map +1 -0
- package/dist/query/graph-index.d.ts +40 -0
- package/dist/query/graph-index.js +178 -0
- package/dist/query/graph-index.js.map +1 -0
- package/dist/store/derived-index.d.ts +4 -0
- package/dist/store/derived-index.js +68 -0
- package/dist/store/derived-index.js.map +1 -0
- package/dist/store/meta.d.ts +1 -0
- package/dist/store/meta.js +3 -0
- package/dist/store/meta.js.map +1 -0
- package/dist/store/schema.d.ts +135 -0
- package/dist/store/schema.js +2 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/store.d.ts +49 -0
- package/dist/store/store.js +254 -0
- package/dist/store/store.js.map +1 -0
- package/dist/types/pipeline.d.ts +12 -0
- package/dist/types/pipeline.js +2 -0
- package/dist/types/pipeline.js.map +1 -0
- package/package.json +69 -0
- package/skills/cotx-enrich/SKILL.md +59 -0
- package/vendor/leiden/index.cjs +355 -0
- package/vendor/leiden/utils.cjs +392 -0
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
import { extractSimpleTypeName, extractVarName, hasTypeAnnotation, unwrapAwait, extractCalleeName, extractElementTypeFromString, extractGenericTypeArgs, resolveIterableElementType, methodToTypeArgPosition, } from './shared.js';
|
|
2
|
+
const DECLARATION_NODE_TYPES = new Set([
|
|
3
|
+
'lexical_declaration',
|
|
4
|
+
'variable_declaration',
|
|
5
|
+
'function_declaration', // JSDoc @param on function declarations
|
|
6
|
+
'method_definition', // JSDoc @param on class methods
|
|
7
|
+
'public_field_definition', // class field: private users: User[]
|
|
8
|
+
]);
|
|
9
|
+
const normalizeJsDocType = (raw) => {
|
|
10
|
+
let type = raw.trim();
|
|
11
|
+
// Strip JSDoc nullable/non-nullable prefixes: ?User → User, !User → User
|
|
12
|
+
if (type.startsWith('?') || type.startsWith('!'))
|
|
13
|
+
type = type.slice(1);
|
|
14
|
+
// Strip union with null/undefined/void: User|null → User
|
|
15
|
+
const parts = type
|
|
16
|
+
.split('|')
|
|
17
|
+
.map((p) => p.trim())
|
|
18
|
+
.filter((p) => p !== 'null' && p !== 'undefined' && p !== 'void');
|
|
19
|
+
if (parts.length !== 1)
|
|
20
|
+
return undefined; // ambiguous union
|
|
21
|
+
type = parts[0];
|
|
22
|
+
// Strip module: prefix — module:models.User → models.User
|
|
23
|
+
if (type.startsWith('module:'))
|
|
24
|
+
type = type.slice(7);
|
|
25
|
+
// Take last segment of dotted path: models.User → User
|
|
26
|
+
const segments = type.split('.');
|
|
27
|
+
type = segments[segments.length - 1];
|
|
28
|
+
// Strip generic wrapper: Promise<User> → Promise (base type, not inner)
|
|
29
|
+
const genericMatch = type.match(/^(\w+)\s*</);
|
|
30
|
+
if (genericMatch)
|
|
31
|
+
type = genericMatch[1];
|
|
32
|
+
// Simple identifier check
|
|
33
|
+
if (/^\w+$/.test(type))
|
|
34
|
+
return type;
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
37
|
+
/** Regex to extract JSDoc @param annotations: `@param {Type} name` */
|
|
38
|
+
const JSDOC_PARAM_RE = /@param\s*\{([^}]+)\}\s+\[?(\w+)[\]=]?[^\s]*/g;
|
|
39
|
+
/**
|
|
40
|
+
* Collect JSDoc @param type bindings from comment nodes preceding a function/method.
|
|
41
|
+
* Returns a map of paramName → typeName.
|
|
42
|
+
*/
|
|
43
|
+
const collectJsDocParams = (funcNode) => {
|
|
44
|
+
const commentTexts = [];
|
|
45
|
+
let sibling = funcNode.previousSibling;
|
|
46
|
+
while (sibling) {
|
|
47
|
+
if (sibling.type === 'comment') {
|
|
48
|
+
commentTexts.unshift(sibling.text);
|
|
49
|
+
}
|
|
50
|
+
else if (sibling.isNamed && sibling.type !== 'decorator') {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
sibling = sibling.previousSibling;
|
|
54
|
+
}
|
|
55
|
+
if (commentTexts.length === 0)
|
|
56
|
+
return new Map();
|
|
57
|
+
const params = new Map();
|
|
58
|
+
const commentBlock = commentTexts.join('\n');
|
|
59
|
+
JSDOC_PARAM_RE.lastIndex = 0;
|
|
60
|
+
let match;
|
|
61
|
+
while ((match = JSDOC_PARAM_RE.exec(commentBlock)) !== null) {
|
|
62
|
+
const typeName = normalizeJsDocType(match[1]);
|
|
63
|
+
const paramName = match[2];
|
|
64
|
+
if (typeName) {
|
|
65
|
+
params.set(paramName, typeName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return params;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* TypeScript: const x: Foo = ..., let x: Foo
|
|
72
|
+
* Also: JSDoc @param annotations on function/method definitions (for .js files).
|
|
73
|
+
*/
|
|
74
|
+
const extractDeclaration = (node, env) => {
|
|
75
|
+
// JSDoc @param on functions/methods — pre-populate env with param types
|
|
76
|
+
if (node.type === 'function_declaration' || node.type === 'method_definition') {
|
|
77
|
+
const jsDocParams = collectJsDocParams(node);
|
|
78
|
+
for (const [paramName, typeName] of jsDocParams) {
|
|
79
|
+
if (!env.has(paramName))
|
|
80
|
+
env.set(paramName, typeName);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Class field: `private users: User[]` — public_field_definition has name + type fields directly.
|
|
85
|
+
if (node.type === 'public_field_definition') {
|
|
86
|
+
const nameNode = node.childForFieldName('name');
|
|
87
|
+
const typeAnnotation = node.childForFieldName('type');
|
|
88
|
+
if (!nameNode || !typeAnnotation)
|
|
89
|
+
return;
|
|
90
|
+
const varName = nameNode.text;
|
|
91
|
+
if (!varName)
|
|
92
|
+
return;
|
|
93
|
+
const typeName = extractSimpleTypeName(typeAnnotation);
|
|
94
|
+
if (typeName)
|
|
95
|
+
env.set(varName, typeName);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
99
|
+
const declarator = node.namedChild(i);
|
|
100
|
+
if (declarator?.type !== 'variable_declarator')
|
|
101
|
+
continue;
|
|
102
|
+
const nameNode = declarator.childForFieldName('name');
|
|
103
|
+
const typeAnnotation = declarator.childForFieldName('type');
|
|
104
|
+
if (!nameNode || !typeAnnotation)
|
|
105
|
+
continue;
|
|
106
|
+
const varName = extractVarName(nameNode);
|
|
107
|
+
const typeName = extractSimpleTypeName(typeAnnotation);
|
|
108
|
+
if (varName && typeName)
|
|
109
|
+
env.set(varName, typeName);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
/** TypeScript: required_parameter / optional_parameter → name: type */
|
|
113
|
+
const extractParameter = (node, env) => {
|
|
114
|
+
let nameNode = null;
|
|
115
|
+
let typeNode = null;
|
|
116
|
+
if (node.type === 'required_parameter' || node.type === 'optional_parameter') {
|
|
117
|
+
nameNode = node.childForFieldName('pattern') ?? node.childForFieldName('name');
|
|
118
|
+
typeNode = node.childForFieldName('type');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Generic fallback
|
|
122
|
+
nameNode = node.childForFieldName('name') ?? node.childForFieldName('pattern');
|
|
123
|
+
typeNode = node.childForFieldName('type');
|
|
124
|
+
}
|
|
125
|
+
if (!nameNode || !typeNode)
|
|
126
|
+
return;
|
|
127
|
+
const varName = extractVarName(nameNode);
|
|
128
|
+
const typeName = extractSimpleTypeName(typeNode);
|
|
129
|
+
if (varName && typeName)
|
|
130
|
+
env.set(varName, typeName);
|
|
131
|
+
};
|
|
132
|
+
/** TypeScript: const x = new User() — infer type from new_expression */
|
|
133
|
+
const extractInitializer = (node, env, _classNames) => {
|
|
134
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
135
|
+
const declarator = node.namedChild(i);
|
|
136
|
+
if (declarator?.type !== 'variable_declarator')
|
|
137
|
+
continue;
|
|
138
|
+
// Only activate when there is no explicit type annotation — extractDeclaration already
|
|
139
|
+
// handles the annotated case and this function is called as a fallback.
|
|
140
|
+
if (declarator.childForFieldName('type') !== null)
|
|
141
|
+
continue;
|
|
142
|
+
let valueNode = declarator.childForFieldName('value');
|
|
143
|
+
// Unwrap `new User() as T`, `new User()!`, and double-cast `new User() as unknown as T`
|
|
144
|
+
while (valueNode?.type === 'as_expression' || valueNode?.type === 'non_null_expression') {
|
|
145
|
+
valueNode = valueNode.firstNamedChild;
|
|
146
|
+
}
|
|
147
|
+
if (valueNode?.type !== 'new_expression')
|
|
148
|
+
continue;
|
|
149
|
+
const constructorNode = valueNode.childForFieldName('constructor');
|
|
150
|
+
if (!constructorNode)
|
|
151
|
+
continue;
|
|
152
|
+
const nameNode = declarator.childForFieldName('name');
|
|
153
|
+
if (!nameNode)
|
|
154
|
+
continue;
|
|
155
|
+
const varName = extractVarName(nameNode);
|
|
156
|
+
const typeName = extractSimpleTypeName(constructorNode);
|
|
157
|
+
if (varName && typeName)
|
|
158
|
+
env.set(varName, typeName);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* TypeScript/JavaScript: const user = getUser() — variable_declarator with call_expression value.
|
|
163
|
+
* Only matches unannotated declarators; annotated ones are handled by extractDeclaration.
|
|
164
|
+
* await is unwrapped: const user = await fetchUser() → callee = 'fetchUser'.
|
|
165
|
+
*/
|
|
166
|
+
const scanConstructorBinding = (node) => {
|
|
167
|
+
if (node.type !== 'variable_declarator')
|
|
168
|
+
return undefined;
|
|
169
|
+
if (hasTypeAnnotation(node))
|
|
170
|
+
return undefined;
|
|
171
|
+
const nameNode = node.childForFieldName('name');
|
|
172
|
+
if (!nameNode || nameNode.type !== 'identifier')
|
|
173
|
+
return undefined;
|
|
174
|
+
const value = unwrapAwait(node.childForFieldName('value'));
|
|
175
|
+
if (!value || value.type !== 'call_expression')
|
|
176
|
+
return undefined;
|
|
177
|
+
const calleeName = extractCalleeName(value);
|
|
178
|
+
if (!calleeName)
|
|
179
|
+
return undefined;
|
|
180
|
+
return { varName: nameNode.text, calleeName };
|
|
181
|
+
};
|
|
182
|
+
const FOR_LOOP_NODE_TYPES = new Set(['for_in_statement']);
|
|
183
|
+
/** TS function/method node types that carry a parameters list. */
|
|
184
|
+
const TS_FUNCTION_NODE_TYPES = new Set([
|
|
185
|
+
'function_declaration',
|
|
186
|
+
'function_expression',
|
|
187
|
+
'arrow_function',
|
|
188
|
+
'method_definition',
|
|
189
|
+
'generator_function',
|
|
190
|
+
'generator_function_declaration',
|
|
191
|
+
]);
|
|
192
|
+
/**
|
|
193
|
+
* Extract element type from a TypeScript type annotation AST node.
|
|
194
|
+
* Handles:
|
|
195
|
+
* type_annotation ": User[]" → array_type → type_identifier "User"
|
|
196
|
+
* type_annotation ": Array<User>" → generic_type → extractGenericTypeArgs → "User"
|
|
197
|
+
* Falls back to text-based extraction via extractElementTypeFromString.
|
|
198
|
+
*/
|
|
199
|
+
const extractTsElementTypeFromAnnotation = (typeAnnotation, pos = 'last', depth = 0) => {
|
|
200
|
+
if (depth > 50)
|
|
201
|
+
return undefined;
|
|
202
|
+
// Unwrap type_annotation (the node text includes ': ' prefix)
|
|
203
|
+
const inner = typeAnnotation.type === 'type_annotation'
|
|
204
|
+
? (typeAnnotation.firstNamedChild ?? typeAnnotation)
|
|
205
|
+
: typeAnnotation;
|
|
206
|
+
// readonly User[] — readonly_type wraps array_type: unwrap and recurse
|
|
207
|
+
if (inner.type === 'readonly_type') {
|
|
208
|
+
const wrapped = inner.firstNamedChild;
|
|
209
|
+
if (wrapped)
|
|
210
|
+
return extractTsElementTypeFromAnnotation(wrapped, pos, depth + 1);
|
|
211
|
+
}
|
|
212
|
+
// User[] — array_type: first named child is the element type
|
|
213
|
+
if (inner.type === 'array_type') {
|
|
214
|
+
const elem = inner.firstNamedChild;
|
|
215
|
+
if (elem)
|
|
216
|
+
return extractSimpleTypeName(elem);
|
|
217
|
+
}
|
|
218
|
+
// Array<User>, Map<string, User> — generic_type
|
|
219
|
+
// pos determines which type arg: 'first' for keys, 'last' for values
|
|
220
|
+
if (inner.type === 'generic_type') {
|
|
221
|
+
const args = extractGenericTypeArgs(inner);
|
|
222
|
+
if (args.length >= 1)
|
|
223
|
+
return pos === 'first' ? args[0] : args[args.length - 1];
|
|
224
|
+
}
|
|
225
|
+
// Fallback: strip ': ' prefix from type_annotation text and use string extraction
|
|
226
|
+
const rawText = inner.text;
|
|
227
|
+
return extractElementTypeFromString(rawText, pos);
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Search a statement_block (function body) for a variable_declarator named `iterableName`
|
|
231
|
+
* that has a type annotation, preceding the given `beforeNode`.
|
|
232
|
+
* Returns the element type from the type annotation, or undefined.
|
|
233
|
+
*/
|
|
234
|
+
const findTsLocalDeclElementType = (iterableName, blockNode, beforeNode, pos = 'last') => {
|
|
235
|
+
for (let i = 0; i < blockNode.namedChildCount; i++) {
|
|
236
|
+
const stmt = blockNode.namedChild(i);
|
|
237
|
+
if (!stmt)
|
|
238
|
+
continue;
|
|
239
|
+
// Stop when we reach the for-loop itself
|
|
240
|
+
if (stmt === beforeNode || stmt.startIndex >= beforeNode.startIndex)
|
|
241
|
+
break;
|
|
242
|
+
// Look for lexical_declaration or variable_declaration
|
|
243
|
+
if (stmt.type !== 'lexical_declaration' && stmt.type !== 'variable_declaration')
|
|
244
|
+
continue;
|
|
245
|
+
for (let j = 0; j < stmt.namedChildCount; j++) {
|
|
246
|
+
const decl = stmt.namedChild(j);
|
|
247
|
+
if (decl?.type !== 'variable_declarator')
|
|
248
|
+
continue;
|
|
249
|
+
const nameNode = decl.childForFieldName('name');
|
|
250
|
+
if (nameNode?.text !== iterableName)
|
|
251
|
+
continue;
|
|
252
|
+
const typeAnnotation = decl.childForFieldName('type');
|
|
253
|
+
if (typeAnnotation)
|
|
254
|
+
return extractTsElementTypeFromAnnotation(typeAnnotation, pos);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return undefined;
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* Walk up the AST from a for-loop node to find the enclosing function scope,
|
|
261
|
+
* then search (1) its parameter list and (2) local declarations in the body
|
|
262
|
+
* for a variable named `iterableName` with a container type annotation.
|
|
263
|
+
* Returns the element type extracted from the annotation, or undefined.
|
|
264
|
+
*/
|
|
265
|
+
const findTsIterableElementType = (iterableName, startNode, pos = 'last') => {
|
|
266
|
+
let current = startNode.parent;
|
|
267
|
+
// Capture the immediate statement_block parent to search local declarations
|
|
268
|
+
const blockNode = current?.type === 'statement_block' ? current : null;
|
|
269
|
+
while (current) {
|
|
270
|
+
if (TS_FUNCTION_NODE_TYPES.has(current.type)) {
|
|
271
|
+
// Search function parameters
|
|
272
|
+
const paramsNode = current.childForFieldName('parameters') ?? current.childForFieldName('formal_parameters');
|
|
273
|
+
if (paramsNode) {
|
|
274
|
+
for (let i = 0; i < paramsNode.namedChildCount; i++) {
|
|
275
|
+
const param = paramsNode.namedChild(i);
|
|
276
|
+
if (!param)
|
|
277
|
+
continue;
|
|
278
|
+
const patternNode = param.childForFieldName('pattern') ?? param.childForFieldName('name');
|
|
279
|
+
if (patternNode?.text === iterableName) {
|
|
280
|
+
const typeAnnotation = param.childForFieldName('type');
|
|
281
|
+
if (typeAnnotation)
|
|
282
|
+
return extractTsElementTypeFromAnnotation(typeAnnotation, pos);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Search local declarations in the function body (statement_block)
|
|
287
|
+
if (blockNode) {
|
|
288
|
+
const result = findTsLocalDeclElementType(iterableName, blockNode, startNode, pos);
|
|
289
|
+
if (result)
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
break; // stop at the nearest function boundary
|
|
293
|
+
}
|
|
294
|
+
current = current.parent;
|
|
295
|
+
}
|
|
296
|
+
return undefined;
|
|
297
|
+
};
|
|
298
|
+
/**
|
|
299
|
+
* TypeScript/JavaScript: for (const user of users) where users has a known array type.
|
|
300
|
+
*
|
|
301
|
+
* Both `for...of` and `for...in` use the same `for_in_statement` AST node in tree-sitter.
|
|
302
|
+
* We differentiate by checking for the `of` keyword among the unnamed children.
|
|
303
|
+
*
|
|
304
|
+
* Tier 1c: resolves the element type via three strategies in priority order:
|
|
305
|
+
* 1. declarationTypeNodes — raw type annotation AST node (covers Array<User> from declarations)
|
|
306
|
+
* 2. scopeEnv string — extractElementTypeFromString on the stored type (covers locally annotated vars)
|
|
307
|
+
* 3. AST walk — walks up to the enclosing function's parameters to read User[] annotations directly
|
|
308
|
+
* Only handles `for...of`; `for...in` produces string keys, not element types.
|
|
309
|
+
*/
|
|
310
|
+
const extractForLoopBinding = (node, { scopeEnv, declarationTypeNodes, scope, returnTypeLookup }) => {
|
|
311
|
+
if (node.type !== 'for_in_statement')
|
|
312
|
+
return;
|
|
313
|
+
// Confirm this is `for...of`, not `for...in`, by scanning unnamed children for the keyword text.
|
|
314
|
+
let isForOf = false;
|
|
315
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
316
|
+
const child = node.child(i);
|
|
317
|
+
if (child && !child.isNamed && child.text === 'of') {
|
|
318
|
+
isForOf = true;
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (!isForOf)
|
|
323
|
+
return;
|
|
324
|
+
// The iterable is the `right` field — may be identifier, member_expression, or call_expression.
|
|
325
|
+
const rightNode = node.childForFieldName('right');
|
|
326
|
+
let iterableName;
|
|
327
|
+
let methodName;
|
|
328
|
+
let callExprElementType;
|
|
329
|
+
if (rightNode?.type === 'identifier') {
|
|
330
|
+
iterableName = rightNode.text;
|
|
331
|
+
}
|
|
332
|
+
else if (rightNode?.type === 'member_expression') {
|
|
333
|
+
const prop = rightNode.childForFieldName('property');
|
|
334
|
+
if (prop)
|
|
335
|
+
iterableName = prop.text;
|
|
336
|
+
}
|
|
337
|
+
else if (rightNode?.type === 'call_expression') {
|
|
338
|
+
// entries.values() → call_expression > function: member_expression > object + property
|
|
339
|
+
// this.repos.values() → nested member_expression: extract property from inner member
|
|
340
|
+
// getUsers() → call_expression > function: identifier (Phase 7.3 — return-type path)
|
|
341
|
+
const fn = rightNode.childForFieldName('function');
|
|
342
|
+
if (fn?.type === 'member_expression') {
|
|
343
|
+
const obj = fn.childForFieldName('object');
|
|
344
|
+
const prop = fn.childForFieldName('property');
|
|
345
|
+
if (obj?.type === 'identifier') {
|
|
346
|
+
iterableName = obj.text;
|
|
347
|
+
}
|
|
348
|
+
else if (obj?.type === 'member_expression') {
|
|
349
|
+
// this.repos.values() → obj = this.repos → extract 'repos'
|
|
350
|
+
const innerProp = obj.childForFieldName('property');
|
|
351
|
+
if (innerProp)
|
|
352
|
+
iterableName = innerProp.text;
|
|
353
|
+
}
|
|
354
|
+
if (prop?.type === 'property_identifier')
|
|
355
|
+
methodName = prop.text;
|
|
356
|
+
}
|
|
357
|
+
else if (fn?.type === 'identifier') {
|
|
358
|
+
// Direct function call: for (const user of getUsers())
|
|
359
|
+
const rawReturn = returnTypeLookup.lookupRawReturnType(fn.text);
|
|
360
|
+
if (rawReturn)
|
|
361
|
+
callExprElementType = extractElementTypeFromString(rawReturn);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (!iterableName && !callExprElementType)
|
|
365
|
+
return;
|
|
366
|
+
let elementType;
|
|
367
|
+
if (callExprElementType) {
|
|
368
|
+
elementType = callExprElementType;
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
// Look up the container's base type name for descriptor-aware resolution
|
|
372
|
+
const containerTypeName = scopeEnv.get(iterableName);
|
|
373
|
+
const typeArgPos = methodToTypeArgPosition(methodName, containerTypeName);
|
|
374
|
+
elementType = resolveIterableElementType(iterableName, node, scopeEnv, declarationTypeNodes, scope, extractTsElementTypeFromAnnotation, findTsIterableElementType, typeArgPos);
|
|
375
|
+
}
|
|
376
|
+
if (!elementType)
|
|
377
|
+
return;
|
|
378
|
+
// The loop variable is the `left` field.
|
|
379
|
+
const leftNode = node.childForFieldName('left');
|
|
380
|
+
if (!leftNode)
|
|
381
|
+
return;
|
|
382
|
+
// Handle destructured for-of: for (const [k, v] of entries)
|
|
383
|
+
// AST: left = array_pattern directly (no variable_declarator wrapper)
|
|
384
|
+
// Bind the LAST identifier to the element type (value in [key, value] patterns)
|
|
385
|
+
if (leftNode.type === 'array_pattern') {
|
|
386
|
+
const lastChild = leftNode.lastNamedChild;
|
|
387
|
+
if (lastChild?.type === 'identifier') {
|
|
388
|
+
scopeEnv.set(lastChild.text, elementType);
|
|
389
|
+
}
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (leftNode.type === 'object_pattern') {
|
|
393
|
+
// Object destructuring (e.g., `for (const { id } of users)`) destructures
|
|
394
|
+
// into fields of the element type. Without field-level resolution, we cannot
|
|
395
|
+
// bind individual properties to their correct types. Skip to avoid false bindings.
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
let loopVarNode = leftNode;
|
|
399
|
+
// `const user` parses as: left → variable_declarator containing an identifier named `user`
|
|
400
|
+
if (loopVarNode.type === 'variable_declarator') {
|
|
401
|
+
loopVarNode = loopVarNode.childForFieldName('name') ?? loopVarNode.firstNamedChild;
|
|
402
|
+
}
|
|
403
|
+
if (!loopVarNode)
|
|
404
|
+
return;
|
|
405
|
+
const loopVarName = extractVarName(loopVarNode);
|
|
406
|
+
if (loopVarName)
|
|
407
|
+
scopeEnv.set(loopVarName, elementType);
|
|
408
|
+
};
|
|
409
|
+
/** Collect fieldAccess items from an object_pattern's destructured properties. */
|
|
410
|
+
const collectDestructuredFields = (nameNode, receiver, scopeEnv) => {
|
|
411
|
+
const items = [];
|
|
412
|
+
for (let j = 0; j < nameNode.namedChildCount; j++) {
|
|
413
|
+
const prop = nameNode.namedChild(j);
|
|
414
|
+
if (!prop)
|
|
415
|
+
continue;
|
|
416
|
+
if (prop.type === 'shorthand_property_identifier_pattern') {
|
|
417
|
+
// `const { name } = obj` → shorthand: varName = fieldName
|
|
418
|
+
const varName = prop.text;
|
|
419
|
+
if (!scopeEnv.has(varName)) {
|
|
420
|
+
items.push({ kind: 'fieldAccess', lhs: varName, receiver, field: varName });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
else if (prop.type === 'pair_pattern') {
|
|
424
|
+
// `const { address: addr } = obj` → pair_pattern: key=field, value=varName
|
|
425
|
+
const keyNode = prop.childForFieldName('key');
|
|
426
|
+
const valNode = prop.childForFieldName('value');
|
|
427
|
+
if (keyNode && valNode) {
|
|
428
|
+
const fieldName = keyNode.text;
|
|
429
|
+
const varName = valNode.text;
|
|
430
|
+
if (!scopeEnv.has(varName)) {
|
|
431
|
+
items.push({ kind: 'fieldAccess', lhs: varName, receiver, field: fieldName });
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return items;
|
|
437
|
+
};
|
|
438
|
+
/** TS/JS: const alias = u → variable_declarator with name/value fields.
|
|
439
|
+
* Also handles destructuring: `const { a, b } = obj` and `const { a } = fn()` → N fieldAccess items. */
|
|
440
|
+
const extractPendingAssignment = (node, scopeEnv) => {
|
|
441
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
442
|
+
const child = node.namedChild(i);
|
|
443
|
+
if (!child || child.type !== 'variable_declarator')
|
|
444
|
+
continue;
|
|
445
|
+
const nameNode = child.childForFieldName('name');
|
|
446
|
+
const valueNode = child.childForFieldName('value');
|
|
447
|
+
if (!nameNode || !valueNode)
|
|
448
|
+
continue;
|
|
449
|
+
// Object destructuring from identifier: `const { address, name } = user`
|
|
450
|
+
if (nameNode.type === 'object_pattern' && valueNode.type === 'identifier') {
|
|
451
|
+
const items = collectDestructuredFields(nameNode, valueNode.text, scopeEnv);
|
|
452
|
+
if (items.length > 0)
|
|
453
|
+
return items;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
// Object destructuring from call/await: `const { x } = fn()` or `const { x } = await fn()`
|
|
457
|
+
// Emits a synthetic callResult + N fieldAccess items resolved via fixpoint iteration.
|
|
458
|
+
if (nameNode.type === 'object_pattern') {
|
|
459
|
+
const callNode = unwrapAwait(valueNode);
|
|
460
|
+
if (callNode?.type === 'call_expression') {
|
|
461
|
+
const funcNode = callNode.childForFieldName('function');
|
|
462
|
+
if (funcNode) {
|
|
463
|
+
let syntheticVar;
|
|
464
|
+
let leadItem;
|
|
465
|
+
if (funcNode.type === 'identifier') {
|
|
466
|
+
syntheticVar = `__destr_${funcNode.text}_${callNode.startIndex}`;
|
|
467
|
+
leadItem = { kind: 'callResult', lhs: syntheticVar, callee: funcNode.text };
|
|
468
|
+
}
|
|
469
|
+
else if (funcNode.type === 'member_expression') {
|
|
470
|
+
const obj = funcNode.childForFieldName('object');
|
|
471
|
+
const prop = funcNode.childForFieldName('property');
|
|
472
|
+
if (obj &&
|
|
473
|
+
prop?.type === 'property_identifier' &&
|
|
474
|
+
(obj.type === 'identifier' || obj.type === 'this')) {
|
|
475
|
+
syntheticVar = `__destr_${prop.text}_${callNode.startIndex}`;
|
|
476
|
+
leadItem = {
|
|
477
|
+
kind: 'methodCallResult',
|
|
478
|
+
lhs: syntheticVar,
|
|
479
|
+
receiver: obj.text,
|
|
480
|
+
method: prop.text,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (syntheticVar && leadItem) {
|
|
485
|
+
const fieldItems = collectDestructuredFields(nameNode, syntheticVar, scopeEnv);
|
|
486
|
+
if (fieldItems.length > 0)
|
|
487
|
+
return [leadItem, ...fieldItems];
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
const lhs = nameNode.text;
|
|
494
|
+
if (scopeEnv.has(lhs))
|
|
495
|
+
continue;
|
|
496
|
+
if (valueNode.type === 'identifier')
|
|
497
|
+
return { kind: 'copy', lhs, rhs: valueNode.text };
|
|
498
|
+
// member_expression RHS → fieldAccess (a.field, this.field)
|
|
499
|
+
if (valueNode.type === 'member_expression') {
|
|
500
|
+
const obj = valueNode.childForFieldName('object');
|
|
501
|
+
const prop = valueNode.childForFieldName('property');
|
|
502
|
+
if (obj &&
|
|
503
|
+
prop?.type === 'property_identifier' &&
|
|
504
|
+
(obj.type === 'identifier' || obj.type === 'this')) {
|
|
505
|
+
return { kind: 'fieldAccess', lhs, receiver: obj.text, field: prop.text };
|
|
506
|
+
}
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
// Unwrap await: `const user = await fetchUser()` or `await a.getC()`
|
|
510
|
+
const callNode = unwrapAwait(valueNode);
|
|
511
|
+
if (!callNode || callNode.type !== 'call_expression')
|
|
512
|
+
continue;
|
|
513
|
+
const funcNode = callNode.childForFieldName('function');
|
|
514
|
+
if (!funcNode)
|
|
515
|
+
continue;
|
|
516
|
+
// Simple call → callResult: getUser()
|
|
517
|
+
if (funcNode.type === 'identifier') {
|
|
518
|
+
return { kind: 'callResult', lhs, callee: funcNode.text };
|
|
519
|
+
}
|
|
520
|
+
// Method call with receiver → methodCallResult: a.getC()
|
|
521
|
+
if (funcNode.type === 'member_expression') {
|
|
522
|
+
const obj = funcNode.childForFieldName('object');
|
|
523
|
+
const prop = funcNode.childForFieldName('property');
|
|
524
|
+
if (obj &&
|
|
525
|
+
prop?.type === 'property_identifier' &&
|
|
526
|
+
(obj.type === 'identifier' || obj.type === 'this')) {
|
|
527
|
+
return { kind: 'methodCallResult', lhs, receiver: obj.text, method: prop.text };
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
return undefined;
|
|
532
|
+
};
|
|
533
|
+
/** Null-check keywords that indicate a null-comparison in binary expressions. */
|
|
534
|
+
const NULL_CHECK_KEYWORDS = new Set(['null', 'undefined']);
|
|
535
|
+
/**
|
|
536
|
+
* Find the if-body (consequence) block for a null-check binary_expression.
|
|
537
|
+
* Walks up from the binary_expression through parenthesized_expression to if_statement,
|
|
538
|
+
* then returns the consequence block (statement_block).
|
|
539
|
+
*
|
|
540
|
+
* AST structure: if_statement > parenthesized_expression > binary_expression
|
|
541
|
+
* if_statement > statement_block (consequence)
|
|
542
|
+
*/
|
|
543
|
+
const findIfConsequenceBlock = (binaryExpr) => {
|
|
544
|
+
// Walk up to find the if_statement (typically: binary_expression > parenthesized_expression > if_statement)
|
|
545
|
+
let current = binaryExpr.parent;
|
|
546
|
+
while (current) {
|
|
547
|
+
if (current.type === 'if_statement') {
|
|
548
|
+
// The consequence is the first statement_block child of if_statement
|
|
549
|
+
for (let i = 0; i < current.childCount; i++) {
|
|
550
|
+
const child = current.child(i);
|
|
551
|
+
if (child?.type === 'statement_block')
|
|
552
|
+
return child;
|
|
553
|
+
}
|
|
554
|
+
return undefined;
|
|
555
|
+
}
|
|
556
|
+
// Stop climbing at function/block boundaries — don't cross scope
|
|
557
|
+
if (current.type === 'function_declaration' ||
|
|
558
|
+
current.type === 'function_expression' ||
|
|
559
|
+
current.type === 'arrow_function' ||
|
|
560
|
+
current.type === 'method_definition')
|
|
561
|
+
return undefined;
|
|
562
|
+
current = current.parent;
|
|
563
|
+
}
|
|
564
|
+
return undefined;
|
|
565
|
+
};
|
|
566
|
+
/** TS instanceof narrowing: `x instanceof User` → bind x to User.
|
|
567
|
+
* Also handles null-check narrowing: `x !== null`, `x != undefined` etc.
|
|
568
|
+
* instanceof: first-writer-wins (no prior type binding).
|
|
569
|
+
* null-check: position-indexed narrowing via narrowingRange. */
|
|
570
|
+
const extractPatternBinding = (node, scopeEnv, declarationTypeNodes, scope) => {
|
|
571
|
+
if (node.type !== 'binary_expression')
|
|
572
|
+
return undefined;
|
|
573
|
+
// Check for instanceof first (existing behavior)
|
|
574
|
+
const instanceofOp = node.children.find((c) => !c.isNamed && c.text === 'instanceof');
|
|
575
|
+
if (instanceofOp) {
|
|
576
|
+
const left = node.namedChild(0);
|
|
577
|
+
const right = node.namedChild(1);
|
|
578
|
+
if (left?.type !== 'identifier' || right?.type !== 'identifier')
|
|
579
|
+
return undefined;
|
|
580
|
+
return { varName: left.text, typeName: right.text };
|
|
581
|
+
}
|
|
582
|
+
// Null-check narrowing: x !== null, x != null, x !== undefined, x != undefined
|
|
583
|
+
const op = node.children.find((c) => !c.isNamed && (c.text === '!==' || c.text === '!='));
|
|
584
|
+
if (!op)
|
|
585
|
+
return undefined;
|
|
586
|
+
const left = node.namedChild(0);
|
|
587
|
+
const right = node.namedChild(1);
|
|
588
|
+
if (!left || !right)
|
|
589
|
+
return undefined;
|
|
590
|
+
// Determine which side is the variable and which is null/undefined
|
|
591
|
+
let varNode;
|
|
592
|
+
let isNullCheck = false;
|
|
593
|
+
if (left.type === 'identifier' && NULL_CHECK_KEYWORDS.has(right.text)) {
|
|
594
|
+
varNode = left;
|
|
595
|
+
isNullCheck = true;
|
|
596
|
+
}
|
|
597
|
+
else if (right.type === 'identifier' && NULL_CHECK_KEYWORDS.has(left.text)) {
|
|
598
|
+
varNode = right;
|
|
599
|
+
isNullCheck = true;
|
|
600
|
+
}
|
|
601
|
+
if (!isNullCheck || !varNode)
|
|
602
|
+
return undefined;
|
|
603
|
+
const varName = varNode.text;
|
|
604
|
+
// Look up the variable's resolved type (already stripped of nullable by extractSimpleTypeName)
|
|
605
|
+
const resolvedType = scopeEnv.get(varName);
|
|
606
|
+
if (!resolvedType)
|
|
607
|
+
return undefined;
|
|
608
|
+
// Check if the original declaration type was nullable by looking at the raw AST type node.
|
|
609
|
+
// extractSimpleTypeName already strips nullable markers, so we need the original to know
|
|
610
|
+
// if narrowing is meaningful (i.e., the variable was declared as nullable).
|
|
611
|
+
const declTypeNode = declarationTypeNodes.get(`${scope}\0${varName}`);
|
|
612
|
+
if (!declTypeNode)
|
|
613
|
+
return undefined;
|
|
614
|
+
const declText = declTypeNode.text;
|
|
615
|
+
// Only narrow if the original declaration was nullable
|
|
616
|
+
if (!declText.includes('null') && !declText.includes('undefined'))
|
|
617
|
+
return undefined;
|
|
618
|
+
// Find the if-body block to scope the narrowing
|
|
619
|
+
const ifBody = findIfConsequenceBlock(node);
|
|
620
|
+
if (!ifBody)
|
|
621
|
+
return undefined;
|
|
622
|
+
return {
|
|
623
|
+
varName,
|
|
624
|
+
typeName: resolvedType,
|
|
625
|
+
narrowingRange: { startIndex: ifBody.startIndex, endIndex: ifBody.endIndex },
|
|
626
|
+
};
|
|
627
|
+
};
|
|
628
|
+
/** Infer the type of a literal AST node for TypeScript overload disambiguation. */
|
|
629
|
+
const inferTsLiteralType = (node) => {
|
|
630
|
+
switch (node.type) {
|
|
631
|
+
case 'number':
|
|
632
|
+
return 'number';
|
|
633
|
+
case 'string':
|
|
634
|
+
case 'template_string':
|
|
635
|
+
return 'string';
|
|
636
|
+
case 'true':
|
|
637
|
+
case 'false':
|
|
638
|
+
return 'boolean';
|
|
639
|
+
case 'null':
|
|
640
|
+
return 'null';
|
|
641
|
+
case 'undefined':
|
|
642
|
+
return 'undefined';
|
|
643
|
+
case 'regex':
|
|
644
|
+
return 'RegExp';
|
|
645
|
+
default:
|
|
646
|
+
return undefined;
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
export const typeConfig = {
|
|
650
|
+
declarationNodeTypes: DECLARATION_NODE_TYPES,
|
|
651
|
+
forLoopNodeTypes: FOR_LOOP_NODE_TYPES,
|
|
652
|
+
patternBindingNodeTypes: new Set(['binary_expression']),
|
|
653
|
+
extractDeclaration,
|
|
654
|
+
extractParameter,
|
|
655
|
+
extractInitializer,
|
|
656
|
+
scanConstructorBinding,
|
|
657
|
+
extractForLoopBinding,
|
|
658
|
+
extractPendingAssignment,
|
|
659
|
+
extractPatternBinding,
|
|
660
|
+
inferLiteralType: inferTsLiteralType,
|
|
661
|
+
};
|
|
662
|
+
//# sourceMappingURL=typescript.js.map
|