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
|
@@ -10,91 +10,91 @@ const MODULE_SYSTEM_LIST_RE = /^(?:(?:cjs|amd|es6|tsd)(?:,|$)){1,4}/gi;
|
|
|
10
10
|
const VALID_DEPTH_RE = /^\d{1,2}$/g;
|
|
11
11
|
|
|
12
12
|
function isObject(pObject) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
return (
|
|
14
|
+
typeof pObject === "object" && !Array.isArray(pObject) && pObject !== null
|
|
15
|
+
);
|
|
16
16
|
}
|
|
17
17
|
function deepMerge(pTarget, pSource) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
18
|
+
const lOutput = structuredClone(pTarget);
|
|
19
|
+
|
|
20
|
+
for (const lKey in pSource) {
|
|
21
|
+
if (isObject(pSource[lKey])) {
|
|
22
|
+
if (lKey in pTarget) {
|
|
23
|
+
lOutput[lKey] = deepMerge(pTarget[lKey], pSource[lKey]);
|
|
24
|
+
} else {
|
|
25
|
+
Object.assign(lOutput, { [lKey]: pSource[lKey] });
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
Object.assign(lOutput, { [lKey]: pSource[lKey] });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return lOutput;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
function assertModuleSystemsValid(pModuleSystems) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
if (
|
|
37
|
+
pModuleSystems &&
|
|
38
|
+
Array.isArray(pModuleSystems) &&
|
|
39
|
+
!pModuleSystems.every((pModuleSystem) =>
|
|
40
|
+
pModuleSystem.match(MODULE_SYSTEM_LIST_RE),
|
|
41
|
+
)
|
|
42
|
+
) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Invalid module system list: '${pModuleSystems.join(", ")}'\n`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function assertRegExpSafety(pPattern) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
if (pPattern && !safeRegex(pPattern)) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`The pattern '${pPattern}' will probably run very slowly - cowardly refusing to run.\n`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function assertOutputTypeValid(pOutputType) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
if (
|
|
59
|
+
pOutputType &&
|
|
60
|
+
!getAvailableReporters().includes(pOutputType) &&
|
|
61
|
+
!pOutputType.startsWith("plugin:")
|
|
62
|
+
) {
|
|
63
|
+
throw new Error(`'${pOutputType}' is not a valid output type.\n`);
|
|
64
|
+
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
function assertMaxDepthValid(pDepth) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
if (pDepth && !pDepth.toString().match(VALID_DEPTH_RE)) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`'${pDepth}' is not a valid depth - use an integer between 0 and 99`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
function assertFocusDepthValid(pFocusDepth) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
const lFocusDepth = Number.parseInt(pFocusDepth, 10);
|
|
77
|
+
const lMaxFocusDepth = 99;
|
|
78
|
+
|
|
79
|
+
if (
|
|
80
|
+
pFocusDepth &&
|
|
81
|
+
(Number.isNaN(lFocusDepth) ||
|
|
82
|
+
lFocusDepth < 0 ||
|
|
83
|
+
lFocusDepth > lMaxFocusDepth)
|
|
84
|
+
) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`'${pFocusDepth}' is not a valid focus depth - use an integer between 0 and ${lMaxFocusDepth}`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
function assertPathsSafety(pFilterOption) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
if (typeof pFilterOption === "string") {
|
|
93
|
+
assertRegExpSafety(pFilterOption);
|
|
94
|
+
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
assertRegExpSafety(pFilterOption?.path ?? "");
|
|
97
|
+
assertRegExpSafety(pFilterOption?.pathNot ?? "");
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
@@ -103,35 +103,35 @@ function assertPathsSafety(pFilterOption) {
|
|
|
103
103
|
* @returns {ICruiseOptions}
|
|
104
104
|
*/
|
|
105
105
|
export function assertCruiseOptionsValid(pOptions) {
|
|
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
|
-
|
|
106
|
+
let lReturnValue = {};
|
|
107
|
+
|
|
108
|
+
if (pOptions) {
|
|
109
|
+
// necessary because can slip through the cracks when passed as a cli parameter
|
|
110
|
+
assertModuleSystemsValid(pOptions.moduleSystems);
|
|
111
|
+
|
|
112
|
+
// necessary because this safety check can't be done in json schema (a.f.a.i.k.)
|
|
113
|
+
assertPathsSafety(pOptions.doNotFollow);
|
|
114
|
+
assertPathsSafety(pOptions.exclude);
|
|
115
|
+
assertRegExpSafety(pOptions.includeOnly);
|
|
116
|
+
assertRegExpSafety(pOptions.focus);
|
|
117
|
+
assertRegExpSafety(pOptions.reaches);
|
|
118
|
+
assertRegExpSafety(pOptions.highlight);
|
|
119
|
+
assertRegExpSafety(pOptions.collapse);
|
|
120
|
+
|
|
121
|
+
// necessary because not in the config schema
|
|
122
|
+
assertOutputTypeValid(pOptions.outputType);
|
|
123
|
+
|
|
124
|
+
// necessary because not found a way to do this properly in JSON schema
|
|
125
|
+
assertMaxDepthValid(pOptions.maxDepth);
|
|
126
|
+
|
|
127
|
+
assertFocusDepthValid(pOptions.focusDepth);
|
|
128
|
+
|
|
129
|
+
if (pOptions?.ruleSet?.options) {
|
|
130
|
+
lReturnValue = assertCruiseOptionsValid(pOptions.ruleSet.options);
|
|
131
|
+
}
|
|
132
|
+
return deepMerge(lReturnValue, pOptions);
|
|
133
|
+
}
|
|
134
|
+
return lReturnValue;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
/**
|
|
@@ -140,11 +140,11 @@ export function assertCruiseOptionsValid(pOptions) {
|
|
|
140
140
|
* @throws {Error}
|
|
141
141
|
*/
|
|
142
142
|
export function assertFormatOptionsValid(pFormatOptions) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
143
|
+
assertPathsSafety(pFormatOptions.exclude);
|
|
144
|
+
assertPathsSafety(pFormatOptions.focus);
|
|
145
|
+
assertPathsSafety(pFormatOptions.reaches);
|
|
146
|
+
assertPathsSafety(pFormatOptions.includeOnly);
|
|
147
|
+
assertRegExpSafety(pFormatOptions.collapse);
|
|
148
|
+
assertOutputTypeValid(pFormatOptions.outputType);
|
|
149
|
+
assertFocusDepthValid(pFormatOptions.focusDepth);
|
|
150
150
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/** @type {import('../../../types/strict-options').IStrictCruiseOptions} */
|
|
2
2
|
export default {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
validate: false,
|
|
4
|
+
maxDepth: 0,
|
|
5
|
+
moduleSystems: ["es6", "cjs", "tsd", "amd"],
|
|
6
|
+
detectJSDocImports: false,
|
|
7
|
+
detectProcessBuiltinModuleCalls: false,
|
|
8
|
+
skipAnalysisNotInRules: false,
|
|
9
|
+
tsPreCompilationDeps: false,
|
|
10
|
+
preserveSymlinks: false,
|
|
11
|
+
combinedDependencies: false,
|
|
12
|
+
externalModuleResolutionStrategy: "node_modules",
|
|
13
|
+
exoticRequireStrings: [],
|
|
14
14
|
};
|
|
@@ -15,76 +15,76 @@ const DEFAULT_CACHE_FOLDER = "node_modules/.cache/dependency-cruiser";
|
|
|
15
15
|
const DEFAULT_CACHE_STRATEGY = "metadata";
|
|
16
16
|
|
|
17
17
|
function normalizeFilterOption(pFilterOption) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
let lReturnValue = pFilterOption || {};
|
|
19
|
+
|
|
20
|
+
if (typeof lReturnValue === "string" || Array.isArray(lReturnValue)) {
|
|
21
|
+
lReturnValue = {
|
|
22
|
+
path: lReturnValue,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return normalizeREProperties(lReturnValue, ["path"]);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function normalizeReporterOptions(pReporterOptions) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
29
|
+
const lNormalizeableOptions = [
|
|
30
|
+
"archi.collapsePattern",
|
|
31
|
+
"archi.filters.includeOnly.path",
|
|
32
|
+
"archi.filters.focus.path",
|
|
33
|
+
"archi.filters.exclude.path",
|
|
34
|
+
"dot.collapsePattern",
|
|
35
|
+
"dot.filters.includeOnly.path",
|
|
36
|
+
"dot.filters.focus.path",
|
|
37
|
+
"dot.filters.exclude.path",
|
|
38
|
+
"ddot.collapsePattern",
|
|
39
|
+
"ddot.filters.includeOnly.path",
|
|
40
|
+
"ddot.filters.focus.path",
|
|
41
|
+
"ddot.filters.exclude.path",
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
return normalizeREProperties(pReporterOptions, lNormalizeableOptions);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function normalizeFilterOptions(pOptions, pFilterOptionKeys) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
let lReturnValue = { ...pOptions };
|
|
49
|
+
|
|
50
|
+
for (const lFilterOptionKey of pFilterOptionKeys) {
|
|
51
|
+
if (pOptions[lFilterOptionKey]) {
|
|
52
|
+
lReturnValue[lFilterOptionKey] = normalizeFilterOption(
|
|
53
|
+
lReturnValue[lFilterOptionKey],
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return lReturnValue;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
function normalizeCollapse(pCollapse) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
let lReturnValue = pCollapse;
|
|
62
|
+
const lOneOrMoreNonSlashes = "[^/]+";
|
|
63
|
+
const lFolderPattern = `${lOneOrMoreNonSlashes}/`;
|
|
64
|
+
const lFolderBelowNodeModules = `node_modules/${lOneOrMoreNonSlashes}`;
|
|
65
|
+
const lSingleDigitRe = /^\d$/;
|
|
66
|
+
|
|
67
|
+
if (typeof pCollapse === "number" || pCollapse.match(lSingleDigitRe)) {
|
|
68
|
+
lReturnValue = `${lFolderBelowNodeModules}|^${lFolderPattern.repeat(
|
|
69
|
+
Number.parseInt(pCollapse, 10),
|
|
70
|
+
)}`;
|
|
71
|
+
}
|
|
72
|
+
return lReturnValue;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
function normalizeFocusDepth(pFormatOptions) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
/** @type {IFormatOptions}*/
|
|
77
|
+
let lFormatOptions = structuredClone(pFormatOptions);
|
|
78
|
+
if (Object.hasOwn(lFormatOptions, "focusDepth")) {
|
|
79
|
+
if (lFormatOptions?.focus) {
|
|
80
|
+
lFormatOptions.focus.depth = Number.parseInt(
|
|
81
|
+
lFormatOptions.focusDepth,
|
|
82
|
+
10,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
delete lFormatOptions.focusDepth;
|
|
86
|
+
}
|
|
87
|
+
return lFormatOptions;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/**
|
|
@@ -93,13 +93,13 @@ function normalizeFocusDepth(pFormatOptions) {
|
|
|
93
93
|
* @returns {boolean}
|
|
94
94
|
*/
|
|
95
95
|
function hasMetricsRule(pRule) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
// TODO: philosophy: is a rule with 'folder' in it a metrics rule?
|
|
97
|
+
// Or is it a misuse to ensure folder derivations (like cycles) get
|
|
98
|
+
// kicked off?
|
|
99
|
+
return (
|
|
100
|
+
Object.hasOwn(pRule?.to ?? {}, "moreUnstable") ||
|
|
101
|
+
(pRule?.scope ?? "module") === "folder"
|
|
102
|
+
);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/**
|
|
@@ -108,11 +108,11 @@ function hasMetricsRule(pRule) {
|
|
|
108
108
|
* @returns {boolean}
|
|
109
109
|
*/
|
|
110
110
|
function ruleSetHasMetricsRule(pRuleSet) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
111
|
+
const lRuleSet = pRuleSet || {};
|
|
112
|
+
return (
|
|
113
|
+
(lRuleSet.forbidden || []).some(hasMetricsRule) ||
|
|
114
|
+
(lRuleSet.allowed || []).some(hasMetricsRule)
|
|
115
|
+
);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
@@ -121,10 +121,10 @@ function ruleSetHasMetricsRule(pRuleSet) {
|
|
|
121
121
|
* @returns Boolean
|
|
122
122
|
*/
|
|
123
123
|
function reporterShowsMetrics(pOptions) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
return (
|
|
125
|
+
(pOptions.reporterOptions?.[pOptions?.outputType]?.showMetrics ?? false) ===
|
|
126
|
+
true
|
|
127
|
+
);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
/**
|
|
@@ -134,12 +134,12 @@ function reporterShowsMetrics(pOptions) {
|
|
|
134
134
|
* @returns Boolean
|
|
135
135
|
*/
|
|
136
136
|
function shouldCalculateMetrics(pOptions) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
return (
|
|
138
|
+
pOptions.metrics ||
|
|
139
|
+
pOptions.outputType === "metrics" ||
|
|
140
|
+
reporterShowsMetrics(pOptions) ||
|
|
141
|
+
ruleSetHasMetricsRule(pOptions.ruleSet)
|
|
142
|
+
);
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
/**
|
|
@@ -147,26 +147,26 @@ function shouldCalculateMetrics(pOptions) {
|
|
|
147
147
|
* @returns {ICacheOptions}
|
|
148
148
|
*/
|
|
149
149
|
function normalizeCacheOptions(pCacheOptions) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
150
|
+
let lNormalizedCacheOptions = pCacheOptions;
|
|
151
|
+
|
|
152
|
+
if (typeof pCacheOptions === "string") {
|
|
153
|
+
lNormalizedCacheOptions = {
|
|
154
|
+
folder: pCacheOptions,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (pCacheOptions === true) {
|
|
159
|
+
lNormalizedCacheOptions = {};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// TODO: put these values in a central spot as constants
|
|
163
|
+
// (folder is already in src/cli/defaults.js but depending on the UI (cli)
|
|
164
|
+
// is not OK. We might b.t.w. wanna deduplicate the defaulting)
|
|
165
|
+
return {
|
|
166
|
+
folder: DEFAULT_CACHE_FOLDER,
|
|
167
|
+
strategy: DEFAULT_CACHE_STRATEGY,
|
|
168
|
+
...lNormalizedCacheOptions,
|
|
169
|
+
};
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
/**
|
|
@@ -176,54 +176,52 @@ function normalizeCacheOptions(pCacheOptions) {
|
|
|
176
176
|
* @returns {IStrictCruiseOptions}
|
|
177
177
|
*/
|
|
178
178
|
export function normalizeCruiseOptions(pOptions, pFileAndDirectoryArray = []) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return normalizeFocusDepth(lReturnValue);
|
|
179
|
+
/** @type {IStrictCruiseOptions} */
|
|
180
|
+
let lReturnValue = {
|
|
181
|
+
baseDir: process.cwd(),
|
|
182
|
+
...defaults,
|
|
183
|
+
...pOptions,
|
|
184
|
+
args: pFileAndDirectoryArray.join(" "),
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
// @ts-expect-error the idea of normalizing maxDepth to number is that after
|
|
188
|
+
// that we're sure it's a number. Should maybe best be solved by
|
|
189
|
+
// having two types/ interfaces
|
|
190
|
+
lReturnValue.maxDepth = Number.parseInt(lReturnValue.maxDepth, 10);
|
|
191
|
+
lReturnValue.moduleSystems = uniq(lReturnValue.moduleSystems);
|
|
192
|
+
if (Object.hasOwn(lReturnValue, "collapse")) {
|
|
193
|
+
lReturnValue.collapse = normalizeCollapse(lReturnValue.collapse);
|
|
194
|
+
}
|
|
195
|
+
// TODO: further down the execution path code still relies on .doNotFollow
|
|
196
|
+
// and .exclude existing. We should treat them the same as the
|
|
197
|
+
// other filters (so either make all exist always or only
|
|
198
|
+
// when they're actually defined)
|
|
199
|
+
lReturnValue.doNotFollow = normalizeFilterOption(lReturnValue.doNotFollow);
|
|
200
|
+
lReturnValue.exclude = normalizeFilterOption(lReturnValue.exclude);
|
|
201
|
+
lReturnValue.extraExtensionsToScan = lReturnValue.extraExtensionsToScan || [];
|
|
202
|
+
lReturnValue = normalizeFilterOptions(lReturnValue, [
|
|
203
|
+
"focus",
|
|
204
|
+
"includeOnly",
|
|
205
|
+
"reaches",
|
|
206
|
+
"highlight",
|
|
207
|
+
]);
|
|
208
|
+
|
|
209
|
+
lReturnValue.exoticRequireStrings = uniq(lReturnValue.exoticRequireStrings);
|
|
210
|
+
if (lReturnValue.reporterOptions) {
|
|
211
|
+
lReturnValue.reporterOptions = normalizeReporterOptions(
|
|
212
|
+
lReturnValue.reporterOptions,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
lReturnValue.metrics = shouldCalculateMetrics(pOptions);
|
|
216
|
+
|
|
217
|
+
if (lReturnValue.cache) {
|
|
218
|
+
lReturnValue.cache = normalizeCacheOptions(lReturnValue.cache);
|
|
219
|
+
}
|
|
220
|
+
if (lReturnValue.detectJSDocImports) {
|
|
221
|
+
lReturnValue.parser = "tsc";
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return normalizeFocusDepth(lReturnValue);
|
|
227
225
|
}
|
|
228
226
|
|
|
229
227
|
/**
|
|
@@ -231,19 +229,19 @@ export function normalizeCruiseOptions(pOptions, pFileAndDirectoryArray = []) {
|
|
|
231
229
|
* @returns {IStrictFormatOptions}
|
|
232
230
|
*/
|
|
233
231
|
export function normalizeFormatOptions(pFormatOptions) {
|
|
234
|
-
|
|
232
|
+
let lFormatOptions = structuredClone(pFormatOptions);
|
|
235
233
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
234
|
+
if (Object.hasOwn(lFormatOptions, "collapse")) {
|
|
235
|
+
lFormatOptions.collapse = normalizeCollapse(lFormatOptions.collapse);
|
|
236
|
+
}
|
|
239
237
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
238
|
+
lFormatOptions = normalizeFilterOptions(lFormatOptions, [
|
|
239
|
+
"exclude",
|
|
240
|
+
"focus",
|
|
241
|
+
"highlight",
|
|
242
|
+
"includeOnly",
|
|
243
|
+
"reaches",
|
|
244
|
+
]);
|
|
247
245
|
|
|
248
|
-
|
|
246
|
+
return normalizeFocusDepth(lFormatOptions);
|
|
249
247
|
}
|