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,83 +1,83 @@
1
1
  var gMode = new Mode();
2
2
 
3
3
  var title2ElementMap = (function makeElementMap() {
4
- /** @type {NodeListOf<SVGGElement>} */
5
- var nodes = document.querySelectorAll(".node");
6
- /** @type {NodeListOf<SVGGElement>} */
7
- var edges = document.querySelectorAll(".edge");
8
- return new Title2ElementMap(edges, nodes);
4
+ /** @type {NodeListOf<SVGGElement>} */
5
+ var nodes = document.querySelectorAll(".node");
6
+ /** @type {NodeListOf<SVGGElement>} */
7
+ var edges = document.querySelectorAll(".edge");
8
+ return new Title2ElementMap(edges, nodes);
9
9
  })();
10
10
 
11
11
  function getHoverHandler(pTitle2ElementMap) {
12
- /** @type {string} */
13
- var currentHighlightedTitle = "";
14
-
15
- /** @param {MouseEvent} pMouseEvent */
16
- return function hoverHighlightHandler(pMouseEvent) {
17
- var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
18
- var closestTitleText = getTitleText(closestNodeOrEdge);
19
-
20
- if (
21
- currentHighlightedTitle !== closestTitleText &&
22
- gMode.get() === gMode.HOVER
23
- ) {
24
- resetNodesAndEdges();
25
- addHighlight(closestNodeOrEdge);
26
- pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
27
- currentHighlightedTitle = closestTitleText;
28
- }
29
- };
12
+ /** @type {string} */
13
+ var currentHighlightedTitle = "";
14
+
15
+ /** @param {MouseEvent} pMouseEvent */
16
+ return function hoverHighlightHandler(pMouseEvent) {
17
+ var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
18
+ var closestTitleText = getTitleText(closestNodeOrEdge);
19
+
20
+ if (
21
+ currentHighlightedTitle !== closestTitleText &&
22
+ gMode.get() === gMode.HOVER
23
+ ) {
24
+ resetNodesAndEdges();
25
+ addHighlight(closestNodeOrEdge);
26
+ pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
27
+ currentHighlightedTitle = closestTitleText;
28
+ }
29
+ };
30
30
  }
31
31
 
32
32
  function getSelectHandler(pTitle2ElementMap) {
33
- /** @type {string} */
34
- var currentHighlightedTitle = "";
35
-
36
- /** @param {MouseEvent} pMouseEvent */
37
- return function selectHighlightHandler(pMouseEvent) {
38
- pMouseEvent.preventDefault();
39
-
40
- var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
41
- var closestTitleText = getTitleText(closestNodeOrEdge);
42
-
43
- if (closestNodeOrEdge) {
44
- gMode.setToSelect();
45
- } else {
46
- gMode.setToHover();
47
- }
48
- if (currentHighlightedTitle !== closestTitleText) {
49
- resetNodesAndEdges();
50
- addHighlight(closestNodeOrEdge);
51
- pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
52
- currentHighlightedTitle = closestTitleText;
53
- }
54
- };
33
+ /** @type {string} */
34
+ var currentHighlightedTitle = "";
35
+
36
+ /** @param {MouseEvent} pMouseEvent */
37
+ return function selectHighlightHandler(pMouseEvent) {
38
+ pMouseEvent.preventDefault();
39
+
40
+ var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
41
+ var closestTitleText = getTitleText(closestNodeOrEdge);
42
+
43
+ if (closestNodeOrEdge) {
44
+ gMode.setToSelect();
45
+ } else {
46
+ gMode.setToHover();
47
+ }
48
+ if (currentHighlightedTitle !== closestTitleText) {
49
+ resetNodesAndEdges();
50
+ addHighlight(closestNodeOrEdge);
51
+ pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
52
+ currentHighlightedTitle = closestTitleText;
53
+ }
54
+ };
55
55
  }
56
56
  function Mode() {
57
- var HOVER = 1;
58
- var SELECT = 2;
59
-
60
- function setToHover() {
61
- this._mode = HOVER;
62
- }
63
- function setToSelect() {
64
- this._mode = SELECT;
65
- }
66
-
67
- /**
68
- * @returns {number}
69
- */
70
- function get() {
71
- return this._mode || HOVER;
72
- }
73
-
74
- return {
75
- HOVER: HOVER,
76
- SELECT: SELECT,
77
- setToHover: setToHover,
78
- setToSelect: setToSelect,
79
- get: get,
80
- };
57
+ var HOVER = 1;
58
+ var SELECT = 2;
59
+
60
+ function setToHover() {
61
+ this._mode = HOVER;
62
+ }
63
+ function setToSelect() {
64
+ this._mode = SELECT;
65
+ }
66
+
67
+ /**
68
+ * @returns {number}
69
+ */
70
+ function get() {
71
+ return this._mode || HOVER;
72
+ }
73
+
74
+ return {
75
+ HOVER: HOVER,
76
+ SELECT: SELECT,
77
+ setToHover: setToHover,
78
+ setToSelect: setToSelect,
79
+ get: get,
80
+ };
81
81
  }
82
82
 
83
83
  /**
@@ -87,76 +87,76 @@ function Mode() {
87
87
  * @return {{get: (pTitleText:string) => SVGGElement[]}}
88
88
  */
89
89
  function Title2ElementMap(pEdges, pNodes) {
90
- /* {{[key: string]: SVGGElement[]}} */
91
- var elementMap = buildMap(pEdges, pNodes);
92
-
93
- /**
94
- * @param {NodeListOf<SVGGElement>} pEdges
95
- * @param {NodeListOf<SVGGElement>} pNodes
96
- * @return {{[key: string]: SVGGElement[]}}
97
- */
98
- function buildMap(pEdges, pNodes) {
99
- var title2NodeMap = buildTitle2NodeMap(pNodes);
100
-
101
- return nodeListToArray(pEdges).reduce(addEdgeToMap(title2NodeMap), {});
102
- }
103
- /**
104
- * @param {NodeListOf<SVGGElement>} pNodes
105
- * @return {{[key: string]: SVGGElement}}
106
- */
107
- function buildTitle2NodeMap(pNodes) {
108
- return nodeListToArray(pNodes).reduce(addNodeToMap, {});
109
- }
110
-
111
- function addNodeToMap(pMap, pNode) {
112
- var titleText = getTitleText(pNode);
113
-
114
- if (titleText) {
115
- pMap[titleText] = pNode;
116
- }
117
- return pMap;
118
- }
119
-
120
- function addEdgeToMap(pNodeMap) {
121
- return function (pEdgeMap, pEdge) {
122
- /** @type {string} */
123
- var titleText = getTitleText(pEdge);
124
-
125
- if (titleText) {
126
- var edge = pryEdgeFromTitle(titleText);
127
-
128
- pEdgeMap[titleText] = [pNodeMap[edge.from], pNodeMap[edge.to]];
129
- (pEdgeMap[edge.from] || (pEdgeMap[edge.from] = [])).push(pEdge);
130
- (pEdgeMap[edge.to] || (pEdgeMap[edge.to] = [])).push(pEdge);
131
- }
132
- return pEdgeMap;
133
- };
134
- }
135
-
136
- /**
137
- *
138
- * @param {string} pString
139
- * @return {{from?: string; to?:string;}}
140
- */
141
- function pryEdgeFromTitle(pString) {
142
- var nodeNames = pString.split(/\s*->\s*/);
143
-
144
- return {
145
- from: nodeNames.shift(),
146
- to: nodeNames.shift(),
147
- };
148
- }
149
- /**
150
- *
151
- * @param {string} pTitleText
152
- * @return {SVGGElement[]}
153
- */
154
- function get(pTitleText) {
155
- return (pTitleText && elementMap[pTitleText]) || [];
156
- }
157
- return {
158
- get: get,
159
- };
90
+ /* {{[key: string]: SVGGElement[]}} */
91
+ var elementMap = buildMap(pEdges, pNodes);
92
+
93
+ /**
94
+ * @param {NodeListOf<SVGGElement>} pEdges
95
+ * @param {NodeListOf<SVGGElement>} pNodes
96
+ * @return {{[key: string]: SVGGElement[]}}
97
+ */
98
+ function buildMap(pEdges, pNodes) {
99
+ var title2NodeMap = buildTitle2NodeMap(pNodes);
100
+
101
+ return nodeListToArray(pEdges).reduce(addEdgeToMap(title2NodeMap), {});
102
+ }
103
+ /**
104
+ * @param {NodeListOf<SVGGElement>} pNodes
105
+ * @return {{[key: string]: SVGGElement}}
106
+ */
107
+ function buildTitle2NodeMap(pNodes) {
108
+ return nodeListToArray(pNodes).reduce(addNodeToMap, {});
109
+ }
110
+
111
+ function addNodeToMap(pMap, pNode) {
112
+ var titleText = getTitleText(pNode);
113
+
114
+ if (titleText) {
115
+ pMap[titleText] = pNode;
116
+ }
117
+ return pMap;
118
+ }
119
+
120
+ function addEdgeToMap(pNodeMap) {
121
+ return function (pEdgeMap, pEdge) {
122
+ /** @type {string} */
123
+ var titleText = getTitleText(pEdge);
124
+
125
+ if (titleText) {
126
+ var edge = pryEdgeFromTitle(titleText);
127
+
128
+ pEdgeMap[titleText] = [pNodeMap[edge.from], pNodeMap[edge.to]];
129
+ (pEdgeMap[edge.from] || (pEdgeMap[edge.from] = [])).push(pEdge);
130
+ (pEdgeMap[edge.to] || (pEdgeMap[edge.to] = [])).push(pEdge);
131
+ }
132
+ return pEdgeMap;
133
+ };
134
+ }
135
+
136
+ /**
137
+ *
138
+ * @param {string} pString
139
+ * @return {{from?: string; to?:string;}}
140
+ */
141
+ function pryEdgeFromTitle(pString) {
142
+ var nodeNames = pString.split(/\s*->\s*/);
143
+
144
+ return {
145
+ from: nodeNames.shift(),
146
+ to: nodeNames.shift(),
147
+ };
148
+ }
149
+ /**
150
+ *
151
+ * @param {string} pTitleText
152
+ * @return {SVGGElement[]}
153
+ */
154
+ function get(pTitleText) {
155
+ return (pTitleText && elementMap[pTitleText]) || [];
156
+ }
157
+ return {
158
+ get: get,
159
+ };
160
160
  }
161
161
 
162
162
  /**
@@ -164,15 +164,15 @@ function Title2ElementMap(pEdges, pNodes) {
164
164
  * @return {string?}
165
165
  */
166
166
  function getTitleText(pGElement) {
167
- /** @type {SVGTitleElement} */
168
- var title = pGElement && pGElement.querySelector("title");
169
- /** @type {string} */
170
- var titleText = title && title.textContent;
171
-
172
- if (titleText) {
173
- titleText = titleText.trim();
174
- }
175
- return titleText;
167
+ /** @type {SVGTitleElement} */
168
+ var title = pGElement && pGElement.querySelector("title");
169
+ /** @type {string} */
170
+ var titleText = title && title.textContent;
171
+
172
+ if (titleText) {
173
+ titleText = titleText.trim();
174
+ }
175
+ return titleText;
176
176
  }
177
177
 
178
178
  /**
@@ -180,71 +180,71 @@ function getTitleText(pGElement) {
180
180
  * @return {Element[]}
181
181
  */
182
182
  function nodeListToArray(pNodeList) {
183
- var lReturnValue = [];
183
+ var lReturnValue = [];
184
184
 
185
- pNodeList.forEach(function (pElement) {
186
- lReturnValue.push(pElement);
187
- });
185
+ pNodeList.forEach(function (pElement) {
186
+ lReturnValue.push(pElement);
187
+ });
188
188
 
189
- return lReturnValue;
189
+ return lReturnValue;
190
190
  }
191
191
 
192
192
  function resetNodesAndEdges() {
193
- nodeListToArray(document.querySelectorAll(".current")).forEach(
194
- removeHighlight,
195
- );
193
+ nodeListToArray(document.querySelectorAll(".current")).forEach(
194
+ removeHighlight,
195
+ );
196
196
  }
197
197
 
198
198
  /**
199
199
  * @param {SVGGElement} pGElement
200
200
  */
201
201
  function removeHighlight(pGElement) {
202
- if (pGElement && pGElement.classList) {
203
- pGElement.classList.remove("current");
204
- }
202
+ if (pGElement && pGElement.classList) {
203
+ pGElement.classList.remove("current");
204
+ }
205
205
  }
206
206
 
207
207
  /**
208
208
  * @param {SVGGElement} pGroup
209
209
  */
210
210
  function addHighlight(pGroup) {
211
- if (pGroup && pGroup.classList) {
212
- pGroup.classList.add("current");
213
- }
211
+ if (pGroup && pGroup.classList) {
212
+ pGroup.classList.add("current");
213
+ }
214
214
  }
215
215
 
216
216
  var gHints = {
217
- HIDDEN: 1,
218
- SHOWN: 2,
219
- state: 1, // === HIDDEN
220
- show: function () {
221
- document.getElementById("hints").removeAttribute("style");
222
- gHints.state = gHints.SHOWN;
223
- },
224
- hide: function () {
225
- document.getElementById("hints").style = "display:none";
226
- gHints.state = gHints.HIDDEN;
227
- },
228
- toggle: function () {
229
- if ((gHints.state || gHints.HIDDEN) === gHints.HIDDEN) {
230
- gHints.show();
231
- } else {
232
- gHints.hide();
233
- }
234
- },
217
+ HIDDEN: 1,
218
+ SHOWN: 2,
219
+ state: 1, // === HIDDEN
220
+ show: function () {
221
+ document.getElementById("hints").removeAttribute("style");
222
+ gHints.state = gHints.SHOWN;
223
+ },
224
+ hide: function () {
225
+ document.getElementById("hints").style = "display:none";
226
+ gHints.state = gHints.HIDDEN;
227
+ },
228
+ toggle: function () {
229
+ if ((gHints.state || gHints.HIDDEN) === gHints.HIDDEN) {
230
+ gHints.show();
231
+ } else {
232
+ gHints.hide();
233
+ }
234
+ },
235
235
  };
236
236
 
237
237
  /** @param {KeyboardEvent} pKeyboardEvent */
238
238
  function keyboardEventHandler(pKeyboardEvent) {
239
- if (pKeyboardEvent.key === "Escape") {
240
- resetNodesAndEdges();
241
- gMode.setToHover();
242
- gHints.hide();
243
- }
244
- if (pKeyboardEvent.key === "F1") {
245
- pKeyboardEvent.preventDefault();
246
- gHints.toggle();
247
- }
239
+ if (pKeyboardEvent.key === "Escape") {
240
+ resetNodesAndEdges();
241
+ gMode.setToHover();
242
+ gHints.hide();
243
+ }
244
+ if (pKeyboardEvent.key === "F1") {
245
+ pKeyboardEvent.preventDefault();
246
+ gHints.toggle();
247
+ }
248
248
  }
249
249
 
250
250
  document.addEventListener("contextmenu", getSelectHandler(title2ElementMap));
@@ -253,34 +253,32 @@ document.addEventListener("keydown", keyboardEventHandler);
253
253
  document.getElementById("close-hints").addEventListener("click", gHints.hide);
254
254
  document.getElementById("button_help").addEventListener("click", gHints.toggle);
255
255
  document.querySelector("svg").insertAdjacentHTML(
256
- "afterbegin",
257
- `<linearGradient id="edgeGradient">
256
+ "afterbegin",
257
+ `<linearGradient id="edgeGradient">
258
258
  <stop offset="0%" stop-color="fuchsia"/>
259
259
  <stop offset="100%" stop-color="purple"/>
260
260
  </linearGradient>
261
261
  `,
262
262
  );
263
263
 
264
- // Add a small increment to the last value of the path to make gradients on
265
- // horizontal paths work. Without them all browsers I tested with (firefox,
266
- // chrome) do not render the gradient, but instead make the line transparent
267
- // (or the color of the background, I haven't looked into it that deeply,
268
- // but for the hack it doesn't matter which).
264
+ // Slightly nudge the last numeric path value (+0.001) so SVG stroke
265
+ // gradients render correctly on horizontal paths. Without them,
266
+ // they don't render at all (firefox, chrome).
269
267
  function skewLineABit(lDrawingInstructions) {
270
- var lLastValue = lDrawingInstructions.match(/(\d+\.?\d*)$/)[0];
271
- // Smaller values than .001 _should_ work as well, but don't in all
272
- // cases. Even this value is so small that it is not visible to the
273
- // human eye (tested with the two I have at my disposal).
274
- var lIncrement = 0.001;
275
- var lNewLastValue = parseFloat(lLastValue) + lIncrement;
276
-
277
- return lDrawingInstructions.replace(lLastValue, lNewLastValue);
268
+ var lLastValue = lDrawingInstructions.match(/(\d+\.?\d*)$/)[0];
269
+ // Smaller values than .001 _should_ work, but don't always.
270
+ // Even this value is so small that it is not visible to the
271
+ // human eye (tested with the two I have at my disposal).
272
+ var lIncrement = 0.001;
273
+ var lNewLastValue = parseFloat(lLastValue) + lIncrement;
274
+
275
+ return lDrawingInstructions.replace(lLastValue, lNewLastValue);
278
276
  }
279
277
 
280
278
  nodeListToArray(document.querySelectorAll("path"))
281
- .filter(function (pElement) {
282
- return pElement.parentElement.classList.contains("edge");
283
- })
284
- .forEach(function (pElement) {
285
- pElement.attributes.d.value = skewLineABit(pElement.attributes.d.value);
286
- });
279
+ .filter(function (pElement) {
280
+ return pElement.parentElement.classList.contains("edge");
281
+ })
282
+ .forEach(function (pElement) {
283
+ pElement.attributes.d.value = skewLineABit(pElement.attributes.d.value);
284
+ });
@@ -4,8 +4,8 @@
4
4
  .node:active polygon,
5
5
  .node:hover polygon,
6
6
  .node.current polygon {
7
- stroke: fuchsia;
8
- stroke-width: 2;
7
+ stroke: fuchsia;
8
+ stroke-width: 2;
9
9
  }
10
10
 
11
11
  .edge:active path,
@@ -14,88 +14,88 @@
14
14
  .edge:active ellipse,
15
15
  .edge:hover ellipse,
16
16
  .edge.current ellipse {
17
- stroke: url(#edgeGradient);
18
- stroke-width: 3;
19
- stroke-opacity: 1;
17
+ stroke: url(#edgeGradient);
18
+ stroke-width: 3;
19
+ stroke-opacity: 1;
20
20
  }
21
21
 
22
22
  .edge:active polygon,
23
23
  .edge:hover polygon,
24
24
  .edge.current polygon {
25
- stroke: fuchsia;
26
- stroke-width: 3;
27
- fill: fuchsia;
28
- stroke-opacity: 1;
29
- fill-opacity: 1;
25
+ stroke: fuchsia;
26
+ stroke-width: 3;
27
+ fill: fuchsia;
28
+ stroke-opacity: 1;
29
+ fill-opacity: 1;
30
30
  }
31
31
 
32
32
  .edge:active text,
33
33
  .edge:hover text {
34
- fill: fuchsia;
34
+ fill: fuchsia;
35
35
  }
36
36
 
37
37
  .cluster path {
38
- stroke-width: 3;
38
+ stroke-width: 3;
39
39
  }
40
40
 
41
41
  .cluster:active path,
42
42
  .cluster:hover path {
43
- fill: #ffff0011;
43
+ fill: #ffff0011;
44
44
  }
45
45
 
46
46
  div.hint {
47
- background-color: #000000aa;
48
- color: white;
49
- font-family: Arial, Helvetica, sans-serif;
50
- border-radius: 1rem;
51
- position: fixed;
52
- top: calc(50% - 4em);
53
- right: calc(50% - 10em);
54
- border: none;
55
- padding: 1em 3em 1em 1em;
47
+ background-color: #000000aa;
48
+ color: white;
49
+ font-family: Arial, Helvetica, sans-serif;
50
+ border-radius: 1rem;
51
+ position: fixed;
52
+ top: calc(50% - 4em);
53
+ right: calc(50% - 10em);
54
+ border: none;
55
+ padding: 1em 3em 1em 1em;
56
56
  }
57
57
 
58
58
  .hint button {
59
- position: absolute;
60
- font-weight: bolder;
61
- right: 0.6em;
62
- top: 0.6em;
63
- color: inherit;
64
- background-color: inherit;
65
- border: 1px solid currentColor;
66
- border-radius: 1em;
67
- margin-left: 0.6em;
59
+ position: absolute;
60
+ font-weight: bolder;
61
+ right: 0.6em;
62
+ top: 0.6em;
63
+ color: inherit;
64
+ background-color: inherit;
65
+ border: 1px solid currentColor;
66
+ border-radius: 1em;
67
+ margin-left: 0.6em;
68
68
  }
69
69
 
70
70
  .hint a {
71
- color: inherit;
71
+ color: inherit;
72
72
  }
73
73
 
74
74
  #button_help {
75
- color: white;
76
- background-color: #00000011;
77
- border-radius: 1em;
78
- position: fixed;
79
- top: 1em;
80
- right: 1em;
81
- font-size: 24pt;
82
- font-weight: bolder;
83
- width: 2em;
84
- height: 2em;
85
- border: none;
75
+ color: white;
76
+ background-color: #00000011;
77
+ border-radius: 1em;
78
+ position: fixed;
79
+ top: 1em;
80
+ right: 1em;
81
+ font-size: 24pt;
82
+ font-weight: bolder;
83
+ width: 2em;
84
+ height: 2em;
85
+ border: none;
86
86
  }
87
87
 
88
88
  #button_help:hover {
89
- cursor: pointer;
90
- background-color: #00000077;
89
+ cursor: pointer;
90
+ background-color: #00000077;
91
91
  }
92
92
 
93
93
  @media print {
94
- #button_help {
95
- display: none;
96
- }
94
+ #button_help {
95
+ display: none;
96
+ }
97
97
 
98
- div.hint {
99
- display: none;
100
- }
98
+ div.hint {
99
+ display: none;
100
+ }
101
101
  }
@@ -2,10 +2,10 @@ import { readFileSync } from "node:fs";
2
2
  import { fileURLToPath } from "node:url";
3
3
 
4
4
  const STYLESHEET_FILE = fileURLToPath(
5
- new URL("svg-in-html-snippets/style.css", import.meta.url),
5
+ new URL("svg-in-html-snippets/style.css", import.meta.url),
6
6
  );
7
7
  const SCRIPT_FILE = fileURLToPath(
8
- new URL("svg-in-html-snippets/script.cjs", import.meta.url),
8
+ new URL("svg-in-html-snippets/script.cjs", import.meta.url),
9
9
  );
10
10
 
11
11
  /**
@@ -13,7 +13,7 @@ const SCRIPT_FILE = fileURLToPath(
13
13
  * @returns {string}
14
14
  */
15
15
  export function getHeader(pStylesheet) {
16
- return `<!doctype html>
16
+ return `<!doctype html>
17
17
  <html lang="en" dir="ltr">
18
18
  <head>
19
19
  <meta charset="utf-8" />
@@ -41,7 +41,7 @@ export function getHeader(pStylesheet) {
41
41
  * @returns {string}
42
42
  */
43
43
  export function getFooter(pScript) {
44
- return ` <script>
44
+ return ` <script>
45
45
  ${pScript}
46
46
  </script>
47
47
  </body>
@@ -55,8 +55,8 @@ export function getFooter(pScript) {
55
55
  * @returns {string}
56
56
  */
57
57
  export function wrapInHTML(pSVG) {
58
- const lStylesheet = readFileSync(STYLESHEET_FILE, "utf8");
59
- const lScript = readFileSync(SCRIPT_FILE, "utf8");
58
+ const lStylesheet = readFileSync(STYLESHEET_FILE, "utf8");
59
+ const lScript = readFileSync(SCRIPT_FILE, "utf8");
60
60
 
61
- return getHeader(lStylesheet) + pSVG + getFooter(lScript);
61
+ return getHeader(lStylesheet) + pSVG + getFooter(lScript);
62
62
  }