dependency-cruiser 10.8.0 → 11.2.0
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/README.md +1 -1
- package/package.json +22 -16
- package/src/enrich/clear-caches.js +1 -1
- package/src/enrich/derive/circular/get-cycle.js +1 -1
- package/src/enrich/derive/dependents/get-dependents.js +1 -1
- package/src/enrich/derive/{metrics/get-stability-metrics.js → folders/aggregate-to-folders.js} +39 -30
- package/src/enrich/derive/folders/index.js +9 -0
- package/src/enrich/derive/folders/utl.js +44 -0
- package/src/enrich/derive/metrics/get-module-metrics.js +39 -0
- package/src/enrich/derive/metrics/index.js +14 -0
- package/src/enrich/derive/{utl.js → module-utl.js} +28 -0
- package/src/enrich/derive/orphan/is-orphan.js +1 -1
- package/src/enrich/derive/reachable/get-path.js +1 -1
- package/src/enrich/derive/reachable/index.js +1 -1
- package/src/enrich/enrich-modules.js +2 -2
- package/src/enrich/index.js +2 -2
- package/src/enrich/summarize/summarize-modules.js +24 -5
- package/src/extract/get-dependencies.js +11 -6
- package/src/extract/parse/to-typescript-ast.js +24 -8
- package/src/extract/utl/get-extension.js +9 -5
- package/src/main/options/normalize.js +28 -0
- package/src/meta.js +1 -1
- package/src/report/dot/dot.template.js +1 -1
- package/src/report/dot/index.js +7 -2
- package/src/report/dot/module-utl.js +47 -19
- package/src/report/dot/prepare-custom-level.js +2 -2
- package/src/report/dot/prepare-flat-level.js +2 -2
- package/src/report/dot/prepare-folder-level.js +2 -2
- package/src/report/error-html/error-html.template.js +1 -1
- package/src/report/error-html/utl.js +50 -7
- package/src/report/error.js +55 -21
- package/src/report/teamcity.js +37 -11
- package/src/report/utl/index.js +16 -0
- package/src/schema/baseline-violations.schema.js +1 -35
- package/src/schema/configuration.schema.js +1 -493
- package/src/schema/cruise-result.schema.js +1 -642
- package/src/utl/regex-util.js +57 -0
- package/src/validate/match-dependency-rule.js +19 -32
- package/src/validate/match-module-rule.js +1 -1
- package/src/validate/matchers.js +58 -48
- package/src/validate/violates-required-rule.js +1 -1
- package/types/baseline-violations.d.ts +1 -1
- package/types/cruise-result.d.ts +11 -50
- package/types/options.d.ts +5 -0
- package/types/reporter-options.d.ts +6 -0
- package/types/restrictions.d.ts +12 -0
- package/types/rule-summary.d.ts +23 -0
- package/types/shared-types.d.ts +7 -0
- package/types/violations.d.ts +43 -0
- package/src/enrich/derive/metrics/folder.js +0 -9
- package/src/enrich/derive/metrics/module-utl.js +0 -27
- package/src/enrich/derive/metrics/module.js +0 -29
- package/src/enrich/derive/metrics/utl.js +0 -28
- package/src/validate/utl.js +0 -31
|
@@ -66,6 +66,32 @@ function normalizeCollapse(pCollapse) {
|
|
|
66
66
|
return lReturnValue;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
function hasMetricsRule(pRule) {
|
|
70
|
+
return _has(pRule, "to.moreUnstable");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ruleSetHasMetricsRule(pRuleSet) {
|
|
74
|
+
const lRuleSet = pRuleSet || {};
|
|
75
|
+
return (
|
|
76
|
+
(lRuleSet.forbidden || []).some(hasMetricsRule) ||
|
|
77
|
+
(lRuleSet.allowed || []).some(hasMetricsRule)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Determines whether (instability) metrics should be calculated
|
|
83
|
+
*
|
|
84
|
+
* @param {import('../../../types/options').ICruiseOptions pOptions
|
|
85
|
+
* @returns Boolean
|
|
86
|
+
*/
|
|
87
|
+
function shouldCalculateMetrics(pOptions) {
|
|
88
|
+
return (
|
|
89
|
+
pOptions.metrics ||
|
|
90
|
+
pOptions.outputType === "metrics" ||
|
|
91
|
+
ruleSetHasMetricsRule(pOptions.ruleSet)
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
69
95
|
/**
|
|
70
96
|
*
|
|
71
97
|
* @param {Partial <import('../../../types/options').ICruiseOptions>} pOptions
|
|
@@ -101,6 +127,8 @@ function normalizeCruiseOptions(pOptions) {
|
|
|
101
127
|
lReturnValue.reporterOptions
|
|
102
128
|
);
|
|
103
129
|
}
|
|
130
|
+
lReturnValue.metrics = shouldCalculateMetrics(pOptions);
|
|
131
|
+
|
|
104
132
|
return lReturnValue;
|
|
105
133
|
}
|
|
106
134
|
|
package/src/meta.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Handlebars=require("handlebars/runtime"),template=Handlebars.template,templates=Handlebars.templates=Handlebars.templates||{};templates["dot.template.hbs"]=template({1:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return null!=(a="function"==typeof(a=null!=(a=a(e,"graphAttrs")||(null!=n?a(n,"graphAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"graphAttrs",hash:{},data:o,loc:{start:{line:2,column:22},end:{line:2,column:38}}}):a)?a:""},3:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return"node ["+(null!=(a="function"==typeof(a=null!=(a=a(e,"nodeAttrs")||(null!=n?a(n,"nodeAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"nodeAttrs",hash:{},data:o,loc:{start:{line:3,column:27},end:{line:3,column:42}}}):a)?a:"")+"]"},5:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return"edge ["+(null!=(a="function"==typeof(a=null!=(a=a(e,"edgeAttrs")||(null!=n?a(n,"edgeAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"edgeAttrs",hash:{},data:o,loc:{start:{line:4,column:27},end:{line:4,column:42}}}):a)?a:"")+"]"},7:function(l,n,e,t,o,a,r){var u=null!=n?n:l.nullContext||{},
|
|
1
|
+
var Handlebars=require("handlebars/runtime"),template=Handlebars.template,templates=Handlebars.templates=Handlebars.templates||{};templates["dot.template.hbs"]=template({1:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return null!=(a="function"==typeof(a=null!=(a=a(e,"graphAttrs")||(null!=n?a(n,"graphAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"graphAttrs",hash:{},data:o,loc:{start:{line:2,column:22},end:{line:2,column:38}}}):a)?a:""},3:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return"node ["+(null!=(a="function"==typeof(a=null!=(a=a(e,"nodeAttrs")||(null!=n?a(n,"nodeAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"nodeAttrs",hash:{},data:o,loc:{start:{line:3,column:27},end:{line:3,column:42}}}):a)?a:"")+"]"},5:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return"edge ["+(null!=(a="function"==typeof(a=null!=(a=a(e,"edgeAttrs")||(null!=n?a(n,"edgeAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"edgeAttrs",hash:{},data:o,loc:{start:{line:4,column:27},end:{line:4,column:42}}}):a)?a:"")+"]"},7:function(l,n,e,t,o,a,r){var u=null!=n?n:l.nullContext||{},i=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]},c=null!=(p=i(e,"if").call(u,null!=n?i(n,"folder"):n,{name:"if",hash:{},fn:l.program(8,o,0,a,r),inverse:l.program(18,o,0,a,r),data:o,loc:{start:{line:7,column:4},end:{line:12,column:11}}}))?p:"",s=null!=(s=i(e,"dependencies")||(null!=n?i(n,"dependencies"):n))?s:l.hooks.helperMissing,o={name:"dependencies",hash:{},fn:l.program(20,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:13,column:4},end:{line:15,column:21}}},p="function"==typeof s?s.call(u,o):s;return null!=(p=!i(e,"dependencies")?l.hooks.blockHelperMissing.call(n,p,o):p)&&(c+=p),c},8:function(l,n,e,t,o,a,r){var u,i,c=null!=n?n:l.nullContext||{},s=l.hooks.helperMissing,p="function",m=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return" "+(null!=(u=m(e,"each").call(c,null!=n?m(n,"path"):n,{name:"each",hash:{},fn:l.program(9,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:8,column:4},end:{line:8,column:201}}}))?u:"")+'"'+(null!=(u=typeof(i=null!=(i=m(e,"source")||(null!=n?m(n,"source"):n))?i:s)==p?i.call(c,{name:"source",hash:{},data:o,loc:{start:{line:9,column:9},end:{line:9,column:21}}}):i)?u:"")+'" [label='+(null!=(u=typeof(i=null!=(i=m(e,"label")||(null!=n?m(n,"label"):n))?i:s)==p?i.call(c,{name:"label",hash:{},data:o,loc:{start:{line:9,column:30},end:{line:9,column:41}}}):i)?u:"")+' tooltip="'+(null!=(u=typeof(i=null!=(i=m(e,"tooltip")||(null!=n?m(n,"tooltip"):n))?i:s)==p?i.call(c,{name:"tooltip",hash:{},data:o,loc:{start:{line:9,column:51},end:{line:9,column:64}}}):i)?u:"")+'" '+(null!=(u=m(e,"if").call(c,null!=n?m(n,"URL"):n,{name:"if",hash:{},fn:l.program(12,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:66},end:{line:9,column:100}}}))?u:"")+(null!=(u=m(e,"if").call(c,null!=n?m(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(14,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:100},end:{line:9,column:141}}}))?u:"")+"]"+(null!=(u=m(e,"each").call(c,null!=n?m(n,"path"):n,{name:"each",hash:{},fn:l.program(16,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:142},end:{line:9,column:167}}}))?u:"")+"\n"},9:function(l,n,e,t,o,a,r){var u,i,c=null!=n?n:l.nullContext||{},s=l.hooks.helperMissing,p="function",m=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return'subgraph "cluster_'+(null!=(u=typeof(i=null!=(i=m(e,"aggregateSnippet")||(null!=n?m(n,"aggregateSnippet"):n))?i:s)==p?i.call(c,{name:"aggregateSnippet",hash:{},data:o,loc:{start:{line:8,column:36},end:{line:8,column:58}}}):i)?u:"")+'" {label="'+(null!=(u=typeof(i=null!=(i=m(e,"snippet")||(null!=n?m(n,"snippet"):n))?i:s)==p?i.call(c,{name:"snippet",hash:{},data:o,loc:{start:{line:8,column:68},end:{line:8,column:81}}}):i)?u:"")+'" '+(null!=(u=m(e,"if").call(c,null!=r[2]?m(r[2],"clustersHaveOwnNode"):r[2],{name:"if",hash:{},fn:l.program(10,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:8,column:83},end:{line:8,column:191}}}))?u:"")},10:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return'"'+(null!=(a="function"==typeof(a=null!=(a=a(e,"aggregateSnippet")||(null!=n?a(n,"aggregateSnippet"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"aggregateSnippet",hash:{},data:o,loc:{start:{line:8,column:117},end:{line:8,column:139}}}):a)?a:"")+'" [width="0.05" shape="point" style="invis"] '},12:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return'URL="'+(null!=(a="function"==typeof(a=null!=(a=a(e,"URL")||(null!=n?a(n,"URL"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"URL",hash:{},data:o,loc:{start:{line:9,column:82},end:{line:9,column:91}}}):a)?a:"")+'" '},14:function(l,n,e,t,o){var a=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return null!=(a="function"==typeof(a=null!=(a=a(e,"themeAttrs")||(null!=n?a(n,"themeAttrs"):n))?a:l.hooks.helperMissing)?a.call(null!=n?n:l.nullContext||{},{name:"themeAttrs",hash:{},data:o,loc:{start:{line:9,column:118},end:{line:9,column:134}}}):a)?a:""},16:function(l,n,e,t,o){return" }"},18:function(l,n,e,t,o,a,r){var u,i,c=null!=n?n:l.nullContext||{},s=l.hooks.helperMissing,p="function",m=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return' "'+(null!=(u=typeof(i=null!=(i=m(e,"source")||(null!=n?m(n,"source"):n))?i:s)==p?i.call(c,{name:"source",hash:{},data:o,loc:{start:{line:11,column:5},end:{line:11,column:17}}}):i)?u:"")+'" [label='+(null!=(u=typeof(i=null!=(i=m(e,"label")||(null!=n?m(n,"label"):n))?i:s)==p?i.call(c,{name:"label",hash:{},data:o,loc:{start:{line:11,column:26},end:{line:11,column:37}}}):i)?u:"")+' tooltip="'+(null!=(u=typeof(i=null!=(i=m(e,"tooltip")||(null!=n?m(n,"tooltip"):n))?i:s)==p?i.call(c,{name:"tooltip",hash:{},data:o,loc:{start:{line:11,column:47},end:{line:11,column:60}}}):i)?u:"")+'" '+(null!=(u=m(e,"if").call(c,null!=n?m(n,"URL"):n,{name:"if",hash:{},fn:l.program(12,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:11,column:62},end:{line:11,column:96}}}))?u:"")+(null!=(u=m(e,"if").call(c,null!=n?m(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(14,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:11,column:96},end:{line:11,column:137}}}))?u:"")+"]\n"},20:function(l,n,e,t,o,a,r){var u,i,c=null!=n?n:l.nullContext||{},s=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return' "'+(null!=(u=l.lambda(null!=r[1]?s(r[1],"source"):r[1],n))?u:"")+'" -> "'+(null!=(u="function"==typeof(i=null!=(i=s(e,"resolved")||(null!=n?s(n,"resolved"):n))?i:l.hooks.helperMissing)?i.call(c,{name:"resolved",hash:{},data:o,loc:{start:{line:14,column:26},end:{line:14,column:40}}}):i)?u:"")+'"'+(null!=(u=s(e,"if").call(c,null!=n?s(n,"hasExtraAttributes"):n,{name:"if",hash:{},fn:l.program(21,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:41},end:{line:14,column:193}}}))?u:"")+"\n"},21:function(l,n,e,t,o,a,r){var u,i=null!=n?n:l.nullContext||{},c=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return" ["+(null!=(u=c(e,"if").call(i,null!=(u=null!=n?c(n,"rule"):n)?c(u,"name"):u,{name:"if",hash:{},fn:l.program(22,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:69},end:{line:14,column:144}}}))?u:"")+(null!=(u=c(e,"if").call(i,null!=n?c(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(14,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:144},end:{line:14,column:185}}}))?u:"")+"]"},22:function(l,n,e,t,o){var a=l.lambda,r=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return'xlabel="'+(null!=(l=a(null!=(l=null!=n?r(n,"rule"):n)?r(l,"name"):l,n))?l:"")+'" tooltip="'+(null!=(l=a(null!=(l=null!=n?r(n,"rule"):n)?r(l,"name"):l,n))?l:"")+'" '},compiler:[8,">= 4.3.0"],main:function(l,n,e,t,o,a,r){var u=null!=n?n:l.nullContext||{},i=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]},c='strict digraph "dependency-cruiser output"{\n '+(null!=(p=i(e,"if").call(u,null!=n?i(n,"graphAttrs"):n,{name:"if",hash:{},fn:l.program(1,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:2,column:4},end:{line:2,column:45}}}))?p:"")+"\n "+(null!=(p=i(e,"if").call(u,null!=n?i(n,"nodeAttrs"):n,{name:"if",hash:{},fn:l.program(3,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:3,column:4},end:{line:3,column:50}}}))?p:"")+"\n "+(null!=(p=i(e,"if").call(u,null!=n?i(n,"edgeAttrs"):n,{name:"if",hash:{},fn:l.program(5,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:4,column:4},end:{line:4,column:50}}}))?p:"")+"\n\n",s=null!=(s=i(e,"modules")||(null!=n?i(n,"modules"):n))?s:l.hooks.helperMissing,o={name:"modules",hash:{},fn:l.program(7,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:6,column:0},end:{line:16,column:12}}},p="function"==typeof s?s.call(u,o):s;return null!=(p=!i(e,"modules")?l.hooks.blockHelperMissing.call(n,p,o):p)&&(c+=p),c+"}\n"},useData:!0,useDepths:!0});
|
package/src/report/dot/index.js
CHANGED
|
@@ -17,7 +17,11 @@ const GRANULARITY2FUNCTION = {
|
|
|
17
17
|
flat: prepareFlatLevel,
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
function report(
|
|
20
|
+
function report(
|
|
21
|
+
pResults,
|
|
22
|
+
pGranularity,
|
|
23
|
+
{ theme, collapsePattern, filters, showMetrics }
|
|
24
|
+
) {
|
|
21
25
|
const lTheme = theming.normalizeTheme(theme);
|
|
22
26
|
const lResults = filters
|
|
23
27
|
? {
|
|
@@ -35,7 +39,8 @@ function report(pResults, pGranularity, { theme, collapsePattern, filters }) {
|
|
|
35
39
|
modules: (GRANULARITY2FUNCTION[pGranularity] || prepareCustomLevel)(
|
|
36
40
|
lResults,
|
|
37
41
|
lTheme,
|
|
38
|
-
collapsePattern
|
|
42
|
+
collapsePattern,
|
|
43
|
+
showMetrics
|
|
39
44
|
),
|
|
40
45
|
});
|
|
41
46
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
const path = require("path").posix;
|
|
2
|
+
const _has = require("lodash/has");
|
|
3
|
+
const utl = require("../utl/index.js");
|
|
2
4
|
const theming = require("./theming");
|
|
3
5
|
|
|
6
|
+
const PROTOCOL_PREFIX_RE = /^[a-z]+:\/\//;
|
|
7
|
+
|
|
4
8
|
function attributizeObject(pObject) {
|
|
5
9
|
return (
|
|
6
10
|
Object.keys(pObject)
|
|
@@ -12,7 +16,9 @@ function attributizeObject(pObject) {
|
|
|
12
16
|
|
|
13
17
|
function extractFirstTransgression(pModule) {
|
|
14
18
|
return {
|
|
15
|
-
...(pModule
|
|
19
|
+
...(_has(pModule, "rules[0]")
|
|
20
|
+
? { ...pModule, tooltip: pModule.rules[0].name }
|
|
21
|
+
: pModule),
|
|
16
22
|
dependencies: pModule.dependencies.map((pDependency) =>
|
|
17
23
|
pDependency.rules
|
|
18
24
|
? {
|
|
@@ -57,20 +63,36 @@ function aggregate(pPathSnippet, pCounter, pPathArray) {
|
|
|
57
63
|
};
|
|
58
64
|
}
|
|
59
65
|
|
|
60
|
-
function
|
|
61
|
-
let
|
|
62
|
-
let lDirectoryName = path.dirname(pModule.source);
|
|
66
|
+
function makeInstabilityString(pModule, pShowMetrics = false) {
|
|
67
|
+
let lInstabilityString = "";
|
|
63
68
|
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
69
|
+
if (pShowMetrics && _has(pModule, "instability") && !pModule.consolidated) {
|
|
70
|
+
lInstabilityString = ` <FONT color="#808080" point-size="8">${utl.formatInstability(
|
|
71
|
+
pModule.instability
|
|
72
|
+
)}</FONT>`;
|
|
67
73
|
}
|
|
74
|
+
return lInstabilityString;
|
|
75
|
+
}
|
|
68
76
|
|
|
69
|
-
|
|
77
|
+
function folderify(pShowMetrics) {
|
|
78
|
+
return (pModule) => {
|
|
79
|
+
let lAdditions = {};
|
|
80
|
+
let lDirectoryName = path.dirname(pModule.source);
|
|
70
81
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
if (lDirectoryName !== ".") {
|
|
83
|
+
lAdditions.folder = lDirectoryName;
|
|
84
|
+
lAdditions.path = lDirectoryName.split(path.sep).map(aggregate);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
lAdditions.label = `<${path.basename(
|
|
88
|
+
pModule.source
|
|
89
|
+
)}${makeInstabilityString(pModule, pShowMetrics)}>`;
|
|
90
|
+
lAdditions.tooltip = path.basename(pModule.source);
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
...pModule,
|
|
94
|
+
...lAdditions,
|
|
95
|
+
};
|
|
74
96
|
};
|
|
75
97
|
}
|
|
76
98
|
|
|
@@ -87,7 +109,7 @@ function folderify(pModule) {
|
|
|
87
109
|
* @return {string} prefix and filename concatenated
|
|
88
110
|
*/
|
|
89
111
|
function smartURIConcat(pPrefix, pSource) {
|
|
90
|
-
if (pPrefix.match(
|
|
112
|
+
if (pPrefix.match(PROTOCOL_PREFIX_RE)) {
|
|
91
113
|
return `${pPrefix}${pSource}`;
|
|
92
114
|
} else {
|
|
93
115
|
return path.join(pPrefix, pSource);
|
|
@@ -103,15 +125,21 @@ function addURL(pPrefix) {
|
|
|
103
125
|
});
|
|
104
126
|
}
|
|
105
127
|
|
|
106
|
-
function
|
|
107
|
-
return {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
pModule.source
|
|
111
|
-
)}</B>>`,
|
|
112
|
-
};
|
|
128
|
+
function makeLabel(pModule, pShowMetrics) {
|
|
129
|
+
return `<${path.dirname(pModule.source)}/<BR/><B>${path.basename(
|
|
130
|
+
pModule.source
|
|
131
|
+
)}</B>${makeInstabilityString(pModule, pShowMetrics)}>`;
|
|
113
132
|
}
|
|
114
133
|
|
|
134
|
+
function flatLabel(pShowMetrics) {
|
|
135
|
+
return (pModule) => {
|
|
136
|
+
return {
|
|
137
|
+
...pModule,
|
|
138
|
+
label: makeLabel(pModule, pShowMetrics),
|
|
139
|
+
tooltip: path.basename(pModule.source),
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
}
|
|
115
143
|
module.exports = {
|
|
116
144
|
folderify,
|
|
117
145
|
applyTheme,
|
|
@@ -4,15 +4,15 @@ const compare = require("../../graph-utl/compare");
|
|
|
4
4
|
const stripSelfTransitions = require("../../graph-utl/strip-self-transitions");
|
|
5
5
|
const moduleUtl = require("./module-utl");
|
|
6
6
|
|
|
7
|
-
module.exports = (pResults, pTheme, pCollapsePattern) => {
|
|
7
|
+
module.exports = (pResults, pTheme, pCollapsePattern, pShowMetrics) => {
|
|
8
8
|
return (
|
|
9
9
|
pCollapsePattern
|
|
10
10
|
? consolidateToPattern(pResults.modules, pCollapsePattern)
|
|
11
11
|
: pResults.modules
|
|
12
12
|
)
|
|
13
13
|
.sort(compare.modules)
|
|
14
|
+
.map(moduleUtl.folderify(pShowMetrics))
|
|
14
15
|
.map(moduleUtl.extractFirstTransgression)
|
|
15
|
-
.map(moduleUtl.folderify)
|
|
16
16
|
.map(stripSelfTransitions)
|
|
17
17
|
.map(moduleUtl.applyTheme(pTheme))
|
|
18
18
|
.map(moduleUtl.addURL(_get(pResults, "summary.optionsUsed.prefix", "")));
|
|
@@ -2,10 +2,10 @@ const _get = require("lodash/get");
|
|
|
2
2
|
const compare = require("../../graph-utl/compare");
|
|
3
3
|
const moduleUtl = require("./module-utl");
|
|
4
4
|
|
|
5
|
-
module.exports = (pResults, pTheme) => {
|
|
5
|
+
module.exports = (pResults, pTheme, _, pShowMetrics) => {
|
|
6
6
|
return pResults.modules
|
|
7
7
|
.sort(compare.modules)
|
|
8
|
-
.map(moduleUtl.flatLabel)
|
|
8
|
+
.map(moduleUtl.flatLabel(pShowMetrics))
|
|
9
9
|
.map(moduleUtl.extractFirstTransgression)
|
|
10
10
|
.map(moduleUtl.applyTheme(pTheme))
|
|
11
11
|
.map(moduleUtl.addURL(_get(pResults, "summary.optionsUsed.prefix", "")));
|
|
@@ -4,11 +4,11 @@ const compare = require("../../graph-utl/compare");
|
|
|
4
4
|
const stripSelfTransitions = require("../../graph-utl/strip-self-transitions");
|
|
5
5
|
const moduleUtl = require("./module-utl");
|
|
6
6
|
|
|
7
|
-
module.exports = (pResults, pTheme) => {
|
|
7
|
+
module.exports = (pResults, pTheme, _, pShowMetrics) => {
|
|
8
8
|
return consolidateToFolder(pResults.modules)
|
|
9
9
|
.sort(compare.modules)
|
|
10
10
|
.map(moduleUtl.extractFirstTransgression)
|
|
11
|
-
.map(moduleUtl.folderify)
|
|
11
|
+
.map(moduleUtl.folderify(pShowMetrics))
|
|
12
12
|
.map(stripSelfTransitions)
|
|
13
13
|
.map(moduleUtl.applyTheme(pTheme))
|
|
14
14
|
.map(moduleUtl.addURL(_get(pResults, "summary.optionsUsed.prefix", "")));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var Handlebars=require("handlebars/runtime"),template=Handlebars.template,templates=Handlebars.templates=Handlebars.templates||{};templates["error-html.template.hbs"]=template({1:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <div style="float:left;padding-right:20px" class="ignore">\n <strong>'+n.escapeExpression(n.lambda(null!=(n=null!=l?a(l,"summary"):l)?a(n,"ignore"):n,l))+"</strong> ignored\n </div>\n"},3:function(n,l,e,o,t){return"<th>ignored</th>"},5:function(n,l,e,o,t,a,r){var i,s,u=null!=l?l:n.nullContext||{},d=n.hooks.helperMissing,c="function",p=n.escapeExpression,h=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return" <tr "+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(6,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:218,column:16},end:{line:218,column:60}}}))?i:"")+">\n <td>"+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(8,t,0,a,r),inverse:n.program(10,t,0,a,r),data:t,loc:{start:{line:219,column:20},end:{line:220,column:66}}}))?i:"")+"</td>\n <td class="+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(12,t,0,a,r),inverse:n.program(14,t,0,a,r),data:t,loc:{start:{line:221,column:26},end:{line:221,column:81}}}))?i:"")+">"+p(typeof(s=null!=(s=h(e,"severity")||(null!=l?h(l,"severity"):l))?s:d)==c?s.call(u,{name:"severity",hash:{},data:t,loc:{start:{line:221,column:82},end:{line:221,column:94}}}):s)+'</td>\n <td class="nowrap"><a href="#'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:45},end:{line:222,column:53}}}):s)+'-instance" id="'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:68},end:{line:222,column:76}}}):s)+'-definition" class="noiseless">'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:107},end:{line:222,column:115}}}):s)+"</a>\n </td>\n <td><strong>"+p(typeof(s=null!=(s=h(e,"count")||(null!=l?h(l,"count"):l))?s:d)==c?s.call(u,{name:"count",hash:{},data:t,loc:{start:{line:224,column:28},end:{line:224,column:37}}}):s)+"</strong></td>\n "+(null!=(i=h(e,"if").call(u,null!=(i=null!=r[1]?h(r[1],"summary"):r[1])?h(i,"ignore"):i,{name:"if",hash:{},fn:n.program(16,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:225,column:16},end:{line:225,column:90}}}))?i:"")+"\n <td>"+p(typeof(s=null!=(s=h(e,"comment")||(null!=l?h(l,"comment"):l))?s:d)==c?s.call(u,{name:"comment",hash:{},data:t,loc:{start:{line:226,column:20},end:{line:226,column:31}}}):s)+"</td>\n </tr>\n"},6:function(n,l,e,o,t){return'class="unviolated" '},8:function(n,l,e,o,t){return'<span class="ok">✓</span>'},10:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'<span\n class="'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"severity")||(null!=l?a(l,"severity"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"severity",hash:{},data:t,loc:{start:{line:220,column:31},end:{line:220,column:43}}}):a)+'">✗</span>'},12:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'"'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"ok")||(null!=l?a(l,"ok"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"ok",hash:{},data:t,loc:{start:{line:221,column:45},end:{line:221,column:51}}}):a)+'"'},14:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'"'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"severity")||(null!=l?a(l,"severity"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"severity",hash:{},data:t,loc:{start:{line:221,column:61},end:{line:221,column:73}}}):a)+'"'},16:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return"<td><strong>"+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"ignoredCount")||(null!=l?a(l,"ignoredCount"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"ignoredCount",hash:{},data:t,loc:{start:{line:225,column:53},end:{line:225,column:69}}}):a)+"</strong></td>"},18:function(n,l,e,o,t){return'"6"'},20:function(n,l,e,o,t){return'"5"'},22:function(n,l,e,o,t,a,r){var i,s=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <span id="show-ignored-violations">\n <h2><svg class="p__svg--inline" viewBox="0 0 12 16" version="1.1" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z">\n </path>\n </svg> All violations</h2>\n <table>\n <thead>\n <tr>\n <th>severity</th>\n <th>rule</th>\n <th>from</th>\n <th>to</th>\n </tr>\n </thead>\n <tbody>\n'+(null!=(i=n.hooks.blockHelperMissing.call(l,n.lambda(null!=(i=null!=l?s(l,"summary"):l)?s(i,"violations"):i,l),{name:"summary.violations",hash:{},fn:n.program(23,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:260,column:12},end:{line:269,column:35}}}))?i:"")+(null!=(i=s(e,"if").call(null!=l?l:n.nullContext||{},null!=(i=null!=l?s(l,"summary"):l)?s(i,"ignore"):i,{name:"if",hash:{},fn:n.program(25,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:270,column:12},end:{line:281,column:19}}}))?i:"")+" </tbody>\n </table>\n </span>\n"},23:function(n,l,e,o,t,a,r){var i=n.lambda,s=n.escapeExpression,u=null!=l?l:n.nullContext||{},d=n.hooks.helperMissing,c="function",p=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <tr class="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'d">\n <td class="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'">'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'</td>\n <td class="nowrap"><a href="#'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'-definition" id="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'-instance"\n class="noiseless">'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'</a></td>\n <td><a href="'+s(i(null!=(n=null!=(n=null!=r[1]?p(r[1],"summary"):r[1])?p(n,"optionsUsed"):n)?p(n,"prefix"):n,l))+s(typeof(r=null!=(r=p(e,"from")||(null!=l?p(l,"from"):l))?r:d)==c?r.call(u,{name:"from",hash:{},data:t,loc:{start:{line:265,column:62},end:{line:265,column:70}}}):r)+'">'+s(typeof(r=null!=(r=p(e,"from")||(null!=l?p(l,"from"):l))?r:d)==c?r.call(u,{name:"from",hash:{},data:t,loc:{start:{line:265,column:72},end:{line:265,column:80}}}):r)+"</a></td>\n <td>"+(null!=(n=typeof(r=null!=(r=p(e,"to")||(null!=l?p(l,"to"):l))?r:d)==c?r.call(u,{name:"to",hash:{},data:t,loc:{start:{line:266,column:20},end:{line:266,column:28}}}):r)?n:"")+"</td>\n\n </tr>\n"},25:function(n,l,e,o,t){return' <tr>\n <td colspan="4" class="controls">\n <div id="show-ignored">\n ↓ <a href="#show-ignored-violations">also show ignored violations</a>\n </div>\n <div id="hide-ignored">\n ↑ <a href="">hide ignored violations</a>\n </div>\n </td>\n </tr>\n'},27:function(n,l,e,o,t){return' <h2><span aria-hidden="true">♥</span> No violations found</h2>\n <p>Get gummy bears to celebrate.</p>\n'},compiler:[8,">= 4.3.0"],main:function(n,l,e,o,t,a,r){var i,s=n.lambda,u=n.escapeExpression,d=null!=l?l:n.nullContext||{},c=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'<!DOCTYPE html>\n<html lang="en">\n\n<head>\n <title>dependency-cruiser - results</title>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1">\n\n <style type="text/css">\n body {\n font-family: sans-serif;\n margin: 0 auto;\n max-width: 90%;\n line-height: 1.6;\n font-size: 14px;\n color: #444;\n padding: 0 10px;\n background-color: #fff;\n }\n\n footer {\n color: gray;\n margin-top: 1.4em;\n border-top: solid 1px currentColor\n }\n\n a {\n text-decoration: none\n }\n\n a.noiseless {\n color: currentColor\n }\n\n h1,\n h2,\n h3 {\n line-height: 1.2\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n text-align: left;\n padding: 4px;\n }\n\n tbody tr:nth-child(odd) {\n background-color: rgba(128, 128, 128, 0.2);\n }\n\n .error {\n color: red;\n }\n\n .warn {\n color: orange;\n }\n\n .info {\n color: blue;\n }\n\n .ignore {\n color:gray;\n }\n\n .ok {\n color: limegreen;\n }\n\n td.nowrap {\n white-space: nowrap\n }\n\n svg {\n fill: currentColor\n }\n\n #show-unviolated {\n display: block\n }\n\n #hide-unviolated {\n display: none\n }\n\n #show-all-the-rules:target #show-unviolated {\n display: none\n }\n\n #show-all-the-rules:target #hide-unviolated {\n display: block\n }\n\n tr.unviolated {\n display: none\n }\n\n #show-all-the-rules:target tr.unviolated {\n display: table-row;\n color: gray;\n }\n\n #show-ignored {\n display: block\n }\n\n #hide-ignored {\n display: none\n }\n\n #show-ignored-violations:target #show-ignored {\n display: none\n }\n\n #show-ignored-violations:target #hide-ignored {\n display: block\n }\n\n tr.ignored {\n display: none\n }\n\n #show-ignored-violations:target tr.ignored {\n display: table-row;\n color: gray;\n }\n\n .p__svg--inline {\n vertical-align: top;\n width: 1.2em;\n height: 1.2em\n }\n\n .controls {\n background-color: #fff;\n vertical-align: bottom;\n text-align: center\n }\n\n .controls:hover {\n opacity: 1;\n }\n\n .controls a {\n text-decoration: none;\n color: gray;\n }\n\n .controls a:hover {\n text-decoration: underline;\n color: blue;\n }\n\n .extra {\n color: gray;\n }\n </style>\n <style type="text/css" media="print">\n th,\n td {\n border: 1px solid #444;\n }\n\n .controls {\n display: none\n }\n </style>\n</head>\n\n<body>\n <h1>Forbidden dependency check - results</h1>\n <span id="show-all-the-rules">\n <h2><svg class="p__svg--inline" viewBox="0 0 14 16" version="1.1" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M11.5 8L8.8 5.4 6.6 8.5 5.5 1.6 2.38 8H0v2h3.6l.9-1.8.9 5.4L9 8.5l1.6 1.5H14V8h-2.5z"></path>\n </svg> Summary</h2>\n <p>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"totalCruised"):i,l))+'</strong> modules\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"totalDependenciesCruised"):i,l))+'</strong> dependencies\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"error"):i,l))+'</strong> errors\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"warn"):i,l))+'</strong> warnings\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"info"):i,l))+"</strong> informational\n </div>\n"+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(1,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:199,column:8},end:{line:203,column:15}}}))?i:"")+" \n </p>\n <table>\n <tbody>\n <thead>\n <tr>\n <th></th>\n <th>severity</th>\n <th>rule</th>\n <th>violations</th>\n "+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(3,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:214,column:20},end:{line:214,column:65}}}))?i:"")+"\n <th>explanation</th>\n </thead>\n"+(null!=(i=n.hooks.blockHelperMissing.call(l,s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"agggregateViolations"):i,l),{name:"summary.agggregateViolations",hash:{},fn:n.program(5,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:217,column:12},end:{line:228,column:45}}}))?i:"")+" <tr>\n <td colspan="+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(18,t,0,a,r),inverse:n.program(20,t,0,a,r),data:t,loc:{start:{line:230,column:28},end:{line:230,column:68}}}))?i:"")+' class="controls">\n <div id="show-unviolated">\n ↓ <a href="#show-all-the-rules">also show unviolated rules</a>\n </div>\n <div id="hide-unviolated">\n ↑ <a href="">hide unviolated rules</a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </span>\n\n'+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"violations"):i,{name:"if",hash:{},fn:n.program(22,t,0,a,r),inverse:n.program(27,t,0,a,r),data:t,loc:{start:{line:243,column:4},end:{line:288,column:11}}}))?i:"")+' <footer>\n <p><a href="https://github.com/sverweij/dependency-cruiser">'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"depcruiseVersion"):i,l))+"</a> /\n "+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"runDate"):i,l))+"</p>\n </footer>\n</body>\n\n</html>"},useData:!0,useDepths:!0});
|
|
1
|
+
var Handlebars=require("handlebars/runtime"),template=Handlebars.template,templates=Handlebars.templates=Handlebars.templates||{};templates["error-html.template.hbs"]=template({1:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <div style="float:left;padding-right:20px" class="ignore">\n <strong>'+n.escapeExpression(n.lambda(null!=(n=null!=l?a(l,"summary"):l)?a(n,"ignore"):n,l))+"</strong> ignored\n </div>\n"},3:function(n,l,e,o,t){return"<th>ignored</th>"},5:function(n,l,e,o,t,a,r){var i,s,u=null!=l?l:n.nullContext||{},d=n.hooks.helperMissing,c="function",p=n.escapeExpression,h=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return" <tr "+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(6,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:218,column:16},end:{line:218,column:60}}}))?i:"")+">\n <td>"+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(8,t,0,a,r),inverse:n.program(10,t,0,a,r),data:t,loc:{start:{line:219,column:20},end:{line:220,column:66}}}))?i:"")+"</td>\n <td class="+(null!=(i=h(e,"if").call(u,null!=l?h(l,"unviolated"):l,{name:"if",hash:{},fn:n.program(12,t,0,a,r),inverse:n.program(14,t,0,a,r),data:t,loc:{start:{line:221,column:26},end:{line:221,column:81}}}))?i:"")+">"+p(typeof(s=null!=(s=h(e,"severity")||(null!=l?h(l,"severity"):l))?s:d)==c?s.call(u,{name:"severity",hash:{},data:t,loc:{start:{line:221,column:82},end:{line:221,column:94}}}):s)+'</td>\n <td class="nowrap"><a href="#'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:45},end:{line:222,column:53}}}):s)+'-instance" id="'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:68},end:{line:222,column:76}}}):s)+'-definition" class="noiseless">'+p(typeof(s=null!=(s=h(e,"name")||(null!=l?h(l,"name"):l))?s:d)==c?s.call(u,{name:"name",hash:{},data:t,loc:{start:{line:222,column:107},end:{line:222,column:115}}}):s)+"</a>\n </td>\n <td><strong>"+p(typeof(s=null!=(s=h(e,"count")||(null!=l?h(l,"count"):l))?s:d)==c?s.call(u,{name:"count",hash:{},data:t,loc:{start:{line:224,column:28},end:{line:224,column:37}}}):s)+"</strong></td>\n "+(null!=(i=h(e,"if").call(u,null!=(i=null!=r[1]?h(r[1],"summary"):r[1])?h(i,"ignore"):i,{name:"if",hash:{},fn:n.program(16,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:225,column:16},end:{line:225,column:90}}}))?i:"")+"\n <td>"+p(typeof(s=null!=(s=h(e,"comment")||(null!=l?h(l,"comment"):l))?s:d)==c?s.call(u,{name:"comment",hash:{},data:t,loc:{start:{line:226,column:20},end:{line:226,column:31}}}):s)+"</td>\n </tr>\n"},6:function(n,l,e,o,t){return'class="unviolated" '},8:function(n,l,e,o,t){return'<span class="ok">✓</span>'},10:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'<span\n class="'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"severity")||(null!=l?a(l,"severity"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"severity",hash:{},data:t,loc:{start:{line:220,column:31},end:{line:220,column:43}}}):a)+'">✗</span>'},12:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'"'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"ok")||(null!=l?a(l,"ok"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"ok",hash:{},data:t,loc:{start:{line:221,column:45},end:{line:221,column:51}}}):a)+'"'},14:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'"'+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"severity")||(null!=l?a(l,"severity"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"severity",hash:{},data:t,loc:{start:{line:221,column:61},end:{line:221,column:73}}}):a)+'"'},16:function(n,l,e,o,t){var a=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return"<td><strong>"+n.escapeExpression("function"==typeof(a=null!=(a=a(e,"ignoredCount")||(null!=l?a(l,"ignoredCount"):l))?a:n.hooks.helperMissing)?a.call(null!=l?l:n.nullContext||{},{name:"ignoredCount",hash:{},data:t,loc:{start:{line:225,column:53},end:{line:225,column:69}}}):a)+"</strong></td>"},18:function(n,l,e,o,t){return'"6"'},20:function(n,l,e,o,t){return'"5"'},22:function(n,l,e,o,t,a,r){var i,s=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <span id="show-ignored-violations">\n <h2><svg class="p__svg--inline" viewBox="0 0 12 16" version="1.1" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z">\n </path>\n </svg> All violations</h2>\n <table>\n <thead>\n <tr>\n <th>severity</th>\n <th>rule</th>\n <th>from</th>\n <th>to</th>\n </tr>\n </thead>\n <tbody>\n'+(null!=(i=n.hooks.blockHelperMissing.call(l,n.lambda(null!=(i=null!=l?s(l,"summary"):l)?s(i,"violations"):i,l),{name:"summary.violations",hash:{},fn:n.program(23,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:260,column:12},end:{line:269,column:35}}}))?i:"")+(null!=(i=s(e,"if").call(null!=l?l:n.nullContext||{},null!=(i=null!=l?s(l,"summary"):l)?s(i,"ignore"):i,{name:"if",hash:{},fn:n.program(25,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:270,column:12},end:{line:281,column:19}}}))?i:"")+" </tbody>\n </table>\n </span>\n"},23:function(n,l,e,o,t,a,r){var i=n.lambda,s=n.escapeExpression,u=null!=l?l:n.nullContext||{},d=n.hooks.helperMissing,c="function",p=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return' <tr class="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'d">\n <td class="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'">'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"severity"):n,l))+'</td>\n <td class="nowrap"><a href="#'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'-definition" id="'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'-instance"\n class="noiseless">'+s(i(null!=(n=null!=l?p(l,"rule"):l)?p(n,"name"):n,l))+'</a></td>\n <td><a href="'+s(i(null!=(n=null!=(n=null!=r[1]?p(r[1],"summary"):r[1])?p(n,"optionsUsed"):n)?p(n,"prefix"):n,l))+s(typeof(r=null!=(r=p(e,"from")||(null!=l?p(l,"from"):l))?r:d)==c?r.call(u,{name:"from",hash:{},data:t,loc:{start:{line:265,column:62},end:{line:265,column:70}}}):r)+'">'+s(typeof(r=null!=(r=p(e,"from")||(null!=l?p(l,"from"):l))?r:d)==c?r.call(u,{name:"from",hash:{},data:t,loc:{start:{line:265,column:72},end:{line:265,column:80}}}):r)+"</a>"+(null!=(n=typeof(r=null!=(r=p(e,"fromExtras")||(null!=l?p(l,"fromExtras"):l))?r:d)==c?r.call(u,{name:"fromExtras",hash:{},data:t,loc:{start:{line:265,column:84},end:{line:265,column:100}}}):r)?n:"")+"</td>\n <td>"+(null!=(n=typeof(r=null!=(r=p(e,"to")||(null!=l?p(l,"to"):l))?r:d)==c?r.call(u,{name:"to",hash:{},data:t,loc:{start:{line:266,column:20},end:{line:266,column:28}}}):r)?n:"")+"</td>\n\n </tr>\n"},25:function(n,l,e,o,t){return' <tr>\n <td colspan="4" class="controls">\n <div id="show-ignored">\n ↓ <a href="#show-ignored-violations">also show ignored violations</a>\n </div>\n <div id="hide-ignored">\n ↑ <a href="">hide ignored violations</a>\n </div>\n </td>\n </tr>\n'},27:function(n,l,e,o,t){return' <h2><span aria-hidden="true">♥</span> No violations found</h2>\n <p>Get gummy bears to celebrate.</p>\n'},compiler:[8,">= 4.3.0"],main:function(n,l,e,o,t,a,r){var i,s=n.lambda,u=n.escapeExpression,d=null!=l?l:n.nullContext||{},c=n.lookupProperty||function(n,l){if(Object.prototype.hasOwnProperty.call(n,l))return n[l]};return'<!DOCTYPE html>\n<html lang="en">\n\n<head>\n <title>dependency-cruiser - results</title>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1">\n\n <style type="text/css">\n body {\n font-family: sans-serif;\n margin: 0 auto;\n max-width: 90%;\n line-height: 1.6;\n font-size: 14px;\n color: #444;\n padding: 0 10px;\n background-color: #fff;\n }\n\n footer {\n color: gray;\n margin-top: 1.4em;\n border-top: solid 1px currentColor\n }\n\n a {\n text-decoration: none\n }\n\n a.noiseless {\n color: currentColor\n }\n\n h1,\n h2,\n h3 {\n line-height: 1.2\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n text-align: left;\n padding: 4px;\n }\n\n tbody tr:nth-child(odd) {\n background-color: rgba(128, 128, 128, 0.2);\n }\n\n .error {\n color: red;\n }\n\n .warn {\n color: orange;\n }\n\n .info {\n color: blue;\n }\n\n .ignore {\n color:gray;\n }\n\n .ok {\n color: limegreen;\n }\n\n td.nowrap {\n white-space: nowrap\n }\n\n svg {\n fill: currentColor\n }\n\n #show-unviolated {\n display: block\n }\n\n #hide-unviolated {\n display: none\n }\n\n #show-all-the-rules:target #show-unviolated {\n display: none\n }\n\n #show-all-the-rules:target #hide-unviolated {\n display: block\n }\n\n tr.unviolated {\n display: none\n }\n\n #show-all-the-rules:target tr.unviolated {\n display: table-row;\n color: gray;\n }\n\n #show-ignored {\n display: block\n }\n\n #hide-ignored {\n display: none\n }\n\n #show-ignored-violations:target #show-ignored {\n display: none\n }\n\n #show-ignored-violations:target #hide-ignored {\n display: block\n }\n\n tr.ignored {\n display: none\n }\n\n #show-ignored-violations:target tr.ignored {\n display: table-row;\n color: gray;\n }\n\n .p__svg--inline {\n vertical-align: top;\n width: 1.2em;\n height: 1.2em\n }\n\n .controls {\n background-color: #fff;\n vertical-align: bottom;\n text-align: center\n }\n\n .controls:hover {\n opacity: 1;\n }\n\n .controls a {\n text-decoration: none;\n color: gray;\n }\n\n .controls a:hover {\n text-decoration: underline;\n color: blue;\n }\n\n .extra {\n color: gray;\n }\n </style>\n <style type="text/css" media="print">\n th,\n td {\n border: 1px solid #444;\n }\n\n .controls {\n display: none\n }\n </style>\n</head>\n\n<body>\n <h1>Forbidden dependency check - results</h1>\n <span id="show-all-the-rules">\n <h2><svg class="p__svg--inline" viewBox="0 0 14 16" version="1.1" aria-hidden="true">\n <path fill-rule="evenodd"\n d="M11.5 8L8.8 5.4 6.6 8.5 5.5 1.6 2.38 8H0v2h3.6l.9-1.8.9 5.4L9 8.5l1.6 1.5H14V8h-2.5z"></path>\n </svg> Summary</h2>\n <p>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"totalCruised"):i,l))+'</strong> modules\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"totalDependenciesCruised"):i,l))+'</strong> dependencies\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"error"):i,l))+'</strong> errors\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"warn"):i,l))+'</strong> warnings\n </div>\n <div style="float:left;padding-right:20px">\n <strong>'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"info"):i,l))+"</strong> informational\n </div>\n"+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(1,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:199,column:8},end:{line:203,column:15}}}))?i:"")+" \n </p>\n <table>\n <tbody>\n <thead>\n <tr>\n <th></th>\n <th>severity</th>\n <th>rule</th>\n <th>violations</th>\n "+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(3,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:214,column:20},end:{line:214,column:65}}}))?i:"")+"\n <th>explanation</th>\n </thead>\n"+(null!=(i=n.hooks.blockHelperMissing.call(l,s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"agggregateViolations"):i,l),{name:"summary.agggregateViolations",hash:{},fn:n.program(5,t,0,a,r),inverse:n.noop,data:t,loc:{start:{line:217,column:12},end:{line:228,column:45}}}))?i:"")+" <tr>\n <td colspan="+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"ignore"):i,{name:"if",hash:{},fn:n.program(18,t,0,a,r),inverse:n.program(20,t,0,a,r),data:t,loc:{start:{line:230,column:28},end:{line:230,column:68}}}))?i:"")+' class="controls">\n <div id="show-unviolated">\n ↓ <a href="#show-all-the-rules">also show unviolated rules</a>\n </div>\n <div id="hide-unviolated">\n ↑ <a href="">hide unviolated rules</a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </span>\n\n'+(null!=(i=c(e,"if").call(d,null!=(i=null!=l?c(l,"summary"):l)?c(i,"violations"):i,{name:"if",hash:{},fn:n.program(22,t,0,a,r),inverse:n.program(27,t,0,a,r),data:t,loc:{start:{line:243,column:4},end:{line:288,column:11}}}))?i:"")+' <footer>\n <p><a href="https://github.com/sverweij/dependency-cruiser">'+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"depcruiseVersion"):i,l))+"</a> /\n "+u(s(null!=(i=null!=l?c(l,"summary"):l)?c(i,"runDate"):i,l))+"</p>\n </footer>\n</body>\n\n</html>"},useData:!0,useDepths:!0});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const _get = require("lodash/get");
|
|
2
2
|
const _has = require("lodash/has");
|
|
3
3
|
const { version } = require("../../../src/meta.js");
|
|
4
|
+
const { formatViolation, formatInstability } = require("../utl/index.js");
|
|
4
5
|
|
|
5
6
|
function getFormattedAllowedRule(pRuleSetUsed) {
|
|
6
7
|
const lAllowed = _get(pRuleSetUsed, "allowed", []);
|
|
@@ -29,14 +30,54 @@ function mergeCountsIntoRule(pRule, pViolationCounts) {
|
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
function formatCycleTo(pViolation) {
|
|
34
|
+
return pViolation.cycle.join(" →<br/>");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function formatReachabilityTo(pViolation) {
|
|
38
|
+
return `${pViolation.to}<br/>${pViolation.via.join(" →<br/>")}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function formatDependencyTo(pViolation) {
|
|
42
|
+
return pViolation.to;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function formatModuleTo() {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function formatInstabilityTo(pViolation) {
|
|
50
|
+
return `${pViolation.to} <span class="extra">(I: ${formatInstability(
|
|
51
|
+
pViolation.metrics.to.instability
|
|
52
|
+
)})</span>`;
|
|
53
|
+
}
|
|
54
|
+
|
|
32
55
|
function determineTo(pViolation) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
56
|
+
const lViolationType2Formatter = {
|
|
57
|
+
dependency: formatDependencyTo,
|
|
58
|
+
module: formatModuleTo,
|
|
59
|
+
cycle: formatCycleTo,
|
|
60
|
+
reachability: formatReachabilityTo,
|
|
61
|
+
instability: formatInstabilityTo,
|
|
62
|
+
};
|
|
63
|
+
return formatViolation(
|
|
64
|
+
pViolation,
|
|
65
|
+
lViolationType2Formatter,
|
|
66
|
+
formatDependencyTo
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function formatInstabilityFromExtras(pViolation) {
|
|
71
|
+
return ` <span class="extra">(I: ${formatInstability(
|
|
72
|
+
pViolation.metrics.from.instability
|
|
73
|
+
)})</span>`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function determineFromExtras(pViolation) {
|
|
77
|
+
const lViolationType2Formatter = {
|
|
78
|
+
instability: formatInstabilityFromExtras,
|
|
79
|
+
};
|
|
80
|
+
return formatViolation(pViolation, lViolationType2Formatter, () => "");
|
|
40
81
|
}
|
|
41
82
|
|
|
42
83
|
function formatSummaryForReport(pSummary) {
|
|
@@ -46,6 +87,7 @@ function formatSummaryForReport(pSummary) {
|
|
|
46
87
|
runDate: new Date().toISOString(),
|
|
47
88
|
violations: (pSummary.violations || []).map((pViolation) => ({
|
|
48
89
|
...pViolation,
|
|
90
|
+
fromExtras: determineFromExtras(pViolation),
|
|
49
91
|
to: determineTo(pViolation),
|
|
50
92
|
})),
|
|
51
93
|
};
|
|
@@ -55,5 +97,6 @@ module.exports = {
|
|
|
55
97
|
getFormattedAllowedRule,
|
|
56
98
|
mergeCountsIntoRule,
|
|
57
99
|
formatSummaryForReport,
|
|
100
|
+
determineFromExtras,
|
|
58
101
|
determineTo,
|
|
59
102
|
};
|
package/src/report/error.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
/* eslint-disable security/detect-object-injection */
|
|
1
2
|
const chalk = require("chalk");
|
|
2
3
|
const figures = require("figures");
|
|
3
|
-
|
|
4
4
|
const _get = require("lodash/get");
|
|
5
5
|
const { findRuleByName } = require("../graph-utl/rule-set");
|
|
6
6
|
const wrapAndIndent = require("../utl/wrap-and-indent");
|
|
7
|
+
const utl = require("./utl/index.js");
|
|
7
8
|
|
|
8
9
|
const SEVERITY2CHALK = {
|
|
9
10
|
error: chalk.red,
|
|
@@ -12,37 +13,70 @@ const SEVERITY2CHALK = {
|
|
|
12
13
|
ignore: chalk.gray,
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
const
|
|
16
|
+
const EXTRA_PATH_INFORMATION_INDENT = 6;
|
|
16
17
|
|
|
17
|
-
function
|
|
18
|
+
function formatExtraPathInformation(pExtra) {
|
|
18
19
|
return "\n".concat(
|
|
19
|
-
wrapAndIndent(
|
|
20
|
+
wrapAndIndent(
|
|
21
|
+
pExtra.join(` ${figures.arrowRight} \n`),
|
|
22
|
+
EXTRA_PATH_INFORMATION_INDENT
|
|
23
|
+
)
|
|
20
24
|
);
|
|
21
25
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
26
|
+
|
|
27
|
+
function formatModuleViolation(pViolation) {
|
|
28
|
+
return chalk.bold(pViolation.from);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function formatDependencyViolation(pViolation) {
|
|
32
|
+
return `${chalk.bold(pViolation.from)} ${figures.arrowRight} ${chalk.bold(
|
|
33
|
+
pViolation.to
|
|
34
|
+
)}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function formatCycleViolation(pViolation) {
|
|
38
|
+
return `${chalk.bold(pViolation.from)} ${
|
|
39
|
+
figures.arrowRight
|
|
40
|
+
} ${formatExtraPathInformation(pViolation.cycle)}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function formatReachabilityViolation(pViolation) {
|
|
44
|
+
return `${chalk.bold(pViolation.from)} ${figures.arrowRight} ${chalk.bold(
|
|
45
|
+
pViolation.to
|
|
46
|
+
)}${formatExtraPathInformation(pViolation.via)}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function formatInstabilityViolation(pViolation) {
|
|
50
|
+
return `${formatDependencyViolation(pViolation)}\n${wrapAndIndent(
|
|
51
|
+
chalk.dim(
|
|
52
|
+
`instability: ${utl.formatInstability(
|
|
53
|
+
pViolation.metrics.from.instability
|
|
54
|
+
)} ${figures.arrowRight} ${utl.formatInstability(
|
|
55
|
+
pViolation.metrics.to.instability
|
|
56
|
+
)}`
|
|
57
|
+
),
|
|
58
|
+
EXTRA_PATH_INFORMATION_INDENT
|
|
59
|
+
)}`;
|
|
32
60
|
}
|
|
33
61
|
|
|
34
62
|
function formatViolation(pViolation) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
63
|
+
const lViolationType2Formatter = {
|
|
64
|
+
module: formatModuleViolation,
|
|
65
|
+
dependency: formatDependencyViolation,
|
|
66
|
+
cycle: formatCycleViolation,
|
|
67
|
+
reachability: formatReachabilityViolation,
|
|
68
|
+
instability: formatInstabilityViolation,
|
|
69
|
+
};
|
|
70
|
+
const lFormattedViolators = utl.formatViolation(
|
|
71
|
+
pViolation,
|
|
72
|
+
lViolationType2Formatter,
|
|
73
|
+
formatDependencyViolation
|
|
74
|
+
);
|
|
41
75
|
|
|
42
76
|
return (
|
|
43
77
|
`${SEVERITY2CHALK[pViolation.rule.severity](pViolation.rule.severity)} ${
|
|
44
78
|
pViolation.rule.name
|
|
45
|
-
}: ${
|
|
79
|
+
}: ${lFormattedViolators}` +
|
|
46
80
|
`${
|
|
47
81
|
pViolation.comment
|
|
48
82
|
? `\n${wrapAndIndent(chalk.dim(pViolation.comment))}\n`
|
package/src/report/teamcity.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const _get = require("lodash/get");
|
|
2
2
|
const tsm = require("teamcity-service-messages");
|
|
3
|
+
const utl = require("./utl/index.js");
|
|
3
4
|
|
|
4
5
|
const CATEGORY = "dependency-cruiser";
|
|
5
6
|
const SEVERITY2TEAMCITY_SEVERITY = {
|
|
@@ -67,20 +68,45 @@ function reportViolatedRules(pRuleSetUsed, pViolations, pIgnoredCount) {
|
|
|
67
68
|
.concat(reportIgnoredRules(pIgnoredCount));
|
|
68
69
|
}
|
|
69
70
|
|
|
70
|
-
function
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
function formatModuleViolation(pViolation) {
|
|
72
|
+
return pViolation.from;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function formatDependencyViolation(pViolation) {
|
|
76
|
+
return `${pViolation.from} -> ${pViolation.to}`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function formatCycleViolation(pViolation) {
|
|
80
|
+
return `${pViolation.from} -> ${pViolation.cycle.join(" -> ")}`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function formatReachabilityViolation(pViolation) {
|
|
84
|
+
return `${formatDependencyViolation(pViolation)} ${pViolation.via.join(
|
|
85
|
+
" -> "
|
|
86
|
+
)}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function formatInstabilityViolation(pViolation) {
|
|
90
|
+
return `${formatDependencyViolation(
|
|
91
|
+
pViolation
|
|
92
|
+
)} (instability: ${utl.formatInstability(
|
|
93
|
+
pViolation.metrics.from.instability
|
|
94
|
+
)} -> ${utl.formatInstability(pViolation.metrics.to.instability)})`;
|
|
78
95
|
}
|
|
79
96
|
|
|
80
97
|
function bakeViolationMessage(pViolation) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
:
|
|
98
|
+
const lViolationType2Formatter = {
|
|
99
|
+
module: formatModuleViolation,
|
|
100
|
+
dependency: formatDependencyViolation,
|
|
101
|
+
cycle: formatCycleViolation,
|
|
102
|
+
reachability: formatReachabilityViolation,
|
|
103
|
+
instability: formatInstabilityViolation,
|
|
104
|
+
};
|
|
105
|
+
return utl.formatViolation(
|
|
106
|
+
pViolation,
|
|
107
|
+
lViolationType2Formatter,
|
|
108
|
+
formatDependencyViolation
|
|
109
|
+
);
|
|
84
110
|
}
|
|
85
111
|
|
|
86
112
|
function reportIgnoredViolation(pIgnoredCount) {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function formatInstability(pNumber) {
|
|
2
|
+
// eslint-disable-next-line no-magic-numbers
|
|
3
|
+
return Math.round(100 * pNumber);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function formatViolation(
|
|
7
|
+
pViolation,
|
|
8
|
+
pViolationType2Formatter,
|
|
9
|
+
pDefaultFormatter
|
|
10
|
+
) {
|
|
11
|
+
return (pViolationType2Formatter[pViolation.type] || pDefaultFormatter)(
|
|
12
|
+
pViolation
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = { formatViolation, formatInstability };
|