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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { normalizeREProperties, normalizeToREAsString } from "../helpers.mjs";
|
|
2
|
+
import { bus } from "#utl/bus.mjs";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* @import { RuleScopeType } from "../../../types/shared-types.mjs";
|
|
@@ -16,9 +17,9 @@ const DEFAULT_RULE = "unnamed";
|
|
|
16
17
|
const DEFAULT_SCOPE = "module";
|
|
17
18
|
|
|
18
19
|
function normalizeSeverity(pSeverity) {
|
|
19
|
-
|
|
20
|
+
const lSeverity = pSeverity ?? DEFAULT_SEVERITY;
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
return VALID_SEVERITIES.test(lSeverity) ? lSeverity : DEFAULT_SEVERITY;
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
25
|
*
|
|
@@ -26,7 +27,7 @@ function normalizeSeverity(pSeverity) {
|
|
|
26
27
|
* @returns {string}
|
|
27
28
|
*/
|
|
28
29
|
function normalizeName(pRuleName) {
|
|
29
|
-
|
|
30
|
+
return pRuleName ?? DEFAULT_RULE;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
/**
|
|
@@ -34,7 +35,7 @@ function normalizeName(pRuleName) {
|
|
|
34
35
|
* @returns {RuleScopeType}
|
|
35
36
|
*/
|
|
36
37
|
function normalizeScope(pScope) {
|
|
37
|
-
|
|
38
|
+
return pScope ?? DEFAULT_SCOPE;
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
/**
|
|
@@ -42,48 +43,48 @@ function normalizeScope(pScope) {
|
|
|
42
43
|
* @returns {IStrictMiniDependencyRestriction}
|
|
43
44
|
*/
|
|
44
45
|
function normalizeVia(pVia) {
|
|
45
|
-
|
|
46
|
+
let lReturnValue = {};
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
if (typeof pVia === "string" || Array.isArray(pVia)) {
|
|
49
|
+
lReturnValue.path = pVia;
|
|
50
|
+
} else {
|
|
51
|
+
lReturnValue = structuredClone(pVia);
|
|
52
|
+
}
|
|
53
|
+
if (lReturnValue?.path) {
|
|
54
|
+
lReturnValue.path = normalizeToREAsString(lReturnValue.path);
|
|
55
|
+
}
|
|
56
|
+
return lReturnValue;
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
// eslint-disable-next-line complexity
|
|
59
60
|
function normalizeVias(pRuleTo) {
|
|
60
|
-
|
|
61
|
+
const lRuleTo = structuredClone(pRuleTo);
|
|
61
62
|
|
|
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
|
-
|
|
63
|
+
if (lRuleTo?.via) {
|
|
64
|
+
lRuleTo.via = normalizeVia(lRuleTo.via);
|
|
65
|
+
}
|
|
66
|
+
if (lRuleTo?.viaOnly) {
|
|
67
|
+
lRuleTo.viaOnly = normalizeVia(lRuleTo.viaOnly);
|
|
68
|
+
}
|
|
69
|
+
if (lRuleTo?.viaNot) {
|
|
70
|
+
if (!lRuleTo?.viaOnly?.pathNot) {
|
|
71
|
+
lRuleTo.viaOnly = {
|
|
72
|
+
...lRuleTo.viaOnly,
|
|
73
|
+
pathNot: normalizeToREAsString(lRuleTo.viaNot),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
delete lRuleTo.viaNot;
|
|
77
|
+
}
|
|
78
|
+
if (lRuleTo?.viaSomeNot) {
|
|
79
|
+
if (!lRuleTo?.via?.pathNot) {
|
|
80
|
+
lRuleTo.via = {
|
|
81
|
+
...lRuleTo.via,
|
|
82
|
+
pathNot: normalizeToREAsString(lRuleTo.viaSomeNot),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
delete lRuleTo.viaSomeNot;
|
|
86
|
+
}
|
|
87
|
+
return lRuleTo;
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
/**
|
|
@@ -91,16 +92,16 @@ function normalizeVias(pRuleTo) {
|
|
|
91
92
|
* @returns {IStrictAnyRuleType}
|
|
92
93
|
*/
|
|
93
94
|
function normalizeRule(pRule) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
95
|
+
const lRuleTo = normalizeVias(pRule.to);
|
|
96
|
+
return {
|
|
97
|
+
...pRule,
|
|
98
|
+
severity: normalizeSeverity(pRule.severity),
|
|
99
|
+
name: normalizeName(pRule.name),
|
|
100
|
+
from: normalizeREProperties(pRule.from),
|
|
101
|
+
to: normalizeREProperties(lRuleTo),
|
|
102
|
+
scope: normalizeScope(pRule.scope),
|
|
103
|
+
...(pRule.module ? { module: normalizeREProperties(pRule.module) } : {}),
|
|
104
|
+
};
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
/**
|
|
@@ -113,37 +114,38 @@ function normalizeRule(pRule) {
|
|
|
113
114
|
* @return {IStrictRuleSet}
|
|
114
115
|
*/
|
|
115
116
|
export default function normalizeRuleSet(pRuleSet) {
|
|
116
|
-
|
|
117
|
+
bus.info("parse rule set: normalize");
|
|
118
|
+
const lRuleSet = structuredClone(pRuleSet);
|
|
117
119
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
120
|
+
if (lRuleSet?.allowed) {
|
|
121
|
+
lRuleSet.allowedSeverity = normalizeSeverity(lRuleSet.allowedSeverity);
|
|
122
|
+
if (lRuleSet.allowedSeverity === "ignore") {
|
|
123
|
+
Reflect.deleteProperty(lRuleSet, "allowed");
|
|
124
|
+
Reflect.deleteProperty(lRuleSet, "allowedSeverity");
|
|
125
|
+
} else {
|
|
126
|
+
lRuleSet.allowed = lRuleSet.allowed.map((pRule) => {
|
|
127
|
+
const lRuleTo = normalizeVias(pRule.to);
|
|
128
|
+
return {
|
|
129
|
+
...pRule,
|
|
130
|
+
name: "not-in-allowed",
|
|
131
|
+
from: normalizeREProperties(pRule.from),
|
|
132
|
+
to: normalizeREProperties(lRuleTo),
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
135
137
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
if (lRuleSet?.forbidden) {
|
|
139
|
+
lRuleSet.forbidden = lRuleSet.forbidden
|
|
140
|
+
.map(normalizeRule)
|
|
141
|
+
.filter((pRule) => pRule.severity !== "ignore");
|
|
142
|
+
}
|
|
141
143
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
if (lRuleSet?.required) {
|
|
145
|
+
lRuleSet.required = lRuleSet.required
|
|
146
|
+
.map(normalizeRule)
|
|
147
|
+
.filter((pRule) => pRule.severity !== "ignore");
|
|
148
|
+
}
|
|
147
149
|
|
|
148
|
-
|
|
150
|
+
return lRuleSet;
|
|
149
151
|
}
|
package/src/meta.cjs
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/* generated - don't edit */
|
|
2
|
-
|
|
3
2
|
module.exports = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
3
|
+
version: "17.3.3-beta-2",
|
|
4
|
+
engines: {
|
|
5
|
+
node: "^20.12||^22||>=24",
|
|
6
|
+
},
|
|
7
|
+
supportedTranspilers: {
|
|
8
|
+
babel: ">=7.0.0 <8.0.0",
|
|
9
|
+
"coffee-script": ">=1.0.0 <2.0.0",
|
|
10
|
+
coffeescript: ">=1.0.0 <3.0.0",
|
|
11
|
+
livescript: ">=1.0.0 <2.0.0",
|
|
12
|
+
svelte: ">=3.0.0 <6.0.0",
|
|
13
|
+
swc: ">=1.0.0 <2.0.0",
|
|
14
|
+
typescript: ">=2.0.0 <6.0.0",
|
|
15
|
+
"vue-template-compiler": ">=2.0.0 <3.0.0",
|
|
16
|
+
"@vue/compiler-sfc": ">=3.0.0 <4.0.0",
|
|
17
|
+
},
|
|
19
18
|
};
|
|
@@ -2,42 +2,28 @@ import memoize, { memoizeClear } from "memoize";
|
|
|
2
2
|
import randomString from "./random-string.mjs";
|
|
3
3
|
|
|
4
4
|
function replace(pElement, pIndex, pWordList) {
|
|
5
|
-
|
|
5
|
+
return pIndex === 0 ? pWordList.shift() || randomString(pElement) : pElement;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
const replaceCached = memoize(replace);
|
|
9
9
|
|
|
10
10
|
function replaceFromWordList(pPathElement, pWordList, pCached) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
return pPathElement
|
|
12
|
+
.split(".")
|
|
13
|
+
.map((pElement, pIndex) =>
|
|
14
|
+
pCached
|
|
15
|
+
? replaceCached(pElement, pIndex, pWordList)
|
|
16
|
+
: replace(pElement, pIndex, pWordList),
|
|
17
|
+
)
|
|
18
|
+
.join(".");
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
* - If the word list is empty use a ('smart') random string (see
|
|
24
|
-
* randomString)
|
|
25
|
-
* - ... but don't replace if the pPathElement matches the whitelist
|
|
26
|
-
* - and only replace up until the first dot in the pattern, so
|
|
27
|
-
* extensions get
|
|
22
|
+
* replaces pPathElement with a word from pWordList
|
|
28
23
|
*
|
|
29
|
-
*
|
|
30
|
-
* superSecureThing.spec.ts => abandon.spec.ts
|
|
31
|
-
* src/index.ts => src/index.ts // 'src' and 'index' are in the whitelist
|
|
32
|
-
* lib/somethingElse.service.js => lib/ability.service.js
|
|
24
|
+
* note: _mutates_ the wordlist to avoid using the same word > 1x
|
|
33
25
|
*
|
|
34
|
-
*
|
|
35
|
-
* consecutive calls, this function saves the (path element, result)
|
|
36
|
-
* pairs in a cache. If you don't want that pass false to the pCached
|
|
37
|
-
* parameter
|
|
38
|
-
*
|
|
39
|
-
* (note: it _removes_ elements from pWordList to prevent duplicates,
|
|
40
|
-
* so if the word list is precious to you - pass a clone)
|
|
26
|
+
* See ./anonymize-path-element.md for details
|
|
41
27
|
*
|
|
42
28
|
* @param {string} pPathElement the path element to anonymize
|
|
43
29
|
* @param {string[]} pWordList words to pick from
|
|
@@ -46,14 +32,14 @@ function replaceFromWordList(pPathElement, pWordList, pCached) {
|
|
|
46
32
|
* @return {string} the path element, anonymized if it isn't whitelisted
|
|
47
33
|
*/
|
|
48
34
|
export function anonymizePathElement(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
pPathElement,
|
|
36
|
+
pWordList = [],
|
|
37
|
+
pWhiteListRE = /^$/g,
|
|
38
|
+
pCached = true,
|
|
53
39
|
) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
40
|
+
return pWhiteListRE.test(pPathElement)
|
|
41
|
+
? pPathElement
|
|
42
|
+
: replaceFromWordList(pPathElement, pWordList, pCached);
|
|
57
43
|
}
|
|
58
44
|
|
|
59
45
|
/**
|
|
@@ -63,5 +49,5 @@ export function anonymizePathElement(
|
|
|
63
49
|
* @returns {void}
|
|
64
50
|
*/
|
|
65
51
|
export function clearCache() {
|
|
66
|
-
|
|
52
|
+
memoizeClear(replaceCached);
|
|
67
53
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { anonymizePathElement } from "./anonymize-path-element.mjs";
|
|
2
2
|
|
|
3
3
|
export const WHITELIST_RE =
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
5
|
+
/^(?:[.]+|~|bin|apps?|cli|src|libs?|configs?|components?|fixtures?|helpers?|i18n|index\.(?:jsx?|[mc]js|d\.ts|tsx?|vue|coffee|ls)|_?_?mocks?_?_?|node_modules|packages?|package\.json|scripts?|services?|sources?|specs?|_?_?tests?_?_?|types?|uti?ls?|tools)$/;
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Kind of smartly anonymizes paths, by
|
|
@@ -22,14 +22,14 @@ export const WHITELIST_RE =
|
|
|
22
22
|
* @returns {string} - anonymized path
|
|
23
23
|
*/
|
|
24
24
|
export function anonymizePath(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
pPath,
|
|
26
|
+
pWordList = [],
|
|
27
|
+
pWhiteListRE = WHITELIST_RE,
|
|
28
28
|
) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
return pPath
|
|
30
|
+
.split("/")
|
|
31
|
+
.map((pPathElement) =>
|
|
32
|
+
anonymizePathElement(pPathElement, pWordList, pWhiteListRE),
|
|
33
|
+
)
|
|
34
|
+
.join("/");
|
|
35
35
|
}
|
|
@@ -3,46 +3,46 @@ import { anonymizePath, WHITELIST_RE } from "./anonymize-path.mjs";
|
|
|
3
3
|
const EOL = "\n";
|
|
4
4
|
|
|
5
5
|
function anonymizePathArray(pPathArray, pWordList) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
// coverage ignore: the || [] branch isn't taken when running tests. With the
|
|
7
|
+
// current setup of the anonymize module that won't change.
|
|
8
|
+
// We keep the branch for robustness though.
|
|
9
|
+
/* c8 ignore next 1 */
|
|
10
|
+
return (pPathArray || []).map((pPath) => anonymizePath(pPath, pWordList));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
function anonymizeMiniDependencyArray(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
pMiniDependencyArray,
|
|
15
|
+
pWordList,
|
|
16
|
+
pAttribute = "name",
|
|
17
17
|
) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
return (pMiniDependencyArray || []).map((pMiniDependency) => ({
|
|
19
|
+
...pMiniDependency,
|
|
20
|
+
[pAttribute]: anonymizePath(pMiniDependency.name, pWordList),
|
|
21
|
+
}));
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
function anonymizeDependencies(pDependencies, pWordList) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
return pDependencies.map((pDependency) => ({
|
|
26
|
+
...pDependency,
|
|
27
|
+
resolved: anonymizePath(pDependency.resolved, pWordList),
|
|
28
|
+
module: anonymizePath(pDependency.module, pWordList),
|
|
29
|
+
cycle: anonymizeMiniDependencyArray(pDependency.cycle, pWordList),
|
|
30
|
+
}));
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
function anonymizeReachesModule(pWordList) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
return (pModule) => ({
|
|
35
|
+
...pModule,
|
|
36
|
+
source: anonymizePath(pModule.source, pWordList),
|
|
37
|
+
via: anonymizeMiniDependencyArray(pModule.via, pWordList),
|
|
38
|
+
});
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
function anonymizeReaches(pReachesArray, pWordList) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
return pReachesArray.map((pReaches) => ({
|
|
43
|
+
...pReaches,
|
|
44
|
+
modules: pReaches.modules.map(anonymizeReachesModule(pWordList)),
|
|
45
|
+
}));
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
@@ -52,24 +52,24 @@ function anonymizeReaches(pReachesArray, pWordList) {
|
|
|
52
52
|
* @returns {import("../../../types/cruise-result.mjs").IModule[]}
|
|
53
53
|
*/
|
|
54
54
|
function anonymizeModules(pModules, pWordList) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
55
|
+
return pModules.map((pModule) => {
|
|
56
|
+
const lReturnValue = {
|
|
57
|
+
...pModule,
|
|
58
|
+
dependencies: anonymizeDependencies(pModule.dependencies, pWordList),
|
|
59
|
+
source: anonymizePath(pModule.source, pWordList),
|
|
60
|
+
};
|
|
61
|
+
if (pModule.dependents) {
|
|
62
|
+
lReturnValue.dependents = anonymizePathArray(
|
|
63
|
+
pModule.dependents,
|
|
64
|
+
pWordList,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (pModule.reaches) {
|
|
68
|
+
lReturnValue.reaches = anonymizeReaches(pModule.reaches, pWordList);
|
|
69
|
+
}
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
return lReturnValue;
|
|
72
|
+
});
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
75
|
*
|
|
@@ -78,52 +78,52 @@ function anonymizeModules(pModules, pWordList) {
|
|
|
78
78
|
* @returns {import("../../../types/cruise-result.mjs").IFolder[]}
|
|
79
79
|
*/
|
|
80
80
|
function anonymizeFolders(pFolders, pWordList) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
81
|
+
return pFolders.map((pFolder) => {
|
|
82
|
+
const lReturnValue = {
|
|
83
|
+
...pFolder,
|
|
84
|
+
name: anonymizePath(pFolder.name, pWordList),
|
|
85
|
+
};
|
|
86
|
+
if (pFolder.dependencies) {
|
|
87
|
+
lReturnValue.dependencies = pFolder.dependencies.map((pDependency) => {
|
|
88
|
+
const lReturnDependencies = {
|
|
89
|
+
...pDependency,
|
|
90
|
+
name: anonymizePath(pDependency.name, pWordList),
|
|
91
|
+
};
|
|
92
|
+
if (lReturnDependencies.cycle) {
|
|
93
|
+
lReturnDependencies.cycle = anonymizeMiniDependencyArray(
|
|
94
|
+
pDependency.cycle,
|
|
95
|
+
pWordList,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return lReturnDependencies;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (pFolder.dependents) {
|
|
102
|
+
lReturnValue.dependents = pFolder.dependents.map((pDependent) => ({
|
|
103
|
+
...pDependent,
|
|
104
|
+
name: anonymizePath(pDependent.name, pWordList),
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
return lReturnValue;
|
|
108
|
+
});
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
function anonymizeViolations(pViolations, pWordList) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
112
|
+
return pViolations.map((pViolation) => {
|
|
113
|
+
const lReturnValue = {
|
|
114
|
+
...pViolation,
|
|
115
|
+
from: anonymizePath(pViolation.from, pWordList),
|
|
116
|
+
to: anonymizePath(pViolation.to, pWordList),
|
|
117
|
+
cycle: anonymizeMiniDependencyArray(pViolation.cycle, pWordList),
|
|
118
|
+
};
|
|
119
|
+
if (pViolation.via) {
|
|
120
|
+
lReturnValue.via = anonymizeMiniDependencyArray(
|
|
121
|
+
pViolation.via,
|
|
122
|
+
pWordList,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
return lReturnValue;
|
|
126
|
+
});
|
|
127
127
|
}
|
|
128
128
|
/**
|
|
129
129
|
*
|
|
@@ -132,25 +132,25 @@ function anonymizeViolations(pViolations, pWordList) {
|
|
|
132
132
|
* @returns {import("../../../types/cruise-result.mjs").ICruiseResult}
|
|
133
133
|
*/
|
|
134
134
|
function anonymize(pResults, pWordList) {
|
|
135
|
-
|
|
135
|
+
const lResults = structuredClone(pResults);
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
137
|
+
lResults.modules = anonymizeModules(lResults.modules, pWordList);
|
|
138
|
+
if (lResults.folders) {
|
|
139
|
+
lResults.folders = anonymizeFolders(lResults.folders, pWordList);
|
|
140
|
+
}
|
|
141
|
+
lResults.summary.violations = anonymizeViolations(
|
|
142
|
+
lResults.summary.violations,
|
|
143
|
+
pWordList,
|
|
144
|
+
);
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
return lResults;
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
function sanitizeWordList(pWordList) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
return pWordList
|
|
151
|
+
.map((pString) => pString.replace(/[^a-zA-Z-]/g, "_"))
|
|
152
|
+
.filter((pString) => pString.match(/^[a-zA-Z-_]+$/g))
|
|
153
|
+
.filter((pString) => !pString.match(WHITELIST_RE));
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/**
|
|
@@ -176,22 +176,22 @@ function sanitizeWordList(pWordList) {
|
|
|
176
176
|
* exitCode: 0
|
|
177
177
|
*/
|
|
178
178
|
export default function reportAnonymous(pResults, pAnonymousReporterOptions) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
179
|
+
/** @type {{wordlist?: String[]}} */
|
|
180
|
+
let lAnonymousReporterOptions = pAnonymousReporterOptions || {};
|
|
181
|
+
if (!lAnonymousReporterOptions.wordlist) {
|
|
182
|
+
lAnonymousReporterOptions.wordlist =
|
|
183
|
+
pResults?.summary?.optionsUsed?.reporterOptions?.anon?.wordlist ?? [];
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
output:
|
|
187
|
+
JSON.stringify(
|
|
188
|
+
anonymize(
|
|
189
|
+
pResults,
|
|
190
|
+
sanitizeWordList(lAnonymousReporterOptions.wordlist),
|
|
191
|
+
),
|
|
192
|
+
null,
|
|
193
|
+
" ",
|
|
194
|
+
) + EOL,
|
|
195
|
+
exitCode: 0,
|
|
196
|
+
};
|
|
197
197
|
}
|