@opencodereview/core 1.9.1
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/dist/ai/anthropic-provider.d.ts +41 -0
- package/dist/ai/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/anthropic-provider.js +139 -0
- package/dist/ai/anthropic-provider.js.map +1 -0
- package/dist/ai/index.d.ts +39 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +41 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +46 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +149 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +44 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +137 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/orchestrator.d.ts +60 -0
- package/dist/ai/orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator.js +188 -0
- package/dist/ai/orchestrator.js.map +1 -0
- package/dist/ai/prompts.d.ts +27 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +112 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/types.d.ts +75 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +10 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ai/v4/embedding/index.d.ts +10 -0
- package/dist/ai/v4/embedding/index.d.ts.map +1 -0
- package/dist/ai/v4/embedding/index.js +10 -0
- package/dist/ai/v4/embedding/index.js.map +1 -0
- package/dist/ai/v4/embedding/local.d.ts +68 -0
- package/dist/ai/v4/embedding/local.d.ts.map +1 -0
- package/dist/ai/v4/embedding/local.js +167 -0
- package/dist/ai/v4/embedding/local.js.map +1 -0
- package/dist/ai/v4/embedding/ollama.d.ts +58 -0
- package/dist/ai/v4/embedding/ollama.d.ts.map +1 -0
- package/dist/ai/v4/embedding/ollama.js +101 -0
- package/dist/ai/v4/embedding/ollama.js.map +1 -0
- package/dist/ai/v4/embedding/openai.d.ts +36 -0
- package/dist/ai/v4/embedding/openai.d.ts.map +1 -0
- package/dist/ai/v4/embedding/openai.js +76 -0
- package/dist/ai/v4/embedding/openai.js.map +1 -0
- package/dist/ai/v4/embedding/similarity.d.ts +36 -0
- package/dist/ai/v4/embedding/similarity.d.ts.map +1 -0
- package/dist/ai/v4/embedding/similarity.js +60 -0
- package/dist/ai/v4/embedding/similarity.js.map +1 -0
- package/dist/ai/v4/index.d.ts +51 -0
- package/dist/ai/v4/index.d.ts.map +1 -0
- package/dist/ai/v4/index.js +54 -0
- package/dist/ai/v4/index.js.map +1 -0
- package/dist/ai/v4/llm/anthropic.d.ts +38 -0
- package/dist/ai/v4/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/v4/llm/anthropic.js +86 -0
- package/dist/ai/v4/llm/anthropic.js.map +1 -0
- package/dist/ai/v4/llm/index.d.ts +9 -0
- package/dist/ai/v4/llm/index.d.ts.map +1 -0
- package/dist/ai/v4/llm/index.js +9 -0
- package/dist/ai/v4/llm/index.js.map +1 -0
- package/dist/ai/v4/llm/ollama.d.ts +39 -0
- package/dist/ai/v4/llm/ollama.d.ts.map +1 -0
- package/dist/ai/v4/llm/ollama.js +95 -0
- package/dist/ai/v4/llm/ollama.js.map +1 -0
- package/dist/ai/v4/llm/openai.d.ts +38 -0
- package/dist/ai/v4/llm/openai.d.ts.map +1 -0
- package/dist/ai/v4/llm/openai.js +88 -0
- package/dist/ai/v4/llm/openai.js.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts +57 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.js +331 -0
- package/dist/ai/v4/patterns/defect-patterns.js.map +1 -0
- package/dist/ai/v4/patterns/index.d.ts +8 -0
- package/dist/ai/v4/patterns/index.d.ts.map +1 -0
- package/dist/ai/v4/patterns/index.js +7 -0
- package/dist/ai/v4/patterns/index.js.map +1 -0
- package/dist/ai/v4/pipeline.d.ts +74 -0
- package/dist/ai/v4/pipeline.d.ts.map +1 -0
- package/dist/ai/v4/pipeline.js +381 -0
- package/dist/ai/v4/pipeline.js.map +1 -0
- package/dist/ai/v4/sla.d.ts +62 -0
- package/dist/ai/v4/sla.d.ts.map +1 -0
- package/dist/ai/v4/sla.js +136 -0
- package/dist/ai/v4/sla.js.map +1 -0
- package/dist/ai/v4/types.d.ts +117 -0
- package/dist/ai/v4/types.d.ts.map +1 -0
- package/dist/ai/v4/types.js +16 -0
- package/dist/ai/v4/types.js.map +1 -0
- package/dist/ai-healer/prompt-builder.d.ts +33 -0
- package/dist/ai-healer/prompt-builder.d.ts.map +1 -0
- package/dist/ai-healer/prompt-builder.js +89 -0
- package/dist/ai-healer/prompt-builder.js.map +1 -0
- package/dist/config/defaults.d.ts +14 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +57 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +33 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +245 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +58 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/v4-config.d.ts +77 -0
- package/dist/config/v4-config.d.ts.map +1 -0
- package/dist/config/v4-config.js +336 -0
- package/dist/config/v4-config.js.map +1 -0
- package/dist/detectors/ai-detector.d.ts +38 -0
- package/dist/detectors/ai-detector.d.ts.map +1 -0
- package/dist/detectors/ai-detector.js +62 -0
- package/dist/detectors/ai-detector.js.map +1 -0
- package/dist/detectors/context-break.d.ts +57 -0
- package/dist/detectors/context-break.d.ts.map +1 -0
- package/dist/detectors/context-break.js +199 -0
- package/dist/detectors/context-break.js.map +1 -0
- package/dist/detectors/deep-hallucination.d.ts +42 -0
- package/dist/detectors/deep-hallucination.d.ts.map +1 -0
- package/dist/detectors/deep-hallucination.js +297 -0
- package/dist/detectors/deep-hallucination.js.map +1 -0
- package/dist/detectors/duplication.d.ts +61 -0
- package/dist/detectors/duplication.d.ts.map +1 -0
- package/dist/detectors/duplication.js +204 -0
- package/dist/detectors/duplication.js.map +1 -0
- package/dist/detectors/hallucination.d.ts +80 -0
- package/dist/detectors/hallucination.d.ts.map +1 -0
- package/dist/detectors/hallucination.js +350 -0
- package/dist/detectors/hallucination.js.map +1 -0
- package/dist/detectors/index.d.ts +35 -0
- package/dist/detectors/index.d.ts.map +1 -0
- package/dist/detectors/index.js +33 -0
- package/dist/detectors/index.js.map +1 -0
- package/dist/detectors/logic-gap.d.ts +58 -0
- package/dist/detectors/logic-gap.d.ts.map +1 -0
- package/dist/detectors/logic-gap.js +284 -0
- package/dist/detectors/logic-gap.js.map +1 -0
- package/dist/detectors/over-engineering.d.ts +44 -0
- package/dist/detectors/over-engineering.d.ts.map +1 -0
- package/dist/detectors/over-engineering.js +257 -0
- package/dist/detectors/over-engineering.js.map +1 -0
- package/dist/detectors/security-pattern.d.ts +43 -0
- package/dist/detectors/security-pattern.d.ts.map +1 -0
- package/dist/detectors/security-pattern.js +235 -0
- package/dist/detectors/security-pattern.js.map +1 -0
- package/dist/detectors/stale-api.d.ts +44 -0
- package/dist/detectors/stale-api.d.ts.map +1 -0
- package/dist/detectors/stale-api.js +160 -0
- package/dist/detectors/stale-api.js.map +1 -0
- package/dist/detectors/type-safety.d.ts +41 -0
- package/dist/detectors/type-safety.d.ts.map +1 -0
- package/dist/detectors/type-safety.js +306 -0
- package/dist/detectors/type-safety.js.map +1 -0
- package/dist/detectors/v4/context-coherence.d.ts +67 -0
- package/dist/detectors/v4/context-coherence.d.ts.map +1 -0
- package/dist/detectors/v4/context-coherence.js +319 -0
- package/dist/detectors/v4/context-coherence.js.map +1 -0
- package/dist/detectors/v4/hallucinated-import.d.ts +52 -0
- package/dist/detectors/v4/hallucinated-import.d.ts.map +1 -0
- package/dist/detectors/v4/hallucinated-import.js +206 -0
- package/dist/detectors/v4/hallucinated-import.js.map +1 -0
- package/dist/detectors/v4/index.d.ts +28 -0
- package/dist/detectors/v4/index.d.ts.map +1 -0
- package/dist/detectors/v4/index.js +40 -0
- package/dist/detectors/v4/index.js.map +1 -0
- package/dist/detectors/v4/over-engineering.d.ts +69 -0
- package/dist/detectors/v4/over-engineering.d.ts.map +1 -0
- package/dist/detectors/v4/over-engineering.js +234 -0
- package/dist/detectors/v4/over-engineering.js.map +1 -0
- package/dist/detectors/v4/security-pattern.d.ts +46 -0
- package/dist/detectors/v4/security-pattern.d.ts.map +1 -0
- package/dist/detectors/v4/security-pattern.js +233 -0
- package/dist/detectors/v4/security-pattern.js.map +1 -0
- package/dist/detectors/v4/stale-api.d.ts +59 -0
- package/dist/detectors/v4/stale-api.d.ts.map +1 -0
- package/dist/detectors/v4/stale-api.js +470 -0
- package/dist/detectors/v4/stale-api.js.map +1 -0
- package/dist/detectors/v4/types.d.ts +74 -0
- package/dist/detectors/v4/types.d.ts.map +1 -0
- package/dist/detectors/v4/types.js +10 -0
- package/dist/detectors/v4/types.js.map +1 -0
- package/dist/diff/filter.d.ts +35 -0
- package/dist/diff/filter.d.ts.map +1 -0
- package/dist/diff/filter.js +65 -0
- package/dist/diff/filter.js.map +1 -0
- package/dist/diff/index.d.ts +9 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +8 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parser.d.ts +61 -0
- package/dist/diff/parser.d.ts.map +1 -0
- package/dist/diff/parser.js +203 -0
- package/dist/diff/parser.js.map +1 -0
- package/dist/i18n/en.d.ts +18 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +83 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/provider.d.ts +54 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +88 -0
- package/dist/i18n/provider.js.map +1 -0
- package/dist/i18n/types.d.ts +37 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +10 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +14 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +83 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +10 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +9 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +126 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +33 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/languages/go/index.d.ts +7 -0
- package/dist/languages/go/index.d.ts.map +1 -0
- package/dist/languages/go/index.js +7 -0
- package/dist/languages/go/index.js.map +1 -0
- package/dist/languages/go/parser.d.ts +89 -0
- package/dist/languages/go/parser.d.ts.map +1 -0
- package/dist/languages/go/parser.js +509 -0
- package/dist/languages/go/parser.js.map +1 -0
- package/dist/languages/index.d.ts +13 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +14 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/java/index.d.ts +7 -0
- package/dist/languages/java/index.d.ts.map +1 -0
- package/dist/languages/java/index.js +7 -0
- package/dist/languages/java/index.js.map +1 -0
- package/dist/languages/java/parser.d.ts +82 -0
- package/dist/languages/java/parser.d.ts.map +1 -0
- package/dist/languages/java/parser.js +492 -0
- package/dist/languages/java/parser.js.map +1 -0
- package/dist/languages/kotlin/index.d.ts +7 -0
- package/dist/languages/kotlin/index.d.ts.map +1 -0
- package/dist/languages/kotlin/index.js +7 -0
- package/dist/languages/kotlin/index.js.map +1 -0
- package/dist/languages/kotlin/parser.d.ts +84 -0
- package/dist/languages/kotlin/parser.d.ts.map +1 -0
- package/dist/languages/kotlin/parser.js +507 -0
- package/dist/languages/kotlin/parser.js.map +1 -0
- package/dist/languages/python/index.d.ts +7 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +7 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/parser.d.ts +91 -0
- package/dist/languages/python/parser.d.ts.map +1 -0
- package/dist/languages/python/parser.js +375 -0
- package/dist/languages/python/parser.js.map +1 -0
- package/dist/languages/registry.d.ts +81 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +150 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/types.d.ts +137 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +10 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +7 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/typescript/parser.d.ts +51 -0
- package/dist/languages/typescript/parser.d.ts.map +1 -0
- package/dist/languages/typescript/parser.js +286 -0
- package/dist/languages/typescript/parser.js.map +1 -0
- package/dist/license/generator.d.ts +43 -0
- package/dist/license/generator.d.ts.map +1 -0
- package/dist/license/generator.js +72 -0
- package/dist/license/generator.js.map +1 -0
- package/dist/license/index.d.ts +11 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +12 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/types.d.ts +85 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +10 -0
- package/dist/license/types.js.map +1 -0
- package/dist/license/validator.d.ts +77 -0
- package/dist/license/validator.d.ts.map +1 -0
- package/dist/license/validator.js +275 -0
- package/dist/license/validator.js.map +1 -0
- package/dist/parser/extractor.d.ts +31 -0
- package/dist/parser/extractor.d.ts.map +1 -0
- package/dist/parser/extractor.js +10 -0
- package/dist/parser/extractor.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +21 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +569 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/index.d.ts +13 -0
- package/dist/parser/extractors/index.d.ts.map +1 -0
- package/dist/parser/extractors/index.js +13 -0
- package/dist/parser/extractors/index.js.map +1 -0
- package/dist/parser/extractors/java.d.ts +24 -0
- package/dist/parser/extractors/java.d.ts.map +1 -0
- package/dist/parser/extractors/java.js +611 -0
- package/dist/parser/extractors/java.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts +25 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin.js +665 -0
- package/dist/parser/extractors/kotlin.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +21 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +514 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +23 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +664 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/index.d.ts +15 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +14 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/manager.d.ts +50 -0
- package/dist/parser/manager.d.ts.map +1 -0
- package/dist/parser/manager.js +159 -0
- package/dist/parser/manager.js.map +1 -0
- package/dist/registry/builtins/go-builtins.d.ts +13 -0
- package/dist/registry/builtins/go-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/go-builtins.js +63 -0
- package/dist/registry/builtins/go-builtins.js.map +1 -0
- package/dist/registry/builtins/java-builtins.d.ts +10 -0
- package/dist/registry/builtins/java-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/java-builtins.js +59 -0
- package/dist/registry/builtins/java-builtins.js.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts +10 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.js +38 -0
- package/dist/registry/builtins/kotlin-builtins.js.map +1 -0
- package/dist/registry/builtins/node-builtins.d.ts +10 -0
- package/dist/registry/builtins/node-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/node-builtins.js +36 -0
- package/dist/registry/builtins/node-builtins.js.map +1 -0
- package/dist/registry/builtins/python-builtins.d.ts +10 -0
- package/dist/registry/builtins/python-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/python-builtins.js +43 -0
- package/dist/registry/builtins/python-builtins.js.map +1 -0
- package/dist/registry/cache.d.ts +53 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +147 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/go-registry.d.ts +52 -0
- package/dist/registry/go-registry.d.ts.map +1 -0
- package/dist/registry/go-registry.js +148 -0
- package/dist/registry/go-registry.js.map +1 -0
- package/dist/registry/index.d.ts +18 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +21 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/maven-registry.d.ts +57 -0
- package/dist/registry/maven-registry.d.ts.map +1 -0
- package/dist/registry/maven-registry.js +155 -0
- package/dist/registry/maven-registry.js.map +1 -0
- package/dist/registry/npm-registry.d.ts +40 -0
- package/dist/registry/npm-registry.d.ts.map +1 -0
- package/dist/registry/npm-registry.js +155 -0
- package/dist/registry/npm-registry.js.map +1 -0
- package/dist/registry/pypi-registry.d.ts +49 -0
- package/dist/registry/pypi-registry.d.ts.map +1 -0
- package/dist/registry/pypi-registry.js +175 -0
- package/dist/registry/pypi-registry.js.map +1 -0
- package/dist/registry/registry-manager.d.ts +45 -0
- package/dist/registry/registry-manager.d.ts.map +1 -0
- package/dist/registry/registry-manager.js +107 -0
- package/dist/registry/registry-manager.js.map +1 -0
- package/dist/registry/types.d.ts +83 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +12 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/reporter/html-reporter.d.ts +20 -0
- package/dist/reporter/html-reporter.d.ts.map +1 -0
- package/dist/reporter/html-reporter.js +612 -0
- package/dist/reporter/html-reporter.js.map +1 -0
- package/dist/reporter/index.d.ts +28 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +48 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/markdown-reporter.d.ts +16 -0
- package/dist/reporter/markdown-reporter.d.ts.map +1 -0
- package/dist/reporter/markdown-reporter.js +182 -0
- package/dist/reporter/markdown-reporter.js.map +1 -0
- package/dist/reporter/sarif-reporter.d.ts +67 -0
- package/dist/reporter/sarif-reporter.d.ts.map +1 -0
- package/dist/reporter/sarif-reporter.js +73 -0
- package/dist/reporter/sarif-reporter.js.map +1 -0
- package/dist/reporter/terminal-reporter.d.ts +14 -0
- package/dist/reporter/terminal-reporter.d.ts.map +1 -0
- package/dist/reporter/terminal-reporter.js +126 -0
- package/dist/reporter/terminal-reporter.js.map +1 -0
- package/dist/reporter/types.d.ts +43 -0
- package/dist/reporter/types.d.ts.map +1 -0
- package/dist/reporter/types.js +10 -0
- package/dist/reporter/types.js.map +1 -0
- package/dist/reporter/v4-html.d.ts +24 -0
- package/dist/reporter/v4-html.d.ts.map +1 -0
- package/dist/reporter/v4-html.js +359 -0
- package/dist/reporter/v4-html.js.map +1 -0
- package/dist/reporter/v4-terminal.d.ts +55 -0
- package/dist/reporter/v4-terminal.d.ts.map +1 -0
- package/dist/reporter/v4-terminal.js +199 -0
- package/dist/reporter/v4-terminal.js.map +1 -0
- package/dist/scanner/index.d.ts +9 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +9 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/v4-scanner.d.ts +162 -0
- package/dist/scanner/v4-scanner.d.ts.map +1 -0
- package/dist/scanner/v4-scanner.js +327 -0
- package/dist/scanner/v4-scanner.js.map +1 -0
- package/dist/scorer/report.d.ts +52 -0
- package/dist/scorer/report.d.ts.map +1 -0
- package/dist/scorer/report.js +347 -0
- package/dist/scorer/report.js.map +1 -0
- package/dist/scorer/scoring-engine.d.ts +170 -0
- package/dist/scorer/scoring-engine.d.ts.map +1 -0
- package/dist/scorer/scoring-engine.js +308 -0
- package/dist/scorer/scoring-engine.js.map +1 -0
- package/dist/scorer/v4-adapter.d.ts +87 -0
- package/dist/scorer/v4-adapter.d.ts.map +1 -0
- package/dist/scorer/v4-adapter.js +145 -0
- package/dist/scorer/v4-adapter.js.map +1 -0
- package/dist/sla/index.d.ts +7 -0
- package/dist/sla/index.d.ts.map +1 -0
- package/dist/sla/index.js +6 -0
- package/dist/sla/index.js.map +1 -0
- package/dist/sla/tracker.d.ts +70 -0
- package/dist/sla/tracker.d.ts.map +1 -0
- package/dist/sla/tracker.js +151 -0
- package/dist/sla/tracker.js.map +1 -0
- package/dist/sla/types.d.ts +67 -0
- package/dist/sla/types.d.ts.map +1 -0
- package/dist/sla/types.js +42 -0
- package/dist/sla/types.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +69 -0
- package/dist/types.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages registered LanguageAdapters and auto-selects the appropriate
|
|
5
|
+
* adapter based on file extension.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* LanguageRegistry — singleton that maps file extensions to language adapters.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const registry = LanguageRegistry.getInstance();
|
|
14
|
+
* registry.register(new TypeScriptAdapter());
|
|
15
|
+
* const adapter = registry.getByExtension('.ts');
|
|
16
|
+
*/
|
|
17
|
+
export class LanguageRegistry {
|
|
18
|
+
static instance = null;
|
|
19
|
+
/** Adapter map by language ID */
|
|
20
|
+
adapters = new Map();
|
|
21
|
+
/** Extension → language ID lookup */
|
|
22
|
+
extensionMap = new Map();
|
|
23
|
+
constructor() { }
|
|
24
|
+
/** Get the singleton instance */
|
|
25
|
+
static getInstance() {
|
|
26
|
+
if (!LanguageRegistry.instance) {
|
|
27
|
+
LanguageRegistry.instance = new LanguageRegistry();
|
|
28
|
+
}
|
|
29
|
+
return LanguageRegistry.instance;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Reset the singleton (for testing).
|
|
33
|
+
*/
|
|
34
|
+
static resetInstance() {
|
|
35
|
+
LanguageRegistry.instance = null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Register a language adapter.
|
|
39
|
+
* @param adapter The language adapter to register
|
|
40
|
+
* @throws If an adapter with the same ID is already registered
|
|
41
|
+
*/
|
|
42
|
+
register(adapter) {
|
|
43
|
+
if (this.adapters.has(adapter.id)) {
|
|
44
|
+
throw new Error(`Language adapter '${adapter.id}' is already registered`);
|
|
45
|
+
}
|
|
46
|
+
this.adapters.set(adapter.id, adapter);
|
|
47
|
+
for (const ext of adapter.extensions) {
|
|
48
|
+
this.extensionMap.set(ext.toLowerCase(), adapter.id);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Unregister a language adapter by ID.
|
|
53
|
+
* @param id Language identifier
|
|
54
|
+
*/
|
|
55
|
+
unregister(id) {
|
|
56
|
+
const adapter = this.adapters.get(id);
|
|
57
|
+
if (adapter) {
|
|
58
|
+
for (const ext of adapter.extensions) {
|
|
59
|
+
this.extensionMap.delete(ext.toLowerCase());
|
|
60
|
+
}
|
|
61
|
+
this.adapters.delete(id);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get a language adapter by language ID.
|
|
66
|
+
* @param id Language identifier (e.g. 'typescript')
|
|
67
|
+
* @returns The adapter, or undefined if not registered
|
|
68
|
+
*/
|
|
69
|
+
getById(id) {
|
|
70
|
+
return this.adapters.get(id);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a language adapter by file extension.
|
|
74
|
+
* @param ext File extension including dot (e.g. '.ts')
|
|
75
|
+
* @returns The adapter, or undefined if no adapter matches
|
|
76
|
+
*/
|
|
77
|
+
getByExtension(ext) {
|
|
78
|
+
const langId = this.extensionMap.get(ext.toLowerCase());
|
|
79
|
+
if (langId) {
|
|
80
|
+
return this.adapters.get(langId);
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get a language adapter for a file path.
|
|
86
|
+
* Extracts the extension and looks up the adapter.
|
|
87
|
+
* @param filePath File path
|
|
88
|
+
* @returns The adapter, or undefined if no adapter matches
|
|
89
|
+
*/
|
|
90
|
+
getByFilePath(filePath) {
|
|
91
|
+
const ext = extractExtension(filePath);
|
|
92
|
+
if (ext) {
|
|
93
|
+
return this.getByExtension(ext);
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Detect the language for a file path.
|
|
99
|
+
* @param filePath File path
|
|
100
|
+
* @returns The language identifier, or undefined
|
|
101
|
+
*/
|
|
102
|
+
detectLanguage(filePath) {
|
|
103
|
+
const ext = extractExtension(filePath);
|
|
104
|
+
if (ext) {
|
|
105
|
+
const langId = this.extensionMap.get(ext.toLowerCase());
|
|
106
|
+
return langId;
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get all registered language IDs.
|
|
112
|
+
*/
|
|
113
|
+
getRegisteredLanguages() {
|
|
114
|
+
return Array.from(this.adapters.keys());
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get all supported extensions.
|
|
118
|
+
*/
|
|
119
|
+
getSupportedExtensions() {
|
|
120
|
+
return Array.from(this.extensionMap.keys());
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a file extension is supported.
|
|
124
|
+
*/
|
|
125
|
+
isSupported(extOrPath) {
|
|
126
|
+
if (extOrPath.startsWith('.')) {
|
|
127
|
+
return this.extensionMap.has(extOrPath.toLowerCase());
|
|
128
|
+
}
|
|
129
|
+
const ext = extractExtension(extOrPath);
|
|
130
|
+
return ext ? this.extensionMap.has(ext.toLowerCase()) : false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Extract file extension from a path (including the dot).
|
|
135
|
+
* Handles compound extensions like .d.ts, .test.ts etc.
|
|
136
|
+
*/
|
|
137
|
+
function extractExtension(filePath) {
|
|
138
|
+
const basename = filePath.split(/[/\\]/).pop();
|
|
139
|
+
if (!basename)
|
|
140
|
+
return undefined;
|
|
141
|
+
// Handle .d.ts, .d.mts, .d.cts
|
|
142
|
+
if (/\.d\.[mc]?ts$/.test(basename)) {
|
|
143
|
+
return basename.match(/\.d\.[mc]?ts$/)?.[0];
|
|
144
|
+
}
|
|
145
|
+
const dotIndex = basename.lastIndexOf('.');
|
|
146
|
+
if (dotIndex === -1 || dotIndex === 0)
|
|
147
|
+
return undefined;
|
|
148
|
+
return basename.slice(dotIndex);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/languages/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Adapter Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the unified LanguageAdapter interface that all language-specific
|
|
5
|
+
* adapters must implement. This enables language-agnostic detection.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
import type { SupportedLanguage } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Abstract AST node — language adapters produce their own AST structures,
|
|
12
|
+
* but they all go through this common interface for traversal.
|
|
13
|
+
*/
|
|
14
|
+
export interface ASTNode {
|
|
15
|
+
type: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
/** Extracted import/require statement */
|
|
19
|
+
export interface ImportInfo {
|
|
20
|
+
/** The module specifier (e.g. 'lodash', './utils', 'node:fs') */
|
|
21
|
+
module: string;
|
|
22
|
+
/** Individual imported bindings (e.g. ['readFile', 'writeFile']) */
|
|
23
|
+
bindings: string[];
|
|
24
|
+
/** Line number where the import appears */
|
|
25
|
+
line: number;
|
|
26
|
+
/** Whether this is a relative import (./foo, ../bar) */
|
|
27
|
+
isRelative: boolean;
|
|
28
|
+
/** Whether this is a built-in module */
|
|
29
|
+
isBuiltin: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Extracted function/method call */
|
|
32
|
+
export interface CallInfo {
|
|
33
|
+
/** The fully qualified call name (e.g. 'fs.readFile', 'console.log') */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Line number */
|
|
36
|
+
line: number;
|
|
37
|
+
/** Column number */
|
|
38
|
+
column?: number;
|
|
39
|
+
/** Whether this is a method call (obj.method()) */
|
|
40
|
+
isMethodCall: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Result of package existence verification */
|
|
43
|
+
export interface PackageVerifyResult {
|
|
44
|
+
/** Package name */
|
|
45
|
+
name: string;
|
|
46
|
+
/** Whether the package exists in the registry */
|
|
47
|
+
exists: boolean;
|
|
48
|
+
/** If deprecated, the deprecation message */
|
|
49
|
+
deprecation?: string;
|
|
50
|
+
/** When the check was performed */
|
|
51
|
+
checkedAt: number;
|
|
52
|
+
}
|
|
53
|
+
/** Information about a deprecated API */
|
|
54
|
+
export interface DeprecatedInfo {
|
|
55
|
+
/** The deprecated API name/pattern */
|
|
56
|
+
api: string;
|
|
57
|
+
/** Why it was deprecated */
|
|
58
|
+
reason: string;
|
|
59
|
+
/** What to use instead */
|
|
60
|
+
replacement?: string;
|
|
61
|
+
/** Since which version it was deprecated */
|
|
62
|
+
since?: string;
|
|
63
|
+
/** Reference URL */
|
|
64
|
+
reference?: string;
|
|
65
|
+
}
|
|
66
|
+
/** Complexity metrics for a code unit (function/file) */
|
|
67
|
+
export interface ComplexityMetrics {
|
|
68
|
+
/** Cyclomatic complexity */
|
|
69
|
+
cyclomatic: number;
|
|
70
|
+
/** Cognitive complexity */
|
|
71
|
+
cognitive: number;
|
|
72
|
+
/** Lines of code */
|
|
73
|
+
loc: number;
|
|
74
|
+
/** Number of functions */
|
|
75
|
+
functionCount: number;
|
|
76
|
+
/** Maximum nesting depth */
|
|
77
|
+
maxNestingDepth: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* LanguageAdapter — unified interface for multi-language support.
|
|
81
|
+
*
|
|
82
|
+
* Each supported language implements this interface to provide:
|
|
83
|
+
* - AST parsing
|
|
84
|
+
* - Import/call extraction
|
|
85
|
+
* - Package verification
|
|
86
|
+
* - Deprecated API checking
|
|
87
|
+
* - Complexity computation
|
|
88
|
+
*
|
|
89
|
+
* Detectors use LanguageAdapter to remain language-agnostic.
|
|
90
|
+
*/
|
|
91
|
+
export interface LanguageAdapter {
|
|
92
|
+
/** Language identifier (e.g. 'typescript', 'python') */
|
|
93
|
+
readonly id: SupportedLanguage;
|
|
94
|
+
/** Supported file extensions (e.g. ['.ts', '.tsx', '.js', '.jsx']) */
|
|
95
|
+
readonly extensions: string[];
|
|
96
|
+
/**
|
|
97
|
+
* Parse source code into an AST.
|
|
98
|
+
* @param source File content
|
|
99
|
+
* @param filePath File path (for error reporting)
|
|
100
|
+
* @returns Parsed AST
|
|
101
|
+
*/
|
|
102
|
+
parse(source: string, filePath: string): Promise<ASTNode>;
|
|
103
|
+
/**
|
|
104
|
+
* Extract import/require statements from parsed AST or source.
|
|
105
|
+
* @param source File content
|
|
106
|
+
* @param ast Parsed AST (optional, for performance)
|
|
107
|
+
* @returns Array of import information
|
|
108
|
+
*/
|
|
109
|
+
extractImports(source: string, ast?: ASTNode): ImportInfo[];
|
|
110
|
+
/**
|
|
111
|
+
* Extract function/method calls from parsed AST or source.
|
|
112
|
+
* @param source File content
|
|
113
|
+
* @param ast Parsed AST (optional, for performance)
|
|
114
|
+
* @returns Array of call information
|
|
115
|
+
*/
|
|
116
|
+
extractCalls(source: string, ast?: ASTNode): CallInfo[];
|
|
117
|
+
/**
|
|
118
|
+
* Verify if a package exists in the language's package registry.
|
|
119
|
+
* @param name Package name
|
|
120
|
+
* @returns Verification result
|
|
121
|
+
*/
|
|
122
|
+
verifyPackage(name: string): Promise<PackageVerifyResult>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if an API is deprecated.
|
|
125
|
+
* @param api The API name/call
|
|
126
|
+
* @returns Deprecation info, or null if not deprecated
|
|
127
|
+
*/
|
|
128
|
+
checkDeprecated(api: string): DeprecatedInfo | null;
|
|
129
|
+
/**
|
|
130
|
+
* Compute complexity metrics for a source file.
|
|
131
|
+
* @param source File content
|
|
132
|
+
* @param ast Parsed AST (optional)
|
|
133
|
+
* @returns Complexity metrics
|
|
134
|
+
*/
|
|
135
|
+
computeComplexity(source: string, ast?: ASTNode): ComplexityMetrics;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/languages/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;CACpB;AAID,qCAAqC;AACrC,MAAM,WAAW,QAAQ;IACvB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;CACvB;AAID,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAID;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAE/B,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAE9B;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;;;;OAKG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,CAAC;IAE5D;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;IAExD;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE1D;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAEpD;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/languages/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/languages/typescript/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/languages/typescript/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript / JavaScript Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Uses oxc-parser for fast AST parsing (Tier 1).
|
|
5
|
+
* Provides import/call extraction, complexity metrics, and built-in module detection.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
import type { SupportedLanguage } from '../../types.js';
|
|
10
|
+
import type { LanguageAdapter, ASTNode, ImportInfo, CallInfo, PackageVerifyResult, DeprecatedInfo, ComplexityMetrics } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* TypeScriptAdapter — LanguageAdapter implementation for TypeScript and JavaScript.
|
|
13
|
+
*
|
|
14
|
+
* Covers: .ts, .tsx, .js, .jsx, .mts, .cts, .mjs, .cjs
|
|
15
|
+
*/
|
|
16
|
+
export declare class TypeScriptAdapter implements LanguageAdapter {
|
|
17
|
+
readonly id: SupportedLanguage;
|
|
18
|
+
readonly extensions: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Parse source code using oxc-parser.
|
|
21
|
+
*/
|
|
22
|
+
parse(source: string, filePath: string): Promise<ASTNode>;
|
|
23
|
+
/**
|
|
24
|
+
* Extract import/require statements using regex (fast, works without AST).
|
|
25
|
+
* This is a robust regex-based approach that matches the existing detector logic.
|
|
26
|
+
*/
|
|
27
|
+
extractImports(source: string, _ast?: ASTNode): ImportInfo[];
|
|
28
|
+
/**
|
|
29
|
+
* Extract function/method calls using regex.
|
|
30
|
+
* This is a lightweight extraction — AST-based extraction can be added later.
|
|
31
|
+
*/
|
|
32
|
+
extractCalls(source: string, _ast?: ASTNode): CallInfo[];
|
|
33
|
+
/**
|
|
34
|
+
* Verify if an npm package exists.
|
|
35
|
+
* Uses HEAD request to registry.npmjs.org.
|
|
36
|
+
* Note: This is a placeholder — actual HTTP verification will be done
|
|
37
|
+
* in DeepHallucinationDetector (Phase 2).
|
|
38
|
+
*/
|
|
39
|
+
verifyPackage(name: string): Promise<PackageVerifyResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if an API is deprecated.
|
|
42
|
+
* Placeholder — real deprecated-apis.json will be added in Phase 2 (StaleAPIDetector).
|
|
43
|
+
*/
|
|
44
|
+
checkDeprecated(_api: string): DeprecatedInfo | null;
|
|
45
|
+
/**
|
|
46
|
+
* Compute complexity metrics for a TypeScript/JavaScript file.
|
|
47
|
+
* Uses simple heuristic counting — AST-based metrics in Phase 2.
|
|
48
|
+
*/
|
|
49
|
+
computeComplexity(source: string, _ast?: ASTNode): ComplexityMetrics;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/languages/typescript/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAkCrB;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAgB;IAC9C,QAAQ,CAAC,UAAU,WAAkE;IAErF;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU/D;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE;IAwH5D;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE;IAiDxD;;;;;OAKG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAU/D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAIpD;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,iBAAiB;CAmDrE"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript / JavaScript Language Adapter
|
|
3
|
+
*
|
|
4
|
+
* Uses oxc-parser for fast AST parsing (Tier 1).
|
|
5
|
+
* Provides import/call extraction, complexity metrics, and built-in module detection.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.0
|
|
8
|
+
*/
|
|
9
|
+
// ─── Node.js Built-in Modules ───
|
|
10
|
+
const NODE_BUILTINS = new Set([
|
|
11
|
+
'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console',
|
|
12
|
+
'constants', 'crypto', 'dgram', 'diagnostics_channel', 'dns', 'domain',
|
|
13
|
+
'events', 'fs', 'http', 'http2', 'https', 'inspector', 'module', 'net',
|
|
14
|
+
'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring',
|
|
15
|
+
'readline', 'repl', 'stream', 'string_decoder', 'test', 'timers',
|
|
16
|
+
'tls', 'trace_events', 'tty', 'url', 'util', 'v8', 'vm',
|
|
17
|
+
'wasi', 'worker_threads', 'zlib',
|
|
18
|
+
// Subpath imports
|
|
19
|
+
'fs/promises', 'stream/promises', 'timers/promises',
|
|
20
|
+
'dns/promises', 'readline/promises',
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* Check if a module specifier refers to a Node.js built-in.
|
|
24
|
+
*/
|
|
25
|
+
function isNodeBuiltin(specifier) {
|
|
26
|
+
if (specifier.startsWith('node:')) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return NODE_BUILTINS.has(specifier);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if an import specifier is a relative path.
|
|
33
|
+
*/
|
|
34
|
+
function isRelativeImport(specifier) {
|
|
35
|
+
return specifier.startsWith('.') || specifier.startsWith('/');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* TypeScriptAdapter — LanguageAdapter implementation for TypeScript and JavaScript.
|
|
39
|
+
*
|
|
40
|
+
* Covers: .ts, .tsx, .js, .jsx, .mts, .cts, .mjs, .cjs
|
|
41
|
+
*/
|
|
42
|
+
export class TypeScriptAdapter {
|
|
43
|
+
id = 'typescript';
|
|
44
|
+
extensions = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.mjs', '.cjs'];
|
|
45
|
+
/**
|
|
46
|
+
* Parse source code using oxc-parser.
|
|
47
|
+
*/
|
|
48
|
+
async parse(source, filePath) {
|
|
49
|
+
const { parseSync } = await import('oxc-parser');
|
|
50
|
+
const result = parseSync(filePath, source);
|
|
51
|
+
if (result.errors && result.errors.length > 0) {
|
|
52
|
+
// Non-fatal: return program even with parse errors
|
|
53
|
+
// Detectors can check for errors separately
|
|
54
|
+
}
|
|
55
|
+
return result.program;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Extract import/require statements using regex (fast, works without AST).
|
|
59
|
+
* This is a robust regex-based approach that matches the existing detector logic.
|
|
60
|
+
*/
|
|
61
|
+
extractImports(source, _ast) {
|
|
62
|
+
const imports = [];
|
|
63
|
+
const lines = source.split('\n');
|
|
64
|
+
for (let i = 0; i < lines.length; i++) {
|
|
65
|
+
const line = lines[i];
|
|
66
|
+
const lineNum = i + 1;
|
|
67
|
+
// ES import: import { a, b } from 'module'
|
|
68
|
+
// ES import: import name from 'module'
|
|
69
|
+
// ES import: import * as name from 'module'
|
|
70
|
+
const esMatch = line.match(/import\s+(?:(?:\{([^}]*)\}|(\w+)|\*\s+as\s+(\w+))(?:\s*,\s*(?:\{([^}]*)\}|(\w+)|\*\s+as\s+(\w+)))?\s+from\s+)?['"]([^'"]+)['"]/);
|
|
71
|
+
if (esMatch) {
|
|
72
|
+
const mod = esMatch[7];
|
|
73
|
+
const bindings = [];
|
|
74
|
+
// Named imports: { a, b as c }
|
|
75
|
+
for (const group of [esMatch[1], esMatch[4]]) {
|
|
76
|
+
if (group) {
|
|
77
|
+
group.split(',').forEach(s => {
|
|
78
|
+
const name = s.trim().split(/\s+as\s+/).pop()?.trim();
|
|
79
|
+
if (name)
|
|
80
|
+
bindings.push(name);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Default import
|
|
85
|
+
if (esMatch[2])
|
|
86
|
+
bindings.push(esMatch[2]);
|
|
87
|
+
if (esMatch[5])
|
|
88
|
+
bindings.push(esMatch[5]);
|
|
89
|
+
// Namespace import
|
|
90
|
+
if (esMatch[3])
|
|
91
|
+
bindings.push(esMatch[3]);
|
|
92
|
+
if (esMatch[6])
|
|
93
|
+
bindings.push(esMatch[6]);
|
|
94
|
+
imports.push({
|
|
95
|
+
module: mod,
|
|
96
|
+
bindings,
|
|
97
|
+
line: lineNum,
|
|
98
|
+
isRelative: isRelativeImport(mod),
|
|
99
|
+
isBuiltin: isNodeBuiltin(mod),
|
|
100
|
+
});
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Side-effect import: import 'module'
|
|
104
|
+
const sideEffectMatch = line.match(/import\s+['"]([^'"]+)['"]/);
|
|
105
|
+
if (sideEffectMatch) {
|
|
106
|
+
imports.push({
|
|
107
|
+
module: sideEffectMatch[1],
|
|
108
|
+
bindings: [],
|
|
109
|
+
line: lineNum,
|
|
110
|
+
isRelative: isRelativeImport(sideEffectMatch[1]),
|
|
111
|
+
isBuiltin: isNodeBuiltin(sideEffectMatch[1]),
|
|
112
|
+
});
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Dynamic import: import('module')
|
|
116
|
+
const dynamicMatch = line.match(/import\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
117
|
+
if (dynamicMatch) {
|
|
118
|
+
imports.push({
|
|
119
|
+
module: dynamicMatch[1],
|
|
120
|
+
bindings: [],
|
|
121
|
+
line: lineNum,
|
|
122
|
+
isRelative: isRelativeImport(dynamicMatch[1]),
|
|
123
|
+
isBuiltin: isNodeBuiltin(dynamicMatch[1]),
|
|
124
|
+
});
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// CommonJS: const { a, b } = require('module')
|
|
128
|
+
const cjsDestructMatch = line.match(/(?:const|let|var)\s+\{([^}]*)\}\s*=\s*require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
129
|
+
if (cjsDestructMatch) {
|
|
130
|
+
const bindings = cjsDestructMatch[1]
|
|
131
|
+
.split(',')
|
|
132
|
+
.map(s => s.trim().split(/\s+as\s+/).pop()?.trim())
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
imports.push({
|
|
135
|
+
module: cjsDestructMatch[2],
|
|
136
|
+
bindings,
|
|
137
|
+
line: lineNum,
|
|
138
|
+
isRelative: isRelativeImport(cjsDestructMatch[2]),
|
|
139
|
+
isBuiltin: isNodeBuiltin(cjsDestructMatch[2]),
|
|
140
|
+
});
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// CommonJS: const name = require('module')
|
|
144
|
+
const cjsMatch = line.match(/(?:const|let|var)\s+(\w+)\s*=\s*require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
145
|
+
if (cjsMatch) {
|
|
146
|
+
imports.push({
|
|
147
|
+
module: cjsMatch[2],
|
|
148
|
+
bindings: [cjsMatch[1]],
|
|
149
|
+
line: lineNum,
|
|
150
|
+
isRelative: isRelativeImport(cjsMatch[2]),
|
|
151
|
+
isBuiltin: isNodeBuiltin(cjsMatch[2]),
|
|
152
|
+
});
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Bare require: require('module')
|
|
156
|
+
const bareRequireMatch = line.match(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
|
|
157
|
+
if (bareRequireMatch && !cjsDestructMatch && !cjsMatch) {
|
|
158
|
+
imports.push({
|
|
159
|
+
module: bareRequireMatch[1],
|
|
160
|
+
bindings: [],
|
|
161
|
+
line: lineNum,
|
|
162
|
+
isRelative: isRelativeImport(bareRequireMatch[1]),
|
|
163
|
+
isBuiltin: isNodeBuiltin(bareRequireMatch[1]),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return imports;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Extract function/method calls using regex.
|
|
171
|
+
* This is a lightweight extraction — AST-based extraction can be added later.
|
|
172
|
+
*/
|
|
173
|
+
extractCalls(source, _ast) {
|
|
174
|
+
const calls = [];
|
|
175
|
+
const lines = source.split('\n');
|
|
176
|
+
for (let i = 0; i < lines.length; i++) {
|
|
177
|
+
const line = lines[i];
|
|
178
|
+
const lineNum = i + 1;
|
|
179
|
+
// Skip comments
|
|
180
|
+
const trimmed = line.trim();
|
|
181
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Match method calls: obj.method(...)
|
|
185
|
+
const methodCallPattern = /(\w+(?:\.\w+)+)\s*\(/g;
|
|
186
|
+
let match;
|
|
187
|
+
while ((match = methodCallPattern.exec(line)) !== null) {
|
|
188
|
+
calls.push({
|
|
189
|
+
name: match[1],
|
|
190
|
+
line: lineNum,
|
|
191
|
+
column: match.index + 1,
|
|
192
|
+
isMethodCall: true,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// Match standalone function calls: func(...)
|
|
196
|
+
const funcCallPattern = /(?<!\.)(?<!\w)([a-zA-Z_$]\w*)\s*\(/g;
|
|
197
|
+
while ((match = funcCallPattern.exec(line)) !== null) {
|
|
198
|
+
const name = match[1];
|
|
199
|
+
// Skip keywords
|
|
200
|
+
if (['if', 'for', 'while', 'switch', 'catch', 'return', 'throw', 'new',
|
|
201
|
+
'typeof', 'instanceof', 'void', 'delete', 'await', 'yield', 'function',
|
|
202
|
+
'class', 'const', 'let', 'var', 'import', 'export', 'async', 'from',
|
|
203
|
+
'case', 'type', 'interface', 'enum'].includes(name)) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
calls.push({
|
|
207
|
+
name,
|
|
208
|
+
line: lineNum,
|
|
209
|
+
column: match.index + 1,
|
|
210
|
+
isMethodCall: false,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return calls;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Verify if an npm package exists.
|
|
218
|
+
* Uses HEAD request to registry.npmjs.org.
|
|
219
|
+
* Note: This is a placeholder — actual HTTP verification will be done
|
|
220
|
+
* in DeepHallucinationDetector (Phase 2).
|
|
221
|
+
*/
|
|
222
|
+
async verifyPackage(name) {
|
|
223
|
+
// Placeholder: return exists=true for now
|
|
224
|
+
// Real implementation in Phase 2 (DeepHallucinationDetector)
|
|
225
|
+
return {
|
|
226
|
+
name,
|
|
227
|
+
exists: true,
|
|
228
|
+
checkedAt: Date.now(),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Check if an API is deprecated.
|
|
233
|
+
* Placeholder — real deprecated-apis.json will be added in Phase 2 (StaleAPIDetector).
|
|
234
|
+
*/
|
|
235
|
+
checkDeprecated(_api) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Compute complexity metrics for a TypeScript/JavaScript file.
|
|
240
|
+
* Uses simple heuristic counting — AST-based metrics in Phase 2.
|
|
241
|
+
*/
|
|
242
|
+
computeComplexity(source, _ast) {
|
|
243
|
+
const lines = source.split('\n');
|
|
244
|
+
const nonEmptyLines = lines.filter(l => l.trim().length > 0);
|
|
245
|
+
let cyclomatic = 1; // base
|
|
246
|
+
let cognitive = 0;
|
|
247
|
+
let maxNestingDepth = 0;
|
|
248
|
+
let currentDepth = 0;
|
|
249
|
+
let functionCount = 0;
|
|
250
|
+
for (const line of lines) {
|
|
251
|
+
const trimmed = line.trim();
|
|
252
|
+
// Count decision points for cyclomatic complexity
|
|
253
|
+
const decisions = (trimmed.match(/\b(if|else\s+if|for|while|case|catch|\?\?|&&|\|\|)\b/g) || []).length;
|
|
254
|
+
cyclomatic += decisions;
|
|
255
|
+
// Count ternary operators
|
|
256
|
+
const ternaries = (trimmed.match(/\?[^?:]*:/g) || []).length;
|
|
257
|
+
cyclomatic += ternaries;
|
|
258
|
+
// Track nesting depth
|
|
259
|
+
const opens = (trimmed.match(/\{/g) || []).length;
|
|
260
|
+
const closes = (trimmed.match(/\}/g) || []).length;
|
|
261
|
+
currentDepth += opens - closes;
|
|
262
|
+
if (currentDepth > maxNestingDepth) {
|
|
263
|
+
maxNestingDepth = currentDepth;
|
|
264
|
+
}
|
|
265
|
+
// Cognitive complexity: nested conditions add more
|
|
266
|
+
if (/\b(if|for|while|catch)\b/.test(trimmed)) {
|
|
267
|
+
cognitive += 1 + Math.max(0, currentDepth - 1);
|
|
268
|
+
}
|
|
269
|
+
// Count functions
|
|
270
|
+
if (/\b(function|=>)\b/.test(trimmed) || /\b(async\s+)?\w+\s*\(/.test(trimmed)) {
|
|
271
|
+
// Very rough function counter
|
|
272
|
+
if (/(?:function\s+\w+|(?:const|let|var)\s+\w+\s*=\s*(?:async\s*)?\(|(?:async\s+)?(?:get|set)?\s*\w+\s*\([^)]*\)\s*(?::\s*\w+)?\s*\{)/.test(trimmed)) {
|
|
273
|
+
functionCount++;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
cyclomatic,
|
|
279
|
+
cognitive,
|
|
280
|
+
loc: nonEmptyLines.length,
|
|
281
|
+
functionCount,
|
|
282
|
+
maxNestingDepth,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=parser.js.map
|