dependency-cruiser-fork
Version:
Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.
129 lines (116 loc) • 3.9 kB
JavaScript
const Handlebars = require("handlebars/runtime");
const _get = require("lodash/get");
const filterbank = require("../../utl/filterbank");
const theming = require("./theming");
const moduleUtl = require("./module-utl");
const prepareFolderLevel = require("./prepare-folder-level");
const prepareCustomLevel = require("./prepare-custom-level");
// eslint-disable-next-line import/no-unassigned-import
require("./dot.template");
function prepareModuleLevel(
pResults,
pTheme,
pCollapsePattern = _get(
pResults,
"summary.optionsUsed.reporterOptions.dot.collapsePattern",
null
)
) {
return prepareCustomLevel(pResults, pTheme, pCollapsePattern);
}
const GRANULARITY2FUNCTION = {
module: prepareModuleLevel,
folder: prepareFolderLevel,
custom: prepareCustomLevel,
};
function report(pResults, pGranularity, { theme, collapsePattern, filters }) {
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
),
});
}
const GRANULARITY2REPORTER_OPTIONS = {
module: "summary.optionsUsed.reporterOptions.dot",
folder: "summary.optionsUsed.reporterOptions.ddot",
custom: "summary.optionsUsed.reporterOptions.archi",
};
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
);
}
/**
* 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)
* @param {ICruiseResult} pResults - the output of a dependency-cruise adhering to
* ../../../schema/cruise-result.schema.json
* @param {IDotTheme} pTheme - a mapping of source properties to a attributes (like
* color, shape) - see ../comon/richTheme.json for an example
* @param {ICollapsePattern[]} - (for the 'custom' granularity level)
* @returns {IReporterOutput} - .output: the directed graph
* .exitCode: 0
*/
module.exports = (pGranularity) => (
pResults,
pTheme,
pCollapsePattern,
pFilters
) => {
const lTheme = pTheme || pryThemeFromResults(pGranularity, pResults);
const lFilters = pFilters || pryFiltersFromResults(pGranularity, pResults);
return {
output: report(pResults, pGranularity, {
theme: lTheme,
collapsePattern: pCollapsePattern,
filters: lFilters,
}),
exitCode: 0,
};
};