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.
Files changed (232) hide show
  1. package/bin/depcruise-baseline.mjs +43 -43
  2. package/bin/depcruise-fmt.mjs +89 -89
  3. package/bin/dependency-cruise.mjs +171 -171
  4. package/configs/plugins/3d-reporter-plugin.mjs +36 -36
  5. package/configs/plugins/stats-reporter-plugin.mjs +51 -51
  6. package/configs/recommended-strict.cjs +5 -5
  7. package/configs/recommended-warn-only.cjs +5 -5
  8. package/configs/recommended.cjs +22 -22
  9. package/configs/rules/no-circular.cjs +10 -10
  10. package/configs/rules/no-deprecated-core.cjs +10 -10
  11. package/configs/rules/no-duplicate-dependency-types.cjs +17 -17
  12. package/configs/rules/no-non-package-json.cjs +11 -11
  13. package/configs/rules/no-orphans.cjs +18 -18
  14. package/configs/rules/not-to-deprecated.cjs +10 -10
  15. package/configs/rules/not-to-unresolvable.cjs +10 -10
  16. package/package.json +170 -170
  17. package/src/cache/cache.mjs +139 -139
  18. package/src/cache/content-strategy.mjs +88 -88
  19. package/src/cache/find-content-changes.mjs +58 -58
  20. package/src/cache/helpers.mjs +52 -52
  21. package/src/cache/metadata-strategy.mjs +83 -83
  22. package/src/cache/options-compatible.mjs +56 -109
  23. package/src/cli/assert-node-environment-suitable.mjs +7 -7
  24. package/src/cli/defaults.mjs +5 -5
  25. package/src/cli/format-meta-info.mjs +22 -22
  26. package/src/cli/format.mjs +28 -28
  27. package/src/cli/index.mjs +145 -145
  28. package/src/cli/init-config/build-config.mjs +94 -94
  29. package/src/cli/init-config/environment-helpers.mjs +77 -77
  30. package/src/cli/init-config/find-extensions.mjs +27 -27
  31. package/src/cli/init-config/get-user-input.mjs +151 -151
  32. package/src/cli/init-config/index.mjs +88 -88
  33. package/src/cli/init-config/normalize-init-options.mjs +47 -47
  34. package/src/cli/init-config/utl.mjs +4 -4
  35. package/src/cli/init-config/validators.mjs +10 -10
  36. package/src/cli/init-config/write-config.mjs +21 -21
  37. package/src/cli/init-config/write-run-scripts-to-manifest.mjs +103 -107
  38. package/src/cli/listeners/cli-feedback.mjs +49 -49
  39. package/src/cli/listeners/ndjson.mjs +66 -66
  40. package/src/cli/listeners/performance-log/format-helpers.mjs +63 -63
  41. package/src/cli/listeners/performance-log/handlers.mjs +56 -56
  42. package/src/cli/listeners/performance-log/index.mjs +37 -37
  43. package/src/cli/normalize-cli-options.mjs +182 -182
  44. package/src/cli/tools/wrap-stream-in-html.mjs +37 -37
  45. package/src/cli/utl/assert-file-existence.mjs +7 -7
  46. package/src/cli/utl/io.mjs +28 -31
  47. package/src/config-utl/extract-babel-config.mjs +69 -69
  48. package/src/config-utl/extract-depcruise-config/index.mjs +54 -54
  49. package/src/config-utl/extract-depcruise-config/merge-configs.mjs +63 -63
  50. package/src/config-utl/extract-depcruise-config/read-config.mjs +9 -9
  51. package/src/config-utl/extract-depcruise-options.mjs +9 -9
  52. package/src/config-utl/extract-known-violations.mjs +49 -49
  53. package/src/config-utl/extract-ts-config.mjs +46 -48
  54. package/src/config-utl/extract-webpack-resolve-config.mjs +88 -88
  55. package/src/config-utl/make-absolute.mjs +5 -5
  56. package/src/enrich/add-validations.mjs +13 -13
  57. package/src/enrich/derive/circular.mjs +49 -49
  58. package/src/enrich/derive/dependents.mjs +27 -27
  59. package/src/enrich/derive/folders/aggregate-to-folders.mjs +104 -104
  60. package/src/enrich/derive/folders/index.mjs +19 -19
  61. package/src/enrich/derive/folders/utl.mjs +18 -18
  62. package/src/enrich/derive/metrics/get-module-metrics.mjs +27 -27
  63. package/src/enrich/derive/metrics/index.mjs +8 -8
  64. package/src/enrich/derive/module-utl.mjs +18 -18
  65. package/src/enrich/derive/orphan/index.mjs +18 -18
  66. package/src/enrich/derive/orphan/is-orphan.mjs +9 -9
  67. package/src/enrich/derive/reachable.mjs +165 -168
  68. package/src/enrich/enrich-modules.mjs +25 -25
  69. package/src/enrich/index.mjs +15 -15
  70. package/src/enrich/soften-known-violations.mjs +90 -90
  71. package/src/enrich/summarize/add-rule-set-used.mjs +13 -13
  72. package/src/enrich/summarize/get-stats.mjs +17 -17
  73. package/src/enrich/summarize/index.mjs +18 -18
  74. package/src/enrich/summarize/is-same-violation.mjs +30 -30
  75. package/src/enrich/summarize/summarize-folders.mjs +35 -35
  76. package/src/enrich/summarize/summarize-modules.mjs +97 -97
  77. package/src/enrich/summarize/summarize-options.mjs +71 -71
  78. package/src/extract/acorn/estree-helpers.mjs +66 -66
  79. package/src/extract/acorn/extract-amd-deps.mjs +63 -64
  80. package/src/extract/acorn/extract-cjs-deps.mjs +83 -83
  81. package/src/extract/acorn/extract-es6-deps.mjs +54 -54
  82. package/src/extract/acorn/extract-stats.mjs +4 -4
  83. package/src/extract/acorn/extract.mjs +28 -28
  84. package/src/extract/acorn/parse.mjs +37 -37
  85. package/src/extract/clear-caches.mjs +7 -7
  86. package/src/extract/extract-dependencies.mjs +109 -109
  87. package/src/extract/extract-stats.mjs +21 -21
  88. package/src/extract/gather-initial-sources.mjs +64 -64
  89. package/src/extract/helpers.mjs +73 -71
  90. package/src/extract/index.mjs +120 -120
  91. package/src/extract/resolve/determine-dependency-types.mjs +166 -169
  92. package/src/extract/resolve/external-module-helpers.mjs +76 -76
  93. package/src/extract/resolve/get-manifest.mjs +79 -79
  94. package/src/extract/resolve/index.mjs +175 -164
  95. package/src/extract/resolve/is-built-in.mjs +22 -24
  96. package/src/extract/resolve/merge-manifests.mjs +43 -43
  97. package/src/extract/resolve/module-classifiers.mjs +229 -229
  98. package/src/extract/resolve/resolve-amd.mjs +44 -44
  99. package/src/extract/resolve/resolve-cjs.mjs +40 -40
  100. package/src/extract/resolve/resolve-helpers.mjs +20 -20
  101. package/src/extract/resolve/resolve.mjs +26 -26
  102. package/src/extract/swc/dependency-visitor.mjs +211 -211
  103. package/src/extract/swc/extract-swc-deps.mjs +4 -4
  104. package/src/extract/swc/extract.mjs +7 -7
  105. package/src/extract/swc/parse.mjs +12 -12
  106. package/src/extract/transpile/babel-wrap.mjs +9 -9
  107. package/src/extract/transpile/coffeescript-wrap.mjs +21 -21
  108. package/src/extract/transpile/index.mjs +47 -47
  109. package/src/extract/transpile/javascript-wrap.mjs +6 -6
  110. package/src/extract/transpile/livescript-wrap.mjs +5 -5
  111. package/src/extract/transpile/meta.mjs +80 -80
  112. package/src/extract/transpile/svelte-preprocess.mjs +73 -73
  113. package/src/extract/transpile/svelte-wrap.mjs +19 -19
  114. package/src/extract/transpile/try-import-available.mjs +26 -27
  115. package/src/extract/transpile/typescript-wrap.mjs +39 -39
  116. package/src/extract/transpile/vue-template-wrap.cjs +43 -43
  117. package/src/extract/tsc/extract-stats.mjs +4 -4
  118. package/src/extract/tsc/extract-typescript-deps.mjs +429 -398
  119. package/src/extract/tsc/extract.mjs +22 -22
  120. package/src/extract/tsc/parse.mjs +21 -21
  121. package/src/graph-utl/add-focus.mjs +35 -35
  122. package/src/graph-utl/compare.mjs +24 -24
  123. package/src/graph-utl/consolidate-module-dependencies.mjs +35 -35
  124. package/src/graph-utl/consolidate-modules.mjs +33 -33
  125. package/src/graph-utl/consolidate-to-folder.mjs +13 -13
  126. package/src/graph-utl/consolidate-to-pattern.mjs +34 -34
  127. package/src/graph-utl/filter-bank.mjs +74 -69
  128. package/src/graph-utl/indexed-module-graph.mjs +227 -225
  129. package/src/graph-utl/match-facade.mjs +3 -3
  130. package/src/graph-utl/rule-set.mjs +20 -20
  131. package/src/graph-utl/strip-self-transitions.mjs +6 -6
  132. package/src/main/cruise.mjs +81 -81
  133. package/src/main/files-and-dirs/normalize.mjs +7 -7
  134. package/src/main/format.mjs +11 -14
  135. package/src/main/helpers.mjs +25 -25
  136. package/src/main/index.mjs +8 -8
  137. package/src/main/options/assert-validity.mjs +100 -100
  138. package/src/main/options/defaults.mjs +11 -11
  139. package/src/main/options/normalize.mjs +158 -160
  140. package/src/main/report-wrap.mjs +37 -37
  141. package/src/main/resolve-options/normalize.mjs +127 -128
  142. package/src/main/rule-set/assert-validity.mjs +67 -73
  143. package/src/main/rule-set/normalize.mjs +81 -79
  144. package/src/meta.cjs +15 -16
  145. package/src/report/anon/anonymize-path-element.mjs +20 -34
  146. package/src/report/anon/anonymize-path.mjs +11 -11
  147. package/src/report/anon/index.mjs +119 -119
  148. package/src/report/anon/random-string.mjs +23 -23
  149. package/src/report/azure-devops.mjs +75 -99
  150. package/src/report/baseline.mjs +9 -9
  151. package/src/report/csv.mjs +13 -13
  152. package/src/report/d2.mjs +105 -105
  153. package/src/report/dot/default-theme.mjs +152 -152
  154. package/src/report/dot/index.mjs +146 -146
  155. package/src/report/dot/module-utl.mjs +72 -72
  156. package/src/report/dot/prepare-custom-level.mjs +20 -20
  157. package/src/report/dot/prepare-flat-level.mjs +11 -11
  158. package/src/report/dot/prepare-folder-level.mjs +12 -13
  159. package/src/report/dot/theming.mjs +73 -73
  160. package/src/report/dot-webpage/dot-module.mjs +36 -36
  161. package/src/report/dot-webpage/svg-in-html-snippets/script.cjs +208 -210
  162. package/src/report/dot-webpage/svg-in-html-snippets/style.css +51 -51
  163. package/src/report/dot-webpage/wrap-in-html.mjs +7 -7
  164. package/src/report/error-html/index.mjs +49 -49
  165. package/src/report/error-html/utl.mjs +99 -99
  166. package/src/report/error-long.mjs +1 -1
  167. package/src/report/error.mjs +93 -93
  168. package/src/report/html/index.mjs +48 -48
  169. package/src/report/identity.mjs +4 -4
  170. package/src/report/index.mjs +33 -33
  171. package/src/report/json.mjs +4 -4
  172. package/src/report/markdown.mjs +120 -120
  173. package/src/report/mermaid.mjs +111 -111
  174. package/src/report/metrics.mjs +185 -185
  175. package/src/report/null.mjs +4 -4
  176. package/src/report/plugins.mjs +41 -41
  177. package/src/report/teamcity.mjs +150 -150
  178. package/src/report/text.mjs +42 -42
  179. package/src/report/utl/dependency-to-incidence-transformer.mjs +32 -32
  180. package/src/report/utl/index.mjs +53 -53
  181. package/src/schema/configuration.validate.mjs +1 -0
  182. package/src/schema/cruise-result.validate.mjs +1 -0
  183. package/src/schema/utl.mjs +6 -0
  184. package/src/utl/array-util.mjs +25 -25
  185. package/src/utl/bus.mjs +12 -12
  186. package/src/utl/extract-root-module-name.cjs +8 -8
  187. package/src/utl/find-all-files.mjs +54 -54
  188. package/src/utl/get-extension.mjs +2 -2
  189. package/src/utl/object-util.mjs +21 -22
  190. package/src/utl/path-to-posix.mjs +5 -5
  191. package/src/utl/regex-util.mjs +20 -20
  192. package/src/utl/try-import.mjs +42 -41
  193. package/src/utl/try-require.cjs +23 -23
  194. package/src/utl/wrap-and-indent.mjs +33 -33
  195. package/src/validate/index.mjs +65 -65
  196. package/src/validate/match-dependency-rule.mjs +47 -47
  197. package/src/validate/match-folder-dependency-rule.mjs +27 -27
  198. package/src/validate/match-module-rule-helpers.mjs +76 -76
  199. package/src/validate/match-module-rule.mjs +12 -12
  200. package/src/validate/matchers.mjs +162 -162
  201. package/src/validate/rule-classifiers.mjs +9 -9
  202. package/src/validate/violates-required-rule.mjs +23 -23
  203. package/types/cache-options.d.mts +27 -27
  204. package/types/config-utl/extract-babel-config.d.mts +1 -1
  205. package/types/config-utl/extract-depcruise-config.d.mts +3 -3
  206. package/types/config-utl/extract-depcruise-options.d.mts +1 -1
  207. package/types/config-utl/extract-ts-config.d.mts +1 -1
  208. package/types/config-utl/extract-webpack-resolve-config.d.mts +3 -3
  209. package/types/configuration.d.mts +10 -10
  210. package/types/cruise-result.d.mts +414 -414
  211. package/types/dependency-cruiser.d.mts +52 -52
  212. package/types/filter-types.d.mts +45 -45
  213. package/types/options.d.mts +430 -430
  214. package/types/plugins/3d-reporter-plugin.d.mts +9 -9
  215. package/types/plugins/mermaid-reporter-plugin.d.mts +10 -10
  216. package/types/plugins/stats-reporter-plugin.d.mts +9 -9
  217. package/types/reporter-options.d.mts +196 -196
  218. package/types/resolve-options.d.mts +23 -23
  219. package/types/restrictions.d.mts +174 -174
  220. package/types/rule-set.d.mts +132 -132
  221. package/types/rule-summary.d.mts +14 -14
  222. package/types/shared-types.d.mts +89 -89
  223. package/types/strict-filter-types.d.mts +52 -52
  224. package/types/strict-options.d.mts +34 -34
  225. package/types/strict-restrictions.d.mts +25 -25
  226. package/types/strict-rule-set.d.mts +36 -36
  227. package/types/violations.d.mts +40 -40
  228. package/src/schema/README.md +0 -5
  229. package/src/schema/baseline-violations.schema.mjs +0 -1
  230. package/src/schema/configuration.schema.mjs +0 -1
  231. package/src/schema/cruise-result.schema.mjs +0 -1
  232. package/types/README.md +0 -1
@@ -1,213 +1,210 @@
1
1
  /* eslint-disable security/detect-object-injection, no-inline-comments */
2
2
  import {
3
- matchToModulePath,
4
- matchToModulePathNot,
3
+ matchToModulePath,
4
+ matchToModulePathNot,
5
5
  } from "#validate/matchers.mjs";
6
6
  import IndexedModuleGraph from "#graph-utl/indexed-module-graph.mjs";
7
7
  import { extractGroups } from "#utl/regex-util.mjs";
8
8
 
9
9
  function isReachableRule(pRule) {
10
- return Object.hasOwn(pRule?.to ?? {}, "reachable");
10
+ return Object.hasOwn(pRule?.to ?? {}, "reachable");
11
11
  }
12
12
 
13
13
  function getReachableRules(pRuleSet) {
14
- return (pRuleSet?.forbidden ?? [])
15
- .filter(isReachableRule)
16
- .concat((pRuleSet?.allowed ?? []).filter(isReachableRule))
17
- .concat((pRuleSet?.required ?? []).filter(isReachableRule));
14
+ return (pRuleSet?.forbidden ?? [])
15
+ .filter(isReachableRule)
16
+ .concat((pRuleSet?.allowed ?? []).filter(isReachableRule))
17
+ .concat((pRuleSet?.required ?? []).filter(isReachableRule));
18
18
  }
19
19
 
20
20
  function isModuleInRuleFrom(pRule) {
21
- return (pModule) => {
22
- const lRuleFrom = pRule.from ?? pRule.module;
23
- if (lRuleFrom) {
24
- return (
25
- (!lRuleFrom.path || pModule.source.match(lRuleFrom.path)) &&
26
- (!lRuleFrom.pathNot || !pModule.source.match(lRuleFrom.pathNot))
27
- );
28
- }
29
- return false;
30
- };
21
+ return (pModule) => {
22
+ const lRuleFrom = pRule.from ?? pRule.module;
23
+ if (lRuleFrom) {
24
+ return (
25
+ (!lRuleFrom.path || pModule.source.match(lRuleFrom.path)) &&
26
+ (!lRuleFrom.pathNot || !pModule.source.match(lRuleFrom.pathNot))
27
+ );
28
+ }
29
+ return false;
30
+ };
31
31
  }
32
32
 
33
33
  function isModuleInRuleTo(pRule, pModuleTo, pModuleFrom) {
34
- const lGroups = pModuleFrom
35
- ? extractGroups(pRule.from ?? pRule.module, pModuleFrom.source)
36
- : [];
37
-
38
- return (
39
- matchToModulePath(pRule, pModuleTo, lGroups) &&
40
- matchToModulePathNot(pRule, pModuleTo, lGroups)
41
- );
34
+ const lGroups = pModuleFrom
35
+ ? extractGroups(pRule.from ?? pRule.module, pModuleFrom.source)
36
+ : [];
37
+
38
+ return (
39
+ matchToModulePath(pRule, pModuleTo, lGroups) &&
40
+ matchToModulePathNot(pRule, pModuleTo, lGroups)
41
+ );
42
42
  }
43
43
 
44
44
  function mergeReachableProperties(pModule, pRule, pPath, pModuleFrom) {
45
- const lReachables = pModule.reachable || [];
46
- const lIndexExistingReachable = lReachables.findIndex(
47
- (pReachable) => pReachable.asDefinedInRule === pRule.name,
48
- );
49
- const lIsReachable = pPath.length > 0;
50
-
51
- if (lIndexExistingReachable > -1) {
52
- lReachables[lIndexExistingReachable].value =
53
- lReachables[lIndexExistingReachable].value || lIsReachable;
54
- return lReachables;
55
- }
56
- return lReachables.concat({
57
- value: lIsReachable,
58
- asDefinedInRule: pRule.name,
59
- matchedFrom: pModuleFrom,
60
- });
45
+ const lReachables = pModule.reachable || [];
46
+ const lIndexExistingReachable = lReachables.findIndex(
47
+ (pReachable) => pReachable.asDefinedInRule === pRule.name,
48
+ );
49
+ const lIsReachable = pPath.length > 0;
50
+
51
+ if (lIndexExistingReachable > -1) {
52
+ lReachables[lIndexExistingReachable].value =
53
+ lReachables[lIndexExistingReachable].value || lIsReachable;
54
+ return lReachables;
55
+ }
56
+ return lReachables.concat({
57
+ value: lIsReachable,
58
+ asDefinedInRule: pRule.name,
59
+ matchedFrom: pModuleFrom,
60
+ });
61
61
  }
62
62
 
63
63
  function mergeReachesProperties(pFromModule, pToModule, pRule, pPath) {
64
- const lReaches = pFromModule.reaches || [];
65
- const lIndexExistingReachable = lReaches.findIndex(
66
- (pReachable) => pReachable.asDefinedInRule === pRule.name,
67
- );
68
-
69
- if (lIndexExistingReachable > -1) {
70
- lReaches[lIndexExistingReachable].modules = (
71
- lReaches[lIndexExistingReachable].modules /* c8 ignore next */ || []
72
- ).concat({
73
- source: pToModule.source,
74
- via: pPath,
75
- });
76
- return lReaches;
77
- }
78
- return lReaches.concat({
79
- asDefinedInRule: pRule.name,
80
- modules: [{ source: pToModule.source, via: pPath }],
81
- });
64
+ const lReaches = pFromModule.reaches || [];
65
+ const lIndexExistingReachable = lReaches.findIndex(
66
+ (pReachable) => pReachable.asDefinedInRule === pRule.name,
67
+ );
68
+
69
+ if (lIndexExistingReachable > -1) {
70
+ lReaches[lIndexExistingReachable].modules = (
71
+ lReaches[lIndexExistingReachable].modules /* c8 ignore next */ || []
72
+ ).concat({
73
+ source: pToModule.source,
74
+ via: pPath,
75
+ });
76
+ return lReaches;
77
+ }
78
+ return lReaches.concat({
79
+ asDefinedInRule: pRule.name,
80
+ modules: [{ source: pToModule.source, via: pPath }],
81
+ });
82
82
  }
83
83
 
84
84
  function shouldAddReaches(pRule, pModule) {
85
- return (
86
- (pRule.to.reachable === true || pRule.name === "not-in-allowed") &&
87
- isModuleInRuleFrom(pRule)(pModule)
88
- );
85
+ return (
86
+ (pRule.to.reachable === true || pRule.name === "not-in-allowed") &&
87
+ isModuleInRuleFrom(pRule)(pModule)
88
+ );
89
89
  }
90
90
 
91
91
  function hasCapturingGroups(pRule) {
92
- const lCapturingGroupPlaceholderRe = /\$[0-9]+/;
92
+ const lCapturingGroupPlaceholderRe = /\$[0-9]+/;
93
93
 
94
- return (
95
- lCapturingGroupPlaceholderRe.test(pRule?.to?.path ?? "") ||
96
- lCapturingGroupPlaceholderRe.test(pRule?.to?.pathNot ?? "")
97
- );
94
+ return (
95
+ lCapturingGroupPlaceholderRe.test(pRule?.to?.path ?? "") ||
96
+ lCapturingGroupPlaceholderRe.test(pRule?.to?.pathNot ?? "")
97
+ );
98
98
  }
99
99
  function shouldAddReachable(pRule, pModuleTo, pGraph) {
100
- let lReturnValue = false;
101
-
102
- if (
103
- pRule.to.reachable === false ||
104
- pRule.name === "not-in-allowed" ||
105
- pRule.module
106
- ) {
107
- if (hasCapturingGroups(pRule)) {
108
- const lModulesFrom = pGraph.filter(isModuleInRuleFrom(pRule));
109
-
110
- lReturnValue = lModulesFrom.some((pModuleFrom) =>
111
- isModuleInRuleTo(pRule, pModuleTo, pModuleFrom),
112
- );
113
- } else {
114
- lReturnValue = isModuleInRuleTo(pRule, pModuleTo);
115
- }
116
- }
117
- return lReturnValue;
100
+ let lReturnValue = false;
101
+
102
+ if (
103
+ pRule.to.reachable === false ||
104
+ pRule.name === "not-in-allowed" ||
105
+ pRule.module
106
+ ) {
107
+ if (hasCapturingGroups(pRule)) {
108
+ const lModulesFrom = pGraph.filter(isModuleInRuleFrom(pRule));
109
+
110
+ lReturnValue = lModulesFrom.some((pModuleFrom) =>
111
+ isModuleInRuleTo(pRule, pModuleTo, pModuleFrom),
112
+ );
113
+ } else {
114
+ lReturnValue = isModuleInRuleTo(pRule, pModuleTo);
115
+ }
116
+ }
117
+ return lReturnValue;
118
118
  }
119
119
 
120
120
  function addReachesToModule(pModule, pGraph, pIndexedGraph, pReachableRule) {
121
- const lToModules = pGraph.filter((pToModule) =>
122
- isModuleInRuleTo(pReachableRule, pToModule, pModule),
123
- );
124
-
125
- for (let lToModule of lToModules) {
126
- if (pModule.source !== lToModule.source) {
127
- const lPath = pIndexedGraph.getPath(pModule.source, lToModule.source);
128
-
129
- if (lPath.length > 0) {
130
- pModule.reaches = mergeReachesProperties(
131
- pModule,
132
- lToModule,
133
- pReachableRule,
134
- lPath,
135
- );
136
- }
137
- }
138
- }
139
- return pModule;
121
+ const lToModules = pGraph.filter((pToModule) =>
122
+ isModuleInRuleTo(pReachableRule, pToModule, pModule),
123
+ );
124
+
125
+ for (const lToModule of lToModules) {
126
+ if (pModule.source !== lToModule.source) {
127
+ const lPath = pIndexedGraph.getPath(pModule.source, lToModule.source);
128
+
129
+ if (lPath.length > 0) {
130
+ pModule.reaches = mergeReachesProperties(
131
+ pModule,
132
+ lToModule,
133
+ pReachableRule,
134
+ lPath,
135
+ );
136
+ }
137
+ }
138
+ }
139
+ return pModule;
140
140
  }
141
141
 
142
142
  function addReachableToModule(
143
- pModule,
144
- pIndexedGraph,
145
- pReachableRule,
146
- pFilteredFromModules,
143
+ pModule,
144
+ pIndexedGraph,
145
+ pReachableRule,
146
+ pFilteredFromModules,
147
147
  ) {
148
- let lFound = false;
149
-
150
- for (let lFromModule of pFilteredFromModules) {
151
- if (
152
- !lFound &&
153
- pModule.source !== lFromModule.source &&
154
- isModuleInRuleTo(pReachableRule, pModule, lFromModule)
155
- ) {
156
- const lPath = pIndexedGraph.getPath(lFromModule.source, pModule.source);
157
-
158
- lFound = lPath.length > 0;
159
- pModule.reachable = mergeReachableProperties(
160
- pModule,
161
- pReachableRule,
162
- lPath,
163
- lFromModule.source,
164
- );
165
- }
166
- }
167
- return pModule;
148
+ let lFound = false;
149
+
150
+ for (const lFromModule of pFilteredFromModules) {
151
+ if (
152
+ !lFound &&
153
+ pModule.source !== lFromModule.source &&
154
+ isModuleInRuleTo(pReachableRule, pModule, lFromModule)
155
+ ) {
156
+ const lPath = pIndexedGraph.getPath(lFromModule.source, pModule.source);
157
+
158
+ lFound = lPath.length > 0;
159
+ pModule.reachable = mergeReachableProperties(
160
+ pModule,
161
+ pReachableRule,
162
+ lPath,
163
+ lFromModule.source,
164
+ );
165
+ }
166
+ }
167
+ return pModule;
168
168
  }
169
169
 
170
170
  function addReachabilityToGraph(pGraph, pIndexedGraph, pReachableRule) {
171
- const lFromModules = pGraph.filter(isModuleInRuleFrom(pReachableRule));
172
-
173
- return pGraph.map((pModule) => {
174
- // strictly speaking we should clone pModule to prevent mutating it,
175
- // but in practice this function is called with a structuredClone'd graph
176
- // anyway and the (reference only) copy we use now is faster (observable
177
- // even on dependency-cruiser's self scan) and less memory intentsive.
178
- let lModule = pModule;
179
-
180
- if (shouldAddReaches(pReachableRule, lModule)) {
181
- lModule = addReachesToModule(
182
- lModule,
183
- pGraph,
184
- pIndexedGraph,
185
- pReachableRule,
186
- );
187
- }
188
- if (shouldAddReachable(pReachableRule, lModule, pGraph)) {
189
- lModule = addReachableToModule(
190
- lModule,
191
- pIndexedGraph,
192
- pReachableRule,
193
- lFromModules,
194
- );
195
- }
196
- return lModule;
197
- });
171
+ const lFromModules = pGraph.filter(isModuleInRuleFrom(pReachableRule));
172
+
173
+ return pGraph.map((pModule) => {
174
+ // mutating pModule intentionally for performance; callers pass a cloned graph
175
+ let lModule = pModule;
176
+
177
+ if (shouldAddReaches(pReachableRule, lModule)) {
178
+ lModule = addReachesToModule(
179
+ lModule,
180
+ pGraph,
181
+ pIndexedGraph,
182
+ pReachableRule,
183
+ );
184
+ }
185
+ if (shouldAddReachable(pReachableRule, lModule, pGraph)) {
186
+ lModule = addReachableToModule(
187
+ lModule,
188
+ pIndexedGraph,
189
+ pReachableRule,
190
+ lFromModules,
191
+ );
192
+ }
193
+ return lModule;
194
+ });
198
195
  }
199
196
 
200
197
  export default function deriveReachables(pGraph, pRuleSet) {
201
- const lReachableRules = pRuleSet ? getReachableRules(pRuleSet) : [];
202
-
203
- if (lReachableRules.length > 0) {
204
- const lIndexedGraph = new IndexedModuleGraph(pGraph);
205
-
206
- let lResultGraph = structuredClone(pGraph);
207
- for (const lRule of lReachableRules) {
208
- lResultGraph = addReachabilityToGraph(lResultGraph, lIndexedGraph, lRule);
209
- }
210
- return lResultGraph;
211
- }
212
- return pGraph;
198
+ const lReachableRules = pRuleSet ? getReachableRules(pRuleSet) : [];
199
+
200
+ if (lReachableRules.length > 0) {
201
+ const lIndexedGraph = new IndexedModuleGraph(pGraph);
202
+
203
+ let lResultGraph = structuredClone(pGraph);
204
+ for (const lRule of lReachableRules) {
205
+ lResultGraph = addReachabilityToGraph(lResultGraph, lIndexedGraph, lRule);
206
+ }
207
+ return lResultGraph;
208
+ }
209
+ return pGraph;
213
210
  }
@@ -17,32 +17,32 @@ import { bus } from "#utl/bus.mjs";
17
17
  * @returns {IModule[]}
18
18
  */
19
19
  export default function enrichModules(pModules, pOptions) {
20
- bus.info("analyze: cycles");
21
- const lIndexedModules = new IndexedModuleGraph(pModules);
22
- let lModules = deriveCycles(pModules, lIndexedModules, {
23
- pSourceAttribute: "source",
24
- pDependencyName: "resolved",
25
- pSkipAnalysisNotInRules: pOptions.skipAnalysisNotInRules,
26
- pRuleSet: pOptions.ruleSet,
27
- });
28
- bus.info("analyze: dependents");
29
- lModules = addDependents(lModules, pOptions);
30
- bus.info("analyze: orphans");
31
- lModules = deriveOrphans(lModules, pOptions);
32
- bus.info("analyze: reachables");
33
- lModules = deriveReachable(lModules, pOptions.ruleSet);
34
- bus.info("analyze: module metrics");
35
- lModules = deriveModuleMetrics(lModules, pOptions);
36
- bus.info("analyze: focus");
37
- lModules = addFocus(lModules, pOptions.focus);
20
+ bus.info("analyze: cycles");
21
+ const lIndexedModules = new IndexedModuleGraph(pModules);
22
+ let lModules = deriveCycles(pModules, lIndexedModules, {
23
+ pSourceAttribute: "source",
24
+ pDependencyName: "resolved",
25
+ pSkipAnalysisNotInRules: pOptions.skipAnalysisNotInRules,
26
+ pRuleSet: pOptions.ruleSet,
27
+ });
28
+ bus.info("analyze: dependents");
29
+ lModules = addDependents(lModules, pOptions);
30
+ bus.info("analyze: orphans");
31
+ lModules = deriveOrphans(lModules, pOptions);
32
+ bus.info("analyze: reachables");
33
+ lModules = deriveReachable(lModules, pOptions.ruleSet);
34
+ bus.info("analyze: module metrics");
35
+ lModules = deriveModuleMetrics(lModules, pOptions);
36
+ bus.info("analyze: focus");
37
+ lModules = addFocus(lModules, pOptions.focus);
38
38
 
39
- // when validate === false we might want to skip the addValidations.
40
- // We don't at this time, however, as "valid" is a mandatory
41
- // attribute (to simplify reporter logic)
42
- bus.info("analyze: validations");
43
- lModules = addValidations(lModules, pOptions.ruleSet, pOptions.validate);
39
+ // when validate === false we might want to skip the addValidations.
40
+ // We don't at this time, however, as "valid" is a mandatory
41
+ // attribute (to simplify reporter logic)
42
+ bus.info("analyze: validations");
43
+ lModules = addValidations(lModules, pOptions.ruleSet, pOptions.validate);
44
44
 
45
- lModules = softenKnownViolations(lModules, pOptions.knownViolations);
45
+ lModules = softenKnownViolations(lModules, pOptions.knownViolations);
46
46
 
47
- return lModules;
47
+ return lModules;
48
48
  }
@@ -17,21 +17,21 @@ import { bus } from "#utl/bus.mjs";
17
17
  * @returns {import("../../types/dependency-cruiser.js").ICruiseResult}
18
18
  */
19
19
  export default function enrich(pModules, pOptions, pFileAndDirectoryArray) {
20
- const lModules = enrichModules(pModules, pOptions);
21
- bus.info("analyze: aggregate to folders");
22
- const lFolders = aggregateToFolders(lModules, pOptions);
20
+ const lModules = enrichModules(pModules, pOptions);
21
+ bus.info("analyze: aggregate to folders");
22
+ const lFolders = aggregateToFolders(lModules, pOptions);
23
23
 
24
- bus.info("analyze: summary");
25
- const lReturnValue = {
26
- modules: lModules,
27
- ...lFolders,
28
- summary: summarize(
29
- lModules,
30
- pOptions,
31
- pFileAndDirectoryArray,
32
- lFolders.folders,
33
- ),
34
- };
24
+ bus.info("analyze: summary");
25
+ const lReturnValue = {
26
+ modules: lModules,
27
+ ...lFolders,
28
+ summary: summarize(
29
+ lModules,
30
+ pOptions,
31
+ pFileAndDirectoryArray,
32
+ lFolders.folders,
33
+ ),
34
+ };
35
35
 
36
- return lReturnValue;
36
+ return lReturnValue;
37
37
  }