dependency-cruiser 17.3.2 → 17.3.3-beta-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/depcruise-baseline.mjs +43 -43
- package/bin/depcruise-fmt.mjs +89 -89
- package/bin/dependency-cruise.mjs +171 -171
- package/configs/plugins/3d-reporter-plugin.mjs +36 -36
- package/configs/plugins/stats-reporter-plugin.mjs +51 -51
- package/configs/recommended-strict.cjs +5 -5
- package/configs/recommended-warn-only.cjs +5 -5
- package/configs/recommended.cjs +22 -22
- package/configs/rules/no-circular.cjs +10 -10
- package/configs/rules/no-deprecated-core.cjs +10 -10
- package/configs/rules/no-duplicate-dependency-types.cjs +17 -17
- package/configs/rules/no-non-package-json.cjs +11 -11
- package/configs/rules/no-orphans.cjs +18 -18
- package/configs/rules/not-to-deprecated.cjs +10 -10
- package/configs/rules/not-to-unresolvable.cjs +10 -10
- package/package.json +170 -170
- package/src/cache/cache.mjs +139 -139
- package/src/cache/content-strategy.mjs +88 -88
- package/src/cache/find-content-changes.mjs +58 -58
- package/src/cache/helpers.mjs +52 -52
- package/src/cache/metadata-strategy.mjs +83 -83
- package/src/cache/options-compatible.mjs +56 -109
- package/src/cli/assert-node-environment-suitable.mjs +7 -7
- package/src/cli/defaults.mjs +5 -5
- package/src/cli/format-meta-info.mjs +22 -22
- package/src/cli/format.mjs +28 -28
- package/src/cli/index.mjs +145 -145
- package/src/cli/init-config/build-config.mjs +94 -94
- package/src/cli/init-config/environment-helpers.mjs +77 -77
- package/src/cli/init-config/find-extensions.mjs +27 -27
- package/src/cli/init-config/get-user-input.mjs +151 -151
- package/src/cli/init-config/index.mjs +88 -88
- package/src/cli/init-config/normalize-init-options.mjs +47 -47
- package/src/cli/init-config/utl.mjs +4 -4
- package/src/cli/init-config/validators.mjs +10 -10
- package/src/cli/init-config/write-config.mjs +21 -21
- package/src/cli/init-config/write-run-scripts-to-manifest.mjs +103 -107
- package/src/cli/listeners/cli-feedback.mjs +49 -49
- package/src/cli/listeners/ndjson.mjs +66 -66
- package/src/cli/listeners/performance-log/format-helpers.mjs +63 -63
- package/src/cli/listeners/performance-log/handlers.mjs +56 -56
- package/src/cli/listeners/performance-log/index.mjs +37 -37
- package/src/cli/normalize-cli-options.mjs +182 -182
- package/src/cli/tools/wrap-stream-in-html.mjs +37 -37
- package/src/cli/utl/assert-file-existence.mjs +7 -7
- package/src/cli/utl/io.mjs +28 -31
- package/src/config-utl/extract-babel-config.mjs +69 -69
- package/src/config-utl/extract-depcruise-config/index.mjs +54 -54
- package/src/config-utl/extract-depcruise-config/merge-configs.mjs +63 -63
- package/src/config-utl/extract-depcruise-config/read-config.mjs +9 -9
- package/src/config-utl/extract-depcruise-options.mjs +9 -9
- package/src/config-utl/extract-known-violations.mjs +49 -49
- package/src/config-utl/extract-ts-config.mjs +46 -48
- package/src/config-utl/extract-webpack-resolve-config.mjs +88 -88
- package/src/config-utl/make-absolute.mjs +5 -5
- package/src/enrich/add-validations.mjs +13 -13
- package/src/enrich/derive/circular.mjs +49 -49
- package/src/enrich/derive/dependents.mjs +27 -27
- package/src/enrich/derive/folders/aggregate-to-folders.mjs +104 -104
- package/src/enrich/derive/folders/index.mjs +19 -19
- package/src/enrich/derive/folders/utl.mjs +18 -18
- package/src/enrich/derive/metrics/get-module-metrics.mjs +27 -27
- package/src/enrich/derive/metrics/index.mjs +8 -8
- package/src/enrich/derive/module-utl.mjs +18 -18
- package/src/enrich/derive/orphan/index.mjs +18 -18
- package/src/enrich/derive/orphan/is-orphan.mjs +9 -9
- package/src/enrich/derive/reachable.mjs +165 -168
- package/src/enrich/enrich-modules.mjs +25 -25
- package/src/enrich/index.mjs +15 -15
- package/src/enrich/soften-known-violations.mjs +90 -90
- package/src/enrich/summarize/add-rule-set-used.mjs +13 -13
- package/src/enrich/summarize/get-stats.mjs +17 -17
- package/src/enrich/summarize/index.mjs +18 -18
- package/src/enrich/summarize/is-same-violation.mjs +30 -30
- package/src/enrich/summarize/summarize-folders.mjs +35 -35
- package/src/enrich/summarize/summarize-modules.mjs +97 -97
- package/src/enrich/summarize/summarize-options.mjs +71 -71
- package/src/extract/acorn/estree-helpers.mjs +66 -66
- package/src/extract/acorn/extract-amd-deps.mjs +63 -64
- package/src/extract/acorn/extract-cjs-deps.mjs +83 -83
- package/src/extract/acorn/extract-es6-deps.mjs +54 -54
- package/src/extract/acorn/extract-stats.mjs +4 -4
- package/src/extract/acorn/extract.mjs +28 -28
- package/src/extract/acorn/parse.mjs +37 -37
- package/src/extract/clear-caches.mjs +7 -7
- package/src/extract/extract-dependencies.mjs +109 -109
- package/src/extract/extract-stats.mjs +21 -21
- package/src/extract/gather-initial-sources.mjs +64 -64
- package/src/extract/helpers.mjs +73 -71
- package/src/extract/index.mjs +120 -120
- package/src/extract/resolve/determine-dependency-types.mjs +166 -169
- package/src/extract/resolve/external-module-helpers.mjs +76 -76
- package/src/extract/resolve/get-manifest.mjs +79 -79
- package/src/extract/resolve/index.mjs +175 -164
- package/src/extract/resolve/is-built-in.mjs +22 -24
- package/src/extract/resolve/merge-manifests.mjs +43 -43
- package/src/extract/resolve/module-classifiers.mjs +229 -229
- package/src/extract/resolve/resolve-amd.mjs +44 -44
- package/src/extract/resolve/resolve-cjs.mjs +40 -40
- package/src/extract/resolve/resolve-helpers.mjs +20 -20
- package/src/extract/resolve/resolve.mjs +26 -26
- package/src/extract/swc/dependency-visitor.mjs +211 -211
- package/src/extract/swc/extract-swc-deps.mjs +4 -4
- package/src/extract/swc/extract.mjs +7 -7
- package/src/extract/swc/parse.mjs +12 -12
- package/src/extract/transpile/babel-wrap.mjs +9 -9
- package/src/extract/transpile/coffeescript-wrap.mjs +21 -21
- package/src/extract/transpile/index.mjs +47 -47
- package/src/extract/transpile/javascript-wrap.mjs +6 -6
- package/src/extract/transpile/livescript-wrap.mjs +5 -5
- package/src/extract/transpile/meta.mjs +80 -80
- package/src/extract/transpile/svelte-preprocess.mjs +73 -73
- package/src/extract/transpile/svelte-wrap.mjs +19 -19
- package/src/extract/transpile/try-import-available.mjs +26 -27
- package/src/extract/transpile/typescript-wrap.mjs +39 -39
- package/src/extract/transpile/vue-template-wrap.cjs +43 -43
- package/src/extract/tsc/extract-stats.mjs +4 -4
- package/src/extract/tsc/extract-typescript-deps.mjs +429 -398
- package/src/extract/tsc/extract.mjs +22 -22
- package/src/extract/tsc/parse.mjs +21 -21
- package/src/graph-utl/add-focus.mjs +35 -35
- package/src/graph-utl/compare.mjs +24 -24
- package/src/graph-utl/consolidate-module-dependencies.mjs +35 -35
- package/src/graph-utl/consolidate-modules.mjs +33 -33
- package/src/graph-utl/consolidate-to-folder.mjs +13 -13
- package/src/graph-utl/consolidate-to-pattern.mjs +34 -34
- package/src/graph-utl/filter-bank.mjs +74 -69
- package/src/graph-utl/indexed-module-graph.mjs +227 -225
- package/src/graph-utl/match-facade.mjs +3 -3
- package/src/graph-utl/rule-set.mjs +20 -20
- package/src/graph-utl/strip-self-transitions.mjs +6 -6
- package/src/main/cruise.mjs +81 -81
- package/src/main/files-and-dirs/normalize.mjs +7 -7
- package/src/main/format.mjs +11 -14
- package/src/main/helpers.mjs +25 -25
- package/src/main/index.mjs +8 -8
- package/src/main/options/assert-validity.mjs +100 -100
- package/src/main/options/defaults.mjs +11 -11
- package/src/main/options/normalize.mjs +158 -160
- package/src/main/report-wrap.mjs +37 -37
- package/src/main/resolve-options/normalize.mjs +127 -128
- package/src/main/rule-set/assert-validity.mjs +67 -73
- package/src/main/rule-set/normalize.mjs +81 -79
- package/src/meta.cjs +15 -16
- package/src/report/anon/anonymize-path-element.mjs +20 -34
- package/src/report/anon/anonymize-path.mjs +11 -11
- package/src/report/anon/index.mjs +119 -119
- package/src/report/anon/random-string.mjs +23 -23
- package/src/report/azure-devops.mjs +75 -99
- package/src/report/baseline.mjs +9 -9
- package/src/report/csv.mjs +13 -13
- package/src/report/d2.mjs +105 -105
- package/src/report/dot/default-theme.mjs +152 -152
- package/src/report/dot/index.mjs +146 -146
- package/src/report/dot/module-utl.mjs +72 -72
- package/src/report/dot/prepare-custom-level.mjs +20 -20
- package/src/report/dot/prepare-flat-level.mjs +11 -11
- package/src/report/dot/prepare-folder-level.mjs +12 -13
- package/src/report/dot/theming.mjs +73 -73
- package/src/report/dot-webpage/dot-module.mjs +36 -36
- package/src/report/dot-webpage/svg-in-html-snippets/script.cjs +208 -210
- package/src/report/dot-webpage/svg-in-html-snippets/style.css +51 -51
- package/src/report/dot-webpage/wrap-in-html.mjs +7 -7
- package/src/report/error-html/index.mjs +49 -49
- package/src/report/error-html/utl.mjs +99 -99
- package/src/report/error-long.mjs +1 -1
- package/src/report/error.mjs +93 -93
- package/src/report/html/index.mjs +48 -48
- package/src/report/identity.mjs +4 -4
- package/src/report/index.mjs +33 -33
- package/src/report/json.mjs +4 -4
- package/src/report/markdown.mjs +120 -120
- package/src/report/mermaid.mjs +111 -111
- package/src/report/metrics.mjs +185 -185
- package/src/report/null.mjs +4 -4
- package/src/report/plugins.mjs +41 -41
- package/src/report/teamcity.mjs +150 -150
- package/src/report/text.mjs +42 -42
- package/src/report/utl/dependency-to-incidence-transformer.mjs +32 -32
- package/src/report/utl/index.mjs +53 -53
- package/src/schema/configuration.validate.mjs +1 -0
- package/src/schema/cruise-result.validate.mjs +1 -0
- package/src/schema/utl.mjs +6 -0
- package/src/utl/array-util.mjs +25 -25
- package/src/utl/bus.mjs +12 -12
- package/src/utl/extract-root-module-name.cjs +8 -8
- package/src/utl/find-all-files.mjs +54 -54
- package/src/utl/get-extension.mjs +2 -2
- package/src/utl/object-util.mjs +21 -22
- package/src/utl/path-to-posix.mjs +5 -5
- package/src/utl/regex-util.mjs +20 -20
- package/src/utl/try-import.mjs +42 -41
- package/src/utl/try-require.cjs +23 -23
- package/src/utl/wrap-and-indent.mjs +33 -33
- package/src/validate/index.mjs +65 -65
- package/src/validate/match-dependency-rule.mjs +47 -47
- package/src/validate/match-folder-dependency-rule.mjs +27 -27
- package/src/validate/match-module-rule-helpers.mjs +76 -76
- package/src/validate/match-module-rule.mjs +12 -12
- package/src/validate/matchers.mjs +162 -162
- package/src/validate/rule-classifiers.mjs +9 -9
- package/src/validate/violates-required-rule.mjs +23 -23
- package/types/cache-options.d.mts +27 -27
- package/types/config-utl/extract-babel-config.d.mts +1 -1
- package/types/config-utl/extract-depcruise-config.d.mts +3 -3
- package/types/config-utl/extract-depcruise-options.d.mts +1 -1
- package/types/config-utl/extract-ts-config.d.mts +1 -1
- package/types/config-utl/extract-webpack-resolve-config.d.mts +3 -3
- package/types/configuration.d.mts +10 -10
- package/types/cruise-result.d.mts +414 -414
- package/types/dependency-cruiser.d.mts +52 -52
- package/types/filter-types.d.mts +45 -45
- package/types/options.d.mts +430 -430
- package/types/plugins/3d-reporter-plugin.d.mts +9 -9
- package/types/plugins/mermaid-reporter-plugin.d.mts +10 -10
- package/types/plugins/stats-reporter-plugin.d.mts +9 -9
- package/types/reporter-options.d.mts +196 -196
- package/types/resolve-options.d.mts +23 -23
- package/types/restrictions.d.mts +174 -174
- package/types/rule-set.d.mts +132 -132
- package/types/rule-summary.d.mts +14 -14
- package/types/shared-types.d.mts +89 -89
- package/types/strict-filter-types.d.mts +52 -52
- package/types/strict-options.d.mts +34 -34
- package/types/strict-restrictions.d.mts +25 -25
- package/types/strict-rule-set.d.mts +36 -36
- package/types/violations.d.mts +40 -40
- package/src/schema/README.md +0 -5
- package/src/schema/baseline-violations.schema.mjs +0 -1
- package/src/schema/configuration.schema.mjs +0 -1
- package/src/schema/cruise-result.schema.mjs +0 -1
- package/types/README.md +0 -1
|
@@ -1,83 +1,83 @@
|
|
|
1
1
|
var gMode = new Mode();
|
|
2
2
|
|
|
3
3
|
var title2ElementMap = (function makeElementMap() {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
183
|
+
var lReturnValue = [];
|
|
184
184
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
185
|
+
pNodeList.forEach(function (pElement) {
|
|
186
|
+
lReturnValue.push(pElement);
|
|
187
|
+
});
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
return lReturnValue;
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
function resetNodesAndEdges() {
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
if (pGroup && pGroup.classList) {
|
|
212
|
+
pGroup.classList.add("current");
|
|
213
|
+
}
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
var gHints = {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
257
|
-
|
|
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
|
-
//
|
|
265
|
-
// horizontal paths
|
|
266
|
-
//
|
|
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
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
34
|
+
fill: fuchsia;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
.cluster path {
|
|
38
|
-
|
|
38
|
+
stroke-width: 3;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.cluster:active path,
|
|
42
42
|
.cluster:hover path {
|
|
43
|
-
|
|
43
|
+
fill: #ffff0011;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
div.hint {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
71
|
+
color: inherit;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
#button_help {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
90
|
-
|
|
89
|
+
cursor: pointer;
|
|
90
|
+
background-color: #00000077;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
@media print {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
#button_help {
|
|
95
|
+
display: none;
|
|
96
|
+
}
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
5
|
+
new URL("svg-in-html-snippets/style.css", import.meta.url),
|
|
6
6
|
);
|
|
7
7
|
const SCRIPT_FILE = fileURLToPath(
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
|
|
58
|
+
const lStylesheet = readFileSync(STYLESHEET_FILE, "utf8");
|
|
59
|
+
const lScript = readFileSync(SCRIPT_FILE, "utf8");
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
return getHeader(lStylesheet) + pSVG + getFooter(lScript);
|
|
62
62
|
}
|