@vyuhlabs/dxkit 2.4.6 → 2.4.7
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 +885 -0
- package/README.md +131 -26
- 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 +666 -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 +19 -8
- package/dist/analyzers/developer/index.js.map +1 -1
- package/dist/analyzers/dispatcher.d.ts +37 -0
- package/dist/analyzers/dispatcher.d.ts.map +1 -1
- package/dist/analyzers/dispatcher.js +56 -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 +271 -33
- 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 +70 -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 +189 -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 +347 -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 +103 -1
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +281 -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/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/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 +131 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.js +175 -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/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 +557 -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 +131 -2
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +206 -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
|
@@ -54,9 +54,10 @@ exports.clearExclusionsCache = clearExclusionsCache;
|
|
|
54
54
|
exports.isExcludedPath = isExcludedPath;
|
|
55
55
|
exports.getFindExcludeFlags = getFindExcludeFlags;
|
|
56
56
|
exports.getGrepExcludeDirFlags = getGrepExcludeDirFlags;
|
|
57
|
-
exports.
|
|
57
|
+
exports.getClocExcludeFlags = getClocExcludeFlags;
|
|
58
58
|
exports.getSemgrepExcludeFlags = getSemgrepExcludeFlags;
|
|
59
|
-
exports.
|
|
59
|
+
exports.getJscpdIgnorePatterns = getJscpdIgnorePatterns;
|
|
60
|
+
exports.getPythonExcludeFilter = getPythonExcludeFilter;
|
|
60
61
|
const fs = __importStar(require("fs"));
|
|
61
62
|
const path = __importStar(require("path"));
|
|
62
63
|
/** Memo: one entry per cwd so repeated helper calls don't re-read files. */
|
|
@@ -206,18 +207,33 @@ function getGrepExcludeDirFlags(cwd) {
|
|
|
206
207
|
return dirs.map((d) => `--exclude-dir='${d}'`).join(' ');
|
|
207
208
|
}
|
|
208
209
|
/**
|
|
209
|
-
* Build cloc `--exclude-dir`
|
|
210
|
-
*
|
|
210
|
+
* Build cloc exclusion flags — `--exclude-dir` (basenames) PLUS
|
|
211
|
+
* `--fullpath --not-match-d` (Perl regex on full directory path) for
|
|
212
|
+
* multi-segment sourcePaths.
|
|
213
|
+
*
|
|
214
|
+
* D055 (2.4.7): pre-fix, multi-segment paths in `.dxkit-ignore` were
|
|
215
|
+
* flattened to basenames here, so `Dev/Addons/DPLAddon/SAPB1/` silently
|
|
216
|
+
* became `{Dev, Addons, DPLAddon, SAPB1}` — cloc then excluded EVERY
|
|
217
|
+
* directory named `Dev` in the tree, killing 90% of source visibility
|
|
218
|
+
* on dpl-studio. The split-flag construction preserves the path
|
|
219
|
+
* structure for cloc.
|
|
220
|
+
*
|
|
221
|
+
* The regex is anchored on path-segment boundaries with `(?:^|/)` /
|
|
222
|
+
* `(?:/|$)` so `Dev/Addons/Foo` doesn't accidentally match `Dev/AddonsX`
|
|
223
|
+
* or `XDev/Addons`. Path components are regex-escaped so `.`, `+`, etc.
|
|
224
|
+
* aren't interpreted as metachars.
|
|
211
225
|
*/
|
|
212
|
-
function
|
|
226
|
+
function getClocExcludeFlags(cwd) {
|
|
213
227
|
const { dirs, sourcePaths } = loadExclusions(cwd);
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
228
|
+
const parts = [];
|
|
229
|
+
if (dirs.length > 0) {
|
|
230
|
+
parts.push(`--exclude-dir=${dirs.join(',')}`);
|
|
231
|
+
}
|
|
232
|
+
if (sourcePaths.length > 0) {
|
|
233
|
+
const escaped = sourcePaths.map(escapeRegex);
|
|
234
|
+
parts.push(`--fullpath --not-match-d='(?:^|/)(?:${escaped.join('|')})(?:/|$)'`);
|
|
219
235
|
}
|
|
220
|
-
return
|
|
236
|
+
return parts.join(' ');
|
|
221
237
|
}
|
|
222
238
|
/**
|
|
223
239
|
* Build semgrep `--exclude` flags (one per directory/pattern).
|
|
@@ -229,22 +245,75 @@ function getSemgrepExcludeFlags(cwd) {
|
|
|
229
245
|
const fileFlags = filePatterns.map((p) => `--exclude '${p}'`).join(' ');
|
|
230
246
|
return `${dirFlags} ${fileFlags}`;
|
|
231
247
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
248
|
+
// Build jscpd `--ignore` glob patterns from the centralized exclusion set.
|
|
249
|
+
//
|
|
250
|
+
// jscpd's `--ignore` accepts a comma-separated glob list. Each pattern is
|
|
251
|
+
// prefixed with the recursive-globstar segment so it matches at any
|
|
252
|
+
// directory depth — the same convention `gatherJscpdResult` already uses
|
|
253
|
+
// for autogen patterns.
|
|
254
|
+
//
|
|
255
|
+
// Mapping:
|
|
256
|
+
// - dirs (basenames) → recursive-glob/<name>/recursive-glob
|
|
257
|
+
// - sourcePaths (multi-seg) → recursive-glob/<path>/recursive-glob
|
|
258
|
+
// - filePatterns (globs) → recursive-glob/<glob>
|
|
259
|
+
//
|
|
260
|
+
// Plumbs the same exclusion set the in-process walkers honor (grep, cloc,
|
|
261
|
+
// semgrep, graphify's Python filter) into jscpd's subprocess argument
|
|
262
|
+
// builder. Without this, jscpd only saw the autogen patterns + `--gitignore`,
|
|
263
|
+
// which left it descending into committed-vendored trees that aren't in the
|
|
264
|
+
// project's `.gitignore` — token tables exhaust heap on minified bundles,
|
|
265
|
+
// jscpd gets OOM-killed before flushing its JSON report, and the report
|
|
266
|
+
// reads "Duplication unavailable" on the very repos that need it most.
|
|
267
|
+
//
|
|
268
|
+
// Returns an array so callers can union with tool-specific extras (e.g.
|
|
269
|
+
// `allAutogenSourcePatterns()` in jscpd's wrapper) before joining.
|
|
270
|
+
function getJscpdIgnorePatterns(cwd) {
|
|
271
|
+
const { dirs, sourcePaths, filePatterns } = loadExclusions(cwd);
|
|
272
|
+
const out = [];
|
|
273
|
+
for (const d of dirs) {
|
|
274
|
+
out.push(`**/${d}/**`);
|
|
275
|
+
}
|
|
239
276
|
for (const p of sourcePaths) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
277
|
+
const trimmed = p.replace(/\/+$/, '');
|
|
278
|
+
if (trimmed)
|
|
279
|
+
out.push(`**/${trimmed}/**`);
|
|
280
|
+
}
|
|
281
|
+
for (const f of filePatterns) {
|
|
282
|
+
out.push(`**/${f}`);
|
|
243
283
|
}
|
|
244
|
-
return
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
284
|
+
return out;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Python literals for the graphify walker — emits both a basename set
|
|
288
|
+
* (`EXCLUDE_DIRS`) and a multi-segment path list (`EXCLUDE_PATHS`) so
|
|
289
|
+
* the Python filter can preserve the path structure of multi-segment
|
|
290
|
+
* `.dxkit-ignore` entries.
|
|
291
|
+
*
|
|
292
|
+
* D055 (2.4.7): pre-fix, basenames-only flattening here meant
|
|
293
|
+
* `Dev/Addons/DPLAddon/SAPB1/` became `{Dev, Addons, DPLAddon, SAPB1}`
|
|
294
|
+
* — graphify then skipped every `Dev/` subtree in dpl-studio (10 files
|
|
295
|
+
* walked instead of ~1700, Functions=13). The two-set shape lets the
|
|
296
|
+
* walker check basenames via segment membership AND check paths via
|
|
297
|
+
* substring match on the file's relpath.
|
|
298
|
+
*/
|
|
299
|
+
function getPythonExcludeFilter(cwd) {
|
|
300
|
+
const { dirs, sourcePaths, filePatterns } = loadExclusions(cwd);
|
|
301
|
+
// `set([...])` rather than `{...}` because `{}` is an empty dict in Python.
|
|
302
|
+
const dirsSet = `set([${dirs.map((d) => `'${d}'`).join(', ')}])`;
|
|
303
|
+
const pathsList = '[' + sourcePaths.map((p) => `'${p}'`).join(', ') + ']';
|
|
304
|
+
// File-glob patterns (`*.min.js`, `*.bundle.js`, `*.chunk.js`,
|
|
305
|
+
// `*.generated.ts`, `*.d.ts`). Pre-extension only `dirs` + `sourcePaths`
|
|
306
|
+
// were passed; the graphify walker enumerated every `*.min.js`
|
|
307
|
+
// matching basename and graphify's AST extractor analyzed them.
|
|
308
|
+
// Web-client's densest-file metric ranked
|
|
309
|
+
// `public/3DFileViewer/assets/index-j54KQSsm.js` (a webpack-hash
|
|
310
|
+
// bundle) as 4,606 "functions" — the kind of metric that makes the
|
|
311
|
+
// "split your densest file" recommendation read as a bug to anyone
|
|
312
|
+
// who knows what the file is.
|
|
313
|
+
const fileGlobsList = '[' + filePatterns.map((p) => `'${p}'`).join(', ') + ']';
|
|
314
|
+
return { dirsSet, pathsList, fileGlobsList };
|
|
315
|
+
}
|
|
316
|
+
function escapeRegex(s) {
|
|
317
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
249
318
|
}
|
|
250
319
|
//# sourceMappingURL=exclusions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exclusions.js","sourceRoot":"","sources":["../../../src/analyzers/tools/exclusions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,wCAmBC;AAGD,oDAEC;AA4ED,wCAaC;AAyBD,kDAIC;AAMD,wDAGC;
|
|
1
|
+
{"version":3,"file":"exclusions.js","sourceRoot":"","sources":["../../../src/analyzers/tools/exclusions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic tool runner -- uses grep, find, wc, git (and the canonical
|
|
3
|
+
* walkSourceFiles / countLineMatches helpers for source-line metrics).
|
|
4
|
+
* Works on any Unix machine with no external dependencies.
|
|
5
|
+
* This is Layer 0: always available.
|
|
6
|
+
*/
|
|
1
7
|
import { HealthMetrics } from '../types';
|
|
2
|
-
|
|
3
|
-
|
|
8
|
+
import type { DetectedStack } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Gather metrics using only built-in Unix tools + the canonical walker.
|
|
11
|
+
*
|
|
12
|
+
* `languageFlags` drives the architecturalShape-aware path counters
|
|
13
|
+
* (primary components, route handlers, data models). When omitted
|
|
14
|
+
* (legacy callers, tests) the path counters degrade to zero rather
|
|
15
|
+
* than silently using a hardcoded backend-centric default — every
|
|
16
|
+
* shipped caller in the codebase threads the active stack through.
|
|
17
|
+
*/
|
|
18
|
+
export declare function gatherGenericMetrics(cwd: string, languageFlags?: DetectedStack['languages']): Partial<HealthMetrics>;
|
|
4
19
|
//# sourceMappingURL=generic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/generic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/generic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA+DjD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,aAAa,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GACzC,OAAO,CAAC,aAAa,CAAC,CAiOxB"}
|
|
@@ -34,137 +34,233 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.gatherGenericMetrics = gatherGenericMetrics;
|
|
37
|
-
/**
|
|
38
|
-
* Generic tool runner -- uses grep, find, wc, git.
|
|
39
|
-
* Works on any Unix machine with no external dependencies.
|
|
40
|
-
* This is Layer 0: always available.
|
|
41
|
-
*/
|
|
42
|
-
const fs = __importStar(require("fs"));
|
|
43
37
|
const runner_1 = require("./runner");
|
|
44
38
|
const exclusions_1 = require("./exclusions");
|
|
39
|
+
const walk_source_files_1 = require("./walk-source-files");
|
|
40
|
+
const debug_statements_1 = require("./debug-statements");
|
|
45
41
|
const languages_1 = require("../../languages");
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
// D055/D056/D072 (2.4.7): every per-source-file metric (rawSourceFiles,
|
|
45
|
+
// wc-l walk, jsConsoleCount, anyTypeCount, evalCount, docCommentFiles,
|
|
46
|
+
// tlsDisabledCount, testFiles) routes through walkSourceFiles +
|
|
47
|
+
// countLineMatches. Closes the class of "site-specific walker drift"
|
|
48
|
+
// (D075/D077) and "grep maxBuffer overflow" (D082/D083/D084) by
|
|
49
|
+
// construction: ONE walker, ONE counter, files pruned at the
|
|
50
|
+
// directory boundary so we never read minified .min.js into memory.
|
|
51
|
+
//
|
|
52
|
+
// `EXCLUDE = getFindExcludeFlags(cwd)` is retained below for find
|
|
53
|
+
// commands that count NON-source artifacts (controllers, models,
|
|
54
|
+
// directories, ciConfigCount) — those legitimately walk path
|
|
55
|
+
// patterns the walker doesn't model.
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the git toplevel for `cwd`. D026 (2.4.7): cross-cutting repo
|
|
58
|
+
* artifacts (`.github/`, `README.md`, `CONTRIBUTING.md`, `Makefile`,
|
|
59
|
+
* `.env.example`, etc.) conventionally live at the repo root, not in
|
|
60
|
+
* the subdirectory a user happens to scan. dpl-studio's baseline F8:
|
|
61
|
+
* customer ran `dxkit health Code/Source/`; both Documentation and DX
|
|
62
|
+
* dimensions returned 0/100 because none of those probes found
|
|
63
|
+
* matches in `Code/Source/`. The fix scopes those probes to the
|
|
64
|
+
* git toplevel.
|
|
65
|
+
*
|
|
66
|
+
* Returns `cwd` unchanged when `git rev-parse --show-toplevel` fails
|
|
67
|
+
* (not in a git repo, or git missing) so non-git workflows keep
|
|
68
|
+
* working — they just don't get the toplevel-scoped improvement.
|
|
69
|
+
*/
|
|
70
|
+
function resolveGitToplevel(cwd) {
|
|
71
|
+
const top = (0, runner_1.run)('git rev-parse --show-toplevel 2>/dev/null', cwd).trim();
|
|
72
|
+
return top.length > 0 ? top : cwd;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Count newlines in `content`. Equivalent to `wc -l` semantics:
|
|
76
|
+
* trailing newline NOT double-counted; file with no trailing newline
|
|
77
|
+
* still counts its last line.
|
|
78
|
+
*/
|
|
79
|
+
function lineCount(content) {
|
|
80
|
+
if (content.length === 0)
|
|
81
|
+
return 0;
|
|
82
|
+
let count = 0;
|
|
83
|
+
for (let i = 0; i < content.length; i++) {
|
|
84
|
+
if (content.charCodeAt(i) === 10 /* \n */)
|
|
85
|
+
count++;
|
|
62
86
|
}
|
|
63
|
-
|
|
87
|
+
// No trailing newline → the last partial line was a line too.
|
|
88
|
+
if (content.charCodeAt(content.length - 1) !== 10)
|
|
89
|
+
count++;
|
|
90
|
+
return count;
|
|
64
91
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
// - Rust integration tests under `tests/*.rs` now counted as test
|
|
76
|
-
// files (Rust pack declared `tests/*.rs` as a path-anchored
|
|
77
|
-
// pattern; the legacy used only `-name` and skipped path patterns).
|
|
78
|
-
const SOURCE_EXTS = `\\( ${(0, languages_1.allSourceExtensions)()
|
|
79
|
-
.map((e) => `-name "*${e}"`)
|
|
80
|
-
.join(' -o ')} \\)`;
|
|
81
|
-
const TEST_PATTERNS = (() => {
|
|
82
|
-
const { nameOnly, pathAnchored } = (0, languages_1.splitTestFilePatterns)();
|
|
83
|
-
const nameClauses = nameOnly.map((p) => `-name "${p}"`);
|
|
84
|
-
const pathClauses = pathAnchored.map((p) => `-path "*/${p}"`);
|
|
85
|
-
return `\\( ${[...nameClauses, ...pathClauses].join(' -o ')} \\)`;
|
|
86
|
-
})();
|
|
87
|
-
/** Gather metrics using only built-in Unix tools. */
|
|
88
|
-
function gatherGenericMetrics(cwd) {
|
|
92
|
+
/**
|
|
93
|
+
* Gather metrics using only built-in Unix tools + the canonical walker.
|
|
94
|
+
*
|
|
95
|
+
* `languageFlags` drives the architecturalShape-aware path counters
|
|
96
|
+
* (primary components, route handlers, data models). When omitted
|
|
97
|
+
* (legacy callers, tests) the path counters degrade to zero rather
|
|
98
|
+
* than silently using a hardcoded backend-centric default — every
|
|
99
|
+
* shipped caller in the codebase threads the active stack through.
|
|
100
|
+
*/
|
|
101
|
+
function gatherGenericMetrics(cwd, languageFlags) {
|
|
89
102
|
const EXCLUDE = (0, exclusions_1.getFindExcludeFlags)(cwd);
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
// D026 (2.4.7): repo-level artifacts probed from git toplevel; code-
|
|
104
|
+
// level metrics (source-file counts, hygiene grep, semgrep) stay
|
|
105
|
+
// scoped to `cwd` so analyzing a subdirectory still measures that
|
|
106
|
+
// subdir's code quality.
|
|
107
|
+
const repoRoot = resolveGitToplevel(cwd);
|
|
108
|
+
// ─── Source / test file enumeration ───────────────────────────────────────
|
|
109
|
+
// ONE walker, every consumer routes through it. The walker's filter
|
|
110
|
+
// pipeline already applies: exclusions (.gitignore + .dxkit-ignore +
|
|
111
|
+
// bundled defaults), autogen basename globs (*.designer.cs etc.),
|
|
112
|
+
// autogen header markers (<auto-generated> / @generated / DO NOT EDIT),
|
|
113
|
+
// test-file patterns (per `includeTests`). Memoized per cwd+opts.
|
|
114
|
+
//
|
|
115
|
+
// 2.4.7 class-fix alignment: `sourceFiles` now excludes test files,
|
|
116
|
+
// matching test-gaps' definition. Pre-fix health included tests in
|
|
117
|
+
// `sourceFiles` (D075 same-label-different-meaning class). The
|
|
118
|
+
// Testing dimension's `testRatio = testFiles / sourceFiles` is
|
|
119
|
+
// mathematically equivalent (numerator drops to 0 simultaneously
|
|
120
|
+
// when there's a test file in the denominator), so user-visible
|
|
121
|
+
// scoring is unchanged in practice.
|
|
122
|
+
const sourceList = (0, walk_source_files_1.walkSourceFiles)(cwd);
|
|
123
|
+
const sourceListWithTests = (0, walk_source_files_1.walkSourceFiles)(cwd, { includeTests: true });
|
|
124
|
+
const testList = sourceListWithTests.filter((p) => !sourceList.includes(p));
|
|
125
|
+
// ─── Per-file line counts (replaces find + xargs wc -l) ───────────────────
|
|
126
|
+
// 2.4.7: pure in-process read. Catches the D028-header / autogen
|
|
127
|
+
// filtering at walker-time, so we don't need a second-pass header
|
|
128
|
+
// filter the way the old code did. Also: largestFiles + filesOver500.
|
|
129
|
+
const filteredFiles = [];
|
|
130
|
+
for (const relPath of sourceList) {
|
|
131
|
+
let content;
|
|
132
|
+
try {
|
|
133
|
+
content = fs.readFileSync(path.join(cwd, relPath), 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
filteredFiles.push({ path: relPath, lines: lineCount(content) });
|
|
139
|
+
}
|
|
96
140
|
let totalLines = 0;
|
|
97
141
|
let largestFileLines = 0;
|
|
98
142
|
let largestFilePath = '';
|
|
99
143
|
let filesOver500Lines = 0;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const lines = parseInt(m[1]);
|
|
106
|
-
const file = m[2];
|
|
107
|
-
if (file === 'total') {
|
|
108
|
-
totalLines = lines;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
if (lines > largestFileLines) {
|
|
112
|
-
largestFileLines = lines;
|
|
113
|
-
largestFilePath = file;
|
|
114
|
-
}
|
|
115
|
-
if (lines > 500)
|
|
116
|
-
filesOver500Lines++;
|
|
117
|
-
}
|
|
144
|
+
for (const f of filteredFiles) {
|
|
145
|
+
totalLines += f.lines;
|
|
146
|
+
if (f.lines > largestFileLines) {
|
|
147
|
+
largestFileLines = f.lines;
|
|
148
|
+
largestFilePath = f.path;
|
|
118
149
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
totalLines = largestFileLines;
|
|
150
|
+
if (f.lines > 500)
|
|
151
|
+
filesOver500Lines++;
|
|
122
152
|
}
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
const
|
|
153
|
+
const sourceFiles = sourceList.length;
|
|
154
|
+
const largestFiles = [...filteredFiles].sort((a, b) => b.lines - a.lines).slice(0, 10);
|
|
155
|
+
// ─── Console / debug / type-escape / eval counts (D074 closure) ───────────
|
|
156
|
+
// skipComments: true filters lines beginning with //, /*, or # so
|
|
157
|
+
// commented-out occurrences don't inflate the count.
|
|
158
|
+
//
|
|
159
|
+
// 2.4.7 D079 closure: `consoleLogCount` now routes through the shared
|
|
160
|
+
// `gatherDebugStatements` helper — same implementation in health AND
|
|
161
|
+
// quality, so the two reports cannot drift on this metric. Counts
|
|
162
|
+
// the print family across active languages (TS/JS/Py/Go).
|
|
163
|
+
const consoleLogCount = (0, debug_statements_1.gatherDebugStatements)(cwd).count;
|
|
164
|
+
// TypeScript escape-hatch count.
|
|
165
|
+
const tsFiles = (0, walk_source_files_1.walkSourceFiles)(cwd, {
|
|
166
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx'],
|
|
167
|
+
includeTests: true,
|
|
168
|
+
});
|
|
169
|
+
// prettier-ignore
|
|
170
|
+
const anyTypeCount = (0, walk_source_files_1.countLineMatches)(cwd, tsFiles, [': any'], { skipComments: true }).lines; // slop-ok
|
|
171
|
+
// ─── Documentation ────────────────────────────────────────────────────────
|
|
172
|
+
// D026 (2.4.7): probe from repo root, not from cwd.
|
|
173
|
+
const readmeExists = (0, runner_1.fileExists)(repoRoot, 'README.md', 'readme.md');
|
|
174
|
+
const readmeLines = parseInt((0, runner_1.run)("wc -l README.md 2>/dev/null | awk '{print $1}'", repoRoot)) || 0;
|
|
175
|
+
// D027 (2.4.7): doc-comment regex + include flags derive from the
|
|
176
|
+
// language pack registry. countLineMatches mode='files' returns the
|
|
177
|
+
// file count. NO skipComments here — we explicitly WANT comment lines.
|
|
178
|
+
const docCommentPatterns = (0, languages_1.allDocCommentPatterns)();
|
|
179
|
+
const docCommentFiles = docCommentPatterns.length > 0
|
|
180
|
+
? (0, walk_source_files_1.countLineMatches)(cwd, sourceList, docCommentPatterns, { mode: 'files' }).files
|
|
181
|
+
: 0;
|
|
182
|
+
const apiDocsExist = (0, runner_1.fileExists)(repoRoot, 'openapi.json', 'openapi.yaml', 'swagger.json', 'swagger.yaml');
|
|
183
|
+
const architectureDocsExist = (0, runner_1.fileExists)(repoRoot, 'ARCHITECTURE.md', 'docs/', 'ADR/', 'adr/');
|
|
184
|
+
const contributingExists = (0, runner_1.fileExists)(repoRoot, 'CONTRIBUTING.md');
|
|
185
|
+
const changelogExists = (0, runner_1.fileExists)(repoRoot, 'CHANGELOG.md', 'CHANGES.md');
|
|
186
|
+
// ─── Security (eval + TLS-bypass + cert/key files) ────────────────────────
|
|
187
|
+
// D056 (2.4.7): routed through the canonical counter so .dxkit-ignore /
|
|
188
|
+
// .gitignore / bundled defaults all apply. D074 (2.4.7): skipComments
|
|
189
|
+
// strips commented-out `eval(` and TLS-bypass idioms.
|
|
190
|
+
const evalFiles = (0, walk_source_files_1.walkSourceFiles)(cwd, {
|
|
191
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx', '.py'],
|
|
192
|
+
includeTests: true,
|
|
193
|
+
});
|
|
194
|
+
const evalCount = (0, walk_source_files_1.countLineMatches)(cwd, evalFiles, ['\\beval\\('], {
|
|
195
|
+
skipComments: true,
|
|
196
|
+
}).lines;
|
|
145
197
|
const privateKeyFiles = (0, runner_1.countLines)(`find . \\( -name "*.key" -o -name "*.pem" \\) ${EXCLUDE} 2>/dev/null`, cwd);
|
|
146
198
|
const envFilesInGit = (0, runner_1.countLines)('git ls-files .env .env.* 2>/dev/null', cwd);
|
|
147
|
-
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
199
|
+
// D034 (2.4.7): TLS-bypass detection derives from the pack registry.
|
|
200
|
+
// D074 (2.4.7): skipComments closes the "vuln-scan rendered a
|
|
201
|
+
// `// NODE_TLS_REJECT_UNAUTHORIZED=0` comment as a HIGH finding"
|
|
202
|
+
// false-positive class on platform.
|
|
203
|
+
const tlsBypassPatterns = (0, languages_1.allTlsBypassPatterns)();
|
|
204
|
+
const tlsDisabledCount = tlsBypassPatterns.length > 0
|
|
205
|
+
? (0, walk_source_files_1.countLineMatches)(cwd, sourceList, tlsBypassPatterns, { skipComments: true }).lines
|
|
206
|
+
: 0;
|
|
207
|
+
// ─── Maintainability (per-pack architectural counts) ───────────────────────
|
|
208
|
+
// Primary-component, route-handler, and data-model counts derive
|
|
209
|
+
// from the active language packs' `architecturalShape`. Pre-extension
|
|
210
|
+
// these were three hardcoded find commands keyed on backend-centric
|
|
211
|
+
// paths (`controllers/`, `handlers/`, `views/`, `models/`), so a pure
|
|
212
|
+
// React frontend or a .NET WinForms desktop app reported zero in all
|
|
213
|
+
// three counters regardless of how much primary architecture sat on
|
|
214
|
+
// disk. The walker visit already enumerated every source file; here
|
|
215
|
+
// we filter `sourceList` (pre-walked + autogen-excluded + exclusion-
|
|
216
|
+
// honoured) by case-insensitive substring match against the unioned
|
|
217
|
+
// pack contributions.
|
|
218
|
+
const flags = languageFlags ?? {};
|
|
219
|
+
const primaryPaths = (0, languages_1.allPrimaryComponentPaths)(flags).map((p) => p.toLowerCase());
|
|
220
|
+
const routePaths = (0, languages_1.allRoutePaths)(flags).map((p) => p.toLowerCase());
|
|
221
|
+
const modelPaths = (0, languages_1.allModelPaths)(flags).map((p) => p.toLowerCase());
|
|
222
|
+
const matchesAny = (p, needles) => {
|
|
223
|
+
if (needles.length === 0)
|
|
224
|
+
return false;
|
|
225
|
+
const lower = p.toLowerCase();
|
|
226
|
+
for (const n of needles) {
|
|
227
|
+
if (lower.includes(n))
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
};
|
|
232
|
+
let controllers = 0;
|
|
233
|
+
let routeHandlerFiles = 0;
|
|
234
|
+
let models = 0;
|
|
235
|
+
for (const rel of sourceList) {
|
|
236
|
+
// Match against the path with a leading slash so substring patterns
|
|
237
|
+
// like "/controllers/" anchor on a directory boundary, never on a
|
|
238
|
+
// filename like "controllers-helper.ts" floating outside such a dir.
|
|
239
|
+
const anchored = '/' + rel;
|
|
240
|
+
if (matchesAny(anchored, primaryPaths))
|
|
241
|
+
controllers++;
|
|
242
|
+
if (matchesAny(anchored, routePaths))
|
|
243
|
+
routeHandlerFiles++;
|
|
244
|
+
if (matchesAny(anchored, modelPaths))
|
|
245
|
+
models++;
|
|
246
|
+
}
|
|
151
247
|
const directories = (0, runner_1.countLines)(`find . -type d ${EXCLUDE} 2>/dev/null`, cwd);
|
|
152
|
-
// Developer Experience
|
|
153
|
-
const ciConfigCount = (0, runner_1.countLines)('find .github/workflows -name "*.yml" -o -name "*.yaml" 2>/dev/null; ls .gitlab-ci.yml Jenkinsfile .circleci/config.yml 2>/dev/null',
|
|
154
|
-
const dockerConfigCount = (0, runner_1.countLines)('ls Dockerfile docker-compose.yml docker-compose.yaml .devcontainer/devcontainer.json 2>/dev/null',
|
|
155
|
-
const precommitConfigCount = (0, runner_1.countLines)('ls -d .husky .pre-commit-config.yaml .git/hooks/pre-commit 2>/dev/null',
|
|
156
|
-
const makefileExists = (0, runner_1.fileExists)(
|
|
157
|
-
const envExampleExists = (0, runner_1.fileExists)(
|
|
158
|
-
|
|
159
|
-
const coverageConfigExists = (0, runner_1.fileExists)(cwd, '.nycrc', '.nycrc.json', '.c8rc', '.c8rc.json', 'jest.config.js', 'jest.config.ts', 'vitest.config.ts', 'vitest.config.js', '.coveragerc', 'setup.cfg', 'pytest.ini');
|
|
248
|
+
// ─── Developer Experience (repo-root scoped) ──────────────────────────────
|
|
249
|
+
const ciConfigCount = (0, runner_1.countLines)('find .github/workflows -name "*.yml" -o -name "*.yaml" 2>/dev/null; ls .gitlab-ci.yml Jenkinsfile .circleci/config.yml 2>/dev/null', repoRoot);
|
|
250
|
+
const dockerConfigCount = (0, runner_1.countLines)('ls Dockerfile docker-compose.yml docker-compose.yaml .devcontainer/devcontainer.json 2>/dev/null', repoRoot);
|
|
251
|
+
const precommitConfigCount = (0, runner_1.countLines)('ls -d .husky .pre-commit-config.yaml .git/hooks/pre-commit 2>/dev/null', repoRoot);
|
|
252
|
+
const makefileExists = (0, runner_1.fileExists)(repoRoot, 'Makefile', 'justfile', 'Taskfile.yml');
|
|
253
|
+
const envExampleExists = (0, runner_1.fileExists)(repoRoot, '.env.example', '.env.sample', '.env.template');
|
|
254
|
+
const coverageConfigExists = (0, runner_1.fileExists)(repoRoot, '.nycrc', '.nycrc.json', '.c8rc', '.c8rc.json', 'jest.config.js', 'jest.config.ts', 'vitest.config.ts', 'vitest.config.js', '.coveragerc', 'setup.cfg', 'pytest.ini');
|
|
160
255
|
return {
|
|
161
256
|
sourceFiles,
|
|
162
|
-
testFiles:
|
|
257
|
+
testFiles: testList.length,
|
|
163
258
|
totalLines,
|
|
164
259
|
coverageConfigExists,
|
|
165
260
|
filesOver500Lines,
|
|
166
261
|
largestFileLines,
|
|
167
262
|
largestFilePath,
|
|
263
|
+
largestFiles,
|
|
168
264
|
consoleLogCount,
|
|
169
265
|
anyTypeCount,
|
|
170
266
|
readmeExists,
|
|
@@ -180,6 +276,7 @@ function gatherGenericMetrics(cwd) {
|
|
|
180
276
|
tlsDisabledCount,
|
|
181
277
|
controllers,
|
|
182
278
|
models,
|
|
279
|
+
routeHandlerFiles,
|
|
183
280
|
directories,
|
|
184
281
|
ciConfigCount,
|
|
185
282
|
dockerConfigCount,
|