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.
Files changed (54) hide show
  1. package/README.md +1 -1
  2. package/package.json +22 -16
  3. package/src/enrich/clear-caches.js +1 -1
  4. package/src/enrich/derive/circular/get-cycle.js +1 -1
  5. package/src/enrich/derive/dependents/get-dependents.js +1 -1
  6. package/src/enrich/derive/{metrics/get-stability-metrics.js → folders/aggregate-to-folders.js} +39 -30
  7. package/src/enrich/derive/folders/index.js +9 -0
  8. package/src/enrich/derive/folders/utl.js +44 -0
  9. package/src/enrich/derive/metrics/get-module-metrics.js +39 -0
  10. package/src/enrich/derive/metrics/index.js +14 -0
  11. package/src/enrich/derive/{utl.js → module-utl.js} +28 -0
  12. package/src/enrich/derive/orphan/is-orphan.js +1 -1
  13. package/src/enrich/derive/reachable/get-path.js +1 -1
  14. package/src/enrich/derive/reachable/index.js +1 -1
  15. package/src/enrich/enrich-modules.js +2 -2
  16. package/src/enrich/index.js +2 -2
  17. package/src/enrich/summarize/summarize-modules.js +24 -5
  18. package/src/extract/get-dependencies.js +11 -6
  19. package/src/extract/parse/to-typescript-ast.js +24 -8
  20. package/src/extract/utl/get-extension.js +9 -5
  21. package/src/main/options/normalize.js +28 -0
  22. package/src/meta.js +1 -1
  23. package/src/report/dot/dot.template.js +1 -1
  24. package/src/report/dot/index.js +7 -2
  25. package/src/report/dot/module-utl.js +47 -19
  26. package/src/report/dot/prepare-custom-level.js +2 -2
  27. package/src/report/dot/prepare-flat-level.js +2 -2
  28. package/src/report/dot/prepare-folder-level.js +2 -2
  29. package/src/report/error-html/error-html.template.js +1 -1
  30. package/src/report/error-html/utl.js +50 -7
  31. package/src/report/error.js +55 -21
  32. package/src/report/teamcity.js +37 -11
  33. package/src/report/utl/index.js +16 -0
  34. package/src/schema/baseline-violations.schema.js +1 -35
  35. package/src/schema/configuration.schema.js +1 -493
  36. package/src/schema/cruise-result.schema.js +1 -642
  37. package/src/utl/regex-util.js +57 -0
  38. package/src/validate/match-dependency-rule.js +19 -32
  39. package/src/validate/match-module-rule.js +1 -1
  40. package/src/validate/matchers.js +58 -48
  41. package/src/validate/violates-required-rule.js +1 -1
  42. package/types/baseline-violations.d.ts +1 -1
  43. package/types/cruise-result.d.ts +11 -50
  44. package/types/options.d.ts +5 -0
  45. package/types/reporter-options.d.ts +6 -0
  46. package/types/restrictions.d.ts +12 -0
  47. package/types/rule-summary.d.ts +23 -0
  48. package/types/shared-types.d.ts +7 -0
  49. package/types/violations.d.ts +43 -0
  50. package/src/enrich/derive/metrics/folder.js +0 -9
  51. package/src/enrich/derive/metrics/module-utl.js +0 -27
  52. package/src/enrich/derive/metrics/module.js +0 -29
  53. package/src/enrich/derive/metrics/utl.js +0 -28
  54. 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,7 +1,7 @@
1
1
  /* generated - don't edit */
2
2
 
3
3
  module.exports = {
4
- version: "10.8.0",
4
+ version: "11.2.0",
5
5
  engines: {
6
6
  node: "^12.20||^14||>=16",
7
7
  },
@@ -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||{},c=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]},i=null!=(p=c(e,"if").call(u,null!=n?c(n,"folder"):n,{name:"if",hash:{},fn:l.program(8,o,0,a,r),inverse:l.program(20,o,0,a,r),data:o,loc:{start:{line:7,column:4},end:{line:12,column:11}}}))?p:"",s=null!=(s=c(e,"dependencies")||(null!=n?c(n,"dependencies"):n))?s:l.hooks.helperMissing,o={name:"dependencies",hash:{},fn:l.program(22,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=!c(e,"dependencies")?l.hooks.blockHelperMissing.call(n,p,o):p)&&(i+=p),i},8:function(l,n,e,t,o,a,r){var u,c,i=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(i,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(c=null!=(c=m(e,"source")||(null!=n?m(n,"source"):n))?c:s)==p?c.call(i,{name:"source",hash:{},data:o,loc:{start:{line:9,column:9},end:{line:9,column:21}}}):c)?u:"")+'" [label='+(null!=(u=typeof(c=null!=(c=m(e,"label")||(null!=n?m(n,"label"):n))?c:s)==p?c.call(i,{name:"label",hash:{},data:o,loc:{start:{line:9,column:30},end:{line:9,column:41}}}):c)?u:"")+" "+(null!=(u=m(e,"if").call(i,null!=n?m(n,"rule"):n,{name:"if",hash:{},fn:l.program(12,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:42},end:{line:9,column:87}}}))?u:"")+(null!=(u=m(e,"if").call(i,null!=n?m(n,"URL"):n,{name:"if",hash:{},fn:l.program(14,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:87},end:{line:9,column:121}}}))?u:"")+(null!=(u=m(e,"if").call(i,null!=n?m(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(16,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:121},end:{line:9,column:162}}}))?u:"")+"]"+(null!=(u=m(e,"each").call(i,null!=n?m(n,"path"):n,{name:"each",hash:{},fn:l.program(18,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:9,column:163},end:{line:9,column:188}}}))?u:"")+"\n"},9:function(l,n,e,t,o,a,r){var u,c,i=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(c=null!=(c=m(e,"aggregateSnippet")||(null!=n?m(n,"aggregateSnippet"):n))?c:s)==p?c.call(i,{name:"aggregateSnippet",hash:{},data:o,loc:{start:{line:8,column:36},end:{line:8,column:58}}}):c)?u:"")+'" {label="'+(null!=(u=typeof(c=null!=(c=m(e,"snippet")||(null!=n?m(n,"snippet"):n))?c:s)==p?c.call(i,{name:"snippet",hash:{},data:o,loc:{start:{line:8,column:68},end:{line:8,column:81}}}):c)?u:"")+'" '+(null!=(u=m(e,"if").call(i,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'tooltip="'+(null!=(l=l.lambda(null!=(l=null!=n?a(n,"rule"):n)?a(l,"name"):l,n))?l:"")+'" '},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'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:103},end:{line:9,column:112}}}):a)?a:"")+'" '},16: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:139},end:{line:9,column:155}}}):a)?a:""},18:function(l,n,e,t,o){return" }"},20:function(l,n,e,t,o,a,r){var u,c,i=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(c=null!=(c=m(e,"source")||(null!=n?m(n,"source"):n))?c:s)==p?c.call(i,{name:"source",hash:{},data:o,loc:{start:{line:11,column:5},end:{line:11,column:17}}}):c)?u:"")+'" [label='+(null!=(u=typeof(c=null!=(c=m(e,"label")||(null!=n?m(n,"label"):n))?c:s)==p?c.call(i,{name:"label",hash:{},data:o,loc:{start:{line:11,column:26},end:{line:11,column:37}}}):c)?u:"")+" "+(null!=(u=m(e,"if").call(i,null!=n?m(n,"rule"):n,{name:"if",hash:{},fn:l.program(12,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:11,column:38},end:{line:11,column:83}}}))?u:"")+(null!=(u=m(e,"if").call(i,null!=n?m(n,"URL"):n,{name:"if",hash:{},fn:l.program(14,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:11,column:83},end:{line:11,column:117}}}))?u:"")+(null!=(u=m(e,"if").call(i,null!=n?m(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(16,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:11,column:117},end:{line:11,column:158}}}))?u:"")+"]\n"},22:function(l,n,e,t,o,a,r){var u,c,i=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(c=null!=(c=s(e,"resolved")||(null!=n?s(n,"resolved"):n))?c:l.hooks.helperMissing)?c.call(i,{name:"resolved",hash:{},data:o,loc:{start:{line:14,column:26},end:{line:14,column:40}}}):c)?u:"")+'"'+(null!=(u=s(e,"if").call(i,null!=n?s(n,"hasExtraAttributes"):n,{name:"if",hash:{},fn:l.program(23,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:41},end:{line:14,column:193}}}))?u:"")+"\n"},23:function(l,n,e,t,o,a,r){var u,c=null!=n?n:l.nullContext||{},i=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]};return" ["+(null!=(u=i(e,"if").call(c,null!=(u=null!=n?i(n,"rule"):n)?i(u,"name"):u,{name:"if",hash:{},fn:l.program(24,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:69},end:{line:14,column:144}}}))?u:"")+(null!=(u=i(e,"if").call(c,null!=n?i(n,"themeAttrs"):n,{name:"if",hash:{},fn:l.program(16,o,0,a,r),inverse:l.noop,data:o,loc:{start:{line:14,column:144},end:{line:14,column:185}}}))?u:"")+"]"},24: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||{},c=l.lookupProperty||function(l,n){if(Object.prototype.hasOwnProperty.call(l,n))return l[n]},i='strict digraph "dependency-cruiser output"{\n '+(null!=(p=c(e,"if").call(u,null!=n?c(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=c(e,"if").call(u,null!=n?c(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=c(e,"if").call(u,null!=n?c(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=c(e,"modules")||(null!=n?c(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=!c(e,"modules")?l.hooks.blockHelperMissing.call(n,p,o):p)&&(i+=p),i+"}\n"},useData:!0,useDepths:!0});
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});
@@ -17,7 +17,11 @@ const GRANULARITY2FUNCTION = {
17
17
  flat: prepareFlatLevel,
18
18
  };
19
19
 
20
- function report(pResults, pGranularity, { theme, collapsePattern, filters }) {
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.rules ? { ...pModule, rule: pModule.rules[0] } : 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 folderify(pModule) {
61
- let lAdditions = {};
62
- let lDirectoryName = path.dirname(pModule.source);
66
+ function makeInstabilityString(pModule, pShowMetrics = false) {
67
+ let lInstabilityString = "";
63
68
 
64
- if (lDirectoryName !== ".") {
65
- lAdditions.folder = lDirectoryName;
66
- lAdditions.path = lDirectoryName.split(path.sep).map(aggregate);
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
- lAdditions.label = `"${path.basename(pModule.source)}"`;
77
+ function folderify(pShowMetrics) {
78
+ return (pModule) => {
79
+ let lAdditions = {};
80
+ let lDirectoryName = path.dirname(pModule.source);
70
81
 
71
- return {
72
- ...pModule,
73
- ...lAdditions,
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(/^[a-z]+:\/\//)) {
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 flatLabel(pModule) {
107
- return {
108
- ...pModule,
109
- label: `<${path.dirname(pModule.source)}/<BR/><B>${path.basename(
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">&check;</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)+'">&cross;</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 &downarrow; <a href="#show-ignored-violations">also show ignored violations</a>\n </div>\n <div id="hide-ignored">\n &uparrow; <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">&hearts;</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:"")+" &nbsp;\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 &downarrow; <a href="#show-all-the-rules">also show unviolated rules</a>\n </div>\n <div id="hide-unviolated">\n &uparrow; <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">&check;</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)+'">&cross;</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 &downarrow; <a href="#show-ignored-violations">also show ignored violations</a>\n </div>\n <div id="hide-ignored">\n &uparrow; <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">&hearts;</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:"")+" &nbsp;\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 &downarrow; <a href="#show-all-the-rules">also show unviolated rules</a>\n </div>\n <div id="hide-unviolated">\n &uparrow; <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(" &rightarrow;<br/>");
35
+ }
36
+
37
+ function formatReachabilityTo(pViolation) {
38
+ return `${pViolation.to}<br/>${pViolation.via.join(" &rightarrow;<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}&nbsp;<span class="extra">(I: ${formatInstability(
51
+ pViolation.metrics.to.instability
52
+ )})</span>`;
53
+ }
54
+
32
55
  function determineTo(pViolation) {
33
- if (pViolation.cycle) {
34
- return pViolation.cycle.join(" &rightarrow;<br/>");
35
- }
36
- if (pViolation.via) {
37
- return `${pViolation.to}<br/>${pViolation.via.join(" &rightarrow;<br/>")}`;
38
- }
39
- return pViolation.from === pViolation.to ? "" : pViolation.to;
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 `&nbsp;<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
  };
@@ -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 CYCLIC_PATH_INDENT = 6;
16
+ const EXTRA_PATH_INFORMATION_INDENT = 6;
16
17
 
17
- function renderExtraPathInformation(pExtra) {
18
+ function formatExtraPathInformation(pExtra) {
18
19
  return "\n".concat(
19
- wrapAndIndent(pExtra.join(` ${figures.arrowRight} \n`), CYCLIC_PATH_INDENT)
20
+ wrapAndIndent(
21
+ pExtra.join(` ${figures.arrowRight} \n`),
22
+ EXTRA_PATH_INFORMATION_INDENT
23
+ )
20
24
  );
21
25
  }
22
- function determineTo(pViolation) {
23
- if (pViolation.cycle) {
24
- return renderExtraPathInformation(pViolation.cycle);
25
- }
26
- if (pViolation.via) {
27
- return `${chalk.bold(pViolation.to)}${renderExtraPathInformation(
28
- pViolation.via
29
- )}`;
30
- }
31
- return `${chalk.bold(pViolation.to)}`;
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 lModuleNames =
36
- pViolation.from === pViolation.to
37
- ? chalk.bold(pViolation.from)
38
- : `${chalk.bold(pViolation.from)} ${figures.arrowRight} ${determineTo(
39
- pViolation
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
- }: ${lModuleNames}` +
79
+ }: ${lFormattedViolators}` +
46
80
  `${
47
81
  pViolation.comment
48
82
  ? `\n${wrapAndIndent(chalk.dim(pViolation.comment))}\n`
@@ -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 determineTo(pViolation) {
71
- if (pViolation.cycle) {
72
- return pViolation.cycle.join(" -> ");
73
- }
74
- if (pViolation.via) {
75
- return `${pViolation.to} ${pViolation.via.join(" -> ")}`;
76
- }
77
- return pViolation.to;
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
- return pViolation.from === pViolation.to
82
- ? pViolation.from
83
- : `${pViolation.from} -> ${determineTo(pViolation)}`;
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 };