-
Notifications
You must be signed in to change notification settings - Fork 248
/
index.js
148 lines (134 loc) · 4.15 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
const Handlebars = require("handlebars/runtime");
const get = require("lodash/get");
const filterBank = require("../../graph-utl/filter-bank");
const theming = require("./theming");
const moduleUtl = require("./module-utl");
const prepareFolderLevel = require("./prepare-folder-level");
const prepareCustomLevel = require("./prepare-custom-level");
const prepareFlatLevel = require("./prepare-flat-level");
// eslint-disable-next-line import/no-unassigned-import
require("./dot.template");
const GRANULARITY2FUNCTION = {
module: prepareCustomLevel,
folder: prepareFolderLevel,
custom: prepareCustomLevel,
flat: prepareFlatLevel,
};
function report(
pResults,
pGranularity,
{ theme, collapsePattern, filters, showMetrics }
) {
const lTheme = theming.normalizeTheme(theme);
const lResults = filters
? {
...pResults,
modules: filterBank.applyFilters(pResults.modules, filters),
}
: pResults;
return Handlebars.templates["dot.template.hbs"]({
graphAttrs: moduleUtl.attributizeObject(lTheme.graph || {}),
nodeAttrs: moduleUtl.attributizeObject(lTheme.node || {}),
edgeAttrs: moduleUtl.attributizeObject(lTheme.edge || {}),
clustersHaveOwnNode: "folder" === pGranularity,
// eslint-disable-next-line security/detect-object-injection
modules: (GRANULARITY2FUNCTION[pGranularity] || prepareCustomLevel)(
lResults,
lTheme,
collapsePattern,
showMetrics
),
});
}
const GRANULARITY2REPORTER_OPTIONS = {
module: "summary.optionsUsed.reporterOptions.dot",
folder: "summary.optionsUsed.reporterOptions.ddot",
custom: "summary.optionsUsed.reporterOptions.archi",
flat: "summary.optionsUsed.reporterOptions.flat",
};
function pryReporterOptionsFromResults(pGranularity, pResults) {
const lFallbackReporterOptions = get(
pResults,
"summary.optionsUsed.reporterOptions.dot"
);
return get(
pResults,
// eslint-disable-next-line security/detect-object-injection
GRANULARITY2REPORTER_OPTIONS[pGranularity],
lFallbackReporterOptions
);
}
function pryThemeFromResults(pGranularity, pResults) {
const lFallbackTheme = get(
pResults,
"summary.optionsUsed.reporterOptions.dot.theme"
);
return get(
pryReporterOptionsFromResults(pGranularity, pResults),
"theme",
lFallbackTheme
);
}
function pryFiltersFromResults(pGranularity, pResults) {
const lFallbackFilters = get(
pResults,
"summary.optionsUsed.reporterOptions.dot.filters"
);
return get(
pryReporterOptionsFromResults(pGranularity, pResults),
"filters",
lFallbackFilters
);
}
function getCollapseFallbackPattern(pGranularity) {
if (pGranularity === "custom") {
return "^(node_modules|packages|src|lib|app|test|spec)/[^/]+";
}
return null;
}
function pryCollapsePatternFromResults(pGranularity, pResults) {
return get(
pryReporterOptionsFromResults(pGranularity, pResults),
"collapsePattern",
getCollapseFallbackPattern(pGranularity)
);
}
function normalizeDotReporterOptions(
pDotReporterOptions,
pGranularity,
pResults
) {
let lDotReporterOptions = pDotReporterOptions || {};
return {
theme:
lDotReporterOptions.theme || pryThemeFromResults(pGranularity, pResults),
collapsePattern:
lDotReporterOptions.collapsePattern ||
pryCollapsePatternFromResults(pGranularity, pResults),
filters:
lDotReporterOptions.filters ||
pryFiltersFromResults(pGranularity, pResults),
...lDotReporterOptions,
};
}
/**
* Returns the results of a cruise as a directed graph in the dot language.
*
* @param {string} pGranularity - either "module" (for fine grained module
* level) or "folder" (for a report consolidated
* to folders)
* @returns {(pResults, pDotReporterOptions) => import("../../..").IReporterOutput}
*/
module.exports = function produceDotReporter(pGranularity) {
return function dot(pResults, pDotReporterOptions) {
const lDotReporterOptions = normalizeDotReporterOptions(
pDotReporterOptions,
pGranularity,
pResults
);
return {
output: report(pResults, pGranularity, lDotReporterOptions),
exitCode: 0,
};
};
};