dependency-cruiser 17.3.2 → 17.3.3-beta-2
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/bin/depcruise-baseline.mjs +43 -43
- package/bin/depcruise-fmt.mjs +89 -89
- package/bin/dependency-cruise.mjs +171 -171
- package/configs/plugins/3d-reporter-plugin.mjs +36 -36
- package/configs/plugins/stats-reporter-plugin.mjs +51 -51
- package/configs/recommended-strict.cjs +5 -5
- package/configs/recommended-warn-only.cjs +5 -5
- package/configs/recommended.cjs +22 -22
- package/configs/rules/no-circular.cjs +10 -10
- package/configs/rules/no-deprecated-core.cjs +10 -10
- package/configs/rules/no-duplicate-dependency-types.cjs +17 -17
- package/configs/rules/no-non-package-json.cjs +11 -11
- package/configs/rules/no-orphans.cjs +18 -18
- package/configs/rules/not-to-deprecated.cjs +10 -10
- package/configs/rules/not-to-unresolvable.cjs +10 -10
- package/package.json +170 -170
- package/src/cache/cache.mjs +139 -139
- package/src/cache/content-strategy.mjs +88 -88
- package/src/cache/find-content-changes.mjs +58 -58
- package/src/cache/helpers.mjs +52 -52
- package/src/cache/metadata-strategy.mjs +83 -83
- package/src/cache/options-compatible.mjs +56 -109
- package/src/cli/assert-node-environment-suitable.mjs +7 -7
- package/src/cli/defaults.mjs +5 -5
- package/src/cli/format-meta-info.mjs +22 -22
- package/src/cli/format.mjs +28 -28
- package/src/cli/index.mjs +145 -145
- package/src/cli/init-config/build-config.mjs +94 -94
- package/src/cli/init-config/environment-helpers.mjs +77 -77
- package/src/cli/init-config/find-extensions.mjs +27 -27
- package/src/cli/init-config/get-user-input.mjs +151 -151
- package/src/cli/init-config/index.mjs +88 -88
- package/src/cli/init-config/normalize-init-options.mjs +47 -47
- package/src/cli/init-config/utl.mjs +4 -4
- package/src/cli/init-config/validators.mjs +10 -10
- package/src/cli/init-config/write-config.mjs +21 -21
- package/src/cli/init-config/write-run-scripts-to-manifest.mjs +103 -107
- package/src/cli/listeners/cli-feedback.mjs +49 -49
- package/src/cli/listeners/ndjson.mjs +66 -66
- package/src/cli/listeners/performance-log/format-helpers.mjs +63 -63
- package/src/cli/listeners/performance-log/handlers.mjs +56 -56
- package/src/cli/listeners/performance-log/index.mjs +37 -37
- package/src/cli/normalize-cli-options.mjs +182 -182
- package/src/cli/tools/wrap-stream-in-html.mjs +37 -37
- package/src/cli/utl/assert-file-existence.mjs +7 -7
- package/src/cli/utl/io.mjs +28 -31
- package/src/config-utl/extract-babel-config.mjs +69 -69
- package/src/config-utl/extract-depcruise-config/index.mjs +54 -54
- package/src/config-utl/extract-depcruise-config/merge-configs.mjs +63 -63
- package/src/config-utl/extract-depcruise-config/read-config.mjs +9 -9
- package/src/config-utl/extract-depcruise-options.mjs +9 -9
- package/src/config-utl/extract-known-violations.mjs +49 -49
- package/src/config-utl/extract-ts-config.mjs +46 -48
- package/src/config-utl/extract-webpack-resolve-config.mjs +88 -88
- package/src/config-utl/make-absolute.mjs +5 -5
- package/src/enrich/add-validations.mjs +13 -13
- package/src/enrich/derive/circular.mjs +49 -49
- package/src/enrich/derive/dependents.mjs +27 -27
- package/src/enrich/derive/folders/aggregate-to-folders.mjs +104 -104
- package/src/enrich/derive/folders/index.mjs +19 -19
- package/src/enrich/derive/folders/utl.mjs +18 -18
- package/src/enrich/derive/metrics/get-module-metrics.mjs +27 -27
- package/src/enrich/derive/metrics/index.mjs +8 -8
- package/src/enrich/derive/module-utl.mjs +18 -18
- package/src/enrich/derive/orphan/index.mjs +18 -18
- package/src/enrich/derive/orphan/is-orphan.mjs +9 -9
- package/src/enrich/derive/reachable.mjs +165 -168
- package/src/enrich/enrich-modules.mjs +25 -25
- package/src/enrich/index.mjs +15 -15
- package/src/enrich/soften-known-violations.mjs +90 -90
- package/src/enrich/summarize/add-rule-set-used.mjs +13 -13
- package/src/enrich/summarize/get-stats.mjs +17 -17
- package/src/enrich/summarize/index.mjs +18 -18
- package/src/enrich/summarize/is-same-violation.mjs +30 -30
- package/src/enrich/summarize/summarize-folders.mjs +35 -35
- package/src/enrich/summarize/summarize-modules.mjs +97 -97
- package/src/enrich/summarize/summarize-options.mjs +71 -71
- package/src/extract/acorn/estree-helpers.mjs +66 -66
- package/src/extract/acorn/extract-amd-deps.mjs +63 -64
- package/src/extract/acorn/extract-cjs-deps.mjs +83 -83
- package/src/extract/acorn/extract-es6-deps.mjs +54 -54
- package/src/extract/acorn/extract-stats.mjs +4 -4
- package/src/extract/acorn/extract.mjs +28 -28
- package/src/extract/acorn/parse.mjs +37 -37
- package/src/extract/clear-caches.mjs +7 -7
- package/src/extract/extract-dependencies.mjs +109 -109
- package/src/extract/extract-stats.mjs +21 -21
- package/src/extract/gather-initial-sources.mjs +64 -64
- package/src/extract/helpers.mjs +73 -71
- package/src/extract/index.mjs +120 -120
- package/src/extract/resolve/determine-dependency-types.mjs +166 -169
- package/src/extract/resolve/external-module-helpers.mjs +76 -76
- package/src/extract/resolve/get-manifest.mjs +79 -79
- package/src/extract/resolve/index.mjs +175 -164
- package/src/extract/resolve/is-built-in.mjs +22 -24
- package/src/extract/resolve/merge-manifests.mjs +43 -43
- package/src/extract/resolve/module-classifiers.mjs +229 -229
- package/src/extract/resolve/resolve-amd.mjs +44 -44
- package/src/extract/resolve/resolve-cjs.mjs +40 -40
- package/src/extract/resolve/resolve-helpers.mjs +20 -20
- package/src/extract/resolve/resolve.mjs +26 -26
- package/src/extract/swc/dependency-visitor.mjs +211 -211
- package/src/extract/swc/extract-swc-deps.mjs +4 -4
- package/src/extract/swc/extract.mjs +7 -7
- package/src/extract/swc/parse.mjs +12 -12
- package/src/extract/transpile/babel-wrap.mjs +9 -9
- package/src/extract/transpile/coffeescript-wrap.mjs +21 -21
- package/src/extract/transpile/index.mjs +47 -47
- package/src/extract/transpile/javascript-wrap.mjs +6 -6
- package/src/extract/transpile/livescript-wrap.mjs +5 -5
- package/src/extract/transpile/meta.mjs +80 -80
- package/src/extract/transpile/svelte-preprocess.mjs +73 -73
- package/src/extract/transpile/svelte-wrap.mjs +19 -19
- package/src/extract/transpile/try-import-available.mjs +26 -27
- package/src/extract/transpile/typescript-wrap.mjs +39 -39
- package/src/extract/transpile/vue-template-wrap.cjs +43 -43
- package/src/extract/tsc/extract-stats.mjs +4 -4
- package/src/extract/tsc/extract-typescript-deps.mjs +429 -398
- package/src/extract/tsc/extract.mjs +22 -22
- package/src/extract/tsc/parse.mjs +21 -21
- package/src/graph-utl/add-focus.mjs +35 -35
- package/src/graph-utl/compare.mjs +24 -24
- package/src/graph-utl/consolidate-module-dependencies.mjs +35 -35
- package/src/graph-utl/consolidate-modules.mjs +33 -33
- package/src/graph-utl/consolidate-to-folder.mjs +13 -13
- package/src/graph-utl/consolidate-to-pattern.mjs +34 -34
- package/src/graph-utl/filter-bank.mjs +74 -69
- package/src/graph-utl/indexed-module-graph.mjs +227 -225
- package/src/graph-utl/match-facade.mjs +3 -3
- package/src/graph-utl/rule-set.mjs +20 -20
- package/src/graph-utl/strip-self-transitions.mjs +6 -6
- package/src/main/cruise.mjs +81 -81
- package/src/main/files-and-dirs/normalize.mjs +7 -7
- package/src/main/format.mjs +11 -14
- package/src/main/helpers.mjs +25 -25
- package/src/main/index.mjs +8 -8
- package/src/main/options/assert-validity.mjs +100 -100
- package/src/main/options/defaults.mjs +11 -11
- package/src/main/options/normalize.mjs +158 -160
- package/src/main/report-wrap.mjs +37 -37
- package/src/main/resolve-options/normalize.mjs +127 -128
- package/src/main/rule-set/assert-validity.mjs +67 -73
- package/src/main/rule-set/normalize.mjs +81 -79
- package/src/meta.cjs +15 -16
- package/src/report/anon/anonymize-path-element.mjs +20 -34
- package/src/report/anon/anonymize-path.mjs +11 -11
- package/src/report/anon/index.mjs +119 -119
- package/src/report/anon/random-string.mjs +23 -23
- package/src/report/azure-devops.mjs +75 -99
- package/src/report/baseline.mjs +9 -9
- package/src/report/csv.mjs +13 -13
- package/src/report/d2.mjs +105 -105
- package/src/report/dot/default-theme.mjs +152 -152
- package/src/report/dot/index.mjs +146 -146
- package/src/report/dot/module-utl.mjs +72 -72
- package/src/report/dot/prepare-custom-level.mjs +20 -20
- package/src/report/dot/prepare-flat-level.mjs +11 -11
- package/src/report/dot/prepare-folder-level.mjs +12 -13
- package/src/report/dot/theming.mjs +73 -73
- package/src/report/dot-webpage/dot-module.mjs +36 -36
- package/src/report/dot-webpage/svg-in-html-snippets/script.cjs +208 -210
- package/src/report/dot-webpage/svg-in-html-snippets/style.css +51 -51
- package/src/report/dot-webpage/wrap-in-html.mjs +7 -7
- package/src/report/error-html/index.mjs +49 -49
- package/src/report/error-html/utl.mjs +99 -99
- package/src/report/error-long.mjs +1 -1
- package/src/report/error.mjs +93 -93
- package/src/report/html/index.mjs +48 -48
- package/src/report/identity.mjs +4 -4
- package/src/report/index.mjs +33 -33
- package/src/report/json.mjs +4 -4
- package/src/report/markdown.mjs +120 -120
- package/src/report/mermaid.mjs +111 -111
- package/src/report/metrics.mjs +185 -185
- package/src/report/null.mjs +4 -4
- package/src/report/plugins.mjs +41 -41
- package/src/report/teamcity.mjs +150 -150
- package/src/report/text.mjs +42 -42
- package/src/report/utl/dependency-to-incidence-transformer.mjs +32 -32
- package/src/report/utl/index.mjs +53 -53
- package/src/schema/configuration.validate.mjs +1 -0
- package/src/schema/cruise-result.validate.mjs +1 -0
- package/src/schema/utl.mjs +6 -0
- package/src/utl/array-util.mjs +25 -25
- package/src/utl/bus.mjs +12 -12
- package/src/utl/extract-root-module-name.cjs +8 -8
- package/src/utl/find-all-files.mjs +54 -54
- package/src/utl/get-extension.mjs +2 -2
- package/src/utl/object-util.mjs +21 -22
- package/src/utl/path-to-posix.mjs +5 -5
- package/src/utl/regex-util.mjs +20 -20
- package/src/utl/try-import.mjs +42 -41
- package/src/utl/try-require.cjs +23 -23
- package/src/utl/wrap-and-indent.mjs +33 -33
- package/src/validate/index.mjs +65 -65
- package/src/validate/match-dependency-rule.mjs +47 -47
- package/src/validate/match-folder-dependency-rule.mjs +27 -27
- package/src/validate/match-module-rule-helpers.mjs +76 -76
- package/src/validate/match-module-rule.mjs +12 -12
- package/src/validate/matchers.mjs +162 -162
- package/src/validate/rule-classifiers.mjs +9 -9
- package/src/validate/violates-required-rule.mjs +23 -23
- package/types/cache-options.d.mts +27 -27
- package/types/config-utl/extract-babel-config.d.mts +1 -1
- package/types/config-utl/extract-depcruise-config.d.mts +3 -3
- package/types/config-utl/extract-depcruise-options.d.mts +1 -1
- package/types/config-utl/extract-ts-config.d.mts +1 -1
- package/types/config-utl/extract-webpack-resolve-config.d.mts +3 -3
- package/types/configuration.d.mts +10 -10
- package/types/cruise-result.d.mts +414 -414
- package/types/dependency-cruiser.d.mts +52 -52
- package/types/filter-types.d.mts +45 -45
- package/types/options.d.mts +430 -430
- package/types/plugins/3d-reporter-plugin.d.mts +9 -9
- package/types/plugins/mermaid-reporter-plugin.d.mts +10 -10
- package/types/plugins/stats-reporter-plugin.d.mts +9 -9
- package/types/reporter-options.d.mts +196 -196
- package/types/resolve-options.d.mts +23 -23
- package/types/restrictions.d.mts +174 -174
- package/types/rule-set.d.mts +132 -132
- package/types/rule-summary.d.mts +14 -14
- package/types/shared-types.d.mts +89 -89
- package/types/strict-filter-types.d.mts +52 -52
- package/types/strict-options.d.mts +34 -34
- package/types/strict-restrictions.d.mts +25 -25
- package/types/strict-rule-set.d.mts +36 -36
- package/types/violations.d.mts +40 -40
- package/src/schema/README.md +0 -5
- package/src/schema/baseline-violations.schema.mjs +0 -1
- package/src/schema/configuration.schema.mjs +0 -1
- package/src/schema/cruise-result.schema.mjs +0 -1
- package/types/README.md +0 -1
|
@@ -6,38 +6,38 @@ const UPPERCASE = 2;
|
|
|
6
6
|
const NOTHING_SPECIAL = 3;
|
|
7
7
|
|
|
8
8
|
function isSeparator(pChar) {
|
|
9
|
-
|
|
9
|
+
const lSeparatorsRe = /[-_.]/;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
return lSeparatorsRe.test(pChar);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
function isUpperCase(pChar) {
|
|
15
|
-
|
|
15
|
+
return pChar.toUpperCase() === pChar;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
function classifyChar(pChar) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
if (/\d/.test(pChar)) return NUMBER;
|
|
20
|
+
if (isSeparator(pChar)) return SEPARATOR;
|
|
21
|
+
if (isUpperCase(pChar)) return UPPERCASE;
|
|
22
|
+
return NOTHING_SPECIAL;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
function getRandomChar(pChar) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
const lLowerCaseChars = "abcdefghijklmnopqrstuvwxyz";
|
|
27
|
+
const lMaxDecimalChar = 9;
|
|
28
|
+
|
|
29
|
+
switch (classifyChar(pChar)) {
|
|
30
|
+
case SEPARATOR:
|
|
31
|
+
return pChar;
|
|
32
|
+
case NUMBER:
|
|
33
|
+
return randomInt(0, lMaxDecimalChar);
|
|
34
|
+
case UPPERCASE:
|
|
35
|
+
return lLowerCaseChars[
|
|
36
|
+
randomInt(0, lLowerCaseChars.length - 1)
|
|
37
|
+
].toUpperCase();
|
|
38
|
+
default:
|
|
39
|
+
return lLowerCaseChars[randomInt(0, lLowerCaseChars.length - 1)];
|
|
40
|
+
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
@@ -54,5 +54,5 @@ function getRandomChar(pChar) {
|
|
|
54
54
|
* @return {string} - a random string with above specs
|
|
55
55
|
*/
|
|
56
56
|
export default function getRandomString(pString) {
|
|
57
|
-
|
|
57
|
+
return Array.from(pString).map(getRandomChar).join("");
|
|
58
58
|
}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { EOL } from "node:os";
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
formatPercentage,
|
|
4
|
+
formatViolation as _formatViolation,
|
|
5
5
|
} from "./utl/index.mjs";
|
|
6
6
|
|
|
7
7
|
const SEVERITY2VSO_TYPE = new Map([
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
["info", "warning"],
|
|
8
|
+
["error", "error"],
|
|
9
|
+
["warn", "warning"],
|
|
10
|
+
// azure devops doesn't seem to know 'info'. We still want to
|
|
11
|
+
// show them, though, hence:
|
|
12
|
+
["info", "warning"],
|
|
14
13
|
]);
|
|
15
14
|
|
|
16
15
|
/**
|
|
@@ -18,7 +17,7 @@ const SEVERITY2VSO_TYPE = new Map([
|
|
|
18
17
|
* @returns {string}
|
|
19
18
|
*/
|
|
20
19
|
function formatSeverity(pSeverity) {
|
|
21
|
-
|
|
20
|
+
return SEVERITY2VSO_TYPE.get(pSeverity) ?? "warning";
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
/**
|
|
@@ -26,7 +25,7 @@ function formatSeverity(pSeverity) {
|
|
|
26
25
|
* @returns {string}
|
|
27
26
|
*/
|
|
28
27
|
function formatModuleViolation(pViolation) {
|
|
29
|
-
|
|
28
|
+
return pViolation.from;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
/**
|
|
@@ -34,7 +33,7 @@ function formatModuleViolation(pViolation) {
|
|
|
34
33
|
* @returns {string}
|
|
35
34
|
*/
|
|
36
35
|
function formatDependencyViolation(pViolation) {
|
|
37
|
-
|
|
36
|
+
return `${pViolation.from} -> ${pViolation.to}`;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
/**
|
|
@@ -42,9 +41,9 @@ function formatDependencyViolation(pViolation) {
|
|
|
42
41
|
* @returns {string}
|
|
43
42
|
*/
|
|
44
43
|
function formatCycleViolation(pViolation) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
return `${pViolation.from} -> ${pViolation.cycle
|
|
45
|
+
.map(({ name }) => name)
|
|
46
|
+
.join(" -> ")}`;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
/**
|
|
@@ -52,9 +51,9 @@ function formatCycleViolation(pViolation) {
|
|
|
52
51
|
* @returns {string}
|
|
53
52
|
*/
|
|
54
53
|
function formatReachabilityViolation(pViolation) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
return `${pViolation.from} -> ${pViolation.to} (via ${pViolation.via
|
|
55
|
+
.map(({ name }) => name)
|
|
56
|
+
.join(" -> ")})`;
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
/**
|
|
@@ -62,11 +61,11 @@ function formatReachabilityViolation(pViolation) {
|
|
|
62
61
|
* @returns {string}
|
|
63
62
|
*/
|
|
64
63
|
function formatInstabilityViolation(pViolation) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
return `${pViolation.from} -> ${
|
|
65
|
+
pViolation.to
|
|
66
|
+
} (instability: ${formatPercentage(
|
|
67
|
+
pViolation.metrics.from.instability,
|
|
68
|
+
)} -> ${formatPercentage(pViolation.metrics.to.instability)})`;
|
|
70
69
|
}
|
|
71
70
|
|
|
72
71
|
/**
|
|
@@ -74,23 +73,23 @@ function formatInstabilityViolation(pViolation) {
|
|
|
74
73
|
* @returns {string}
|
|
75
74
|
*/
|
|
76
75
|
function formatViolation(pViolation) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
76
|
+
const lViolationType2Formatter = {
|
|
77
|
+
module: formatModuleViolation,
|
|
78
|
+
dependency: formatDependencyViolation,
|
|
79
|
+
cycle: formatCycleViolation,
|
|
80
|
+
reachability: formatReachabilityViolation,
|
|
81
|
+
instability: formatInstabilityViolation,
|
|
82
|
+
};
|
|
83
|
+
let lFormattedViolators = _formatViolation(
|
|
84
|
+
pViolation,
|
|
85
|
+
lViolationType2Formatter,
|
|
86
|
+
formatDependencyViolation,
|
|
87
|
+
);
|
|
88
|
+
return `##vso[task.logissue type=${formatSeverity(
|
|
89
|
+
pViolation.rule.severity,
|
|
90
|
+
)};sourcepath=${pViolation.from};code=${
|
|
91
|
+
pViolation.rule.name
|
|
92
|
+
};]${lFormattedViolators}${EOL}`;
|
|
94
93
|
}
|
|
95
94
|
|
|
96
95
|
/**
|
|
@@ -99,7 +98,7 @@ function formatViolation(pViolation) {
|
|
|
99
98
|
* @returns {string}
|
|
100
99
|
*/
|
|
101
100
|
function formatResultStatus(pNumberOfErrors) {
|
|
102
|
-
|
|
101
|
+
return pNumberOfErrors > 0 ? "Failed" : "Succeeded";
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
/**
|
|
@@ -107,16 +106,16 @@ function formatResultStatus(pNumberOfErrors) {
|
|
|
107
106
|
* @returns {string}
|
|
108
107
|
*/
|
|
109
108
|
function formatMeta(pMeta) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
const lWarningCount = pMeta.warn + pMeta.info;
|
|
110
|
+
const lError = `${pMeta.error} error`;
|
|
111
|
+
const lWarn = `${lWarningCount} warning/ informational`;
|
|
112
|
+
const lIgnore = (pMeta?.ignore ?? 0) > 0 ? `, ${pMeta.ignore} ignored` : "";
|
|
114
113
|
|
|
115
|
-
|
|
114
|
+
return `${lError}, ${lWarn}${lIgnore}`;
|
|
116
115
|
}
|
|
117
116
|
|
|
118
117
|
function sumMeta(pMeta) {
|
|
119
|
-
|
|
118
|
+
return pMeta.error + pMeta.warn + pMeta.info;
|
|
120
119
|
}
|
|
121
120
|
|
|
122
121
|
/**
|
|
@@ -124,9 +123,9 @@ function sumMeta(pMeta) {
|
|
|
124
123
|
* @returns {string}
|
|
125
124
|
*/
|
|
126
125
|
function formatIgnoreWarning(pNumberOfIgnored) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
return (pNumberOfIgnored ?? 0) > 0
|
|
127
|
+
? ` - ${pNumberOfIgnored} violations ignored `
|
|
128
|
+
: "";
|
|
130
129
|
}
|
|
131
130
|
|
|
132
131
|
/**
|
|
@@ -134,19 +133,19 @@ function formatIgnoreWarning(pNumberOfIgnored) {
|
|
|
134
133
|
* @returns {string}
|
|
135
134
|
*/
|
|
136
135
|
function formatResultMessage(pSummary) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
136
|
+
let lStatSummary = `${pSummary.totalCruised} modules, ${
|
|
137
|
+
pSummary?.totalDependenciesCruised ?? 0
|
|
138
|
+
} dependencies cruised`;
|
|
139
|
+
|
|
140
|
+
if (sumMeta(pSummary) > 0) {
|
|
141
|
+
return `${sumMeta(pSummary)} dependency violations (${formatMeta(
|
|
142
|
+
pSummary,
|
|
143
|
+
)}). ${lStatSummary}`;
|
|
144
|
+
} else {
|
|
145
|
+
return `no dependency violations found${formatIgnoreWarning(
|
|
146
|
+
pSummary.ignore,
|
|
147
|
+
)} (${lStatSummary})`;
|
|
148
|
+
}
|
|
150
149
|
}
|
|
151
150
|
|
|
152
151
|
/**
|
|
@@ -154,9 +153,9 @@ function formatResultMessage(pSummary) {
|
|
|
154
153
|
* @returns {string}
|
|
155
154
|
*/
|
|
156
155
|
function formatSummary(pSummary) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
156
|
+
return `##vso[task.complete result=${formatResultStatus(
|
|
157
|
+
pSummary.error,
|
|
158
|
+
)};]${formatResultMessage(pSummary)}${EOL}`;
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
/**
|
|
@@ -172,38 +171,15 @@ function formatSummary(pSummary) {
|
|
|
172
171
|
*/
|
|
173
172
|
// eslint-disable-next-line unicorn/prevent-abbreviations
|
|
174
173
|
export default function azureDevOps(pResults) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
174
|
+
const lViolations = (pResults?.summary?.violations ?? []).filter(
|
|
175
|
+
(pViolation) => pViolation.rule.severity !== "ignore",
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
output: lViolations
|
|
180
|
+
.map(formatViolation)
|
|
181
|
+
.join("")
|
|
182
|
+
.concat(formatSummary(pResults.summary)),
|
|
183
|
+
exitCode: pResults.summary.error,
|
|
184
|
+
};
|
|
186
185
|
}
|
|
187
|
-
|
|
188
|
-
/*
|
|
189
|
-
Some notes from the documentation over at https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash#task-commands
|
|
190
|
-
|
|
191
|
-
Warnings and errors:
|
|
192
|
-
|
|
193
|
-
##vso[task.logissue type=warning;sourcepath=consoleapp/main.cs;linenumber=1;columnnumber=1;code=100;]Found something that could be a problem.
|
|
194
|
-
|
|
195
|
-
Progress
|
|
196
|
-
##vso[task.setprogress]current operation
|
|
197
|
-
|
|
198
|
-
Complete
|
|
199
|
-
##vso[task.complete]current operation
|
|
200
|
-
|
|
201
|
-
Message grouping
|
|
202
|
-
##[group]Beginning of a group
|
|
203
|
-
##[warning]Warning message
|
|
204
|
-
##[error]Error message
|
|
205
|
-
##[section]Start of a section
|
|
206
|
-
##[debug]Debug text
|
|
207
|
-
##[command]Command-line being run
|
|
208
|
-
##[endgroup]
|
|
209
|
-
*/
|
package/src/report/baseline.mjs
CHANGED
|
@@ -12,13 +12,13 @@ const EOL = "\n";
|
|
|
12
12
|
* exitCode: 0
|
|
13
13
|
*/
|
|
14
14
|
export default function baseline(pCruiseResult) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
return {
|
|
16
|
+
output:
|
|
17
|
+
JSON.stringify(
|
|
18
|
+
pCruiseResult.summary.violations,
|
|
19
|
+
null,
|
|
20
|
+
DEFAULT_JSON_INDENT,
|
|
21
|
+
) + EOL,
|
|
22
|
+
exitCode: 0,
|
|
23
|
+
};
|
|
24
24
|
}
|
package/src/report/csv.mjs
CHANGED
|
@@ -2,24 +2,24 @@ import { EOL } from "node:os";
|
|
|
2
2
|
import dependencyToIncidenceTransformer from "./utl/dependency-to-incidence-transformer.mjs";
|
|
3
3
|
|
|
4
4
|
function renderHeader(pModules) {
|
|
5
|
-
|
|
5
|
+
return pModules.map((pModule) => `"${pModule.source}"`).join(",");
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
function mapIncidences(pIncidences) {
|
|
9
|
-
|
|
9
|
+
return pIncidences.map((pIncidence) => `"${pIncidence.incidence}"`).join(",");
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
function renderBody(pModules) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
return pModules
|
|
14
|
+
.map(
|
|
15
|
+
(pModule) =>
|
|
16
|
+
`"${pModule.source}",${mapIncidences(pModule.incidences)},""`,
|
|
17
|
+
)
|
|
18
|
+
.join(EOL);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
function report(pModules) {
|
|
22
|
-
|
|
22
|
+
return `"",${renderHeader(pModules)},""${EOL}${renderBody(pModules)}${EOL}`;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -30,8 +30,8 @@ function report(pModules) {
|
|
|
30
30
|
* @returns {import("../../types/dependency-cruiser.js").IReporterOutput}
|
|
31
31
|
*/
|
|
32
32
|
export default function csv(pResults) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
return {
|
|
34
|
+
output: report(dependencyToIncidenceTransformer(pResults.modules)),
|
|
35
|
+
exitCode: 0,
|
|
36
|
+
};
|
|
37
37
|
}
|
package/src/report/d2.mjs
CHANGED
|
@@ -3,9 +3,9 @@ import { basename, dirname } from "node:path";
|
|
|
3
3
|
import { getURLForModule } from "./utl/index.mjs";
|
|
4
4
|
|
|
5
5
|
const severity2color = new Map([
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
["error", "red"],
|
|
7
|
+
["warn", "orange"],
|
|
8
|
+
["info", "blue"],
|
|
9
9
|
]);
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -13,21 +13,21 @@ const severity2color = new Map([
|
|
|
13
13
|
* @returns {string}
|
|
14
14
|
*/
|
|
15
15
|
function getMaxSeverity(pRules) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
16
|
+
const lSeverity2Number = new Map([
|
|
17
|
+
// eslint-disable-next-line no-magic-numbers
|
|
18
|
+
["error", 3],
|
|
19
|
+
// eslint-disable-next-line no-magic-numbers
|
|
20
|
+
["warn", 2],
|
|
21
|
+
["info", 1],
|
|
22
|
+
]);
|
|
23
|
+
return pRules
|
|
24
|
+
.map((pRule) => pRule.severity)
|
|
25
|
+
.reduce((pMax, pCurrent) => {
|
|
26
|
+
return (lSeverity2Number.get(pMax) ?? 0) >
|
|
27
|
+
(lSeverity2Number.get(pCurrent) ?? 0)
|
|
28
|
+
? pMax
|
|
29
|
+
: pCurrent;
|
|
30
|
+
});
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -35,15 +35,15 @@ function getMaxSeverity(pRules) {
|
|
|
35
35
|
* @return {string}
|
|
36
36
|
*/
|
|
37
37
|
function getVertexName(pSource) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
const lFolderName = dirname(pSource)
|
|
39
|
+
.split("/")
|
|
40
|
+
.map((pPart) => `"${pPart}"`)
|
|
41
|
+
.join(".");
|
|
42
|
+
const lBaseName = `"${basename(pSource)}"`;
|
|
43
|
+
if (lFolderName === `"."`) {
|
|
44
|
+
return lBaseName;
|
|
45
|
+
}
|
|
46
|
+
return `${lFolderName}.${lBaseName}`;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -54,38 +54,38 @@ function getVertexName(pSource) {
|
|
|
54
54
|
|
|
55
55
|
// eslint-disable-next-line complexity
|
|
56
56
|
function getModuleAttributes(pModule, pOptions) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
57
|
+
let lReturnValue = "class: module";
|
|
58
|
+
if (pModule.consolidated) {
|
|
59
|
+
lReturnValue = `${lReturnValue}; style.multiple: true`;
|
|
60
|
+
}
|
|
61
|
+
if (
|
|
62
|
+
pModule.matchesFocus ||
|
|
63
|
+
pModule.matchesHighlight ||
|
|
64
|
+
pModule.matchesReaches
|
|
65
|
+
) {
|
|
66
|
+
lReturnValue = `${lReturnValue}; style.fill: yellow`;
|
|
67
|
+
}
|
|
68
|
+
if (pModule.valid === false) {
|
|
69
|
+
lReturnValue = `${lReturnValue}; style.stroke: ${
|
|
70
|
+
severity2color.get(getMaxSeverity(pModule.rules)) ?? "orange"
|
|
71
|
+
}`;
|
|
72
|
+
lReturnValue = `${lReturnValue}; tooltip: "${pModule.rules
|
|
73
|
+
.map((pRule) => pRule.name)
|
|
74
|
+
.join("\\n")}"`;
|
|
75
|
+
}
|
|
76
|
+
if (
|
|
77
|
+
pModule.dependencyTypes?.some((pDependencyType) =>
|
|
78
|
+
pDependencyType.includes("npm"),
|
|
79
|
+
)
|
|
80
|
+
) {
|
|
81
|
+
lReturnValue = `${lReturnValue}; shape: package`;
|
|
82
|
+
}
|
|
83
|
+
lReturnValue = `${lReturnValue}; link: "${getURLForModule(
|
|
84
|
+
pModule,
|
|
85
|
+
pOptions?.prefix,
|
|
86
|
+
pOptions?.suffix,
|
|
87
|
+
)}"`;
|
|
88
|
+
return lReturnValue;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
/**
|
|
@@ -94,25 +94,25 @@ function getModuleAttributes(pModule, pOptions) {
|
|
|
94
94
|
*/
|
|
95
95
|
|
|
96
96
|
function getDependencyAttributes(pDependency) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
97
|
+
let lThing = "";
|
|
98
|
+
if (pDependency.valid === false) {
|
|
99
|
+
lThing =
|
|
100
|
+
`style: {stroke: ${
|
|
101
|
+
severity2color.get(getMaxSeverity(pDependency.rules)) ?? "orange"
|
|
102
|
+
}}; ` +
|
|
103
|
+
`label: "${pDependency.rules.map((pRule) => pRule.name).join("\\n")}"`;
|
|
104
|
+
}
|
|
105
|
+
if (pDependency.circular) {
|
|
106
|
+
lThing = `${
|
|
107
|
+
lThing ? `${lThing};` : lThing
|
|
108
|
+
} target-arrowhead: {shape: circle}`;
|
|
109
|
+
}
|
|
110
|
+
if (pDependency.dynamic) {
|
|
111
|
+
lThing = `${
|
|
112
|
+
lThing ? `${lThing};` : lThing
|
|
113
|
+
} target-arrowhead: {shape: arrow}`;
|
|
114
|
+
}
|
|
115
|
+
return lThing ? `: {${lThing}}` : lThing;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
@@ -120,34 +120,34 @@ function getDependencyAttributes(pDependency) {
|
|
|
120
120
|
* @return {string}
|
|
121
121
|
*/
|
|
122
122
|
function renderD2Source(pCruiseResult) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
123
|
+
const lVertices = pCruiseResult.modules
|
|
124
|
+
.map((pModule) => {
|
|
125
|
+
return `${getVertexName(pModule.source)}: {${getModuleAttributes(
|
|
126
|
+
pModule,
|
|
127
|
+
pCruiseResult.summary.optionsUsed,
|
|
128
|
+
)}}`;
|
|
129
|
+
})
|
|
130
|
+
.join(EOL);
|
|
131
|
+
const lEdges = pCruiseResult.modules
|
|
132
|
+
.flatMap((pModule) => {
|
|
133
|
+
return pModule.dependencies.map((pDependency) => {
|
|
134
|
+
return `${getVertexName(pModule.source)} -> ${getVertexName(
|
|
135
|
+
pDependency.resolved,
|
|
136
|
+
)}${getDependencyAttributes(pDependency)}`;
|
|
137
|
+
});
|
|
138
|
+
})
|
|
139
|
+
.join(EOL);
|
|
140
|
+
const lStyles = `classes: {
|
|
141
141
|
module: {
|
|
142
142
|
height: 30;
|
|
143
143
|
style.border-radius: 10;
|
|
144
144
|
}
|
|
145
145
|
}`;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
return (
|
|
147
|
+
`# modules${EOL}${EOL}${lVertices}${EOL}${EOL}` +
|
|
148
|
+
`# dependencies${EOL}${EOL}${lEdges}${EOL}${EOL}` +
|
|
149
|
+
`# styling${EOL}${EOL}${lStyles}${EOL}`
|
|
150
|
+
);
|
|
151
151
|
}
|
|
152
152
|
/**
|
|
153
153
|
* d2 reporter
|
|
@@ -156,8 +156,8 @@ function renderD2Source(pCruiseResult) {
|
|
|
156
156
|
* @return {import('../../types/dependency-cruiser').IReporterOutput}
|
|
157
157
|
*/
|
|
158
158
|
export default function d2(pCruiseResult) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
return {
|
|
160
|
+
output: renderD2Source(pCruiseResult),
|
|
161
|
+
exitCode: 0,
|
|
162
|
+
};
|
|
163
163
|
}
|