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/cache/helpers.mjs
CHANGED
|
@@ -17,7 +17,7 @@ import { filenameMatchesPattern } from "#graph-utl/match-facade.mjs";
|
|
|
17
17
|
* @returns {string}
|
|
18
18
|
*/
|
|
19
19
|
function hash(pString) {
|
|
20
|
-
|
|
20
|
+
return createHash("sha1").update(pString).digest("base64");
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -25,11 +25,11 @@ function hash(pString) {
|
|
|
25
25
|
* @returns {string}
|
|
26
26
|
*/
|
|
27
27
|
function _getFileHashSync(pFileName) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
try {
|
|
29
|
+
return hash(readFileSync(pFileName, "utf8"));
|
|
30
|
+
} catch (pError) {
|
|
31
|
+
return "file not found";
|
|
32
|
+
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
export const getFileHashSync = memoize(_getFileHashSync);
|
|
@@ -39,10 +39,10 @@ export const getFileHashSync = memoize(_getFileHashSync);
|
|
|
39
39
|
* @return {IRevisionChange}
|
|
40
40
|
*/
|
|
41
41
|
export function addCheckSumToChangeSync(pChange) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
return {
|
|
43
|
+
...pChange,
|
|
44
|
+
checksum: getFileHashSync(pChange.name),
|
|
45
|
+
};
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -50,12 +50,12 @@ export function addCheckSumToChangeSync(pChange) {
|
|
|
50
50
|
* @returns {(pFileName: string) => boolean}
|
|
51
51
|
*/
|
|
52
52
|
export function excludeFilter(pExcludeOption) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
return (pFileName) => {
|
|
54
|
+
if (pExcludeOption.path) {
|
|
55
|
+
return !filenameMatchesPattern(pFileName, pExcludeOption.path);
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -63,19 +63,19 @@ export function excludeFilter(pExcludeOption) {
|
|
|
63
63
|
* @returns {(pFileName: string) => boolean}
|
|
64
64
|
*/
|
|
65
65
|
export function includeOnlyFilter(pIncludeOnlyFilter) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
return (pFileName) => {
|
|
67
|
+
if (pIncludeOnlyFilter) {
|
|
68
|
+
return filenameMatchesPattern(pFileName, pIncludeOnlyFilter.path);
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* @param {Set<string>} pExtensions
|
|
75
75
|
* @returns {(pFileName: string) => boolean}
|
|
76
76
|
*/
|
|
77
77
|
export function hasInterestingExtension(pExtensions) {
|
|
78
|
-
|
|
78
|
+
return (pFileName) => pExtensions.has(extname(pFileName));
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
/**
|
|
@@ -83,26 +83,26 @@ export function hasInterestingExtension(pExtensions) {
|
|
|
83
83
|
* @returns {(pChange: IChange) => boolean}
|
|
84
84
|
*/
|
|
85
85
|
export function changeHasInterestingExtension(pExtensions) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
return (pChange) => {
|
|
87
|
+
const lNameHasInterestingExtension = hasInterestingExtension(pExtensions)(
|
|
88
|
+
pChange.name,
|
|
89
|
+
);
|
|
90
|
+
const lOldNameHasInterestingExtension = Boolean(
|
|
91
|
+
pChange.oldName && hasInterestingExtension(pExtensions)(pChange.oldName),
|
|
92
|
+
);
|
|
93
|
+
return lNameHasInterestingExtension || lOldNameHasInterestingExtension;
|
|
94
|
+
};
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// skipping: "pairing broken", "unmodified", "type changed", "ignored"
|
|
98
98
|
const DEFAULT_INTERESTING_CHANGE_TYPES = new Set([
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
"added",
|
|
100
|
+
"copied",
|
|
101
|
+
"deleted",
|
|
102
|
+
"modified",
|
|
103
|
+
"renamed",
|
|
104
|
+
"unmerged",
|
|
105
|
+
"untracked",
|
|
106
106
|
]);
|
|
107
107
|
|
|
108
108
|
/**
|
|
@@ -110,10 +110,10 @@ const DEFAULT_INTERESTING_CHANGE_TYPES = new Set([
|
|
|
110
110
|
* @returns {(pChange: IChange) => boolean}
|
|
111
111
|
*/
|
|
112
112
|
export function isInterestingChangeType(pInterestingChangeTypes) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
return (pChange) =>
|
|
114
|
+
(pInterestingChangeTypes ?? DEFAULT_INTERESTING_CHANGE_TYPES).has(
|
|
115
|
+
pChange.type,
|
|
116
|
+
);
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
@@ -121,13 +121,13 @@ export function isInterestingChangeType(pInterestingChangeTypes) {
|
|
|
121
121
|
* @returns {boolean}
|
|
122
122
|
*/
|
|
123
123
|
export function moduleIsInterestingForDiff(pModule) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
return (
|
|
125
|
+
!pModule.consolidated &&
|
|
126
|
+
!pModule.coreModule &&
|
|
127
|
+
!pModule.couldNotResolve &&
|
|
128
|
+
!pModule.matchesDoNotFollow &&
|
|
129
|
+
// as followable is optional, !exists when the module _is_ followable
|
|
130
|
+
// explicit comparison with false
|
|
131
|
+
pModule.followable !== false
|
|
132
|
+
);
|
|
133
133
|
}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
import { isDeepStrictEqual } from "node:util";
|
|
4
4
|
import { getSHA, list } from "watskeburt";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
isInterestingChangeType,
|
|
7
|
+
addCheckSumToChangeSync,
|
|
8
|
+
excludeFilter,
|
|
9
|
+
includeOnlyFilter,
|
|
10
|
+
changeHasInterestingExtension,
|
|
11
11
|
} from "./helpers.mjs";
|
|
12
12
|
import { bus } from "#utl/bus.mjs";
|
|
13
13
|
|
|
@@ -18,84 +18,84 @@ import { bus } from "#utl/bus.mjs";
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
export default class MetaDataStrategy {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
21
|
+
/**
|
|
22
|
+
* @param {string} _pDirectory
|
|
23
|
+
* @param {ICruiseResult} _pCachedCruiseResult
|
|
24
|
+
* @param {Object} pOptions
|
|
25
|
+
* @param {Set<string>} pOptions.extensions
|
|
26
|
+
* @param {Set<changeType>=} pOptions.interestingChangeTypes
|
|
27
|
+
* @param {typeof getSHA=} pOptions.shaRetrievalFn
|
|
28
|
+
* @param {typeof list=} pOptions.diffListFn
|
|
29
|
+
* @param {typeof addCheckSumToChangeSync=} pOptions.checksumFn
|
|
30
|
+
* @returns {Promise<IRevisionData>}
|
|
31
|
+
*/
|
|
32
|
+
async getRevisionData(
|
|
33
|
+
_pDirectory,
|
|
34
|
+
_pCachedCruiseResult,
|
|
35
|
+
pCruiseOptions,
|
|
36
|
+
pOptions,
|
|
37
|
+
) {
|
|
38
|
+
const lOptions = {
|
|
39
|
+
shaRetrievalFn: getSHA,
|
|
40
|
+
diffListFn: list,
|
|
41
|
+
checksumFn: addCheckSumToChangeSync,
|
|
42
|
+
...pOptions,
|
|
43
|
+
};
|
|
44
|
+
try {
|
|
45
|
+
bus.debug("cache: - get sha");
|
|
46
|
+
const lSHA = await lOptions.shaRetrievalFn();
|
|
47
|
+
bus.debug("cache: - get diff");
|
|
48
|
+
const lDiff = /** @type {IChange[]} */ (
|
|
49
|
+
await lOptions.diffListFn({ oldRevision: lSHA })
|
|
50
|
+
);
|
|
51
|
+
const lChanges = lDiff
|
|
52
|
+
.filter(({ name }) => excludeFilter(pCruiseOptions.exclude)(name))
|
|
53
|
+
.filter(({ name }) =>
|
|
54
|
+
includeOnlyFilter(pCruiseOptions.includeOnly)(name),
|
|
55
|
+
)
|
|
56
|
+
.filter(changeHasInterestingExtension(lOptions.extensions))
|
|
57
|
+
.filter(isInterestingChangeType(lOptions.interestingChangeTypes));
|
|
58
|
+
bus.debug("cache: - sha-sum diff");
|
|
59
|
+
return {
|
|
60
|
+
SHA1: lSHA,
|
|
61
|
+
changes: lChanges.map(lOptions.checksumFn),
|
|
62
|
+
};
|
|
63
|
+
} catch (pError) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`The --cache option works in concert with git - and it seems either the current folder isn't version managed or git isn't installed. Error:${`\n\n ${pError}\n`}`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
70
|
+
/**
|
|
71
|
+
* @param {IRevisionData=} pExistingRevisionData
|
|
72
|
+
* @param {IRevisionData=} pNewRevisionData
|
|
73
|
+
* @returns {boolean}
|
|
74
|
+
*/
|
|
75
|
+
revisionDataEqual(pExistingRevisionData, pNewRevisionData) {
|
|
76
|
+
return (
|
|
77
|
+
Boolean(pExistingRevisionData) &&
|
|
78
|
+
Boolean(pNewRevisionData) &&
|
|
79
|
+
// @ts-expect-error ts(18048) - tsc complains pExistingRevisionData &
|
|
80
|
+
// pNewRevisionData can be undefined, but it should probably get a course
|
|
81
|
+
// in reading typescript as we've just checked this.
|
|
82
|
+
pExistingRevisionData.SHA1 === pNewRevisionData.SHA1 &&
|
|
83
|
+
// @ts-expect-error ts(18048)
|
|
84
|
+
isDeepStrictEqual(pExistingRevisionData.changes, pNewRevisionData.changes)
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
88
|
+
/**
|
|
89
|
+
* @param {ICruiseResult} pCruiseResult
|
|
90
|
+
* @param {IRevisionData=} pRevisionData
|
|
91
|
+
* @returns {ICruiseResult}
|
|
92
|
+
*/
|
|
93
|
+
prepareRevisionDataForSaving(pCruiseResult, pRevisionData) {
|
|
94
|
+
return pRevisionData
|
|
95
|
+
? {
|
|
96
|
+
...pCruiseResult,
|
|
97
|
+
revisionData: pRevisionData,
|
|
98
|
+
}
|
|
99
|
+
: pCruiseResult;
|
|
100
|
+
}
|
|
101
101
|
}
|
|
@@ -5,89 +5,36 @@ import { isDeepStrictEqual } from "node:util";
|
|
|
5
5
|
* @import { IStrictCruiseOptions } from "../../types/strict-options.mjs"
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
/*
|
|
9
|
-
# command line options
|
|
10
|
-
## No influence on cache
|
|
11
|
-
-i, --info
|
|
12
|
-
-V, --version
|
|
13
|
-
-h, --help
|
|
14
|
-
-T, --output-type <type> unless counting implicit shizzle like dependents, metrics calculation
|
|
15
|
-
-f, --output-to <file>
|
|
16
|
-
-p, --progress [type]
|
|
17
|
-
-P, --prefix <prefix>
|
|
18
|
-
-C, --cache [cache-location]
|
|
19
|
-
--init [oneshot]
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
## Influence on cache
|
|
23
|
-
### 100% invalidate when different
|
|
24
|
-
-c, --config [file]
|
|
25
|
-
--ignore-known [file]
|
|
26
|
-
--ts-config [file]
|
|
27
|
-
--webpack-config [file]
|
|
28
|
-
--ts-pre-compilation-deps
|
|
29
|
-
-v, --validate [file]
|
|
30
|
-
--preserve-symlinks
|
|
31
|
-
|
|
32
|
-
### Invalidates when in cache, not in command
|
|
33
|
-
(or more precise: when filters in cache yield a subset of command)
|
|
34
|
-
-I, --include-only <regex>
|
|
35
|
-
-F, --focus <regex>
|
|
36
|
-
-R, --reaches <regex>
|
|
37
|
-
-x, --exclude <regex>
|
|
38
|
-
-X, --do-not-follow <regex>
|
|
39
|
-
-S, --collapse <regex>
|
|
40
|
-
-d, --max-depth <n> (more precise: when cache.max-depth < command.max-depth OR cache.max-depth === 0)
|
|
41
|
-
-M, --module-systems <items> (more precise: )
|
|
42
|
-
|
|
43
|
-
### Invalidates when not in cache, but in command
|
|
44
|
-
-m, --metrics
|
|
45
|
-
|
|
46
|
-
# options that are not available on the command line
|
|
47
|
-
|
|
48
|
-
## no influence on cache
|
|
49
|
-
- Anything in reporterOptions
|
|
50
|
-
- externalModuleResolutionStrategy (as it's not really used anymore IIRC)
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
## influence on cache
|
|
54
|
-
|
|
55
|
-
- combinedDependencies
|
|
56
|
-
- enhancedResolveOptions
|
|
57
|
-
- exoticRequireStrings
|
|
58
|
-
- knownViolations
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
8
|
export function includeOnlyIsCompatible(pExistingFilter, pNewFilter) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
9
|
+
return (
|
|
10
|
+
!pExistingFilter || isDeepStrictEqual({ path: pExistingFilter }, pNewFilter)
|
|
11
|
+
);
|
|
65
12
|
}
|
|
66
13
|
|
|
67
14
|
export function filterOptionIsCompatible(pExistingOption, pNewOption) {
|
|
68
|
-
|
|
15
|
+
return !pExistingOption || isDeepStrictEqual(pExistingOption, pNewOption);
|
|
69
16
|
}
|
|
70
17
|
|
|
71
18
|
export function optionIsCompatible(pExistingOption, pNewOption) {
|
|
72
|
-
|
|
19
|
+
return isDeepStrictEqual(pExistingOption, pNewOption);
|
|
73
20
|
}
|
|
74
21
|
|
|
75
22
|
export function limitIsCompatible(pExistingLimit, pNewLimit) {
|
|
76
|
-
|
|
23
|
+
return !pExistingLimit || pExistingLimit >= (pNewLimit || pExistingLimit + 1);
|
|
77
24
|
}
|
|
78
25
|
|
|
79
26
|
export function metricsIsCompatible(pExistingMetrics, pNewMetrics) {
|
|
80
|
-
|
|
27
|
+
return pExistingMetrics || pExistingMetrics === pNewMetrics;
|
|
81
28
|
}
|
|
82
29
|
|
|
83
30
|
export function cacheOptionIsCompatible(pExistingCacheOption, pNewCacheOption) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
31
|
+
if (!pExistingCacheOption || !pNewCacheOption) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return (
|
|
35
|
+
pExistingCacheOption === pNewCacheOption ||
|
|
36
|
+
isDeepStrictEqual(pExistingCacheOption, pNewCacheOption)
|
|
37
|
+
);
|
|
91
38
|
}
|
|
92
39
|
|
|
93
40
|
/**
|
|
@@ -98,46 +45,46 @@ export function cacheOptionIsCompatible(pExistingCacheOption, pNewCacheOption) {
|
|
|
98
45
|
*/
|
|
99
46
|
// eslint-disable-next-line complexity
|
|
100
47
|
export function optionsAreCompatible(pOldOptions, pNewOptions) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
48
|
+
return (
|
|
49
|
+
pOldOptions.args === pNewOptions.args &&
|
|
50
|
+
pOldOptions.rulesFile === pNewOptions.rulesFile &&
|
|
51
|
+
pOldOptions.tsPreCompilationDeps === pNewOptions.tsPreCompilationDeps &&
|
|
52
|
+
pOldOptions.preserveSymlinks === pNewOptions.preserveSymlinks &&
|
|
53
|
+
pOldOptions.combinedDependencies === pNewOptions.combinedDependencies &&
|
|
54
|
+
pOldOptions.experimentalStats === pNewOptions.experimentalStats &&
|
|
55
|
+
pOldOptions.detectJSDocImports === pNewOptions.detectJSDocImports &&
|
|
56
|
+
pOldOptions.detectProcessBuiltinModuleCalls ===
|
|
57
|
+
pNewOptions.detectProcessBuiltinModuleCalls &&
|
|
58
|
+
pOldOptions.skipAnalysisNotInRules === pNewOptions.skipAnalysisNotInRules &&
|
|
59
|
+
metricsIsCompatible(pOldOptions.metrics, pNewOptions.metrics) &&
|
|
60
|
+
// includeOnly suffers from a backwards compatibility disease
|
|
61
|
+
includeOnlyIsCompatible(pOldOptions.includeOnly, pNewOptions.includeOnly) &&
|
|
62
|
+
filterOptionIsCompatible(
|
|
63
|
+
pOldOptions.doNotFollow,
|
|
64
|
+
pNewOptions.doNotFollow,
|
|
65
|
+
) &&
|
|
66
|
+
filterOptionIsCompatible(
|
|
67
|
+
pOldOptions.moduleSystems,
|
|
68
|
+
pNewOptions.moduleSystems,
|
|
69
|
+
) &&
|
|
70
|
+
filterOptionIsCompatible(pOldOptions.exclude, pNewOptions.exclude) &&
|
|
71
|
+
filterOptionIsCompatible(pOldOptions.focus, pNewOptions.focus) &&
|
|
72
|
+
filterOptionIsCompatible(pOldOptions.reaches, pNewOptions.reaches) &&
|
|
73
|
+
filterOptionIsCompatible(pOldOptions.highlight, pNewOptions.highlight) &&
|
|
74
|
+
filterOptionIsCompatible(pOldOptions.collapse, pNewOptions.collapse) &&
|
|
75
|
+
limitIsCompatible(pOldOptions.maxDepth, pNewOptions.maxDepth) &&
|
|
76
|
+
optionIsCompatible(
|
|
77
|
+
pOldOptions.knownViolations || [],
|
|
78
|
+
pNewOptions.knownViolations || [],
|
|
79
|
+
) &&
|
|
80
|
+
optionIsCompatible(
|
|
81
|
+
pOldOptions.enhancedResolveOptions,
|
|
82
|
+
pNewOptions.enhancedResolveOptions,
|
|
83
|
+
) &&
|
|
84
|
+
optionIsCompatible(
|
|
85
|
+
pOldOptions.exoticRequireStrings,
|
|
86
|
+
pNewOptions.exoticRequireStrings,
|
|
87
|
+
) &&
|
|
88
|
+
cacheOptionIsCompatible(pOldOptions.cache, pNewOptions.cache)
|
|
89
|
+
);
|
|
143
90
|
}
|
|
@@ -2,17 +2,17 @@ import satisfies from "semver/functions/satisfies.js";
|
|
|
2
2
|
import meta from "#meta.cjs";
|
|
3
3
|
|
|
4
4
|
export default function assertNodeEnvironmentSuitable(pNodeVersion) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
// not using default parameter here because the check should run
|
|
6
|
+
// run on node 4 as well
|
|
7
|
+
const lNodeVersion = pNodeVersion || process.versions.node;
|
|
8
|
+
const lVersionError = `\nERROR: Your node version (${lNodeVersion}) is not supported. dependency-cruiser
|
|
9
9
|
follows the node.js release cycle and runs on these node versions:
|
|
10
10
|
${meta.engines.node}
|
|
11
11
|
See https://nodejs.org/en/about/releases/ for details.
|
|
12
12
|
|
|
13
13
|
`;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
if (!satisfies(lNodeVersion, meta.engines.node)) {
|
|
16
|
+
throw new Error(lVersionError);
|
|
17
|
+
}
|
|
18
18
|
}
|
package/src/cli/defaults.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export const OLD_DEFAULT_RULES_FILE_NAME = ".dependency-cruiser.json";
|
|
2
2
|
export const RULES_FILE_NAME_SEARCH_ARRAY = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
".dependency-cruiser.json",
|
|
4
|
+
".dependency-cruiser.js",
|
|
5
|
+
".dependency-cruiser.cjs",
|
|
6
|
+
".dependency-cruiser.mjs",
|
|
7
7
|
];
|
|
8
8
|
export const DEFAULT_BASELINE_FILE_NAME =
|
|
9
|
-
|
|
9
|
+
".dependency-cruiser-known-violations.json";
|
|
10
10
|
export const DEFAULT_CONFIG_FILE_NAME = ".dependency-cruiser.js";
|
|
11
11
|
export const WEBPACK_CONFIG = "webpack.config.js";
|
|
12
12
|
export const TYPESCRIPT_CONFIG = "tsconfig.json";
|
|
@@ -5,7 +5,7 @@ import { getAvailableTranspilers, allExtensions } from "#main/index.mjs";
|
|
|
5
5
|
import meta from "#meta.cjs";
|
|
6
6
|
|
|
7
7
|
function bool2Symbol(pBool) {
|
|
8
|
-
|
|
8
|
+
return pBool ? styleText("green", "✔") : styleText("red", "x");
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
const MAX_VERSION_RANGE_STRING_LENGTH = 19;
|
|
@@ -13,30 +13,30 @@ const MAX_TRANSPILER_NAME_LENGTH = 22;
|
|
|
13
13
|
const MAX_VERSION_STRING_LENGTH = 24;
|
|
14
14
|
|
|
15
15
|
function formatTranspilers() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
let lTranspilerTableHeader = styleText(
|
|
17
|
+
"bold",
|
|
18
|
+
` ✔ ${"transpiler".padEnd(MAX_TRANSPILER_NAME_LENGTH)} ${"versions supported".padEnd(MAX_VERSION_RANGE_STRING_LENGTH)} version found`,
|
|
19
|
+
);
|
|
20
|
+
let lTranspilerTableDivider = ` - ${"-".repeat(MAX_TRANSPILER_NAME_LENGTH)} ${"-".repeat(MAX_VERSION_RANGE_STRING_LENGTH)} ${"-".repeat(MAX_VERSION_STRING_LENGTH)}`;
|
|
21
|
+
let lTranspilerTable = getAvailableTranspilers()
|
|
22
|
+
.map(
|
|
23
|
+
(pTranspiler) =>
|
|
24
|
+
` ${bool2Symbol(pTranspiler.available)} ${pTranspiler.name.padEnd(MAX_TRANSPILER_NAME_LENGTH)} ${pTranspiler.version.padEnd(MAX_VERSION_RANGE_STRING_LENGTH)} ${pTranspiler.currentVersion}`,
|
|
25
|
+
)
|
|
26
|
+
.join("\n");
|
|
27
|
+
return `${lTranspilerTableHeader}\n${lTranspilerTableDivider}\n${lTranspilerTable}\n`;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
function formatExtensions(pExtensions) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
return pExtensions.reduce(
|
|
32
|
+
(pAll, pThis) =>
|
|
33
|
+
`${pAll} ${bool2Symbol(pThis.available)} ${pThis.extension}\n`,
|
|
34
|
+
"",
|
|
35
|
+
);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export default function formatMetaInfo() {
|
|
39
|
-
|
|
39
|
+
return `
|
|
40
40
|
${styleText("bold", "dependency-cruiser")}@${meta.version}
|
|
41
41
|
|
|
42
42
|
node version supported : ${meta.engines.node}
|
|
@@ -44,9 +44,9 @@ export default function formatMetaInfo() {
|
|
|
44
44
|
os version found : ${arch()} ${platform()}@${release()}
|
|
45
45
|
|
|
46
46
|
If you need a supported, but not enabled transpiler ('${styleText(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
"red",
|
|
48
|
+
"x",
|
|
49
|
+
)}' below), just install
|
|
50
50
|
it in the same folder dependency-cruiser is installed. E.g. 'npm i livescript'
|
|
51
51
|
will enable livescript support if it's installed in your project folder.
|
|
52
52
|
|