@vyuhlabs/dxkit 2.4.6 → 2.4.8
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/CHANGELOG.md +1076 -0
- package/README.md +132 -27
- package/dist/analysis-result.d.ts +112 -0
- package/dist/analysis-result.d.ts.map +1 -0
- package/dist/analysis-result.js +52 -0
- package/dist/analysis-result.js.map +1 -0
- package/dist/analyzers/bom/detailed.d.ts.map +1 -1
- package/dist/analyzers/bom/detailed.js +19 -0
- package/dist/analyzers/bom/detailed.js.map +1 -1
- package/dist/analyzers/bom/gather.d.ts +27 -26
- package/dist/analyzers/bom/gather.d.ts.map +1 -1
- package/dist/analyzers/bom/gather.js +26 -87
- package/dist/analyzers/bom/gather.js.map +1 -1
- package/dist/analyzers/bom/index.d.ts +0 -7
- package/dist/analyzers/bom/index.d.ts.map +1 -1
- package/dist/analyzers/bom/index.js +98 -48
- package/dist/analyzers/bom/index.js.map +1 -1
- package/dist/analyzers/bom/types.d.ts +11 -13
- package/dist/analyzers/bom/types.d.ts.map +1 -1
- package/dist/analyzers/cache.d.ts +95 -0
- package/dist/analyzers/cache.d.ts.map +1 -0
- package/dist/analyzers/cache.js +309 -0
- package/dist/analyzers/cache.js.map +1 -0
- package/dist/analyzers/coverage-runner.d.ts +56 -0
- package/dist/analyzers/coverage-runner.d.ts.map +1 -0
- package/dist/analyzers/coverage-runner.js +72 -0
- package/dist/analyzers/coverage-runner.js.map +1 -0
- package/dist/analyzers/dashboard/index.d.ts +24 -0
- package/dist/analyzers/dashboard/index.d.ts.map +1 -0
- package/dist/analyzers/dashboard/index.js +667 -0
- package/dist/analyzers/dashboard/index.js.map +1 -0
- package/dist/analyzers/developer/gather.d.ts.map +1 -1
- package/dist/analyzers/developer/gather.js +205 -37
- package/dist/analyzers/developer/gather.js.map +1 -1
- package/dist/analyzers/developer/index.d.ts +1 -1
- package/dist/analyzers/developer/index.d.ts.map +1 -1
- package/dist/analyzers/developer/index.js +21 -9
- package/dist/analyzers/developer/index.js.map +1 -1
- package/dist/analyzers/dispatcher.d.ts +52 -0
- package/dist/analyzers/dispatcher.d.ts.map +1 -1
- package/dist/analyzers/dispatcher.js +92 -9
- package/dist/analyzers/dispatcher.js.map +1 -1
- package/dist/analyzers/docs/shallow.d.ts +17 -5
- package/dist/analyzers/docs/shallow.d.ts.map +1 -1
- package/dist/analyzers/docs/shallow.js +65 -2
- package/dist/analyzers/docs/shallow.js.map +1 -1
- package/dist/analyzers/dx/shallow.d.ts +17 -5
- package/dist/analyzers/dx/shallow.d.ts.map +1 -1
- package/dist/analyzers/dx/shallow.js +66 -2
- package/dist/analyzers/dx/shallow.js.map +1 -1
- package/dist/analyzers/health/actions.d.ts +1 -1
- package/dist/analyzers/health/actions.d.ts.map +1 -1
- package/dist/analyzers/health/actions.js +27 -9
- package/dist/analyzers/health/actions.js.map +1 -1
- package/dist/analyzers/health/detailed.d.ts +2 -1
- package/dist/analyzers/health/detailed.d.ts.map +1 -1
- package/dist/analyzers/health/detailed.js +11 -7
- package/dist/analyzers/health/detailed.js.map +1 -1
- package/dist/analyzers/health.d.ts +27 -0
- package/dist/analyzers/health.d.ts.map +1 -1
- package/dist/analyzers/health.js +282 -34
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/licenses/gather.d.ts +35 -8
- package/dist/analyzers/licenses/gather.d.ts.map +1 -1
- package/dist/analyzers/licenses/gather.js +86 -13
- package/dist/analyzers/licenses/gather.js.map +1 -1
- package/dist/analyzers/licenses/index.d.ts +1 -1
- package/dist/analyzers/licenses/index.d.ts.map +1 -1
- package/dist/analyzers/licenses/index.js +52 -11
- package/dist/analyzers/licenses/index.js.map +1 -1
- package/dist/analyzers/licenses/types.d.ts +15 -0
- package/dist/analyzers/licenses/types.d.ts.map +1 -1
- package/dist/analyzers/maintainability/shallow.d.ts +17 -5
- package/dist/analyzers/maintainability/shallow.d.ts.map +1 -1
- package/dist/analyzers/maintainability/shallow.js +80 -2
- package/dist/analyzers/maintainability/shallow.js.map +1 -1
- package/dist/analyzers/quality/detailed.d.ts.map +1 -1
- package/dist/analyzers/quality/detailed.js +4 -6
- package/dist/analyzers/quality/detailed.js.map +1 -1
- package/dist/analyzers/quality/gather.d.ts +1 -14
- package/dist/analyzers/quality/gather.d.ts.map +1 -1
- package/dist/analyzers/quality/gather.js +48 -137
- package/dist/analyzers/quality/gather.js.map +1 -1
- package/dist/analyzers/quality/index.d.ts +9 -2
- package/dist/analyzers/quality/index.d.ts.map +1 -1
- package/dist/analyzers/quality/index.js +197 -117
- package/dist/analyzers/quality/index.js.map +1 -1
- package/dist/analyzers/quality/shallow.d.ts +50 -5
- package/dist/analyzers/quality/shallow.d.ts.map +1 -1
- package/dist/analyzers/quality/shallow.js +155 -2
- package/dist/analyzers/quality/shallow.js.map +1 -1
- package/dist/analyzers/quality/types.d.ts +14 -0
- package/dist/analyzers/quality/types.d.ts.map +1 -1
- package/dist/analyzers/security/actions.d.ts +11 -4
- package/dist/analyzers/security/actions.d.ts.map +1 -1
- package/dist/analyzers/security/actions.js +87 -37
- package/dist/analyzers/security/actions.js.map +1 -1
- package/dist/analyzers/security/aggregator.d.ts +236 -0
- package/dist/analyzers/security/aggregator.d.ts.map +1 -0
- package/dist/analyzers/security/aggregator.js +349 -0
- package/dist/analyzers/security/aggregator.js.map +1 -0
- package/dist/analyzers/security/detailed.d.ts +2 -2
- package/dist/analyzers/security/detailed.d.ts.map +1 -1
- package/dist/analyzers/security/detailed.js +10 -9
- package/dist/analyzers/security/detailed.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts +104 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +299 -9
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts +15 -0
- package/dist/analyzers/security/index.d.ts.map +1 -1
- package/dist/analyzers/security/index.js +463 -50
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/security/shallow.d.ts +50 -6
- package/dist/analyzers/security/shallow.d.ts.map +1 -1
- package/dist/analyzers/security/shallow.js +154 -2
- package/dist/analyzers/security/shallow.js.map +1 -1
- package/dist/analyzers/security/types.d.ts +51 -0
- package/dist/analyzers/security/types.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.d.ts.map +1 -1
- package/dist/analyzers/tests/detailed.js +2 -3
- package/dist/analyzers/tests/detailed.js.map +1 -1
- package/dist/analyzers/tests/gather.d.ts +2 -1
- package/dist/analyzers/tests/gather.d.ts.map +1 -1
- package/dist/analyzers/tests/gather.js +98 -69
- package/dist/analyzers/tests/gather.js.map +1 -1
- package/dist/analyzers/tests/index.d.ts +11 -2
- package/dist/analyzers/tests/index.d.ts.map +1 -1
- package/dist/analyzers/tests/index.js +83 -18
- package/dist/analyzers/tests/index.js.map +1 -1
- package/dist/analyzers/tests/shallow.d.ts +19 -5
- package/dist/analyzers/tests/shallow.d.ts.map +1 -1
- package/dist/analyzers/tests/shallow.js +89 -2
- package/dist/analyzers/tests/shallow.js.map +1 -1
- package/dist/analyzers/tests/types.d.ts +41 -1
- package/dist/analyzers/tests/types.d.ts.map +1 -1
- package/dist/analyzers/tools/autogen-header.d.ts +8 -0
- package/dist/analyzers/tools/autogen-header.d.ts.map +1 -0
- package/dist/analyzers/tools/autogen-header.js +107 -0
- package/dist/analyzers/tools/autogen-header.js.map +1 -0
- package/dist/analyzers/tools/cloc.d.ts.map +1 -1
- package/dist/analyzers/tools/cloc.js +36 -5
- package/dist/analyzers/tools/cloc.js.map +1 -1
- package/dist/analyzers/tools/deadline.d.ts +67 -0
- package/dist/analyzers/tools/deadline.d.ts.map +1 -0
- package/dist/analyzers/tools/deadline.js +81 -0
- package/dist/analyzers/tools/deadline.js.map +1 -0
- package/dist/analyzers/tools/debug-statements.d.ts +17 -0
- package/dist/analyzers/tools/debug-statements.d.ts.map +1 -0
- package/dist/analyzers/tools/debug-statements.js +58 -0
- package/dist/analyzers/tools/debug-statements.js.map +1 -0
- package/dist/analyzers/tools/default-exclusions.gitignore +28 -0
- package/dist/analyzers/tools/exclusions.d.ts +33 -6
- package/dist/analyzers/tools/exclusions.d.ts.map +1 -1
- package/dist/analyzers/tools/exclusions.js +95 -26
- package/dist/analyzers/tools/exclusions.js.map +1 -1
- package/dist/analyzers/tools/generic.d.ts +17 -2
- package/dist/analyzers/tools/generic.d.ts.map +1 -1
- package/dist/analyzers/tools/generic.js +206 -109
- package/dist/analyzers/tools/generic.js.map +1 -1
- package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
- package/dist/analyzers/tools/gitleaks.js +48 -1
- package/dist/analyzers/tools/gitleaks.js.map +1 -1
- package/dist/analyzers/tools/graphify.d.ts +30 -2
- package/dist/analyzers/tools/graphify.d.ts.map +1 -1
- package/dist/analyzers/tools/graphify.js +131 -15
- package/dist/analyzers/tools/graphify.js.map +1 -1
- package/dist/analyzers/tools/jscpd.d.ts +12 -2
- package/dist/analyzers/tools/jscpd.d.ts.map +1 -1
- package/dist/analyzers/tools/jscpd.js +129 -6
- package/dist/analyzers/tools/jscpd.js.map +1 -1
- package/dist/analyzers/tools/lint-label.d.ts +29 -0
- package/dist/analyzers/tools/lint-label.d.ts.map +1 -0
- package/dist/analyzers/tools/lint-label.js +23 -0
- package/dist/analyzers/tools/lint-label.js.map +1 -0
- package/dist/analyzers/tools/minified-detection.d.ts +9 -0
- package/dist/analyzers/tools/minified-detection.d.ts.map +1 -0
- package/dist/analyzers/tools/minified-detection.js +147 -0
- package/dist/analyzers/tools/minified-detection.js.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts +133 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.js +177 -0
- package/dist/analyzers/tools/nuget-package-reference.js.map +1 -0
- package/dist/analyzers/tools/osv-scanner-deps.d.ts +3 -2
- package/dist/analyzers/tools/osv-scanner-deps.d.ts.map +1 -1
- package/dist/analyzers/tools/osv-scanner-deps.js +32 -14
- package/dist/analyzers/tools/osv-scanner-deps.js.map +1 -1
- package/dist/analyzers/tools/osv.d.ts +36 -0
- package/dist/analyzers/tools/osv.d.ts.map +1 -1
- package/dist/analyzers/tools/osv.js +26 -0
- package/dist/analyzers/tools/osv.js.map +1 -1
- package/dist/analyzers/tools/parallel.d.ts +1 -1
- package/dist/analyzers/tools/parallel.d.ts.map +1 -1
- package/dist/analyzers/tools/parallel.js +2 -2
- package/dist/analyzers/tools/parallel.js.map +1 -1
- package/dist/analyzers/tools/report-date.d.ts +17 -0
- package/dist/analyzers/tools/report-date.d.ts.map +1 -0
- package/dist/analyzers/tools/report-date.js +26 -0
- package/dist/analyzers/tools/report-date.js.map +1 -0
- package/dist/analyzers/tools/risk-score.d.ts +7 -0
- package/dist/analyzers/tools/risk-score.d.ts.map +1 -1
- package/dist/analyzers/tools/risk-score.js +9 -2
- package/dist/analyzers/tools/risk-score.js.map +1 -1
- package/dist/analyzers/tools/run-tests-helper.d.ts +43 -0
- package/dist/analyzers/tools/run-tests-helper.d.ts.map +1 -0
- package/dist/analyzers/tools/run-tests-helper.js +156 -0
- package/dist/analyzers/tools/run-tests-helper.js.map +1 -0
- package/dist/analyzers/tools/runner.d.ts.map +1 -1
- package/dist/analyzers/tools/runner.js +75 -12
- package/dist/analyzers/tools/runner.js.map +1 -1
- package/dist/analyzers/tools/semgrep.d.ts +39 -2
- package/dist/analyzers/tools/semgrep.d.ts.map +1 -1
- package/dist/analyzers/tools/semgrep.js +131 -9
- package/dist/analyzers/tools/semgrep.js.map +1 -1
- package/dist/analyzers/tools/timing.d.ts +17 -3
- package/dist/analyzers/tools/timing.d.ts.map +1 -1
- package/dist/analyzers/tools/timing.js +36 -14
- package/dist/analyzers/tools/timing.js.map +1 -1
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
- package/dist/analyzers/tools/tool-registry.js +11 -1
- package/dist/analyzers/tools/tool-registry.js.map +1 -1
- package/dist/analyzers/tools/tools-unavailable-prose.d.ts +18 -0
- package/dist/analyzers/tools/tools-unavailable-prose.d.ts.map +1 -0
- package/dist/analyzers/tools/tools-unavailable-prose.js +69 -0
- package/dist/analyzers/tools/tools-unavailable-prose.js.map +1 -0
- package/dist/analyzers/tools/upgrade-plan-resolver.d.ts.map +1 -1
- package/dist/analyzers/tools/upgrade-plan-resolver.js +7 -0
- package/dist/analyzers/tools/upgrade-plan-resolver.js.map +1 -1
- package/dist/analyzers/tools/vendored-advisor.d.ts +43 -0
- package/dist/analyzers/tools/vendored-advisor.d.ts.map +1 -0
- package/dist/analyzers/tools/vendored-advisor.js +107 -0
- package/dist/analyzers/tools/vendored-advisor.js.map +1 -0
- package/dist/analyzers/tools/walk-paths.d.ts +78 -0
- package/dist/analyzers/tools/walk-paths.d.ts.map +1 -0
- package/dist/analyzers/tools/walk-paths.js +150 -0
- package/dist/analyzers/tools/walk-paths.js.map +1 -0
- package/dist/analyzers/tools/walk-source-files.d.ts +70 -0
- package/dist/analyzers/tools/walk-source-files.d.ts.map +1 -0
- package/dist/analyzers/tools/walk-source-files.js +369 -0
- package/dist/analyzers/tools/walk-source-files.js.map +1 -0
- package/dist/analyzers/types.d.ts +204 -4
- package/dist/analyzers/types.d.ts.map +1 -1
- package/dist/analyzers/xlsx/bom.d.ts.map +1 -1
- package/dist/analyzers/xlsx/bom.js +8 -1
- package/dist/analyzers/xlsx/bom.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +581 -189
- package/dist/cli.js.map +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +24 -7
- package/dist/detect.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +103 -53
- package/dist/doctor.js.map +1 -1
- package/dist/languages/capabilities/provider.d.ts +130 -1
- package/dist/languages/capabilities/provider.d.ts.map +1 -1
- package/dist/languages/capabilities/types.d.ts +68 -7
- package/dist/languages/capabilities/types.d.ts.map +1 -1
- package/dist/languages/csharp.d.ts +15 -1
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +624 -146
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +89 -11
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/index.d.ts +132 -2
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +207 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/java.d.ts.map +1 -1
- package/dist/languages/java.js +113 -26
- package/dist/languages/java.js.map +1 -1
- package/dist/languages/kotlin.d.ts.map +1 -1
- package/dist/languages/kotlin.js +132 -26
- package/dist/languages/kotlin.js.map +1 -1
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +149 -44
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/ruby.d.ts +39 -1
- package/dist/languages/ruby.d.ts.map +1 -1
- package/dist/languages/ruby.js +178 -44
- package/dist/languages/ruby.js.map +1 -1
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +103 -16
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/types.d.ts +228 -5
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +201 -14
- package/dist/languages/typescript.js.map +1 -1
- package/dist/scoring/dimensions/documentation.d.ts +53 -0
- package/dist/scoring/dimensions/documentation.d.ts.map +1 -0
- package/dist/scoring/dimensions/documentation.js +106 -0
- package/dist/scoring/dimensions/documentation.js.map +1 -0
- package/dist/scoring/dimensions/dx.d.ts +53 -0
- package/dist/scoring/dimensions/dx.d.ts.map +1 -0
- package/dist/scoring/dimensions/dx.js +105 -0
- package/dist/scoring/dimensions/dx.js.map +1 -0
- package/dist/scoring/dimensions/maintainability.d.ts +53 -0
- package/dist/scoring/dimensions/maintainability.d.ts.map +1 -0
- package/dist/scoring/dimensions/maintainability.js +101 -0
- package/dist/scoring/dimensions/maintainability.js.map +1 -0
- package/dist/scoring/dimensions/quality.d.ts +108 -0
- package/dist/scoring/dimensions/quality.d.ts.map +1 -0
- package/dist/scoring/dimensions/quality.js +174 -0
- package/dist/scoring/dimensions/quality.js.map +1 -0
- package/dist/scoring/dimensions/security.d.ts +84 -0
- package/dist/scoring/dimensions/security.d.ts.map +1 -0
- package/dist/scoring/dimensions/security.js +135 -0
- package/dist/scoring/dimensions/security.js.map +1 -0
- package/dist/scoring/dimensions/testing.d.ts +56 -0
- package/dist/scoring/dimensions/testing.d.ts.map +1 -0
- package/dist/scoring/dimensions/testing.js +98 -0
- package/dist/scoring/dimensions/testing.js.map +1 -0
- package/dist/scoring/evaluator.d.ts +27 -0
- package/dist/scoring/evaluator.d.ts.map +1 -0
- package/dist/scoring/evaluator.js +124 -0
- package/dist/scoring/evaluator.js.map +1 -0
- package/dist/scoring/format.d.ts +34 -0
- package/dist/scoring/format.d.ts.map +1 -0
- package/dist/scoring/format.js +63 -0
- package/dist/scoring/format.js.map +1 -0
- package/dist/scoring/index.d.ts +37 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +57 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/overall.d.ts +54 -0
- package/dist/scoring/overall.d.ts.map +1 -0
- package/dist/scoring/overall.js +76 -0
- package/dist/scoring/overall.js.map +1 -0
- package/dist/scoring/result.d.ts +111 -0
- package/dist/scoring/result.d.ts.map +1 -0
- package/dist/scoring/result.js +14 -0
- package/dist/scoring/result.js.map +1 -0
- package/dist/scoring/spec.d.ts +76 -0
- package/dist/scoring/spec.d.ts.map +1 -0
- package/dist/scoring/spec.js +22 -0
- package/dist/scoring/spec.js.map +1 -0
- package/dist/scoring/thresholds.d.ts +56 -0
- package/dist/scoring/thresholds.d.ts.map +1 -0
- package/dist/scoring/thresholds.js +75 -0
- package/dist/scoring/thresholds.js.map +1 -0
- package/dist/tools-cli.d.ts.map +1 -1
- package/dist/tools-cli.js +21 -2
- package/dist/tools-cli.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/.claude/commands/dashboard.md +17 -9
- package/dist/analyzers/scoring.d.ts +0 -49
- package/dist/analyzers/scoring.d.ts.map +0 -1
- package/dist/analyzers/scoring.js +0 -422
- package/dist/analyzers/scoring.js.map +0 -1
- package/dist/analyzers/security/scoring.d.ts +0 -29
- package/dist/analyzers/security/scoring.d.ts.map +0 -1
- package/dist/analyzers/security/scoring.js +0 -40
- package/dist/analyzers/security/scoring.js.map +0 -1
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.graphifyProvider = void 0;
|
|
37
37
|
exports.gatherGraphifyResult = gatherGraphifyResult;
|
|
38
|
+
exports.buildGraphifyEnvelope = buildGraphifyEnvelope;
|
|
38
39
|
/**
|
|
39
40
|
* Graphify integration — deterministic AST extraction via tree-sitter.
|
|
40
41
|
* Layer 2 (optional): requires `pip install graphifyy`.
|
|
@@ -58,8 +59,10 @@ const path = __importStar(require("path"));
|
|
|
58
59
|
const runner_1 = require("./runner");
|
|
59
60
|
const tool_registry_1 = require("./tool-registry");
|
|
60
61
|
const exclusions_1 = require("./exclusions");
|
|
62
|
+
const paths_1 = require("./paths");
|
|
61
63
|
/** Build the graphify Python script with cwd-specific exclusions baked in. */
|
|
62
64
|
function buildGraphifyScript(cwd) {
|
|
65
|
+
const { dirsSet, pathsList, fileGlobsList } = (0, exclusions_1.getPythonExcludeFilter)(cwd);
|
|
63
66
|
return `# Exclusion set derived from src/analyzers/tools/exclusions.ts
|
|
64
67
|
import json, sys, os, tempfile
|
|
65
68
|
from pathlib import Path
|
|
@@ -79,10 +82,65 @@ except ImportError:
|
|
|
79
82
|
|
|
80
83
|
target = Path(sys.argv[1])
|
|
81
84
|
|
|
82
|
-
#
|
|
83
|
-
|
|
85
|
+
# Three-axis exclusion. EXCLUDE_DIRS is basename-only (any path
|
|
86
|
+
# segment matching skips the file). EXCLUDE_PATHS holds multi-segment
|
|
87
|
+
# relative paths from .dxkit-ignore (e.g. 'Dev/Addons/VendorAddon/SAPB1')
|
|
88
|
+
# and matches via substring on the file's relpath. EXCLUDE_FILE_GLOBS
|
|
89
|
+
# carries basename-glob patterns from bundled defaults + .gitignore
|
|
90
|
+
# ('*.min.js', '*.bundle.js', '*.chunk.js', '*.generated.ts', '*.d.ts')
|
|
91
|
+
# so graphify's enumeration matches what dxkit's canonical walker
|
|
92
|
+
# already excludes everywhere else.
|
|
93
|
+
import fnmatch
|
|
94
|
+
EXCLUDE_DIRS = ${dirsSet}
|
|
95
|
+
EXCLUDE_PATHS = ${pathsList}
|
|
96
|
+
EXCLUDE_FILE_GLOBS = ${fileGlobsList}
|
|
97
|
+
|
|
98
|
+
# Bytes-per-line floor above which a file is almost certainly minified
|
|
99
|
+
# / bundled output. Mirrors the heuristic in
|
|
100
|
+
# src/analyzers/tools/minified-detection.ts so graphify's enumeration
|
|
101
|
+
# applies the same filter dxkit's source-file walker does. Web-client's
|
|
102
|
+
# webpack-hash bundle index-j54KQSsm.js carried ~4,606 detected
|
|
103
|
+
# "functions" before this guard — pre-fix the densest-file metric
|
|
104
|
+
# pointed at minified output instead of human-authored code.
|
|
105
|
+
_MINIFIED_BYTES_PER_LINE = 500
|
|
106
|
+
_MINIFIED_SAMPLE_BYTES = 4096
|
|
107
|
+
_MINIFIABLE_EXTS = {'.js', '.jsx', '.mjs', '.cjs', '.css', '.scss', '.sass', '.less'}
|
|
108
|
+
|
|
109
|
+
def _is_likely_minified(f):
|
|
110
|
+
if f.suffix.lower() not in _MINIFIABLE_EXTS:
|
|
111
|
+
return False
|
|
112
|
+
try:
|
|
113
|
+
with open(f, 'rb') as fh:
|
|
114
|
+
buf = fh.read(_MINIFIED_SAMPLE_BYTES)
|
|
115
|
+
if not buf:
|
|
116
|
+
return False
|
|
117
|
+
newlines = buf.count(b'\\n')
|
|
118
|
+
lines_in_sample = max(1, newlines)
|
|
119
|
+
return (len(buf) / lines_in_sample) >= _MINIFIED_BYTES_PER_LINE
|
|
120
|
+
except OSError:
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
def _is_excluded(f):
|
|
124
|
+
if any(seg in EXCLUDE_DIRS for seg in f.parts):
|
|
125
|
+
return True
|
|
126
|
+
name = f.name
|
|
127
|
+
for glob in EXCLUDE_FILE_GLOBS:
|
|
128
|
+
if fnmatch.fnmatchcase(name, glob):
|
|
129
|
+
return True
|
|
130
|
+
if EXCLUDE_PATHS:
|
|
131
|
+
try:
|
|
132
|
+
rel = str(f.relative_to(target)).replace(os.sep, '/')
|
|
133
|
+
except ValueError:
|
|
134
|
+
rel = str(f).replace(os.sep, '/')
|
|
135
|
+
for p in EXCLUDE_PATHS:
|
|
136
|
+
if rel == p or rel.startswith(p + '/') or ('/' + p + '/') in ('/' + rel + '/'):
|
|
137
|
+
return True
|
|
138
|
+
if _is_likely_minified(f):
|
|
139
|
+
return True
|
|
140
|
+
return False
|
|
141
|
+
|
|
84
142
|
all_files = collect_files(target)
|
|
85
|
-
files = [f for f in all_files if not
|
|
143
|
+
files = [f for f in all_files if not _is_excluded(f)]
|
|
86
144
|
if not files:
|
|
87
145
|
print(json.dumps({"error": "no files found"}))
|
|
88
146
|
sys.exit(0)
|
|
@@ -192,15 +250,15 @@ const graphifyOutcomeCache = new Map();
|
|
|
192
250
|
* memoized per-cwd outcome so graphify shells out at most once per
|
|
193
251
|
* analyzer run.
|
|
194
252
|
*/
|
|
195
|
-
function gatherGraphifyResult(cwd) {
|
|
253
|
+
async function gatherGraphifyResult(cwd) {
|
|
196
254
|
const cached = graphifyOutcomeCache.get(cwd);
|
|
197
255
|
if (cached)
|
|
198
256
|
return cached;
|
|
199
|
-
const outcome = computeGraphifyOutcome(cwd);
|
|
257
|
+
const outcome = await computeGraphifyOutcome(cwd);
|
|
200
258
|
graphifyOutcomeCache.set(cwd, outcome);
|
|
201
259
|
return outcome;
|
|
202
260
|
}
|
|
203
|
-
function computeGraphifyOutcome(cwd) {
|
|
261
|
+
async function computeGraphifyOutcome(cwd) {
|
|
204
262
|
const pythonCmd = findPython(cwd);
|
|
205
263
|
if (!pythonCmd)
|
|
206
264
|
return { kind: 'unavailable', reason: 'not installed' };
|
|
@@ -211,17 +269,51 @@ function computeGraphifyOutcome(cwd) {
|
|
|
211
269
|
const scriptDir = fs.mkdtempSync(path.join(os.tmpdir(), 'dxkit-graphify-'));
|
|
212
270
|
const scriptPath = path.join(scriptDir, 'run.py');
|
|
213
271
|
fs.writeFileSync(scriptPath, buildGraphifyScript(cwd));
|
|
214
|
-
//
|
|
215
|
-
//
|
|
216
|
-
|
|
272
|
+
// Spawn-with-process-group so the Python interpreter + any
|
|
273
|
+
// tree-sitter worker subprocesses it starts are all killed
|
|
274
|
+
// atomically on timeout. Pre-fix execSync sent SIGTERM only to
|
|
275
|
+
// the immediate Python child; tree-sitter workers spawned by
|
|
276
|
+
// the script could be orphaned mid-write, which on a large
|
|
277
|
+
// codebase (thousands of .cs files) sometimes left the run
|
|
278
|
+
// looking "no stderr captured" because the process group went
|
|
279
|
+
// away before flushing to the stderr tempfile.
|
|
280
|
+
//
|
|
281
|
+
// runDetached captures stderr natively so the tempfile redirect
|
|
282
|
+
// pattern is no longer needed — same effect, fewer moving parts.
|
|
283
|
+
const outcome = await (0, runner_1.runDetached)(pythonCmd, [scriptPath, cwd], {
|
|
284
|
+
cwd: scriptDir,
|
|
285
|
+
timeoutMs: 300000, // 5 min — bumped from 120000 in 2.4.7 for multi-thousand-file frontend repos
|
|
286
|
+
});
|
|
217
287
|
try {
|
|
218
288
|
fs.rmSync(scriptDir, { recursive: true, force: true });
|
|
219
289
|
}
|
|
220
290
|
catch {
|
|
221
291
|
/* ignore */
|
|
222
292
|
}
|
|
223
|
-
|
|
224
|
-
|
|
293
|
+
const output = outcome.stdout;
|
|
294
|
+
const stderrCapture = outcome.stderr.trim();
|
|
295
|
+
if (!output) {
|
|
296
|
+
if (outcome.timedOut) {
|
|
297
|
+
return {
|
|
298
|
+
kind: 'unavailable',
|
|
299
|
+
reason: 'timed out at 300s (try narrowing scan scope via .dxkit-ignore)',
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
// Surface the first meaningful stderr line so the customer can
|
|
303
|
+
// see what broke (tree-sitter parse error, Python ImportError,
|
|
304
|
+
// OOM kill, etc.). Truncate aggressively — toolsUnavailable[]
|
|
305
|
+
// entries shouldn't carry multi-line tracebacks.
|
|
306
|
+
const firstStderrLine = stderrCapture
|
|
307
|
+
.split('\n')
|
|
308
|
+
.find((l) => l.trim().length > 0)
|
|
309
|
+
?.trim();
|
|
310
|
+
const reason = firstStderrLine
|
|
311
|
+
? `failed: ${firstStderrLine.length > 200 ? firstStderrLine.slice(0, 197) + '...' : firstStderrLine}`
|
|
312
|
+
: outcome.code !== 0 && outcome.code !== null
|
|
313
|
+
? `failed with exit code ${outcome.code} (no stderr captured — likely killed by the OS, e.g. OOM)`
|
|
314
|
+
: 'failed to run (no stderr captured)';
|
|
315
|
+
return { kind: 'unavailable', reason };
|
|
316
|
+
}
|
|
225
317
|
// Graphify prints progress to stdout before the JSON — extract only the JSON line.
|
|
226
318
|
const jsonLine = output
|
|
227
319
|
.split('\n')
|
|
@@ -238,13 +330,29 @@ function computeGraphifyOutcome(cwd) {
|
|
|
238
330
|
}
|
|
239
331
|
if (data.error)
|
|
240
332
|
return { kind: 'unavailable', reason: data.error };
|
|
241
|
-
|
|
333
|
+
return { kind: 'success', envelope: buildGraphifyEnvelope(data, cwd) };
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Pure JSON-to-envelope reshape so the normalization contract is
|
|
337
|
+
* unit-testable without shelling out to Python.
|
|
338
|
+
*
|
|
339
|
+
* The Python helper emits `maxFunctionsFilePath` as an absolute path
|
|
340
|
+
* (`str(Path(...))` on a value derived from `target = sys.argv[1]`).
|
|
341
|
+
* Renderers downstream emit this field verbatim into customer-facing
|
|
342
|
+
* markdown, so it has to be project-relative before it leaves the
|
|
343
|
+
* gather layer — mirrors the gitleaks / semgrep / grep-secrets pattern
|
|
344
|
+
* where each tool wrapper owns its own path normalization.
|
|
345
|
+
*/
|
|
346
|
+
function buildGraphifyEnvelope(data, cwd) {
|
|
347
|
+
return {
|
|
242
348
|
schemaVersion: 1,
|
|
243
349
|
tool: 'graphify',
|
|
244
350
|
functionCount: data.functionCount,
|
|
245
351
|
classCount: data.classCount,
|
|
246
352
|
maxFunctionsInFile: data.maxFunctionsInFile,
|
|
247
|
-
maxFunctionsFilePath: data.maxFunctionsFilePath
|
|
353
|
+
maxFunctionsFilePath: data.maxFunctionsFilePath
|
|
354
|
+
? (0, paths_1.toProjectRelative)(cwd, data.maxFunctionsFilePath)
|
|
355
|
+
: '',
|
|
248
356
|
godNodeCount: data.godNodeCount,
|
|
249
357
|
communityCount: data.communityCount,
|
|
250
358
|
avgCohesion: data.avgCohesion,
|
|
@@ -252,19 +360,27 @@ function computeGraphifyOutcome(cwd) {
|
|
|
252
360
|
deadImportCount: data.deadImportCount,
|
|
253
361
|
commentedCodeRatio: data.commentedCodeRatio,
|
|
254
362
|
};
|
|
255
|
-
return { kind: 'success', envelope };
|
|
256
363
|
}
|
|
257
364
|
/**
|
|
258
365
|
* Capability-shaped provider. Register in
|
|
259
366
|
* `src/languages/capabilities/global.ts:GLOBAL_CAPABILITIES.structural`
|
|
260
367
|
* so the dispatcher picks it up via `providersFor(STRUCTURAL)`.
|
|
261
368
|
*/
|
|
369
|
+
// Exposes the underlying outcome via `gatherOutcome` so the dispatcher
|
|
370
|
+
// captures graphify's actual failure reason (Python missing / graphify
|
|
371
|
+
// package missing / timeout / parse error / empty result) into
|
|
372
|
+
// `DispatchOutcome.skipReasons`. Without it, every failure mode
|
|
373
|
+
// collapses to the same generic prose at the renderer layer, hiding
|
|
374
|
+
// install-vs-runtime distinctions the user would act on differently.
|
|
262
375
|
exports.graphifyProvider = {
|
|
263
376
|
source: 'graphify',
|
|
264
377
|
async gather(cwd) {
|
|
265
|
-
const outcome = gatherGraphifyResult(cwd);
|
|
378
|
+
const outcome = await gatherGraphifyResult(cwd);
|
|
266
379
|
return outcome.kind === 'success' ? outcome.envelope : null;
|
|
267
380
|
},
|
|
381
|
+
async gatherOutcome(cwd) {
|
|
382
|
+
return gatherGraphifyResult(cwd);
|
|
383
|
+
},
|
|
268
384
|
};
|
|
269
385
|
/** Find a working python3 that has graphify installed. Delegates to tool-registry. */
|
|
270
386
|
function findPython(cwd) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../../src/analyzers/tools/graphify.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../../src/analyzers/tools/graphify.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,11 +31,21 @@ export type DuplicationGatherOutcome = {
|
|
|
31
31
|
/**
|
|
32
32
|
* Single source of truth for the jscpd invocation. Consumed by
|
|
33
33
|
* `jscpdProvider` (capability dispatcher).
|
|
34
|
+
*
|
|
35
|
+
* Failure-mode honesty: when jscpd doesn't produce a parseable
|
|
36
|
+
* report, the returned `reason` distinguishes timeout, non-zero
|
|
37
|
+
* exit (with first stderr line), or the rare true "no output"
|
|
38
|
+
* case. Same shape as the semgrep gather — switched from execSync
|
|
39
|
+
* to spawn-with-process-group so jscpd's worker pool (it splits
|
|
40
|
+
* the scan across multiple Node workers internally) isn't killed
|
|
41
|
+
* mid-run when execSync's wall-clock timer fires.
|
|
34
42
|
*/
|
|
35
|
-
export declare function gatherJscpdResult(cwd: string): DuplicationGatherOutcome
|
|
43
|
+
export declare function gatherJscpdResult(cwd: string): Promise<DuplicationGatherOutcome>;
|
|
36
44
|
/**
|
|
37
45
|
* Capability-shaped provider. Registered in
|
|
38
46
|
* `src/languages/capabilities/global.ts:GLOBAL_CAPABILITIES.duplication`.
|
|
39
47
|
*/
|
|
40
|
-
export declare const jscpdProvider: CapabilityProvider<DuplicationResult
|
|
48
|
+
export declare const jscpdProvider: CapabilityProvider<DuplicationResult> & {
|
|
49
|
+
gatherOutcome(cwd: string): Promise<DuplicationGatherOutcome>;
|
|
50
|
+
};
|
|
41
51
|
//# sourceMappingURL=jscpd.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jscpd.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/jscpd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"jscpd.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/jscpd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAuB9F;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA8C5C;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqGtF;AAED;;;GAGG;AAUH,eAAO,MAAM,aAAa,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG;IAClE,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAU/D,CAAC"}
|
|
@@ -14,10 +14,46 @@
|
|
|
14
14
|
* driven derivation keeps adding a new language to a one-line scaffold
|
|
15
15
|
* change rather than a cross-cutting edit here.
|
|
16
16
|
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
17
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
51
|
exports.jscpdProvider = void 0;
|
|
19
52
|
exports.gatherJscpdResult = gatherJscpdResult;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
20
55
|
const languages_1 = require("../../languages");
|
|
56
|
+
const exclusions_1 = require("./exclusions");
|
|
21
57
|
const runner_1 = require("./runner");
|
|
22
58
|
const tool_registry_1 = require("./tool-registry");
|
|
23
59
|
/**
|
|
@@ -65,18 +101,93 @@ function topClonesFrom(duplicates, limit = 15) {
|
|
|
65
101
|
/**
|
|
66
102
|
* Single source of truth for the jscpd invocation. Consumed by
|
|
67
103
|
* `jscpdProvider` (capability dispatcher).
|
|
104
|
+
*
|
|
105
|
+
* Failure-mode honesty: when jscpd doesn't produce a parseable
|
|
106
|
+
* report, the returned `reason` distinguishes timeout, non-zero
|
|
107
|
+
* exit (with first stderr line), or the rare true "no output"
|
|
108
|
+
* case. Same shape as the semgrep gather — switched from execSync
|
|
109
|
+
* to spawn-with-process-group so jscpd's worker pool (it splits
|
|
110
|
+
* the scan across multiple Node workers internally) isn't killed
|
|
111
|
+
* mid-run when execSync's wall-clock timer fires.
|
|
68
112
|
*/
|
|
69
|
-
function gatherJscpdResult(cwd) {
|
|
113
|
+
async function gatherJscpdResult(cwd) {
|
|
70
114
|
const status = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS.jscpd, cwd);
|
|
71
115
|
if (!status.available || !status.path)
|
|
72
116
|
return { kind: 'unavailable', reason: 'not installed' };
|
|
73
117
|
const reportDir = `/tmp/dxkit-jscpd-${Date.now()}`;
|
|
74
118
|
const pattern = buildJscpdPattern();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
119
|
+
// jscpd's `--ignore` receives the union of:
|
|
120
|
+
//
|
|
121
|
+
// 1. dxkit's centralized exclusion set (`getJscpdIgnorePatterns`) —
|
|
122
|
+
// the same dirs / sourcePaths / filePatterns the in-process
|
|
123
|
+
// walkers (cloc, grep, semgrep, graphify's Python filter)
|
|
124
|
+
// honor. Without this, committed-vendored trees that aren't
|
|
125
|
+
// listed in the project's `.gitignore` (the `--gitignore` flag's
|
|
126
|
+
// only input) — minified bundles, hash-versioned webpack
|
|
127
|
+
// chunks, vendored library copies under `public/` — would
|
|
128
|
+
// force jscpd to tokenize them, exhaust heap, and OOM-kill
|
|
129
|
+
// before flushing its JSON report. The report would then read
|
|
130
|
+
// "Duplication unavailable" on the densest repos.
|
|
131
|
+
//
|
|
132
|
+
// 2. Pack-declared autogen patterns (`*.Designer.cs`, WCF
|
|
133
|
+
// `Reference.cs`, MSBuild `*.AssemblyInfo.cs`, etc.) so
|
|
134
|
+
// duplication detection skips the same files generic.ts +
|
|
135
|
+
// test-gaps' source walk already skip. Autogen scaffolding
|
|
136
|
+
// duplicates verbatim by its nature; including it inflates
|
|
137
|
+
// the duplication percentage and points "extract this" advice
|
|
138
|
+
// at code the developer never authored.
|
|
139
|
+
//
|
|
140
|
+
// Patterns get a `**/` prefix so they match at any directory depth.
|
|
141
|
+
const exclusionIgnore = (0, exclusions_1.getJscpdIgnorePatterns)(cwd);
|
|
142
|
+
const autogenIgnore = (0, languages_1.allAutogenSourcePatterns)().map((p) => `**/${p}`);
|
|
143
|
+
const ignorePatterns = [...exclusionIgnore, ...autogenIgnore];
|
|
144
|
+
const args = ['--reporters', 'json', '--output', reportDir, '--gitignore', '--pattern', pattern];
|
|
145
|
+
if (ignorePatterns.length > 0) {
|
|
146
|
+
args.push('--ignore', ignorePatterns.join(','));
|
|
147
|
+
}
|
|
148
|
+
args.push('--min-lines', '5', '--min-tokens', '50', cwd);
|
|
149
|
+
const outcome = await (0, runner_1.runDetached)(status.path, args, { cwd, timeoutMs: 600000 });
|
|
150
|
+
// Read the report file directly. Pre-D-fix this used
|
|
151
|
+
// `run('cat <path>')` which routed through execSync with the default
|
|
152
|
+
// 1MB maxBuffer — jscpd reports on enterprise codebases routinely
|
|
153
|
+
// exceed that (the .NET WinForms benchmark's was 25MB / 395k lines), causing execSync
|
|
154
|
+
// to truncate the output to empty and the gather to misreport
|
|
155
|
+
// jscpd as "unavailable" even after a fully-successful run.
|
|
156
|
+
// Direct file read sidesteps the buffer entirely.
|
|
157
|
+
const reportPath = path.join(reportDir, 'jscpd-report.json');
|
|
158
|
+
let reportRaw;
|
|
159
|
+
try {
|
|
160
|
+
reportRaw = fs.readFileSync(reportPath, 'utf-8');
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
reportRaw = '';
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
fs.rmSync(reportDir, { recursive: true, force: true });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* dir already gone or never written — fine */
|
|
170
|
+
}
|
|
171
|
+
if (!reportRaw) {
|
|
172
|
+
if (outcome.timedOut) {
|
|
173
|
+
return {
|
|
174
|
+
kind: 'unavailable',
|
|
175
|
+
reason: 'timed out at 600s (try narrowing scan scope via .dxkit-ignore)',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const stderrFirstLine = outcome.stderr
|
|
179
|
+
.split('\n')
|
|
180
|
+
.map((l) => l.trim())
|
|
181
|
+
.find((l) => l.length > 0);
|
|
182
|
+
if (outcome.code !== 0 && outcome.code !== null) {
|
|
183
|
+
const ctx = stderrFirstLine ? ` (stderr: ${stderrFirstLine})` : '';
|
|
184
|
+
return { kind: 'unavailable', reason: `exit code ${outcome.code}${ctx}` };
|
|
185
|
+
}
|
|
186
|
+
if (stderrFirstLine) {
|
|
187
|
+
return { kind: 'unavailable', reason: `no output (stderr: ${stderrFirstLine})` };
|
|
188
|
+
}
|
|
79
189
|
return { kind: 'unavailable', reason: 'no output' };
|
|
190
|
+
}
|
|
80
191
|
let data;
|
|
81
192
|
try {
|
|
82
193
|
data = JSON.parse(reportRaw);
|
|
@@ -103,11 +214,23 @@ function gatherJscpdResult(cwd) {
|
|
|
103
214
|
* Capability-shaped provider. Registered in
|
|
104
215
|
* `src/languages/capabilities/global.ts:GLOBAL_CAPABILITIES.duplication`.
|
|
105
216
|
*/
|
|
217
|
+
// Implements the optional `gatherOutcome` channel the dispatcher reads
|
|
218
|
+
// to populate `DispatchOutcome.skipReasons`. Without it, a failed jscpd
|
|
219
|
+
// run collapses to `null` at the gather boundary and the actual failure
|
|
220
|
+
// reason ("not installed" / "timed out at 600s" / "exit code 137" /
|
|
221
|
+
// "no output" / "parse error") is dropped — `availabilityFromOutcome`
|
|
222
|
+
// in health.ts then synthesizes generic prose that conflates
|
|
223
|
+
// install-missing with attempted-but-failed. Exposing the real outcome
|
|
224
|
+
// here lets the report show why jscpd didn't contribute, in jscpd's
|
|
225
|
+
// own words.
|
|
106
226
|
exports.jscpdProvider = {
|
|
107
227
|
source: 'jscpd',
|
|
108
228
|
async gather(cwd) {
|
|
109
|
-
const outcome = gatherJscpdResult(cwd);
|
|
229
|
+
const outcome = await gatherJscpdResult(cwd);
|
|
110
230
|
return outcome.kind === 'success' ? outcome.envelope : null;
|
|
111
231
|
},
|
|
232
|
+
async gatherOutcome(cwd) {
|
|
233
|
+
return gatherJscpdResult(cwd);
|
|
234
|
+
},
|
|
112
235
|
};
|
|
113
236
|
//# sourceMappingURL=jscpd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jscpd.js","sourceRoot":"","sources":["../../../src/analyzers/tools/jscpd.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG
|
|
1
|
+
{"version":3,"file":"jscpd.js","sourceRoot":"","sources":["../../../src/analyzers/tools/jscpd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse the augmented lint tool label produced by the lint dispatcher
|
|
3
|
+
* when one or more language packs returned null silently.
|
|
4
|
+
*
|
|
5
|
+
* Augmented shape: `<tool> (not run: <pack> — <reason>[, <pack> — <reason>])`
|
|
6
|
+
* (the suffix is appended in `analyzeHealth`'s lint augmentation block).
|
|
7
|
+
*
|
|
8
|
+
* The Tools-used footer wants only `<tool>` (anything else reads as
|
|
9
|
+
* "<tool> didn't run because of <pack>"). The Lint coverage gap row
|
|
10
|
+
* wants the inverse — the not-run packs with their per-pack reasons.
|
|
11
|
+
* Centralizing the parse here keeps the two consumers from drifting.
|
|
12
|
+
*/
|
|
13
|
+
export interface ParsedLintLabel {
|
|
14
|
+
/** The tool that actually ran, with the suffix stripped. */
|
|
15
|
+
tool: string;
|
|
16
|
+
/**
|
|
17
|
+
* Raw "not run" contents (the inside of the parenthetical), or null
|
|
18
|
+
* when the label carries no suffix. Form: `<pack> — <reason>[, ...]`.
|
|
19
|
+
*/
|
|
20
|
+
notRunPacks: string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseLintLabel(label: string): ParsedLintLabel;
|
|
23
|
+
/**
|
|
24
|
+
* Convenience: just the tool name, suffix stripped. Equivalent to
|
|
25
|
+
* `parseLintLabel(label).tool`. Common case at Tools-used-footer
|
|
26
|
+
* construction sites.
|
|
27
|
+
*/
|
|
28
|
+
export declare function stripNotRunSuffix(label: string): string;
|
|
29
|
+
//# sourceMappingURL=lint-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-label.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/lint-label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseLintLabel = parseLintLabel;
|
|
4
|
+
exports.stripNotRunSuffix = stripNotRunSuffix;
|
|
5
|
+
const NOT_RUN_RE = /\s*\(not run:\s*([^)]*)\)/;
|
|
6
|
+
function parseLintLabel(label) {
|
|
7
|
+
const match = NOT_RUN_RE.exec(label);
|
|
8
|
+
if (!match)
|
|
9
|
+
return { tool: label.trim(), notRunPacks: null };
|
|
10
|
+
return {
|
|
11
|
+
tool: label.replace(NOT_RUN_RE, '').trim(),
|
|
12
|
+
notRunPacks: match[1].trim() || null,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convenience: just the tool name, suffix stripped. Equivalent to
|
|
17
|
+
* `parseLintLabel(label).tool`. Common case at Tools-used-footer
|
|
18
|
+
* construction sites.
|
|
19
|
+
*/
|
|
20
|
+
function stripNotRunSuffix(label) {
|
|
21
|
+
return parseLintLabel(label).tool;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=lint-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-label.js","sourceRoot":"","sources":["../../../src/analyzers/tools/lint-label.ts"],"names":[],"mappings":";;AAwBA,wCAOC;AAOD,8CAEC;AAlBD,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAE/C,SAAgB,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7D,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;QAC1C,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI;KACrC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when the file at `absPath` looks like minified / bundled
|
|
3
|
+
* output by the bytes-per-line heuristic. Returns false on read
|
|
4
|
+
* errors or for files whose extension isn't in
|
|
5
|
+
* `MINIFIABLE_EXTENSIONS` — over-include is preferable to silently
|
|
6
|
+
* dropping legit source.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isLikelyMinified(absPath: string): boolean;
|
|
9
|
+
//# sourceMappingURL=minified-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minified-detection.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/minified-detection.ts"],"names":[],"mappings":"AAqEA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAgCzD"}
|