dependency-cruiser 11.4.1 → 11.5.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/package.json +17 -17
- package/src/enrich/derive/circular/get-cycle.js +34 -18
- package/src/enrich/derive/circular/index.js +29 -13
- package/src/enrich/derive/folders/aggregate-to-folders.js +28 -6
- package/src/enrich/derive/folders/utl.js +5 -0
- package/src/enrich/enrich-modules.js +7 -2
- package/src/enrich/summarize/index.js +4 -3
- package/src/enrich/summarize/summarize-folders.js +11 -2
- package/src/extract/ast-extractors/swc-dependency-visitor.js +5 -1
- package/src/main/options/normalize.js +12 -6
- package/src/meta.js +1 -1
- package/src/schema/cruise-result.schema.js +1 -1
- package/src/validate/match-folder-dependency-rule.js +2 -3
- package/types/cruise-result.d.ts +32 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dependency-cruiser",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.5.0",
|
|
4
4
|
"description": "Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"static analysis",
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"acorn-jsx-walk": "2.0.0",
|
|
141
141
|
"acorn-loose": "8.3.0",
|
|
142
142
|
"acorn-walk": "8.2.0",
|
|
143
|
-
"ajv": "8.
|
|
143
|
+
"ajv": "8.11.0",
|
|
144
144
|
"chalk": "^4.1.2",
|
|
145
145
|
"commander": "9.1.0",
|
|
146
146
|
"enhanced-resolve": "5.9.2",
|
|
@@ -149,49 +149,49 @@
|
|
|
149
149
|
"glob": "7.2.0",
|
|
150
150
|
"handlebars": "4.7.7",
|
|
151
151
|
"indent-string": "^4.0.0",
|
|
152
|
-
"inquirer": "8.2.
|
|
153
|
-
"json5": "2.2.
|
|
152
|
+
"inquirer": "8.2.2",
|
|
153
|
+
"json5": "2.2.1",
|
|
154
154
|
"lodash": "4.17.21",
|
|
155
155
|
"safe-regex": "2.1.1",
|
|
156
|
-
"semver": "^7.3.
|
|
157
|
-
"semver-try-require": "^5.0.
|
|
156
|
+
"semver": "^7.3.6",
|
|
157
|
+
"semver-try-require": "^5.0.2",
|
|
158
158
|
"teamcity-service-messages": "0.1.12",
|
|
159
159
|
"tsconfig-paths-webpack-plugin": "3.5.2",
|
|
160
160
|
"wrap-ansi": "^7.0.0"
|
|
161
161
|
},
|
|
162
162
|
"devDependencies": {
|
|
163
|
-
"@babel/core": "7.17.
|
|
164
|
-
"@babel/plugin-transform-modules-commonjs": "7.17.
|
|
163
|
+
"@babel/core": "7.17.9",
|
|
164
|
+
"@babel/plugin-transform-modules-commonjs": "7.17.9",
|
|
165
165
|
"@babel/preset-typescript": "7.16.7",
|
|
166
|
-
"@swc/core": "1.2.
|
|
167
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
168
|
-
"@typescript-eslint/parser": "5.
|
|
166
|
+
"@swc/core": "1.2.165",
|
|
167
|
+
"@typescript-eslint/eslint-plugin": "5.18.0",
|
|
168
|
+
"@typescript-eslint/parser": "5.18.0",
|
|
169
169
|
"@vue/compiler-sfc": "3.2.31",
|
|
170
170
|
"c8": "7.11.0",
|
|
171
171
|
"chai": "4.3.6",
|
|
172
172
|
"chai-json-schema": "1.5.1",
|
|
173
173
|
"coffeescript": "2.6.1",
|
|
174
|
-
"eslint": "^8.
|
|
174
|
+
"eslint": "^8.13.0",
|
|
175
175
|
"eslint-config-moving-meadow": "3.0.0",
|
|
176
176
|
"eslint-config-prettier": "8.5.0",
|
|
177
177
|
"eslint-plugin-budapestian": "3.0.1",
|
|
178
|
-
"eslint-plugin-import": "2.
|
|
178
|
+
"eslint-plugin-import": "2.26.0",
|
|
179
179
|
"eslint-plugin-mocha": "^9.0.0",
|
|
180
180
|
"eslint-plugin-node": "11.1.0",
|
|
181
181
|
"eslint-plugin-security": "1.4.0",
|
|
182
|
-
"eslint-plugin-unicorn": "^
|
|
182
|
+
"eslint-plugin-unicorn": "^42.0.0",
|
|
183
183
|
"husky": "^4.3.8",
|
|
184
184
|
"intercept-stdout": "0.1.2",
|
|
185
185
|
"lint-staged": "12.3.4",
|
|
186
186
|
"mocha": "9.2.2",
|
|
187
187
|
"normalize-newline": "^3.0.0",
|
|
188
188
|
"npm-run-all": "4.1.5",
|
|
189
|
-
"prettier": "2.6.
|
|
189
|
+
"prettier": "2.6.2",
|
|
190
190
|
"proxyquire": "2.1.3",
|
|
191
191
|
"shx": "0.3.4",
|
|
192
|
-
"svelte": "3.
|
|
192
|
+
"svelte": "3.47.0",
|
|
193
193
|
"symlink-dir": "5.0.1",
|
|
194
|
-
"typescript": "4.6.
|
|
194
|
+
"typescript": "4.6.3",
|
|
195
195
|
"upem": "^7.0.0",
|
|
196
196
|
"vue-template-compiler": "2.6.14",
|
|
197
197
|
"yarn": "1.22.18"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable security/detect-object-injection */
|
|
2
2
|
/* about the absence of checks whether attributes/ objects actually
|
|
3
3
|
* exist:
|
|
4
4
|
* - it saves CPU cycles to the effect of being ~30% faster than with the
|
|
@@ -11,37 +11,53 @@ const { findModuleByName } = require("../module-utl");
|
|
|
11
11
|
* Returns the first non-zero length path from pInitialSource to pInitialSource
|
|
12
12
|
* Returns the empty array if there is no such path
|
|
13
13
|
*
|
|
14
|
-
* @param
|
|
15
|
-
* @param
|
|
16
|
-
*
|
|
17
|
-
* @param
|
|
18
|
-
*
|
|
19
|
-
* @param
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
14
|
+
* @param {any} pGraph The graph in which to test this condition
|
|
15
|
+
* @param {string} pInitialSource The 'source' attribute of the node to be tested
|
|
16
|
+
* (source uniquely identifying a node)
|
|
17
|
+
* @param {string} pCurrentSource The 'source' attribute of the 'to' node to
|
|
18
|
+
* be traversed
|
|
19
|
+
* @param {string} pDependencyName The attribute name of the dependency to use.
|
|
20
|
+
* defaults to "resolved" (which is in use for
|
|
21
|
+
* modules). For folders pass "name"
|
|
22
|
+
* @param {function} pFindNodeByName Function taking a Graph and a pCurrentSource string
|
|
23
|
+
* that returns the Node in that graph going by
|
|
24
|
+
* that name. Defaults to findModuleByName (which
|
|
25
|
+
* is in use for modules). For folders pass
|
|
26
|
+
* findFolderByName
|
|
27
|
+
* @param {Set} pVisited The set of nodes visited hithereto (optional
|
|
28
|
+
* attribute - there's no need to pass it when
|
|
29
|
+
* calling it; it's used by the algorithm to
|
|
30
|
+
* determine the stop condition)
|
|
31
|
+
* @return {string[]} see description above
|
|
24
32
|
*/
|
|
25
|
-
|
|
33
|
+
// eslint-disable-next-line max-params
|
|
34
|
+
function getCycle(
|
|
35
|
+
pGraph,
|
|
36
|
+
pInitialSource,
|
|
37
|
+
pCurrentSource,
|
|
38
|
+
{ pDependencyName, pFindNodeByName },
|
|
39
|
+
pVisited
|
|
40
|
+
) {
|
|
26
41
|
pVisited = pVisited || new Set();
|
|
27
42
|
|
|
28
|
-
const lCurrentNode =
|
|
43
|
+
const lCurrentNode = pFindNodeByName(pGraph, pCurrentSource);
|
|
29
44
|
const lDependencies = lCurrentNode.dependencies.filter(
|
|
30
|
-
(pDependency) => !pVisited.has(pDependency
|
|
45
|
+
(pDependency) => !pVisited.has(pDependency[pDependencyName])
|
|
31
46
|
);
|
|
32
47
|
const lMatch = lDependencies.find(
|
|
33
|
-
(pDependency) => pDependency
|
|
48
|
+
(pDependency) => pDependency[pDependencyName] === pInitialSource
|
|
34
49
|
);
|
|
35
50
|
if (lMatch) {
|
|
36
|
-
return [pCurrentSource, lMatch
|
|
51
|
+
return [pCurrentSource, lMatch[pDependencyName]];
|
|
37
52
|
}
|
|
38
53
|
return lDependencies.reduce((pAll, pDependency) => {
|
|
39
54
|
if (!pAll.includes(pCurrentSource)) {
|
|
40
55
|
const lCycle = getCycle(
|
|
41
56
|
pGraph,
|
|
42
57
|
pInitialSource,
|
|
43
|
-
pDependency
|
|
44
|
-
|
|
58
|
+
pDependency[pDependencyName],
|
|
59
|
+
{ pDependencyName, pFindNodeByName },
|
|
60
|
+
pVisited.add(pDependency[pDependencyName])
|
|
45
61
|
);
|
|
46
62
|
|
|
47
63
|
if (lCycle.length > 0 && !lCycle.includes(pCurrentSource)) {
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
+
/* eslint-disable security/detect-object-injection */
|
|
1
2
|
const getCycle = require("./get-cycle");
|
|
2
3
|
|
|
3
|
-
function addCircularityCheckToDependency(
|
|
4
|
-
|
|
4
|
+
function addCircularityCheckToDependency(
|
|
5
|
+
pGraph,
|
|
6
|
+
pFrom,
|
|
7
|
+
pToDep,
|
|
8
|
+
{ pDependencyName, pFindNodeByName }
|
|
9
|
+
) {
|
|
5
10
|
let lReturnValue = {
|
|
6
11
|
...pToDep,
|
|
7
|
-
circular:
|
|
12
|
+
circular: false,
|
|
8
13
|
};
|
|
14
|
+
const lCycle = getCycle(pGraph, pFrom, pToDep[pDependencyName], {
|
|
15
|
+
pDependencyName,
|
|
16
|
+
pFindNodeByName,
|
|
17
|
+
});
|
|
9
18
|
|
|
10
|
-
if (
|
|
19
|
+
if (lCycle.length > 0) {
|
|
11
20
|
lReturnValue = {
|
|
12
21
|
...lReturnValue,
|
|
22
|
+
circular: true,
|
|
13
23
|
cycle: lCycle,
|
|
14
24
|
};
|
|
15
25
|
}
|
|
@@ -18,19 +28,25 @@ function addCircularityCheckToDependency(pToDep, pGraph, pFrom) {
|
|
|
18
28
|
}
|
|
19
29
|
|
|
20
30
|
/**
|
|
21
|
-
* Runs through all dependencies of all
|
|
31
|
+
* Runs through all dependencies of all pNodes, for each of them determines
|
|
22
32
|
* whether it's (part of a) circular (relationship) and returns the
|
|
23
33
|
* dependencies with that added.
|
|
24
|
-
*
|
|
25
|
-
* @param {Object} pModules [description]
|
|
26
|
-
* @return {Object} the same dependencies, but for each
|
|
27
|
-
* of them added whether or not it is
|
|
28
|
-
* part of
|
|
29
34
|
*/
|
|
30
|
-
module.exports = (
|
|
31
|
-
|
|
35
|
+
module.exports = (
|
|
36
|
+
pNodes,
|
|
37
|
+
{ pSourceAttribute, pDependencyName, pFindNodeByName }
|
|
38
|
+
) =>
|
|
39
|
+
pNodes.map((pModule) => ({
|
|
32
40
|
...pModule,
|
|
33
41
|
dependencies: pModule.dependencies.map((pToDep) =>
|
|
34
|
-
addCircularityCheckToDependency(
|
|
42
|
+
addCircularityCheckToDependency(
|
|
43
|
+
pNodes,
|
|
44
|
+
pModule[pSourceAttribute],
|
|
45
|
+
pToDep,
|
|
46
|
+
{
|
|
47
|
+
pDependencyName,
|
|
48
|
+
pFindNodeByName,
|
|
49
|
+
}
|
|
50
|
+
)
|
|
35
51
|
),
|
|
36
52
|
}));
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/* eslint-disable security/detect-object-injection */
|
|
2
2
|
const path = require("path").posix;
|
|
3
3
|
const { calculateInstability, metricsAreCalculable } = require("../module-utl");
|
|
4
|
+
const detectCycles = require("../circular");
|
|
4
5
|
const {
|
|
6
|
+
findFolderByName,
|
|
5
7
|
getAfferentCouplings,
|
|
6
8
|
getEfferentCouplings,
|
|
7
9
|
getParentFolders,
|
|
@@ -80,10 +82,6 @@ function calculateFolderMetrics(pFolder) {
|
|
|
80
82
|
};
|
|
81
83
|
}
|
|
82
84
|
|
|
83
|
-
function findFolderByName(pAllFolders, pName) {
|
|
84
|
-
return pAllFolders.find((pFolder) => pFolder.name === pName);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
85
|
function denormalizeInstability(pFolder, _, pAllFolders) {
|
|
88
86
|
return {
|
|
89
87
|
...pFolder,
|
|
@@ -96,11 +94,35 @@ function denormalizeInstability(pFolder, _, pAllFolders) {
|
|
|
96
94
|
}),
|
|
97
95
|
};
|
|
98
96
|
}
|
|
97
|
+
function uniq(pArray) {
|
|
98
|
+
return [...new Set(pArray)];
|
|
99
|
+
}
|
|
100
|
+
function getSinks(pFolders) {
|
|
101
|
+
const lKnownFolders = new Set(pFolders.map(({ name }) => name));
|
|
102
|
+
const lAllFolders = uniq(
|
|
103
|
+
pFolders.flatMap(({ dependencies }) => dependencies.map(({ name }) => name))
|
|
104
|
+
);
|
|
105
|
+
const lReturnValue = lAllFolders
|
|
106
|
+
.filter((pFolder) => !lKnownFolders.has(pFolder))
|
|
107
|
+
.map((pFolder) => ({
|
|
108
|
+
name: pFolder,
|
|
109
|
+
moduleCount: -1,
|
|
110
|
+
dependencies: [],
|
|
111
|
+
dependents: [],
|
|
112
|
+
}));
|
|
113
|
+
return lReturnValue;
|
|
114
|
+
}
|
|
99
115
|
|
|
100
116
|
module.exports = function aggregateToFolders(pModules) {
|
|
101
117
|
const lFolders = object2Array(
|
|
102
118
|
pModules.filter(metricsAreCalculable).reduce(aggregateToFolder, {})
|
|
103
|
-
)
|
|
119
|
+
)
|
|
120
|
+
.map(calculateFolderMetrics)
|
|
121
|
+
.map(denormalizeInstability);
|
|
104
122
|
|
|
105
|
-
return lFolders.
|
|
123
|
+
return detectCycles(lFolders.concat(getSinks(lFolders)), {
|
|
124
|
+
pSourceAttribute: "name",
|
|
125
|
+
pDependencyName: "name",
|
|
126
|
+
pFindNodeByName: findFolderByName,
|
|
127
|
+
});
|
|
106
128
|
};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/* eslint-disable security/detect-object-injection */
|
|
2
2
|
const path = require("path").posix;
|
|
3
3
|
|
|
4
|
+
function findFolderByName(pAllFolders, pName) {
|
|
5
|
+
return pAllFolders.find((pFolder) => pFolder.name === pName);
|
|
6
|
+
}
|
|
7
|
+
|
|
4
8
|
function getAfferentCouplings(pModule, pDirname) {
|
|
5
9
|
return pModule.dependents.filter(
|
|
6
10
|
(pDependent) => !pDependent.startsWith(pDirname.concat(path.sep))
|
|
@@ -37,6 +41,7 @@ function object2Array(pObject) {
|
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
module.exports = {
|
|
44
|
+
findFolderByName,
|
|
40
45
|
getAfferentCouplings,
|
|
41
46
|
getEfferentCouplings,
|
|
42
47
|
getParentFolders,
|
|
@@ -2,17 +2,22 @@ const _get = require("lodash/get");
|
|
|
2
2
|
const bus = require("../utl/bus");
|
|
3
3
|
const busLogLevels = require("../utl/bus-log-levels");
|
|
4
4
|
const addFocus = require("../../src/graph-utl/add-focus");
|
|
5
|
-
const
|
|
5
|
+
const deriveCycles = require("./derive/circular");
|
|
6
6
|
const deriveOrphans = require("./derive/orphan");
|
|
7
7
|
const addDependents = require("./derive/dependents");
|
|
8
8
|
const deriveReachable = require("./derive/reachable");
|
|
9
9
|
const addValidations = require("./add-validations");
|
|
10
10
|
const softenKnownViolations = require("./soften-known-violations");
|
|
11
11
|
const deriveModuleMetrics = require("./derive/metrics");
|
|
12
|
+
const { findModuleByName } = require("./derive/module-utl");
|
|
12
13
|
|
|
13
14
|
module.exports = function enrichModules(pModules, pOptions) {
|
|
14
15
|
bus.emit("progress", "analyzing: cycles", { level: busLogLevels.INFO });
|
|
15
|
-
let lModules =
|
|
16
|
+
let lModules = deriveCycles(pModules, {
|
|
17
|
+
pSourceAttribute: "source",
|
|
18
|
+
pDependencyName: "resolved",
|
|
19
|
+
pFindNodeByName: findModuleByName,
|
|
20
|
+
});
|
|
16
21
|
bus.emit("progress", "analyzing: dependents", { level: busLogLevels.INFO });
|
|
17
22
|
lModules = addDependents(lModules, pOptions);
|
|
18
23
|
bus.emit("progress", "analyzing: orphans", { level: busLogLevels.INFO });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const compare = require("../../graph-utl/compare");
|
|
1
2
|
const addRuleSetUsed = require("./add-rule-set-used");
|
|
2
3
|
const summarizeModules = require("./summarize-modules");
|
|
3
4
|
const summarizeFolders = require("./summarize-folders");
|
|
@@ -28,9 +29,9 @@ module.exports = function summarize(
|
|
|
28
29
|
pFileDirectoryArray,
|
|
29
30
|
pFolders
|
|
30
31
|
) {
|
|
31
|
-
const lViolations = summarizeModules(pModules, pOptions.ruleSet)
|
|
32
|
-
summarizeFolders(pFolders || [], pOptions.ruleSet)
|
|
33
|
-
|
|
32
|
+
const lViolations = summarizeModules(pModules, pOptions.ruleSet)
|
|
33
|
+
.concat(summarizeFolders(pFolders || [], pOptions.ruleSet))
|
|
34
|
+
.sort(compare.violations);
|
|
34
35
|
|
|
35
36
|
return {
|
|
36
37
|
violations: lViolations,
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
const
|
|
1
|
+
const has = require("lodash/has");
|
|
2
2
|
const { findRuleByName } = require("../../graph-utl/rule-set");
|
|
3
3
|
|
|
4
4
|
function classifyViolation(pRule, pRuleSet) {
|
|
5
|
-
|
|
5
|
+
const lRule = findRuleByName(pRuleSet, pRule.name);
|
|
6
|
+
if (has(lRule, "to.moreUnstable")) {
|
|
6
7
|
return "instability";
|
|
7
8
|
}
|
|
9
|
+
if (has(lRule, "to.circular")) {
|
|
10
|
+
return "cycle";
|
|
11
|
+
}
|
|
8
12
|
return "folder";
|
|
9
13
|
}
|
|
10
14
|
|
|
@@ -28,6 +32,11 @@ function getViolations(pFolder, pRuleSet) {
|
|
|
28
32
|
},
|
|
29
33
|
}
|
|
30
34
|
: {}),
|
|
35
|
+
...(lViolationType === "cycle"
|
|
36
|
+
? {
|
|
37
|
+
cycle: pDependency.cycle,
|
|
38
|
+
}
|
|
39
|
+
: {}),
|
|
31
40
|
};
|
|
32
41
|
})
|
|
33
42
|
);
|
|
@@ -13,7 +13,11 @@ function pryStringsFromArguments(pArguments) {
|
|
|
13
13
|
lReturnValue = pArguments[0].expression.value;
|
|
14
14
|
} else if (pArguments[0].expression.type === "TemplateLiteral") {
|
|
15
15
|
/* c8 ignore start */
|
|
16
|
-
|
|
16
|
+
// @swc/core@1.2.159 and before: cooked.value.
|
|
17
|
+
// @swc/core@1.2.160 and after: just cooked
|
|
18
|
+
lReturnValue =
|
|
19
|
+
pArguments[0].expression.quasis[0].cooked.value ||
|
|
20
|
+
pArguments[0].expression.quasis[0].cooked;
|
|
17
21
|
}
|
|
18
22
|
/* c8 ignore stop */
|
|
19
23
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable security/detect-object-injection */
|
|
2
|
-
const
|
|
3
|
-
const
|
|
2
|
+
const get = require("lodash/get");
|
|
3
|
+
const clone = require("lodash/clone");
|
|
4
|
+
const has = require("lodash/has");
|
|
4
5
|
const normalizeREProperties = require("../utl/normalize-re-properties");
|
|
5
6
|
const defaults = require("./defaults.js");
|
|
6
7
|
|
|
@@ -67,7 +68,12 @@ function normalizeCollapse(pCollapse) {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
function hasMetricsRule(pRule) {
|
|
70
|
-
|
|
71
|
+
// TODO: philosophy: is a rule with 'folder' in it a metrics rule?
|
|
72
|
+
// Or is it a misuse to ensure folder derivations (like cycles) get
|
|
73
|
+
// kicked off?
|
|
74
|
+
return (
|
|
75
|
+
has(pRule, "to.moreUnstable") || get(pRule, "scope", "module") === "folder"
|
|
76
|
+
);
|
|
71
77
|
}
|
|
72
78
|
|
|
73
79
|
function ruleSetHasMetricsRule(pRuleSet) {
|
|
@@ -107,7 +113,7 @@ function normalizeCruiseOptions(pOptions) {
|
|
|
107
113
|
|
|
108
114
|
lReturnValue.maxDepth = Number.parseInt(lReturnValue.maxDepth, 10);
|
|
109
115
|
lReturnValue.moduleSystems = uniq(lReturnValue.moduleSystems.sort());
|
|
110
|
-
if (
|
|
116
|
+
if (has(lReturnValue, "collapse")) {
|
|
111
117
|
lReturnValue.collapse = normalizeCollapse(lReturnValue.collapse);
|
|
112
118
|
}
|
|
113
119
|
// TODO: further down the execution path code still relies on .doNotFollow
|
|
@@ -133,9 +139,9 @@ function normalizeCruiseOptions(pOptions) {
|
|
|
133
139
|
}
|
|
134
140
|
|
|
135
141
|
function normalizeFormatOptions(pFormatOptions) {
|
|
136
|
-
const lFormatOptions =
|
|
142
|
+
const lFormatOptions = clone(pFormatOptions);
|
|
137
143
|
|
|
138
|
-
if (
|
|
144
|
+
if (has(lFormatOptions, "collapse")) {
|
|
139
145
|
lFormatOptions.collapse = normalizeCollapse(lFormatOptions.collapse);
|
|
140
146
|
}
|
|
141
147
|
return normalizeFilterOptions(lFormatOptions, [
|
package/src/meta.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/* generated - don't edit */
|
|
2
|
-
module.exports={"title":"dependency-cruiser output format","$schema":"http://json-schema.org/draft-07/schema#","$id":"https://dependency-cruiser.js.org/schema/cruise-result.schema.json","type":"object","required":["summary","modules"],"additionalProperties":false,"properties":{"modules":{"$ref":"#/definitions/ModulesType"},"folders":{"$ref":"#/definitions/FoldersType"},"summary":{"$ref":"#/definitions/SummaryType"}},"definitions":{"ModulesType":{"type":"array","items":{"$ref":"#/definitions/ModuleType"}},"ModuleType":{"type":"object","required":["source","dependencies","valid"],"additionalProperties":false,"properties":{"source":{"type":"string"},"valid":{"type":"boolean"},"dependencies":{"$ref":"#/definitions/DependenciesType"},"dependents":{"type":"array","items":{"type":"string"}},"followable":{"type":"boolean"},"matchesDoNotFollow":{"type":"boolean"},"matchesFocus":{"type":"boolean"},"coreModule":{"type":"boolean"},"couldNotResolve":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"license":{"type":"string"},"orphan":{"type":"boolean"},"reachable":{"type":"array","items":{"$ref":"#/definitions/ReachableType"}},"reaches":{"type":"array","items":{"$ref":"#/definitions/ReachesType"}},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}},"consolidated":{"type":"boolean"},"instability":{"type":"number"}}},"ReachableType":{"type":"object","required":["value","asDefinedInRule","matchedFrom"],"additionalProperties":false,"properties":{"value":{"type":"boolean"},"asDefinedInRule":{"type":"string"},"matchedFrom":{"type":"string"}}},"ReachesType":{"type":"object","required":["modules","asDefinedInRule"],"additionalProperties":false,"properties":{"modules":{"type":"array","items":{"type":"object","required":["source","via"],"additionalProperties":false,"properties":{"source":{"type":"string"},"via":{"type":"array","items":{"type":"string"}}}}},"asDefinedInRule":{"type":"string"}}},"DependenciesType":{"type":"array","items":{"$ref":"#/definitions/DependencyType"}},"DependencyType":{"type":"object","required":["circular","coreModule","couldNotResolve","dependencyTypes","exoticallyRequired","dynamic","followable","module","moduleSystem","resolved","valid"],"additionalProperties":false,"properties":{"module":{"type":"string"},"protocol":{"type":"string","enum":["data:","file:","node:"]},"mimeType":{"type":"string"},"resolved":{"type":"string"},"coreModule":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"license":{"type":"string"},"followable":{"type":"boolean"},"dynamic":{"type":"boolean"},"exoticallyRequired":{"type":"boolean"},"exoticRequire":{"type":"string"},"matchesDoNotFollow":{"type":"boolean"},"couldNotResolve":{"type":"boolean"},"preCompilationOnly":{"type":"boolean"},"typeOnly":{"type":"boolean"},"circular":{"type":"boolean"},"cycle":{"type":"array","items":{"type":"string"}},"moduleSystem":{"$ref":"#/definitions/ModuleSystemType"},"valid":{"type":"boolean"},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}},"instability":{"type":"number"}}},"DependencyTypeType":{"type":"string","enum":["aliased","core","deprecated","local","localmodule","npm","npm-bundled","npm-dev","npm-no-pkg","npm-optional","npm-peer","npm-unknown","undetermined","unknown","type-only"]},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"SeverityType":{"type":"string","enum":["error","warn","info","ignore"]},"FoldersType":{"type":"array","items":{"$ref":"#/definitions/FolderType"}},"FolderType":{"type":"object","required":["name","moduleCount"],"additionalProperties":false,"properties":{"name":{"type":"string"},"dependents":{"type":"array","items":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string"}}}},"dependencies":{"type":"array","items":{"type":"object","required":["name","valid"],"additionalProperties":false,"properties":{"name":{"type":"string"},"instability":{"type":"number"},"valid":{"type":"boolean"},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}}}}},"moduleCount":{"type":"number"},"afferentCouplings":{"type":"number"},"efferentCouplings":{"type":"number"},"instability":{"type":"number"}}},"SummaryType":{"type":"object","required":["violations","error","warn","info","totalCruised","optionsUsed"],"additionalProperties":false,"properties":{"violations":{"$ref":"#/definitions/ViolationsType"},"error":{"type":"number"},"warn":{"type":"number"},"info":{"type":"number"},"ignore":{"type":"number"},"totalCruised":{"type":"number"},"totalDependenciesCruised":{"type":"number"},"ruleSetUsed":{"$ref":"#/definitions/RuleSetType"},"optionsUsed":{"$ref":"#/definitions/OptionsUsedType"}}},"ViolationsType":{"type":"array","items":{"$ref":"#/definitions/ViolationType"}},"ViolationType":{"type":"object","required":["from","to","rule"],"additionalProperties":false,"properties":{"from":{"type":"string"},"to":{"type":"string"},"type":{"$ref":"#/definitions/ViolationTypeType"},"rule":{"$ref":"#/definitions/RuleSummaryType"},"cycle":{"type":"array","items":{"type":"string"}},"via":{"type":"array","items":{"type":"string"}},"metrics":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"from":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}},"to":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}}}},"comment":{"type":"string"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"RuleSetType":{"type":"object","additionalProperties":false,"properties":{"forbidden":{"type":"array","items":{"$ref":"#/definitions/ForbiddenRuleType"}},"allowed":{"type":"array","items":{"$ref":"#/definitions/AllowedRuleType"}},"allowedSeverity":{"$ref":"#/definitions/SeverityType"},"required":{"type":"array","items":{"$ref":"#/definitions/RequiredRuleType"}}}},"AllowedRuleType":{"oneOf":[{"$ref":"#/definitions/RegularAllowedRuleType"},{"$ref":"#/definitions/ReachabilityAllowedRuleType"}]},"RegularAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"from":{"$ref":"#/definitions/ReachabilityFromRestrictionType"},"to":{"$ref":"#/definitions/ReachabilityToRestrictionType"}}},"ForbiddenRuleType":{"oneOf":[{"$ref":"#/definitions/RegularForbiddenRuleType"},{"$ref":"#/definitions/ReachabilityForbiddenRuleType"},{"$ref":"#/definitions/DependentsForbiddenRuleType"}]},"RegularForbiddenRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"scope":{"type":"string","enum":["module","folder"]},"comment":{"type":"string"},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"DependentsForbiddenRuleType":{"type":"object","required":["module","from"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"module":{"$ref":"#/definitions/DependentsModuleRestrictionType"},"from":{"$ref":"#/definitions/DependentsFromRestrictionType"}}},"ReachabilityForbiddenRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"from":{"$ref":"#/definitions/ReachabilityFromRestrictionType"},"to":{"$ref":"#/definitions/ReachabilityToRestrictionType"}}},"RequiredRuleType":{"type":"object","required":["module","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"module":{"$ref":"#/definitions/RequiredModuleRestrictionType"},"to":{"$ref":"#/definitions/RequiredToRestrictionType"}}},"FromRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"orphan":{"type":"boolean"}}},"ReachabilityFromRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"ToRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"couldNotResolve":{"type":"boolean"},"circular":{"type":"boolean"},"dynamic":{"type":"boolean"},"exoticallyRequired":{"type":"boolean"},"exoticRequire":{"$ref":"#/definitions/REAsStringsType"},"exoticRequireNot":{"$ref":"#/definitions/REAsStringsType"},"preCompilationOnly":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"dependencyTypesNot":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"moreThanOneDependencyType":{"type":"boolean"},"license":{"$ref":"#/definitions/REAsStringsType"},"licenseNot":{"$ref":"#/definitions/REAsStringsType"},"via":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"moreUnstable":{"type":"boolean"}}},"DependentsModuleRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"numberOfDependentsLessThan":{"type":"integer","minimum":0,"maximum":100},"numberOfDependentsMoreThan":{"type":"integer","minimum":0,"maximum":100}}},"DependentsFromRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"ReachabilityToRestrictionType":{"required":["reachable"],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"reachable":{"type":"boolean"}}},"RequiredModuleRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"RequiredToRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"REAsStringsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"OptionsUsedType":{"type":"object","additionalProperties":false,"properties":{"doNotFollow":{"$ref":"#/definitions/CompoundDoNotFollowType"},"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundIncludeOnlyType"}]},"focus":{"$ref":"#/definitions/CompoundFocusType"},"knownViolations":{"$ref":"#/definitions/ViolationsType"},"collapse":{"type":"string"},"maxDepth":{"type":"integer","minimum":0,"maximum":99},"moduleSystems":{"$ref":"#/definitions/ModuleSystemsType"},"prefix":{"type":"string"},"preserveSymlinks":{"type":"boolean"},"combinedDependencies":{"type":"boolean"},"tsConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"tsPreCompilationDeps":{"oneOf":[{"type":"boolean"},{"type":"string","enum":["specify"]}]},"extraExtensionsToScan":{"type":"array","items":{"type":"string"}},"externalModuleResolutionStrategy":{"type":"string","enum":["node_modules","yarn-pnp"]},"forceDeriveDependents":{"type":"boolean"},"webpackConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"},"env":{"oneOf":[{"type":"object"},{"type":"string"}]},"arguments":{"type":"object"}}},"enhancedResolveOptions":{"type":"object","additionalProperties":false,"properties":{"exportsFields":{"type":"array","items":{"type":"string"}},"conditionNames":{"type":"array","items":{"type":"string"}},"extensions":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","none"]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics"]},{"type":"string","pattern":"^plugin:[^:]+$"}]},"CompoundExcludeType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dynamic":{"type":"boolean"}}},"CompoundDoNotFollowType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}}}},"CompoundIncludeOnlyType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundFocusType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"ReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"anon":{"$ref":"#/definitions/AnonReporterOptionsType"},"archi":{"$ref":"#/definitions/DotReporterOptionsType"},"dot":{"$ref":"#/definitions/DotReporterOptionsType"},"ddot":{"$ref":"#/definitions/DotReporterOptionsType"},"flat":{"$ref":"#/definitions/DotReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"}}},"AnonReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"wordlist":{"type":"array","items":{"type":"string"}}}},"MetricsReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"orderBy":{"type":"string","enum":["instability","moduleCount","afferentCouplings","efferentCouplings","name"]},"hideModules":{"type":"boolean"},"hideFolders":{"type":"boolean"}}},"DotReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"collapsePattern":{"$ref":"#/definitions/REAsStringsType"},"filters":{"$ref":"#/definitions/ReporterFiltersType"},"showMetrics":{"type":"boolean"},"theme":{"$ref":"#/definitions/DotThemeType"}}},"DotThemeType":{"type":"object","additionalProperties":false,"properties":{"replace":{"type":"boolean"},"graph":{"type":"object"},"node":{"type":"object"},"edge":{"type":"object"},"modules":{"$ref":"#/definitions/DotThemeArrayType"},"dependencies":{"$ref":"#/definitions/DotThemeArrayType"}}},"DotThemeArrayType":{"type":"array","items":{"$ref":"#/definitions/DotThemeEntryType"}},"DotThemeEntryType":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object"},"attributes":{"type":"object"}}},"ReporterFiltersType":{"type":"object","additionalProperties":false,"properties":{"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"$ref":"#/definitions/CompoundIncludeOnlyType"},"focus":{"$ref":"#/definitions/CompoundFocusType"}}}}}
|
|
2
|
+
module.exports={"title":"dependency-cruiser output format","$schema":"http://json-schema.org/draft-07/schema#","$id":"https://dependency-cruiser.js.org/schema/cruise-result.schema.json","type":"object","required":["summary","modules"],"additionalProperties":false,"properties":{"modules":{"$ref":"#/definitions/ModulesType"},"folders":{"$ref":"#/definitions/FoldersType"},"summary":{"$ref":"#/definitions/SummaryType"}},"definitions":{"ModulesType":{"type":"array","items":{"$ref":"#/definitions/ModuleType"}},"ModuleType":{"type":"object","required":["source","dependencies","valid"],"additionalProperties":false,"properties":{"source":{"type":"string"},"valid":{"type":"boolean"},"dependencies":{"$ref":"#/definitions/DependenciesType"},"dependents":{"type":"array","items":{"type":"string"}},"followable":{"type":"boolean"},"matchesDoNotFollow":{"type":"boolean"},"matchesFocus":{"type":"boolean"},"coreModule":{"type":"boolean"},"couldNotResolve":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"license":{"type":"string"},"orphan":{"type":"boolean"},"reachable":{"type":"array","items":{"$ref":"#/definitions/ReachableType"}},"reaches":{"type":"array","items":{"$ref":"#/definitions/ReachesType"}},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}},"consolidated":{"type":"boolean"},"instability":{"type":"number"}}},"ReachableType":{"type":"object","required":["value","asDefinedInRule","matchedFrom"],"additionalProperties":false,"properties":{"value":{"type":"boolean"},"asDefinedInRule":{"type":"string"},"matchedFrom":{"type":"string"}}},"ReachesType":{"type":"object","required":["modules","asDefinedInRule"],"additionalProperties":false,"properties":{"modules":{"type":"array","items":{"type":"object","required":["source","via"],"additionalProperties":false,"properties":{"source":{"type":"string"},"via":{"type":"array","items":{"type":"string"}}}}},"asDefinedInRule":{"type":"string"}}},"DependenciesType":{"type":"array","items":{"$ref":"#/definitions/DependencyType"}},"DependencyType":{"type":"object","required":["circular","coreModule","couldNotResolve","dependencyTypes","exoticallyRequired","dynamic","followable","module","moduleSystem","resolved","valid"],"additionalProperties":false,"properties":{"module":{"type":"string"},"protocol":{"type":"string","enum":["data:","file:","node:"]},"mimeType":{"type":"string"},"resolved":{"type":"string"},"coreModule":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"license":{"type":"string"},"followable":{"type":"boolean"},"dynamic":{"type":"boolean"},"exoticallyRequired":{"type":"boolean"},"exoticRequire":{"type":"string"},"matchesDoNotFollow":{"type":"boolean"},"couldNotResolve":{"type":"boolean"},"preCompilationOnly":{"type":"boolean"},"typeOnly":{"type":"boolean"},"circular":{"type":"boolean"},"cycle":{"type":"array","items":{"type":"string"}},"moduleSystem":{"$ref":"#/definitions/ModuleSystemType"},"valid":{"type":"boolean"},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}},"instability":{"type":"number"}}},"DependencyTypeType":{"type":"string","enum":["aliased","core","deprecated","local","localmodule","npm","npm-bundled","npm-dev","npm-no-pkg","npm-optional","npm-peer","npm-unknown","undetermined","unknown","type-only"]},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"SeverityType":{"type":"string","enum":["error","warn","info","ignore"]},"FoldersType":{"type":"array","items":{"$ref":"#/definitions/FolderType"}},"FolderType":{"type":"object","required":["name","moduleCount"],"additionalProperties":false,"properties":{"name":{"type":"string"},"dependents":{"type":"array","items":{"type":"object","required":["name"],"additionalProperties":false,"properties":{"name":{"type":"string"}}}},"dependencies":{"type":"array","items":{"type":"object","required":["name","valid","circular"],"additionalProperties":false,"properties":{"name":{"type":"string"},"instability":{"type":"number"},"valid":{"type":"boolean"},"circular":{"type":"boolean"},"cycle":{"type":"array","items":{"type":"string"}},"rules":{"type":"array","items":{"$ref":"#/definitions/RuleSummaryType"}}}}},"moduleCount":{"type":"number"},"afferentCouplings":{"type":"number"},"efferentCouplings":{"type":"number"},"instability":{"type":"number"}}},"SummaryType":{"type":"object","required":["violations","error","warn","info","totalCruised","optionsUsed"],"additionalProperties":false,"properties":{"violations":{"$ref":"#/definitions/ViolationsType"},"error":{"type":"number"},"warn":{"type":"number"},"info":{"type":"number"},"ignore":{"type":"number"},"totalCruised":{"type":"number"},"totalDependenciesCruised":{"type":"number"},"ruleSetUsed":{"$ref":"#/definitions/RuleSetType"},"optionsUsed":{"$ref":"#/definitions/OptionsUsedType"}}},"ViolationsType":{"type":"array","items":{"$ref":"#/definitions/ViolationType"}},"ViolationType":{"type":"object","required":["from","to","rule"],"additionalProperties":false,"properties":{"from":{"type":"string"},"to":{"type":"string"},"type":{"$ref":"#/definitions/ViolationTypeType"},"rule":{"$ref":"#/definitions/RuleSummaryType"},"cycle":{"type":"array","items":{"type":"string"}},"via":{"type":"array","items":{"type":"string"}},"metrics":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"from":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}},"to":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}}}},"comment":{"type":"string"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"RuleSetType":{"type":"object","additionalProperties":false,"properties":{"forbidden":{"type":"array","items":{"$ref":"#/definitions/ForbiddenRuleType"}},"allowed":{"type":"array","items":{"$ref":"#/definitions/AllowedRuleType"}},"allowedSeverity":{"$ref":"#/definitions/SeverityType"},"required":{"type":"array","items":{"$ref":"#/definitions/RequiredRuleType"}}}},"AllowedRuleType":{"oneOf":[{"$ref":"#/definitions/RegularAllowedRuleType"},{"$ref":"#/definitions/ReachabilityAllowedRuleType"}]},"RegularAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"from":{"$ref":"#/definitions/ReachabilityFromRestrictionType"},"to":{"$ref":"#/definitions/ReachabilityToRestrictionType"}}},"ForbiddenRuleType":{"oneOf":[{"$ref":"#/definitions/RegularForbiddenRuleType"},{"$ref":"#/definitions/ReachabilityForbiddenRuleType"},{"$ref":"#/definitions/DependentsForbiddenRuleType"}]},"RegularForbiddenRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"scope":{"type":"string","enum":["module","folder"]},"comment":{"type":"string"},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"DependentsForbiddenRuleType":{"type":"object","required":["module","from"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"module":{"$ref":"#/definitions/DependentsModuleRestrictionType"},"from":{"$ref":"#/definitions/DependentsFromRestrictionType"}}},"ReachabilityForbiddenRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"from":{"$ref":"#/definitions/ReachabilityFromRestrictionType"},"to":{"$ref":"#/definitions/ReachabilityToRestrictionType"}}},"RequiredRuleType":{"type":"object","required":["module","to"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"},"comment":{"type":"string"},"module":{"$ref":"#/definitions/RequiredModuleRestrictionType"},"to":{"$ref":"#/definitions/RequiredToRestrictionType"}}},"FromRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"orphan":{"type":"boolean"}}},"ReachabilityFromRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"ToRestrictionType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"couldNotResolve":{"type":"boolean"},"circular":{"type":"boolean"},"dynamic":{"type":"boolean"},"exoticallyRequired":{"type":"boolean"},"exoticRequire":{"$ref":"#/definitions/REAsStringsType"},"exoticRequireNot":{"$ref":"#/definitions/REAsStringsType"},"preCompilationOnly":{"type":"boolean"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"dependencyTypesNot":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}},"moreThanOneDependencyType":{"type":"boolean"},"license":{"$ref":"#/definitions/REAsStringsType"},"licenseNot":{"$ref":"#/definitions/REAsStringsType"},"via":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"moreUnstable":{"type":"boolean"}}},"DependentsModuleRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"numberOfDependentsLessThan":{"type":"integer","minimum":0,"maximum":100},"numberOfDependentsMoreThan":{"type":"integer","minimum":0,"maximum":100}}},"DependentsFromRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"ReachabilityToRestrictionType":{"required":["reachable"],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"},"reachable":{"type":"boolean"}}},"RequiredModuleRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"pathNot":{"$ref":"#/definitions/REAsStringsType"}}},"RequiredToRestrictionType":{"required":[],"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"REAsStringsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"OptionsUsedType":{"type":"object","additionalProperties":false,"properties":{"doNotFollow":{"$ref":"#/definitions/CompoundDoNotFollowType"},"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundIncludeOnlyType"}]},"focus":{"$ref":"#/definitions/CompoundFocusType"},"knownViolations":{"$ref":"#/definitions/ViolationsType"},"collapse":{"type":"string"},"maxDepth":{"type":"integer","minimum":0,"maximum":99},"moduleSystems":{"$ref":"#/definitions/ModuleSystemsType"},"prefix":{"type":"string"},"preserveSymlinks":{"type":"boolean"},"combinedDependencies":{"type":"boolean"},"tsConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"tsPreCompilationDeps":{"oneOf":[{"type":"boolean"},{"type":"string","enum":["specify"]}]},"extraExtensionsToScan":{"type":"array","items":{"type":"string"}},"externalModuleResolutionStrategy":{"type":"string","enum":["node_modules","yarn-pnp"]},"forceDeriveDependents":{"type":"boolean"},"webpackConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"},"env":{"oneOf":[{"type":"object"},{"type":"string"}]},"arguments":{"type":"object"}}},"enhancedResolveOptions":{"type":"object","additionalProperties":false,"properties":{"exportsFields":{"type":"array","items":{"type":"string"}},"conditionNames":{"type":"array","items":{"type":"string"}},"extensions":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","none"]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics"]},{"type":"string","pattern":"^plugin:[^:]+$"}]},"CompoundExcludeType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dynamic":{"type":"boolean"}}},"CompoundDoNotFollowType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}}}},"CompoundIncludeOnlyType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundFocusType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"ReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"anon":{"$ref":"#/definitions/AnonReporterOptionsType"},"archi":{"$ref":"#/definitions/DotReporterOptionsType"},"dot":{"$ref":"#/definitions/DotReporterOptionsType"},"ddot":{"$ref":"#/definitions/DotReporterOptionsType"},"flat":{"$ref":"#/definitions/DotReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"}}},"AnonReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"wordlist":{"type":"array","items":{"type":"string"}}}},"MetricsReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"orderBy":{"type":"string","enum":["instability","moduleCount","afferentCouplings","efferentCouplings","name"]},"hideModules":{"type":"boolean"},"hideFolders":{"type":"boolean"}}},"DotReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"collapsePattern":{"$ref":"#/definitions/REAsStringsType"},"filters":{"$ref":"#/definitions/ReporterFiltersType"},"showMetrics":{"type":"boolean"},"theme":{"$ref":"#/definitions/DotThemeType"}}},"DotThemeType":{"type":"object","additionalProperties":false,"properties":{"replace":{"type":"boolean"},"graph":{"type":"object"},"node":{"type":"object"},"edge":{"type":"object"},"modules":{"$ref":"#/definitions/DotThemeArrayType"},"dependencies":{"$ref":"#/definitions/DotThemeArrayType"}}},"DotThemeArrayType":{"type":"array","items":{"$ref":"#/definitions/DotThemeEntryType"}},"DotThemeEntryType":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object"},"attributes":{"type":"object"}}},"ReporterFiltersType":{"type":"object","additionalProperties":false,"properties":{"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"$ref":"#/definitions/CompoundIncludeOnlyType"},"focus":{"$ref":"#/definitions/CompoundFocusType"}}}}}
|
|
@@ -5,9 +5,8 @@ function match(pFromFolder, pToFolder) {
|
|
|
5
5
|
return (pRule) =>
|
|
6
6
|
// TODO: add path rules - they need to be frippled from the ones
|
|
7
7
|
// already in place for modules
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
matchers.toIsMoreUnstable(pRule, pFromFolder, pToFolder);
|
|
8
|
+
matchers.toIsMoreUnstable(pRule, pFromFolder, pToFolder) &&
|
|
9
|
+
matchers.propertyEquals(pRule, pToFolder, "circular");
|
|
11
10
|
}
|
|
12
11
|
|
|
13
12
|
const isInteresting = (pRule) =>
|
package/types/cruise-result.d.ts
CHANGED
|
@@ -383,7 +383,38 @@ export interface IFolder {
|
|
|
383
383
|
/**
|
|
384
384
|
* List of folders this folder depends upon
|
|
385
385
|
*/
|
|
386
|
-
dependencies?: {
|
|
386
|
+
dependencies?: {
|
|
387
|
+
/**
|
|
388
|
+
* the (resolved) name of the dependency
|
|
389
|
+
*/
|
|
390
|
+
name: string;
|
|
391
|
+
/**
|
|
392
|
+
* 'true' if this folder dependency violated a rule; 'false' in all other
|
|
393
|
+
* cases. The violated rule will be in the 'rules' object at the same level.
|
|
394
|
+
*/
|
|
395
|
+
valid: boolean;
|
|
396
|
+
/**
|
|
397
|
+
* the instability of the dependency (denormalized - this is a duplicate of
|
|
398
|
+
* the one found in the instability of the folder with the same name)
|
|
399
|
+
*/
|
|
400
|
+
instability?: number;
|
|
401
|
+
/**
|
|
402
|
+
* 'true' if following this dependency will ultimately return to the source, false in all
|
|
403
|
+
* other cases
|
|
404
|
+
*/
|
|
405
|
+
circular: boolean;
|
|
406
|
+
/**
|
|
407
|
+
* If following this dependency will ultimately return to the source (circular === true),
|
|
408
|
+
* this attribute will contain an (ordered) array of module names that shows (one of) the
|
|
409
|
+
* circular path(s)
|
|
410
|
+
*/
|
|
411
|
+
cycle?: string[];
|
|
412
|
+
/**
|
|
413
|
+
* an array of rules violated by this dependency - left out if the dependency
|
|
414
|
+
* is valid
|
|
415
|
+
*/
|
|
416
|
+
rules?: IRuleSummary[];
|
|
417
|
+
}[];
|
|
387
418
|
/**
|
|
388
419
|
* The total number of modules detected in this folder and its sub-folders
|
|
389
420
|
*/
|