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
package/src/report/teamcity.mjs
CHANGED
|
@@ -12,26 +12,26 @@ import { formatPercentage, formatViolation } from "./utl/index.mjs";
|
|
|
12
12
|
* @return {String}
|
|
13
13
|
*/
|
|
14
14
|
function escape(pMessageString) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
if (pMessageString === null) {
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
return (
|
|
20
|
+
pMessageString
|
|
21
|
+
.toString()
|
|
22
|
+
.replace(/\|/g, "||")
|
|
23
|
+
.replace(/\n/g, "|n")
|
|
24
|
+
.replace(/\r/g, "|r")
|
|
25
|
+
.replace(/\[/g, "|[")
|
|
26
|
+
.replace(/\]/g, "|]")
|
|
27
|
+
// next line
|
|
28
|
+
.replace(/\u0085/g, "|x")
|
|
29
|
+
// line separator
|
|
30
|
+
.replace(/\u2028/g, "|l")
|
|
31
|
+
// paragraph separator
|
|
32
|
+
.replace(/\u2029/g, "|p")
|
|
33
|
+
.replace(/'/g, "|'")
|
|
34
|
+
);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -43,11 +43,11 @@ function escape(pMessageString) {
|
|
|
43
43
|
* @return {string} a random flowId consisting of 10 numeric digits
|
|
44
44
|
*/
|
|
45
45
|
function getRandomFlowIdBare() {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
const lFlowIdLength = 10;
|
|
47
|
+
// eslint-disable-next-line no-magic-numbers
|
|
48
|
+
const lFlowIdMax = 10 ** lFlowIdLength;
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
return randomInt(1, lFlowIdMax).toString().padStart(lFlowIdLength, "0");
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
const getRandomFlowId = memoize(getRandomFlowIdBare);
|
|
@@ -56,178 +56,178 @@ const getRandomFlowId = memoize(getRandomFlowIdBare);
|
|
|
56
56
|
* Returns a timestamp in ISO format without the trailing 'Z'. It used to be
|
|
57
57
|
* an issue with TeamCity that it didn't use the trailing 'Z' (this is
|
|
58
58
|
* documented in the teamcity-service-messages source code) - not sure whether
|
|
59
|
-
* this is still the case, but
|
|
59
|
+
* this is still the case, but better safe than sorry.
|
|
60
60
|
*
|
|
61
61
|
* @returns {string} a timestamp in ISO format without the trailing 'Z'
|
|
62
62
|
*/
|
|
63
63
|
function getTimeStamp() {
|
|
64
|
-
|
|
64
|
+
return new Date().toISOString().slice(0, -1);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
function inspectionType(pData) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
68
|
+
const lAttributes = [];
|
|
69
|
+
lAttributes.push(
|
|
70
|
+
`id='${pData.id}'`,
|
|
71
|
+
`name='${pData.name}'`,
|
|
72
|
+
`description='${escape(pData.description)}'`,
|
|
73
|
+
`category='${pData.category}'`,
|
|
74
|
+
`flowId='${getRandomFlowId()}'`,
|
|
75
|
+
`timestamp='${getTimeStamp()}'`,
|
|
76
|
+
);
|
|
77
|
+
return `##teamcity[inspectionType ${lAttributes.join(" ")}]`;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
function inspection(pData) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
81
|
+
const lAttributes = [];
|
|
82
|
+
lAttributes.push(
|
|
83
|
+
`typeId='${pData.typeId}'`,
|
|
84
|
+
`message='${escape(pData.message)}'`,
|
|
85
|
+
);
|
|
86
|
+
if (pData.file) {
|
|
87
|
+
lAttributes.push(`file='${pData.file}'`);
|
|
88
|
+
}
|
|
89
|
+
lAttributes.push(
|
|
90
|
+
`SEVERITY='${pData.SEVERITY}'`,
|
|
91
|
+
`flowId='${getRandomFlowId()}'`,
|
|
92
|
+
`timestamp='${getTimeStamp()}'`,
|
|
93
|
+
);
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
return `##teamcity[inspection ${lAttributes.join(" ")}]`;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
const CATEGORY = "dependency-cruiser";
|
|
99
99
|
const SEVERITY2TEAMCITY_SEVERITY = new Map([
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
["error", "ERROR"],
|
|
101
|
+
["warn", "WARNING"],
|
|
102
|
+
["info", "INFO"],
|
|
103
103
|
]);
|
|
104
104
|
const EOL = "\n";
|
|
105
105
|
|
|
106
106
|
function severity2teamcitySeverity(pSeverity) {
|
|
107
|
-
|
|
107
|
+
return SEVERITY2TEAMCITY_SEVERITY.get(pSeverity) || "INFO";
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
function reportRules(pRules, pViolations) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
111
|
+
return pRules
|
|
112
|
+
.filter((pRule) =>
|
|
113
|
+
pViolations.some((pViolation) => pRule.name === pViolation.rule.name),
|
|
114
|
+
)
|
|
115
|
+
.map((pRule) =>
|
|
116
|
+
inspectionType({
|
|
117
|
+
id: pRule.name,
|
|
118
|
+
name: pRule.name,
|
|
119
|
+
description: pRule.comment || pRule.name,
|
|
120
|
+
category: CATEGORY,
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
function reportAllowedRule(pAllowedRule, pViolations) {
|
|
126
|
-
|
|
126
|
+
let lReturnValue = [];
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
128
|
+
if (
|
|
129
|
+
pAllowedRule.length > 0 &&
|
|
130
|
+
pViolations.some((pViolation) => pViolation.rule.name === "not-in-allowed")
|
|
131
|
+
) {
|
|
132
|
+
lReturnValue = inspectionType({
|
|
133
|
+
id: "not-in-allowed",
|
|
134
|
+
name: "not-in-allowed",
|
|
135
|
+
description: "dependency is not in the 'allowed' set of rules",
|
|
136
|
+
category: CATEGORY,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return lReturnValue;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
function reportIgnoredRules(pIgnoredCount) {
|
|
143
|
-
|
|
143
|
+
let lReturnValue = [];
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
145
|
+
if (pIgnoredCount > 0) {
|
|
146
|
+
lReturnValue = inspectionType({
|
|
147
|
+
id: "ignored-known-violations",
|
|
148
|
+
name: "ignored-known-violations",
|
|
149
|
+
description:
|
|
150
|
+
"some dependency violations were ignored; run with --no-ignore-known to see them",
|
|
151
|
+
category: CATEGORY,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return lReturnValue;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
function reportViolatedRules(pRuleSetUsed, pViolations, pIgnoredCount) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
return reportRules(pRuleSetUsed?.forbidden ?? [], pViolations)
|
|
159
|
+
.concat(reportAllowedRule(pRuleSetUsed?.allowed ?? [], pViolations))
|
|
160
|
+
.concat(reportRules(pRuleSetUsed?.required ?? [], pViolations))
|
|
161
|
+
.concat(reportIgnoredRules(pIgnoredCount));
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
function formatModuleViolation(pViolation) {
|
|
165
|
-
|
|
165
|
+
return pViolation.from;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
function formatDependencyViolation(pViolation) {
|
|
169
|
-
|
|
169
|
+
return `${pViolation.from} -> ${pViolation.to}`;
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
function formatCycleViolation(pViolation) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
173
|
+
return `${pViolation.from} -> ${pViolation.cycle
|
|
174
|
+
.map(({ name }) => name)
|
|
175
|
+
.join(" -> ")}`;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
function formatReachabilityViolation(pViolation) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
return `${formatDependencyViolation(pViolation)} ${pViolation.via
|
|
180
|
+
.map(({ name }) => name)
|
|
181
|
+
.join(" -> ")}`;
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
function formatInstabilityViolation(pViolation) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
185
|
+
return `${formatDependencyViolation(
|
|
186
|
+
pViolation,
|
|
187
|
+
)} (instability: ${formatPercentage(
|
|
188
|
+
pViolation.metrics.from.instability,
|
|
189
|
+
)} -> ${formatPercentage(pViolation.metrics.to.instability)})`;
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
function bakeViolationMessage(pViolation) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
193
|
+
const lViolationType2Formatter = {
|
|
194
|
+
module: formatModuleViolation,
|
|
195
|
+
dependency: formatDependencyViolation,
|
|
196
|
+
cycle: formatCycleViolation,
|
|
197
|
+
reachability: formatReachabilityViolation,
|
|
198
|
+
instability: formatInstabilityViolation,
|
|
199
|
+
};
|
|
200
|
+
return formatViolation(
|
|
201
|
+
pViolation,
|
|
202
|
+
lViolationType2Formatter,
|
|
203
|
+
formatDependencyViolation,
|
|
204
|
+
);
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
function reportIgnoredViolation(pIgnoredCount) {
|
|
208
|
-
|
|
208
|
+
let lReturnValue = [];
|
|
209
209
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
210
|
+
if (pIgnoredCount > 0) {
|
|
211
|
+
lReturnValue = inspection({
|
|
212
|
+
typeId: "ignored-known-violations",
|
|
213
|
+
message: `${pIgnoredCount} known violations ignored. Run with --no-ignore-known to see them.`,
|
|
214
|
+
SEVERITY: "WARNING",
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return lReturnValue;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
function reportViolations(pViolations, pIgnoredCount) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
221
|
+
return pViolations
|
|
222
|
+
.map((pViolation) =>
|
|
223
|
+
inspection({
|
|
224
|
+
typeId: pViolation.rule.name,
|
|
225
|
+
message: bakeViolationMessage(pViolation),
|
|
226
|
+
file: pViolation.from,
|
|
227
|
+
SEVERITY: severity2teamcitySeverity(pViolation.rule.severity),
|
|
228
|
+
}),
|
|
229
|
+
)
|
|
230
|
+
.concat(reportIgnoredViolation(pIgnoredCount));
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
/**
|
|
@@ -242,19 +242,19 @@ function reportViolations(pViolations, pIgnoredCount) {
|
|
|
242
242
|
*/
|
|
243
243
|
// eslint-disable-next-line complexity
|
|
244
244
|
export default function teamcity(pResults) {
|
|
245
|
-
|
|
245
|
+
memoizeClear(getRandomFlowId);
|
|
246
246
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
247
|
+
const lRuleSet = pResults?.summary?.ruleSetUsed ?? [];
|
|
248
|
+
const lViolations = (pResults?.summary?.violations ?? []).filter(
|
|
249
|
+
(pViolation) => pViolation.rule.severity !== "ignore",
|
|
250
|
+
);
|
|
251
|
+
const lIgnoredCount = pResults?.summary?.ignore ?? 0;
|
|
252
252
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
253
|
+
return {
|
|
254
|
+
output:
|
|
255
|
+
reportViolatedRules(lRuleSet, lViolations, lIgnoredCount)
|
|
256
|
+
.concat(reportViolations(lViolations, lIgnoredCount))
|
|
257
|
+
.reduce((pAll, pCurrent) => `${pAll}${pCurrent}\n`, "") || EOL,
|
|
258
|
+
exitCode: pResults.summary.error,
|
|
259
|
+
};
|
|
260
260
|
}
|
package/src/report/text.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { styleText } from "node:util";
|
|
2
2
|
|
|
3
3
|
const DEFAULT_OPTIONS = {
|
|
4
|
-
|
|
4
|
+
highlightFocused: false,
|
|
5
5
|
};
|
|
6
6
|
const EOL = "\n";
|
|
7
7
|
|
|
@@ -13,36 +13,36 @@ const EOL = "\n";
|
|
|
13
13
|
* @returns {any}
|
|
14
14
|
*/
|
|
15
15
|
function toFlatModuleDependencies(pModule, pModulesInFocus, pHighlightFocused) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
return pModule.dependencies.map((pDependency) => ({
|
|
17
|
+
from: {
|
|
18
|
+
name: pModule.source,
|
|
19
|
+
highlight: pHighlightFocused && pModule.matchesFocus,
|
|
20
|
+
},
|
|
21
|
+
to: {
|
|
22
|
+
name: pDependency.resolved,
|
|
23
|
+
highlight: pHighlightFocused && pModulesInFocus.has(pDependency.resolved),
|
|
24
|
+
},
|
|
25
|
+
}));
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function toFlatDependencies(pModules, pModulesInFocus, pHighlightFocused) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
return pModules.reduce(
|
|
30
|
+
(pAll, pModule) =>
|
|
31
|
+
pAll.concat(
|
|
32
|
+
toFlatModuleDependencies(pModule, pModulesInFocus, pHighlightFocused),
|
|
33
|
+
),
|
|
34
|
+
[],
|
|
35
|
+
);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
function stringifyModule(pModule) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
return pModule.highlight
|
|
40
|
+
? styleText("underline", pModule.name)
|
|
41
|
+
: pModule.name;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
function stringify(pFlatDependency) {
|
|
45
|
-
|
|
45
|
+
return `${stringifyModule(pFlatDependency.from)} → ${stringifyModule(pFlatDependency.to)}`;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -51,11 +51,11 @@ function stringify(pFlatDependency) {
|
|
|
51
51
|
* @returns {Set<string>}
|
|
52
52
|
*/
|
|
53
53
|
function getModulesInFocus(pModules) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
return new Set(
|
|
55
|
+
pModules
|
|
56
|
+
.filter((pModule) => pModule.matchesFocus || pModule.matchesReaches)
|
|
57
|
+
.map((pModule) => pModule.source),
|
|
58
|
+
);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -65,18 +65,18 @@ function getModulesInFocus(pModules) {
|
|
|
65
65
|
* @returns {string}
|
|
66
66
|
*/
|
|
67
67
|
function report(pResults, pOptions) {
|
|
68
|
-
|
|
68
|
+
const lOptions = { ...DEFAULT_OPTIONS, ...pOptions };
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
70
|
+
return (
|
|
71
|
+
toFlatDependencies(
|
|
72
|
+
pResults.modules,
|
|
73
|
+
getModulesInFocus(pResults.modules),
|
|
74
|
+
lOptions.highlightFocused === true,
|
|
75
|
+
).reduce(
|
|
76
|
+
(pAll, pDependency) => pAll.concat(stringify(pDependency)).concat(EOL),
|
|
77
|
+
"",
|
|
78
|
+
) || EOL
|
|
79
|
+
);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
@@ -87,8 +87,8 @@ function report(pResults, pOptions) {
|
|
|
87
87
|
* @returns {import("../../types/dependency-cruiser").IReporterOutput}
|
|
88
88
|
*/
|
|
89
89
|
export default function text(pResults, pOptions) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
return {
|
|
91
|
+
output: report(pResults, pOptions || {}),
|
|
92
|
+
exitCode: 0,
|
|
93
|
+
};
|
|
94
94
|
}
|
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
function deriveSortKey(pModule) {
|
|
2
|
-
|
|
2
|
+
return `${pModule.coreModule ? "1" : "0"}-${pModule.source}`;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
function compareOnSource(pOne, pTwo) {
|
|
6
|
-
|
|
6
|
+
return deriveSortKey(pOne) > deriveSortKey(pTwo) ? 1 : -1;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
function determineIncidenceType(pFromListEntry) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
return (pModule) => {
|
|
11
|
+
let lDependency = pModule.dependencies.find(
|
|
12
|
+
(pDependency) => pDependency.resolved === pFromListEntry.source,
|
|
13
|
+
);
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
if (lDependency) {
|
|
16
|
+
return lDependency.valid
|
|
17
|
+
? {
|
|
18
|
+
incidence: "true",
|
|
19
|
+
}
|
|
20
|
+
: {
|
|
21
|
+
incidence: lDependency.rules[0].severity,
|
|
22
|
+
rule: `${lDependency.rules[0].name}${
|
|
23
|
+
lDependency.rules.length > 1
|
|
24
|
+
? ` (+${lDependency.rules.length - 1} others)`
|
|
25
|
+
: ""
|
|
26
|
+
}`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
return {
|
|
31
|
+
incidence: "false",
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
function addIncidences(pFromList) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
return (pDependency) => ({
|
|
38
|
+
...pDependency,
|
|
39
|
+
incidences: pFromList.map((pFromListEntry) => ({
|
|
40
|
+
to: pFromListEntry.source,
|
|
41
|
+
...determineIncidenceType(pFromListEntry)(pDependency),
|
|
42
|
+
})),
|
|
43
|
+
});
|
|
44
44
|
}
|
|
45
45
|
/*
|
|
46
46
|
|
|
47
47
|
*/
|
|
48
48
|
export default function transformDependenciesToIncidences(pFromList) {
|
|
49
|
-
|
|
49
|
+
return pFromList.sort(compareOnSource).map(addIncidences(pFromList));
|
|
50
50
|
}
|