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
@@ -2,80 +2,80 @@ import { basename, sep, dirname } from "node:path/posix";
2
2
  import { formatPercentage, getURLForModule } from "../utl/index.mjs";
3
3
 
4
4
  export function attributizeObject(pObject) {
5
- return (
6
- Object.keys(pObject)
7
- // eslint-disable-next-line security/detect-object-injection
8
- .map((pKey) => `${pKey}="${pObject[pKey]}"`)
9
- .join(" ")
10
- );
5
+ return (
6
+ Object.keys(pObject)
7
+ // eslint-disable-next-line security/detect-object-injection
8
+ .map((pKey) => `${pKey}="${pObject[pKey]}"`)
9
+ .join(" ")
10
+ );
11
11
  }
12
12
 
13
13
  export function extractFirstTransgression(pModule) {
14
- return {
15
- ...(pModule?.rules?.[0]
16
- ? { ...pModule, tooltip: pModule.rules[0].name }
17
- : pModule),
18
- dependencies: pModule.dependencies.map((pDependency) =>
19
- pDependency.rules
20
- ? {
21
- ...pDependency,
22
- rule: pDependency.rules[0],
23
- }
24
- : pDependency,
25
- ),
26
- };
14
+ return {
15
+ ...(pModule?.rules?.[0]
16
+ ? { ...pModule, tooltip: pModule.rules[0].name }
17
+ : pModule),
18
+ dependencies: pModule.dependencies.map((pDependency) =>
19
+ pDependency.rules
20
+ ? {
21
+ ...pDependency,
22
+ rule: pDependency.rules[0],
23
+ }
24
+ : pDependency,
25
+ ),
26
+ };
27
27
  }
28
28
 
29
29
  function toFullPath(pAll, pCurrent) {
30
- return `${pAll}${pCurrent}${sep}`;
30
+ return `${pAll}${pCurrent}${sep}`;
31
31
  }
32
32
 
33
33
  function aggregate(pPathSnippet, pCounter, pPathArray) {
34
- return {
35
- snippet: pPathSnippet,
36
- aggregateSnippet: `${pPathArray
37
- .slice(0, pCounter)
38
- .reduce(toFullPath, "")}${pPathSnippet}`,
39
- };
34
+ return {
35
+ snippet: pPathSnippet,
36
+ aggregateSnippet: `${pPathArray
37
+ .slice(0, pCounter)
38
+ .reduce(toFullPath, "")}${pPathSnippet}`,
39
+ };
40
40
  }
41
41
 
42
42
  function makeInstabilityString(pModule, pShowMetrics = false) {
43
- let lInstabilityString = "";
43
+ let lInstabilityString = "";
44
44
 
45
- if (
46
- pShowMetrics &&
47
- Object.hasOwn(pModule, "instability") &&
48
- !pModule.consolidated
49
- ) {
50
- lInstabilityString = ` <FONT color="#808080" point-size="8">${formatPercentage(
51
- pModule.instability,
52
- )}</FONT>`;
53
- }
54
- return lInstabilityString;
45
+ if (
46
+ pShowMetrics &&
47
+ Object.hasOwn(pModule, "instability") &&
48
+ !pModule.consolidated
49
+ ) {
50
+ lInstabilityString = ` <FONT color="#808080" point-size="8">${formatPercentage(
51
+ pModule.instability,
52
+ )}</FONT>`;
53
+ }
54
+ return lInstabilityString;
55
55
  }
56
56
 
57
57
  export function folderify(pShowMetrics) {
58
- /** @param {import("../../../types/cruise-result").IModule} pModule*/
59
- return (pModule) => {
60
- let lAdditions = {};
61
- let lDirectoryName = dirname(pModule.source);
58
+ /** @param {import("../../../types/cruise-result").IModule} pModule*/
59
+ return (pModule) => {
60
+ let lAdditions = {};
61
+ let lDirectoryName = dirname(pModule.source);
62
62
 
63
- if (lDirectoryName !== ".") {
64
- lAdditions.folder = lDirectoryName;
65
- lAdditions.path = lDirectoryName.split(sep).map(aggregate);
66
- }
63
+ if (lDirectoryName !== ".") {
64
+ lAdditions.folder = lDirectoryName;
65
+ lAdditions.path = lDirectoryName.split(sep).map(aggregate);
66
+ }
67
67
 
68
- lAdditions.label = `<${basename(pModule.source)}${makeInstabilityString(
69
- pModule,
70
- pShowMetrics,
71
- )}>`;
72
- lAdditions.tooltip = basename(pModule.source);
68
+ lAdditions.label = `<${basename(pModule.source)}${makeInstabilityString(
69
+ pModule,
70
+ pShowMetrics,
71
+ )}>`;
72
+ lAdditions.tooltip = basename(pModule.source);
73
73
 
74
- return {
75
- ...pModule,
76
- ...lAdditions,
77
- };
78
- };
74
+ return {
75
+ ...pModule,
76
+ ...lAdditions,
77
+ };
78
+ };
79
79
  }
80
80
 
81
81
  /**
@@ -84,28 +84,28 @@ export function folderify(pShowMetrics) {
84
84
  * @returns {URL?: string}
85
85
  */
86
86
  export function addURL(pPrefix, pSuffix) {
87
- return (pModule) => {
88
- if (pModule.couldNotResolve) {
89
- return pModule;
90
- }
87
+ return (pModule) => {
88
+ if (pModule.couldNotResolve) {
89
+ return pModule;
90
+ }
91
91
 
92
- return {
93
- ...pModule,
94
- URL: getURLForModule(pModule, pPrefix, pSuffix),
95
- };
96
- };
92
+ return {
93
+ ...pModule,
94
+ URL: getURLForModule(pModule, pPrefix, pSuffix),
95
+ };
96
+ };
97
97
  }
98
98
 
99
99
  function makeLabel(pModule, pShowMetrics) {
100
- return `<${dirname(pModule.source)}/<BR/><B>${basename(
101
- pModule.source,
102
- )}</B>${makeInstabilityString(pModule, pShowMetrics)}>`;
100
+ return `<${dirname(pModule.source)}/<BR/><B>${basename(
101
+ pModule.source,
102
+ )}</B>${makeInstabilityString(pModule, pShowMetrics)}>`;
103
103
  }
104
104
 
105
105
  export function flatLabel(pShowMetrics) {
106
- return (pModule) => ({
107
- ...pModule,
108
- label: makeLabel(pModule, pShowMetrics),
109
- tooltip: basename(pModule.source),
110
- });
106
+ return (pModule) => ({
107
+ ...pModule,
108
+ label: makeLabel(pModule, pShowMetrics),
109
+ tooltip: basename(pModule.source),
110
+ });
111
111
  }
@@ -5,25 +5,25 @@ import { compareModules } from "#graph-utl/compare.mjs";
5
5
  import stripSelfTransitions from "#graph-utl/strip-self-transitions.mjs";
6
6
 
7
7
  export default function prepareCustomLevel(
8
- pResults,
9
- pTheme,
10
- pCollapsePattern,
11
- pShowMetrics,
8
+ pResults,
9
+ pTheme,
10
+ pCollapsePattern,
11
+ pShowMetrics,
12
12
  ) {
13
- return (
14
- pCollapsePattern
15
- ? consolidateToPattern(pResults.modules, pCollapsePattern)
16
- : pResults.modules
17
- )
18
- .sort(compareModules)
19
- .map(folderify(pShowMetrics))
20
- .map(extractFirstTransgression)
21
- .map(stripSelfTransitions)
22
- .map(applyTheme(pTheme))
23
- .map(
24
- addURL(
25
- pResults.summary.optionsUsed?.prefix ?? "",
26
- pResults.summary.optionsUsed?.suffix ?? "",
27
- ),
28
- );
13
+ return (
14
+ pCollapsePattern
15
+ ? consolidateToPattern(pResults.modules, pCollapsePattern)
16
+ : pResults.modules
17
+ )
18
+ .sort(compareModules)
19
+ .map(folderify(pShowMetrics))
20
+ .map(extractFirstTransgression)
21
+ .map(stripSelfTransitions)
22
+ .map(applyTheme(pTheme))
23
+ .map(
24
+ addURL(
25
+ pResults.summary.optionsUsed?.prefix ?? "",
26
+ pResults.summary.optionsUsed?.suffix ?? "",
27
+ ),
28
+ );
29
29
  }
@@ -3,15 +3,15 @@ import { applyTheme } from "./theming.mjs";
3
3
  import { compareModules } from "#graph-utl/compare.mjs";
4
4
 
5
5
  export default function prepareFlatLevel(pResults, pTheme, _, pShowMetrics) {
6
- return pResults.modules
7
- .sort(compareModules)
8
- .map(flatLabel(pShowMetrics))
9
- .map(extractFirstTransgression)
10
- .map(applyTheme(pTheme))
11
- .map(
12
- addURL(
13
- pResults.summary.optionsUsed?.prefix ?? "",
14
- pResults.summary.optionsUsed?.suffix ?? "",
15
- ),
16
- );
6
+ return pResults.modules
7
+ .sort(compareModules)
8
+ .map(flatLabel(pShowMetrics))
9
+ .map(extractFirstTransgression)
10
+ .map(applyTheme(pTheme))
11
+ .map(
12
+ addURL(
13
+ pResults.summary.optionsUsed?.prefix ?? "",
14
+ pResults.summary.optionsUsed?.suffix ?? "",
15
+ ),
16
+ );
17
17
  }
@@ -3,19 +3,18 @@ import { applyTheme } from "./theming.mjs";
3
3
  import consolidateToFolder from "#graph-utl/consolidate-to-folder.mjs";
4
4
  import { compareModules } from "#graph-utl/compare.mjs";
5
5
  import stripSelfTransitions from "#graph-utl/strip-self-transitions.mjs";
6
- // fuk eslint
7
6
 
8
7
  export default function prepareFolderLevel(pResults, pTheme, _, pShowMetrics) {
9
- return consolidateToFolder(pResults.modules)
10
- .sort(compareModules)
11
- .map(extractFirstTransgression)
12
- .map(folderify(pShowMetrics))
13
- .map(stripSelfTransitions)
14
- .map(applyTheme(pTheme))
15
- .map(
16
- addURL(
17
- pResults.summary.optionsUsed?.prefix ?? "",
18
- pResults.summary.optionsUsed?.suffix ?? "",
19
- ),
20
- );
8
+ return consolidateToFolder(pResults.modules)
9
+ .sort(compareModules)
10
+ .map(extractFirstTransgression)
11
+ .map(folderify(pShowMetrics))
12
+ .map(stripSelfTransitions)
13
+ .map(applyTheme(pTheme))
14
+ .map(
15
+ addURL(
16
+ pResults.summary.optionsUsed?.prefix ?? "",
17
+ pResults.summary.optionsUsed?.suffix ?? "",
18
+ ),
19
+ );
21
20
  }
@@ -3,96 +3,96 @@ import { attributizeObject } from "./module-utl.mjs";
3
3
  import { has, get } from "#utl/object-util.mjs";
4
4
 
5
5
  function matchesRE(pValue, pRE) {
6
- const lMatchResult = pValue.match && pValue.match(pRE);
6
+ const lMatchResult = pValue.match && pValue.match(pRE);
7
7
 
8
- return lMatchResult && lMatchResult.length > 0;
8
+ return lMatchResult && lMatchResult.length > 0;
9
9
  }
10
10
 
11
11
  function matchesCriterion(pModuleKey, pCriterion) {
12
- return pModuleKey === pCriterion || matchesRE(pModuleKey, pCriterion);
12
+ return pModuleKey === pCriterion || matchesRE(pModuleKey, pCriterion);
13
13
  }
14
14
 
15
15
  function moduleOrDependencyMatchesCriteria(pSchemeEntry, pModule) {
16
- return Object.keys(pSchemeEntry.criteria).every((pKey) => {
17
- // the keys can have paths in them like {"rules[0].severity": "info"}
18
- // To get the criterion treat that key as a string and not as a path
19
- // eslint-disable-next-line security/detect-object-injection
20
- const lCriterion = pSchemeEntry.criteria[pKey];
21
- // we use a bespoke 'get' here because in the criteria you can enter
22
- // nested keys like "rules[0].severity" : "error", and that function
23
- // handles those for us
24
- const lModuleKey = get(pModule, pKey);
16
+ return Object.keys(pSchemeEntry.criteria).every((pKey) => {
17
+ // the keys can have paths in them like {"rules[0].severity": "info"}
18
+ // To get the criterion treat that key as a string and not as a path
19
+ // eslint-disable-next-line security/detect-object-injection
20
+ const lCriterion = pSchemeEntry.criteria[pKey];
21
+ // we use a bespoke 'get' here because in the criteria you can enter
22
+ // nested keys like "rules[0].severity" : "error", and that function
23
+ // handles those for us
24
+ const lModuleKey = get(pModule, pKey);
25
25
 
26
- if (!(lModuleKey || has(pModule, pKey))) {
27
- return false;
28
- }
26
+ if (!(lModuleKey || has(pModule, pKey))) {
27
+ return false;
28
+ }
29
29
 
30
- if (Array.isArray(lModuleKey)) {
31
- if (Array.isArray(lCriterion)) {
32
- return lCriterion.some((pCriterionEntry) =>
33
- lModuleKey.some((pModuleKeyEntry) =>
34
- matchesCriterion(pModuleKeyEntry, pCriterionEntry),
35
- ),
36
- );
37
- } else {
38
- return lModuleKey.some((pModuleKeyEntry) =>
39
- matchesCriterion(pModuleKeyEntry, lCriterion),
40
- );
41
- }
42
- }
43
- if (Array.isArray(lCriterion)) {
44
- return lCriterion.some((pCriterionEntry) =>
45
- matchesCriterion(lModuleKey, pCriterionEntry),
46
- );
47
- }
48
- return matchesCriterion(lModuleKey, lCriterion);
49
- });
30
+ if (Array.isArray(lModuleKey)) {
31
+ if (Array.isArray(lCriterion)) {
32
+ return lCriterion.some((pCriterionEntry) =>
33
+ lModuleKey.some((pModuleKeyEntry) =>
34
+ matchesCriterion(pModuleKeyEntry, pCriterionEntry),
35
+ ),
36
+ );
37
+ } else {
38
+ return lModuleKey.some((pModuleKeyEntry) =>
39
+ matchesCriterion(pModuleKeyEntry, lCriterion),
40
+ );
41
+ }
42
+ }
43
+ if (Array.isArray(lCriterion)) {
44
+ return lCriterion.some((pCriterionEntry) =>
45
+ matchesCriterion(lModuleKey, pCriterionEntry),
46
+ );
47
+ }
48
+ return matchesCriterion(lModuleKey, lCriterion);
49
+ });
50
50
  }
51
51
 
52
52
  export function getThemeAttributes(pModuleOrDependency, pAttributeCriteria) {
53
- return (pAttributeCriteria || [])
54
- .filter((pSchemeEntry) =>
55
- moduleOrDependencyMatchesCriteria(pSchemeEntry, pModuleOrDependency),
56
- )
57
- .map((pSchemeEntry) => pSchemeEntry.attributes)
58
- .reduce((pAll, pCurrent) => ({ ...pCurrent, ...pAll }), {});
53
+ return (pAttributeCriteria || [])
54
+ .filter((pSchemeEntry) =>
55
+ moduleOrDependencyMatchesCriteria(pSchemeEntry, pModuleOrDependency),
56
+ )
57
+ .map((pSchemeEntry) => pSchemeEntry.attributes)
58
+ .reduce((pAll, pCurrent) => ({ ...pCurrent, ...pAll }), {});
59
59
  }
60
60
 
61
61
  export function normalizeTheme(pTheme) {
62
- let lReturnValue = structuredClone(DEFAULT_THEME);
62
+ let lReturnValue = structuredClone(DEFAULT_THEME);
63
63
 
64
- if (pTheme) {
65
- if (pTheme.replace) {
66
- lReturnValue = pTheme;
67
- } else {
68
- lReturnValue.graph = { ...DEFAULT_THEME.graph, ...pTheme.graph };
69
- lReturnValue.node = { ...DEFAULT_THEME.node, ...pTheme.node };
70
- lReturnValue.edge = { ...DEFAULT_THEME.edge, ...pTheme.edge };
71
- lReturnValue.modules = (pTheme.modules || []).concat(
72
- DEFAULT_THEME.modules,
73
- );
74
- lReturnValue.dependencies = (pTheme.dependencies || []).concat(
75
- DEFAULT_THEME.dependencies,
76
- );
77
- }
78
- }
79
- return lReturnValue;
64
+ if (pTheme) {
65
+ if (pTheme.replace) {
66
+ lReturnValue = pTheme;
67
+ } else {
68
+ lReturnValue.graph = { ...DEFAULT_THEME.graph, ...pTheme.graph };
69
+ lReturnValue.node = { ...DEFAULT_THEME.node, ...pTheme.node };
70
+ lReturnValue.edge = { ...DEFAULT_THEME.edge, ...pTheme.edge };
71
+ lReturnValue.modules = (pTheme.modules || []).concat(
72
+ DEFAULT_THEME.modules,
73
+ );
74
+ lReturnValue.dependencies = (pTheme.dependencies || []).concat(
75
+ DEFAULT_THEME.dependencies,
76
+ );
77
+ }
78
+ }
79
+ return lReturnValue;
80
80
  }
81
81
 
82
82
  export function applyTheme(pTheme) {
83
- return (pModule) => ({
84
- ...pModule,
85
- dependencies: pModule.dependencies
86
- .map((pDependency) => ({
87
- ...pDependency,
88
- themeAttrs: attributizeObject(
89
- getThemeAttributes(pDependency, pTheme.dependencies),
90
- ),
91
- }))
92
- .map((pDependency) => ({
93
- ...pDependency,
94
- hasExtraAttributes: Boolean(pDependency.rule || pDependency.themeAttrs),
95
- })),
96
- themeAttrs: attributizeObject(getThemeAttributes(pModule, pTheme.modules)),
97
- });
83
+ return (pModule) => ({
84
+ ...pModule,
85
+ dependencies: pModule.dependencies
86
+ .map((pDependency) => ({
87
+ ...pDependency,
88
+ themeAttrs: attributizeObject(
89
+ getThemeAttributes(pDependency, pTheme.dependencies),
90
+ ),
91
+ }))
92
+ .map((pDependency) => ({
93
+ ...pDependency,
94
+ hasExtraAttributes: Boolean(pDependency.rule || pDependency.themeAttrs),
95
+ })),
96
+ themeAttrs: attributizeObject(getThemeAttributes(pModule, pTheme.modules)),
97
+ });
98
98
  }
@@ -4,8 +4,8 @@ import dotModuleReporter from "../dot/dot-module.mjs";
4
4
  import { wrapInHTML } from "./wrap-in-html.mjs";
5
5
 
6
6
  const CONSTANTS = {
7
- exec: "dot",
8
- format: "svg",
7
+ exec: "dot",
8
+ format: "svg",
9
9
  };
10
10
 
11
11
  /**
@@ -14,22 +14,22 @@ const CONSTANTS = {
14
14
  * @returns {string} the dot program converted to svg, wrapped in html
15
15
  */
16
16
  function convert(pDot, pOptions) {
17
- /* c8 ignore next */
18
- const lSpawnFunction = pOptions.spawnFunction || spawnSync;
19
- const { stdout, status, error } = lSpawnFunction(
20
- CONSTANTS.exec,
21
- [`-T${CONSTANTS.format}`],
22
- {
23
- input: pDot,
24
- },
25
- );
26
- if (status === 0) {
27
- return stdout.toString("utf8");
28
- } else if (error) {
29
- throw error;
30
- } else {
31
- throw new Error(`GraphViz' dot returned an error (exit code ${status})`);
32
- }
17
+ /* c8 ignore next */
18
+ const lSpawnFunction = pOptions.spawnFunction || spawnSync;
19
+ const { stdout, status, error } = lSpawnFunction(
20
+ CONSTANTS.exec,
21
+ [`-T${CONSTANTS.format}`],
22
+ {
23
+ input: pDot,
24
+ },
25
+ );
26
+ if (status === 0) {
27
+ return stdout.toString("utf8");
28
+ } else if (error) {
29
+ throw error;
30
+ } else {
31
+ throw new Error(`GraphViz' dot returned an error (exit code ${status})`);
32
+ }
33
33
  }
34
34
 
35
35
  /**
@@ -37,12 +37,12 @@ function convert(pDot, pOptions) {
37
37
  * @returns {boolean}
38
38
  */
39
39
  function isAvailable(pOptions) {
40
- /* c8 ignore next */
41
- const lSpawnFunction = pOptions.spawnFunction || spawnSync;
42
- const { status, stderr } = lSpawnFunction(CONSTANTS.exec, ["-V"]);
43
- return (
44
- status === 0 && stderr.toString("utf8").startsWith("dot - graphviz version")
45
- );
40
+ /* c8 ignore next */
41
+ const lSpawnFunction = pOptions.spawnFunction || spawnSync;
42
+ const { status, stderr } = lSpawnFunction(CONSTANTS.exec, ["-V"]);
43
+ return (
44
+ status === 0 && stderr.toString("utf8").startsWith("dot - graphviz version")
45
+ );
46
46
  }
47
47
 
48
48
  /**
@@ -61,16 +61,16 @@ function isAvailable(pOptions) {
61
61
  * @returns {IReporterOutput}
62
62
  */
63
63
  export default function dotWebpage(pResults, pDotWebpageReporterOptions) {
64
- if (!isAvailable(pDotWebpageReporterOptions)) {
65
- throw new Error(
66
- "GraphViz dot, which is required for the 'x-dot-webpage' reporter doesn't " +
67
- "seem to be available on this system. See the GraphViz download page for " +
68
- "instruction on how to get it on your system: https://www.graphviz.org/download/",
69
- );
70
- }
71
- const { output } = dotModuleReporter(pResults, pDotWebpageReporterOptions);
72
- return {
73
- output: wrapInHTML(convert(output, pDotWebpageReporterOptions)),
74
- exitCode: 0,
75
- };
64
+ if (!isAvailable(pDotWebpageReporterOptions)) {
65
+ throw new Error(
66
+ "GraphViz dot, which is required for the 'x-dot-webpage' reporter doesn't " +
67
+ "seem to be available on this system. See the GraphViz download page for " +
68
+ "instruction on how to get it on your system: https://www.graphviz.org/download/",
69
+ );
70
+ }
71
+ const { output } = dotModuleReporter(pResults, pDotWebpageReporterOptions);
72
+ return {
73
+ output: wrapInHTML(convert(output, pDotWebpageReporterOptions)),
74
+ exitCode: 0,
75
+ };
76
76
  }