dependency-cruiser 12.5.1 → 12.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,17 +30,25 @@ npx depcruise --init
30
30
  ```
31
31
 
32
32
  This will look around in your environment a bit, ask you some questions and create
33
- a `.dependency-cruiser.js` configuration file attuned to your project[^1].
33
+ a `.dependency-cruiser.js` configuration file attuned to your project[^1][^2].
34
34
 
35
35
  [^1]:
36
36
  We're using `npx` in the example scripts for convenience. When you use the
37
37
  commands in a script in `package.json` it's not necessary to prefix them with
38
38
  `npx`.
39
39
 
40
+ [^2]:
41
+ If you don't don't want to use `npx`, but instead `pnpx` (from the `pnpm`
42
+ package manager) or `yarn` - please refer to that tool's documentation.
43
+ Particularly `pnpx` has semantics that differ from `npx` quite significantly
44
+ and that you want to be aware of before using it. In the mean time: `npx`
45
+ _should_ work even when you installed the dependency with a package manager
46
+ different from `npm`.
47
+
40
48
  ### Show stuff to your grandma
41
49
 
42
50
  To create a graph of the dependencies in your src folder, you'd run dependency
43
- cruiser with output type `dot` and run _GraphViz dot_[^2] on the result. In
51
+ cruiser with output type `dot` and run _GraphViz dot_[^3] on the result. In
44
52
  a one liner:
45
53
 
46
54
  ```shell
@@ -55,7 +63,7 @@ npx depcruise src --include-only "^src" --config --output-type dot | dot -T svg
55
63
  we've [got her covered](./doc/cli.md#--output-type-specify-the-output-format)
56
64
  as well.
57
65
 
58
- [^2]:
66
+ [^3]:
59
67
  This assumes the GraphViz `dot` command is available - on most linux and
60
68
  comparable systems this will be. In case it's not, see
61
69
  [GraphViz' download page](https://www.graphviz.org/download/) for instructions
@@ -88,6 +88,7 @@ try {
88
88
  "-p, --progress [type]",
89
89
  "show progress while dependency-cruiser is busy. Possible values: cli-feedback, performance-log, none"
90
90
  )
91
+ .option("--no-progress", "Alias of --progress none")
91
92
  .option(
92
93
  "-d, --max-depth <n>",
93
94
  "You probably want to use --collapse instead of --max-depth. " +
@@ -111,6 +112,11 @@ try {
111
112
  "(experimental) strategy to use for detecting changed files in the cache. " +
112
113
  "Possible values: metadata (= use git, the default), content"
113
114
  )
115
+ .option(
116
+ "--no-cache",
117
+ "switch off caching. Overrides the 'cache' key in .dependency-cruiser.js " +
118
+ "and --cache options set earlier on the command line"
119
+ )
114
120
  .option("--preserve-symlinks", `leave symlinks unchanged (off by default)`)
115
121
  .option("-v, --validate [file]", `alias for --config`)
116
122
  .option(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dependency-cruiser",
3
- "version": "12.5.1",
3
+ "version": "12.7.0",
4
4
  "description": "Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.",
5
5
  "keywords": [
6
6
  "static analysis",
@@ -122,7 +122,7 @@
122
122
  "test:i": "LANG=en_US.UTF-8 mocha --grep \"^\\[[I]\\]\"",
123
123
  "test:u": "LANG=en_US.UTF-8 mocha --grep \"^\\[[U]\\]\"",
124
124
  "test:e": "LANG=en_US.UTF-8 mocha --grep \"^\\[[E]\\]\"",
125
- "test:cover": "LANG=en_US.UTF-8 c8 --check-coverage --statements 99.9 --branches 99.7 --functions 100 --lines 99.9 --exclude \"{bin,configs/*.js,configs/rules,configs/plugins/3d-*.js,configs/plugins/stats-*.js,doc,docs,coverage,test,tools,webpack.conf.js,tmp*,src/**/*.template.js,src/cli/tools/svg-in-html-snippets/script.snippet.js,src/cli/init-config/get-user-input.js,src/cli/listeners/*/index.js,src/cli/listeners/cli-feedback.js}\" --reporter text-summary --reporter html --reporter json-summary mocha",
125
+ "test:cover": "LANG=en_US.UTF-8 c8 --check-coverage --statements 99.9 --branches 99.7 --functions 100 --lines 99.9 --exclude \"{bin,configs/*.js,configs/rules,configs/plugins/3d-*.js,configs/plugins/stats-*.js,doc,docs,coverage,test,tools,webpack.conf.js,tmp*,src/**/*.template.js,src/cli/tools/svg-in-html-snippets/script.snippet.js,src/cli/init-config/get-user-input.js,src/cli/listeners/*/index.js,src/cli/listeners/{cli-feedback,ndjson}.js}\" --reporter text-summary --reporter html --reporter json-summary mocha",
126
126
  "test:glob": "set -f && test \"`bin/dependency-cruise.js test/extract/__mocks__/gather-globbing/packages/**/src/**/*.js | grep \"no dependency violations found\"`\" = \"✔ no dependency violations found (6 modules, 0 dependencies cruised)\"",
127
127
  "test:yarn-pnp": "npm-run-all test:yarn-pnp:cleanup test:yarn-pnp:pack test:yarn-pnp:copy test:yarn-pnp:install test:yarn-pnp:version test:yarn-pnp:run test:yarn-pnp:test test:yarn-pnp:cleanup",
128
128
  "test:yarn-pnp:pack": "npm pack",
@@ -132,8 +132,8 @@
132
132
  "test:yarn-pnp:run": "cd test/integration/yarn-pnp.testing-ground && yarn dependency-cruise:json",
133
133
  "test:yarn-pnp:test": "cd test/integration/yarn-pnp.testing-ground && yarn test",
134
134
  "test:yarn-pnp:cleanup": "shx rm -rf test/integration/yarn-pnp.testing-ground dependency-cruiser*.tgz",
135
- "test:load": "hyperfine --warmup 3 --runs 30 \"bin/dependency-cruise.js --ignore-known --validate -- src bin test configs types tools\"",
136
- "test:load:short": "hyperfine --warmup 1 --runs 5 \"bin/dependency-cruise.js --ignore-known --validate -- src bin test configs types tools\"",
135
+ "test:load": "hyperfine --warmup 3 --runs 30 \"bin/dependency-cruise.js src bin test configs types tools --ignore-known --validate --no-cache --no-progress\"",
136
+ "test:load:short": "hyperfine --warmup 1 --runs 5 \"bin/dependency-cruise.js src bin test configs types tools --ignore-known --validate --no-cache --no-progress\"",
137
137
  "test:watch": "mocha --watch --watch-extensions=json --reporter=min test/\\*\\*/\\*.spec.js",
138
138
  "update-dependencies": "npm-run-all upem:update upem:install build:clean build lint:fix depcruise test:cover",
139
139
  "upem-outdated": "npm outdated --json --long | upem --dry-run",
@@ -142,7 +142,7 @@
142
142
  "version": "npm-run-all build depcruise:graph:doc scm:stage"
143
143
  },
144
144
  "dependencies": {
145
- "acorn": "8.8.1",
145
+ "acorn": "8.8.2",
146
146
  "acorn-jsx": "5.3.2",
147
147
  "acorn-jsx-walk": "2.0.0",
148
148
  "acorn-loose": "8.3.0",
@@ -168,25 +168,25 @@
168
168
  "semver-try-require": "6.0.0",
169
169
  "teamcity-service-messages": "0.1.14",
170
170
  "tsconfig-paths-webpack-plugin": "4.0.0",
171
- "watskeburt": "0.9.0",
171
+ "watskeburt": "0.9.1",
172
172
  "wrap-ansi": "^7.0.0"
173
173
  },
174
174
  "devDependencies": {
175
175
  "@babel/core": "7.20.12",
176
176
  "@babel/plugin-transform-modules-commonjs": "7.20.11",
177
177
  "@babel/preset-typescript": "7.18.6",
178
- "@swc/core": "1.3.27",
178
+ "@swc/core": "1.3.31",
179
179
  "@types/lodash": "4.14.191",
180
180
  "@types/node": "18.11.18",
181
181
  "@types/prompts": "2.4.2",
182
- "@typescript-eslint/eslint-plugin": "5.48.2",
183
- "@typescript-eslint/parser": "5.48.2",
182
+ "@typescript-eslint/eslint-plugin": "5.50.0",
183
+ "@typescript-eslint/parser": "5.50.0",
184
184
  "@vue/compiler-sfc": "3.2.45",
185
185
  "c8": "7.12.0",
186
186
  "chai": "4.3.7",
187
187
  "chai-json-schema": "1.5.1",
188
188
  "coffeescript": "2.7.0",
189
- "eslint": "8.32.0",
189
+ "eslint": "8.33.0",
190
190
  "eslint-config-moving-meadow": "4.0.2",
191
191
  "eslint-config-prettier": "8.6.0",
192
192
  "eslint-plugin-budapestian": "5.0.1",
@@ -194,7 +194,7 @@
194
194
  "eslint-plugin-import": "2.27.5",
195
195
  "eslint-plugin-mocha": "10.1.0",
196
196
  "eslint-plugin-node": "11.1.0",
197
- "eslint-plugin-security": "1.6.0",
197
+ "eslint-plugin-security": "1.7.0",
198
198
  "eslint-plugin-unicorn": "^45.0.0",
199
199
  "husky": "8.0.3",
200
200
  "intercept-stdout": "0.1.2",
@@ -207,7 +207,7 @@
207
207
  "shx": "0.3.4",
208
208
  "svelte": "3.55.1",
209
209
  "symlink-dir": "5.1.0",
210
- "typescript": "4.9.4",
210
+ "typescript": "4.9.5",
211
211
  "upem": "7.3.1",
212
212
  "vue-template-compiler": "2.7.14",
213
213
  "yarn": "1.22.19"
package/src/cli/index.js CHANGED
@@ -19,6 +19,7 @@ const io = require("./utl/io");
19
19
  const formatMetaInfo = require("./format-meta-info");
20
20
  const setUpCliFeedbackListener = require("./listeners/cli-feedback");
21
21
  const setUpPerformanceLogListener = require("./listeners/performance-log");
22
+ const setUpNDJSONListener = require("./listeners/ndjson");
22
23
 
23
24
  function extractResolveOptions(pCruiseOptions) {
24
25
  let lResolveOptions = {};
@@ -78,6 +79,7 @@ function setUpListener(pCruiseOptions) {
78
79
  const lString2Listener = {
79
80
  "cli-feedback": setUpCliFeedbackListener,
80
81
  "performance-log": setUpPerformanceLogListener,
82
+ ndjson: setUpNDJSONListener,
81
83
  };
82
84
  const lListenerID =
83
85
  pCruiseOptions?.progress ??
@@ -162,7 +164,7 @@ module.exports = function executeCli(pFileDirectoryArray, pCruiseOptions) {
162
164
  // (the start-up) of cruises by that same amount. We've since replaced
163
165
  // inquirer with 'prompts' (which is much smaller), but the same reasoning
164
166
  // holds.
165
- // eslint-disable-next-line node/global-require
167
+ // eslint-disable-next-line node/global-require, import/max-dependencies
166
168
  const initConfig = require("./init-config");
167
169
  initConfig(lCruiseOptions.init);
168
170
  } else {
@@ -0,0 +1,90 @@
1
+ const { EOL } = require("os");
2
+ const busLogLevels = require("../../utl/bus-log-levels");
3
+
4
+ const MICRO_SECONDS_PER_SECOND = 1000000;
5
+
6
+ function formatPerfLine({
7
+ runStartTime,
8
+ message,
9
+ time,
10
+ elapsedTime,
11
+ elapsedUser,
12
+ elapsedSystem,
13
+ rss,
14
+ heapUsed,
15
+ heapTotal,
16
+ external,
17
+ }) {
18
+ return (
19
+ JSON.stringify({
20
+ runStartTime,
21
+ message,
22
+ time: Math.round(time * MICRO_SECONDS_PER_SECOND),
23
+ elapsedTime: Math.round(elapsedTime * MICRO_SECONDS_PER_SECOND),
24
+ elapsedUser,
25
+ elapsedSystem,
26
+ rss,
27
+ heapUsed,
28
+ heapTotal,
29
+ external,
30
+ }) + EOL
31
+ );
32
+ }
33
+
34
+ function getProgressLine(pMessage, pState, pLevel, pMaxLevel) {
35
+ let lReturnValue = "";
36
+
37
+ if (pLevel <= pMaxLevel) {
38
+ const lTime = process.uptime();
39
+ const { user, system } = process.cpuUsage();
40
+ const { rss, heapTotal, heapUsed, external } = process.memoryUsage();
41
+ const lStats = {
42
+ runStartTime: pState.runStartTime,
43
+ message: pState.previousMessage,
44
+ time: lTime,
45
+ elapsedTime: lTime - pState.previousTime,
46
+ elapsedUser: user - pState.previousUserUsage,
47
+ elapsedSystem: system - pState.previousSystemUsage,
48
+ rss,
49
+ heapUsed,
50
+ heapTotal,
51
+ external,
52
+ };
53
+
54
+ pState.previousMessage = pMessage;
55
+ pState.previousTime = lTime;
56
+ pState.previousUserUsage = user;
57
+ pState.previousSystemUsage = system;
58
+
59
+ lReturnValue = formatPerfLine(lStats);
60
+ }
61
+ return lReturnValue;
62
+ }
63
+
64
+ function getProgressWriter(pStream, pState, pMaxLevel) {
65
+ return (pMessage, pOptions) => {
66
+ const lOptions = { level: busLogLevels.SUMMARY, ...(pOptions || {}) };
67
+
68
+ pStream.write(getProgressLine(pMessage, pState, lOptions.level, pMaxLevel));
69
+ };
70
+ }
71
+
72
+ module.exports = function setUpNDJSONListener(
73
+ pEventEmitter,
74
+ pMaxLevel = busLogLevels.INFO,
75
+ pStream = process.stderr
76
+ ) {
77
+ let lState = {
78
+ runStartTime: new Date(Date.now()).toISOString(),
79
+ previousMessage: "start of node process",
80
+ previousTime: 0,
81
+ previousUserUsage: 0,
82
+ previousSystemUsage: 0,
83
+ };
84
+
85
+ pEventEmitter.on("progress", getProgressWriter(pStream, lState, pMaxLevel));
86
+
87
+ pEventEmitter.on("end", () => {
88
+ pStream.end();
89
+ });
90
+ };
@@ -2,7 +2,7 @@ const chalk = require("chalk");
2
2
 
3
3
  const MS_PER_SECOND = 1000;
4
4
  const MS_PER_MICRO_SECOND = 0.001;
5
- const MAX_LENGTH_EXPECTED = 12;
5
+ const MAX_EXPECTED_LENGTH = 13;
6
6
  const NUMBER_OF_COLUMNS = 8;
7
7
  const K = 1024;
8
8
  /*
@@ -28,7 +28,11 @@ const gSizeFormat = new Intl.NumberFormat(LOCALE, {
28
28
  maximumFractionDigits: 0,
29
29
  }).format;
30
30
 
31
- const pad = (pString) => pString.padStart(MAX_LENGTH_EXPECTED).concat(" ");
31
+ const pad = (pString) => pString.padStart(MAX_EXPECTED_LENGTH).concat(" ");
32
+
33
+ function formatDividerLine() {
34
+ return `${`${"-".repeat(MAX_EXPECTED_LENGTH)} `.repeat(NUMBER_OF_COLUMNS)}\n`;
35
+ }
32
36
 
33
37
  function formatHeader() {
34
38
  return chalk
@@ -43,19 +47,17 @@ function formatHeader() {
43
47
  pad("∆ external")
44
48
  }after step...\n`
45
49
  )
46
- .concat(
47
- `${`${"-".repeat(MAX_LENGTH_EXPECTED)} `.repeat(NUMBER_OF_COLUMNS)}\n`
48
- );
50
+ .concat(formatDividerLine());
49
51
  }
50
52
 
51
53
  function formatTime(pNumber, pConversionMultiplier = MS_PER_SECOND) {
52
54
  return gTimeFormat(pConversionMultiplier * pNumber)
53
- .padStart(MAX_LENGTH_EXPECTED)
55
+ .padStart(MAX_EXPECTED_LENGTH)
54
56
  .concat(" ");
55
57
  }
56
58
 
57
59
  function formatMemory(pBytes) {
58
- const lReturnValue = gSizeFormat(pBytes / K).padStart(MAX_LENGTH_EXPECTED);
60
+ const lReturnValue = gSizeFormat(pBytes / K).padStart(MAX_EXPECTED_LENGTH);
59
61
 
60
62
  return (pBytes < 0 ? chalk.blue(lReturnValue) : lReturnValue).concat(" ");
61
63
  }
@@ -87,4 +89,5 @@ module.exports = {
87
89
  formatMemory,
88
90
  formatPerfLine,
89
91
  formatHeader,
92
+ formatDividerLine,
90
93
  };
@@ -1,8 +1,7 @@
1
1
  const {
2
- formatTime,
3
2
  formatPerfLine,
4
3
  formatHeader,
5
- formatMemory,
4
+ formatDividerLine,
6
5
  } = require("./format-helpers");
7
6
 
8
7
  function getHeader(pLevel, pMaxLevel) {
@@ -47,11 +46,24 @@ function getProgressLine(pMessage, pState, pLevel, pMaxLevel) {
47
46
  function getEndText(pState, pLevel, pMaxLevel) {
48
47
  if (pLevel <= pMaxLevel) {
49
48
  const lTime = process.uptime();
50
- const { heapUsed } = process.memoryUsage();
51
- pState.previousMessage = `really done (${formatTime(
52
- lTime
53
- ).trim()}, ${formatMemory(heapUsed).trim()})`;
54
- return getProgressLine("", pState, pLevel, pMaxLevel);
49
+ const { user, system } = process.cpuUsage();
50
+ const { heapUsed, heapTotal, external, rss } = process.memoryUsage();
51
+ pState.previousMessage = "really done";
52
+
53
+ return (
54
+ getProgressLine("", pState, pLevel, pMaxLevel) +
55
+ formatDividerLine() +
56
+ formatPerfLine({
57
+ elapsedTime: lTime,
58
+ elapsedUser: user,
59
+ elapsedSystem: system,
60
+ deltaRss: rss,
61
+ deltaHeapUsed: heapUsed,
62
+ deltaHeapTotal: heapTotal,
63
+ deltaExternal: external,
64
+ message: "",
65
+ })
66
+ );
55
67
  }
56
68
  return "";
57
69
  }
@@ -1,20 +1,20 @@
1
1
  /* eslint-disable security/detect-object-injection */
2
- const getCycle = require("./get-cycle");
3
2
 
4
3
  function addCircularityCheckToDependency(
5
- pGraph,
4
+ pIndexedGraph,
6
5
  pFrom,
7
6
  pToDep,
8
- { pDependencyName, pFindNodeByName }
7
+ pDependencyName
9
8
  ) {
10
9
  let lReturnValue = {
11
10
  ...pToDep,
12
11
  circular: false,
13
12
  };
14
- const lCycle = getCycle(pGraph, pFrom, pToDep[pDependencyName], {
15
- pDependencyName,
16
- pFindNodeByName,
17
- });
13
+ const lCycle = pIndexedGraph.getCycle(
14
+ pFrom,
15
+ pToDep[pDependencyName],
16
+ pDependencyName
17
+ );
18
18
 
19
19
  if (lCycle.length > 0) {
20
20
  lReturnValue = {
@@ -32,21 +32,20 @@ function addCircularityCheckToDependency(
32
32
  * whether it's (part of a) circular (relationship) and returns the
33
33
  * dependencies with that added.
34
34
  */
35
- module.exports = (
35
+ module.exports = function detectAndAddCycles(
36
36
  pNodes,
37
- { pSourceAttribute, pDependencyName, pFindNodeByName }
38
- ) =>
39
- pNodes.map((pModule) => ({
37
+ pIndexedNodes,
38
+ { pSourceAttribute, pDependencyName }
39
+ ) {
40
+ return pNodes.map((pModule) => ({
40
41
  ...pModule,
41
42
  dependencies: pModule.dependencies.map((pToDep) =>
42
43
  addCircularityCheckToDependency(
43
- pNodes,
44
+ pIndexedNodes,
44
45
  pModule[pSourceAttribute],
45
46
  pToDep,
46
- {
47
- pDependencyName,
48
- pFindNodeByName,
49
- }
47
+ pDependencyName
50
48
  )
51
49
  ),
52
50
  }));
51
+ };
@@ -2,6 +2,7 @@
2
2
  const path = require("path").posix;
3
3
  const { calculateInstability, metricsAreCalculable } = require("../module-utl");
4
4
  const detectCycles = require("../circular");
5
+ const IndexedModuleGraph = require("../../../graph-utl/indexed-module-graph");
5
6
  const {
6
7
  findFolderByName,
7
8
  getAfferentCouplings,
@@ -82,7 +83,7 @@ function calculateFolderMetrics(pFolder) {
82
83
  };
83
84
  }
84
85
 
85
- function denormalizeInstability(pFolder, _, pAllFolders) {
86
+ function deNormalizeInstability(pFolder, _, pAllFolders) {
86
87
  return {
87
88
  ...pFolder,
88
89
  dependencies: pFolder.dependencies.map((pDependency) => {
@@ -114,15 +115,15 @@ function getSinks(pFolders) {
114
115
  }
115
116
 
116
117
  module.exports = function aggregateToFolders(pModules) {
117
- const lFolders = object2Array(
118
+ let lFolders = object2Array(
118
119
  pModules.filter(metricsAreCalculable).reduce(aggregateToFolder, {})
119
120
  )
120
121
  .map(calculateFolderMetrics)
121
- .map(denormalizeInstability);
122
+ .map(deNormalizeInstability);
123
+ lFolders = lFolders.concat(getSinks(lFolders));
122
124
 
123
- return detectCycles(lFolders.concat(getSinks(lFolders)), {
125
+ return detectCycles(lFolders, new IndexedModuleGraph(lFolders, "name"), {
124
126
  pSourceAttribute: "name",
125
127
  pDependencyName: "name",
126
- pFindNodeByName: findFolderByName,
127
128
  });
128
129
  };
@@ -2,8 +2,7 @@ const validate = require("../../../validate");
2
2
  const aggregateToFolders = require("./aggregate-to-folders");
3
3
 
4
4
  /**
5
- *
6
- * @param {*} pFolder
5
+ * @param {import("../../../..").IFolder} pFolder
7
6
  * @param {import('../../../..').IOptions} pOptions
8
7
  * @returns
9
8
  */
@@ -1,4 +1,4 @@
1
- const { findModuleByName } = require("../module-utl");
1
+ const IndexedModuleGraph = require("../../../graph-utl/indexed-module-graph");
2
2
  const { calculateInstability, metricsAreCalculable } = require("../module-utl");
3
3
 
4
4
  function addInstabilityMetric(pModule) {
@@ -16,11 +16,12 @@ function addInstabilityMetric(pModule) {
16
16
  }
17
17
 
18
18
  function addInstabilityToDependency(pAllModules) {
19
+ const lIndexedModules = new IndexedModuleGraph(pAllModules);
19
20
  return (pDependency) => ({
20
21
  ...pDependency,
21
22
  instability:
22
- (findModuleByName(pAllModules, pDependency.resolved) || {}).instability ||
23
- 0,
23
+ (lIndexedModules.findModuleByName(pDependency.resolved) || {})
24
+ .instability || 0,
24
25
  });
25
26
  }
26
27
 
@@ -1,4 +1,3 @@
1
- const { clearCache } = require("../module-utl");
2
1
  const {
3
2
  addInstabilityMetric,
4
3
  deNormalizeInstabilityMetricsToDependencies,
@@ -6,9 +5,9 @@ const {
6
5
 
7
6
  module.exports = function deriveModulesMetrics(pModules, pOptions) {
8
7
  if (pOptions.metrics) {
9
- const lModules = pModules.map(addInstabilityMetric);
10
- clearCache();
11
- return lModules.map(deNormalizeInstabilityMetricsToDependencies);
8
+ return pModules
9
+ .map(addInstabilityMetric)
10
+ .map(deNormalizeInstabilityMetricsToDependencies);
12
11
  }
13
12
  return pModules;
14
13
  };
@@ -1,29 +1,3 @@
1
- /** @type {Map<string,import('../../../types/cruise-result').IModule>} */
2
- let gIndexedGraph = null;
3
-
4
- /**
5
- * Returns the module with attribute pSource, when it exists in the pModuleGraph.
6
- * Returns undefined when it doesn't.
7
- *
8
- * This function uses an indexed cache for efficiency reasons. If you need to
9
- * call this function consecutively for different module graphs, you can clear
10
- * this cache with the clearCache function from this module.
11
- *
12
- * TODO: use IndexedModuleGraph class from src/graph-utl in stead
13
- *
14
- * @param {import('../../../types/cruise-result').IModule[]} pModuleGraph
15
- * @param {string} pSource
16
- * @returns {import('../../../types/cruise-result').IModule | undefined}
17
- */
18
- function findModuleByName(pModuleGraph, pSource) {
19
- if (!gIndexedGraph) {
20
- gIndexedGraph = new Map(
21
- pModuleGraph.map((pModule) => [pModule.source, pModule])
22
- );
23
- }
24
- return gIndexedGraph.get(pSource);
25
- }
26
-
27
1
  function isDependent(pResolvedName) {
28
2
  return (pModule) =>
29
3
  pModule.dependencies.some(
@@ -41,7 +15,7 @@ function metricsAreCalculable(pModule) {
41
15
 
42
16
  /**
43
17
  * returns the Instability of a component given the number of incoming (afferent)
44
- * and outgoign (efferent) connections ('couplings')
18
+ * and outgoing (efferent) connections ('couplings')
45
19
  *
46
20
  * @param {number} pEfferentCouplingCount
47
21
  * @param {number} pAfferentCouplingCount
@@ -57,13 +31,7 @@ function calculateInstability(pEfferentCouplingCount, pAfferentCouplingCount) {
57
31
  );
58
32
  }
59
33
 
60
- function clearCache() {
61
- gIndexedGraph = null;
62
- }
63
-
64
34
  module.exports = {
65
- findModuleByName,
66
- clearCache,
67
35
  isDependent,
68
36
  metricsAreCalculable,
69
37
  calculateInstability,
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable security/detect-object-injection, no-inline-comments */
2
2
 
3
- const clone = require("lodash/clone");
3
+ const cloneDeep = require("lodash/cloneDeep");
4
4
  const has = require("lodash/has");
5
- const matchers = require("../../../validate/matchers");
6
- const { extractGroups } = require("../../../utl/regex-util");
7
- const getPath = require("./get-path");
5
+ const matchers = require("../../validate/matchers");
6
+ const { extractGroups } = require("../../utl/regex-util");
7
+ const IndexedModuleGraph = require("../../graph-utl/indexed-module-graph");
8
8
 
9
9
  function getReachableRules(pRuleSet) {
10
10
  return (pRuleSet?.forbidden ?? [])
@@ -105,14 +105,14 @@ function shouldAddReachable(pRule, pModuleTo, pGraph) {
105
105
  return lReturnValue;
106
106
  }
107
107
 
108
- function addReachesToModule(pModule, pGraph, pReachableRule) {
108
+ function addReachesToModule(pModule, pGraph, pIndexedGraph, pReachableRule) {
109
109
  const lToModules = pGraph.filter((pToModule) =>
110
110
  isModuleInRuleTo(pReachableRule, pToModule, pModule)
111
111
  );
112
112
 
113
113
  for (let lToModule of lToModules) {
114
114
  if (pModule.source !== lToModule.source) {
115
- const lPath = getPath(pGraph, pModule.source, lToModule.source);
115
+ const lPath = pIndexedGraph.getPath(pModule.source, lToModule.source);
116
116
 
117
117
  if (lPath.length > 0) {
118
118
  pModule.reaches = mergeReachesProperties(
@@ -127,7 +127,7 @@ function addReachesToModule(pModule, pGraph, pReachableRule) {
127
127
  return pModule;
128
128
  }
129
129
 
130
- function addReachableToModule(pModule, pGraph, pReachableRule) {
130
+ function addReachableToModule(pModule, pGraph, pIndexedGraph, pReachableRule) {
131
131
  const lFromModules = pGraph.filter(isModuleInRuleFrom(pReachableRule));
132
132
  let lFound = false;
133
133
 
@@ -137,7 +137,7 @@ function addReachableToModule(pModule, pGraph, pReachableRule) {
137
137
  pModule.source !== lFromModule.source &&
138
138
  isModuleInRuleTo(pReachableRule, pModule, lFromModule)
139
139
  ) {
140
- const lPath = getPath(pGraph, lFromModule.source, pModule.source);
140
+ const lPath = pIndexedGraph.getPath(lFromModule.source, pModule.source);
141
141
 
142
142
  lFound = lPath.length > 0;
143
143
  pModule.reachable = mergeReachableProperties(
@@ -151,17 +151,23 @@ function addReachableToModule(pModule, pGraph, pReachableRule) {
151
151
  return pModule;
152
152
  }
153
153
 
154
- function addReachabilityToGraph(pGraph, pReachableRule) {
154
+ function addReachabilityToGraph(pGraph, pIndexedGraph, pReachableRule) {
155
155
  return pGraph.map((pModule) => {
156
- let lClonedModule = clone(pModule);
156
+ let lClonedModule = cloneDeep(pModule);
157
157
 
158
158
  if (shouldAddReaches(pReachableRule, lClonedModule)) {
159
- lClonedModule = addReachesToModule(lClonedModule, pGraph, pReachableRule);
159
+ lClonedModule = addReachesToModule(
160
+ lClonedModule,
161
+ pGraph,
162
+ pIndexedGraph,
163
+ pReachableRule
164
+ );
160
165
  }
161
166
  if (shouldAddReachable(pReachableRule, lClonedModule, pGraph)) {
162
167
  lClonedModule = addReachableToModule(
163
168
  lClonedModule,
164
169
  pGraph,
170
+ pIndexedGraph,
165
171
  pReachableRule
166
172
  );
167
173
  }
@@ -171,9 +177,12 @@ function addReachabilityToGraph(pGraph, pReachableRule) {
171
177
 
172
178
  module.exports = function deriveReachables(pGraph, pRuleSet) {
173
179
  const lReachableRules = pRuleSet ? getReachableRules(pRuleSet) : [];
180
+ const lIndexedGraph =
181
+ lReachableRules.length > 0 ? new IndexedModuleGraph(pGraph) : {};
174
182
 
175
183
  return lReachableRules.reduce(
176
- (pReturnGraph, pRule) => addReachabilityToGraph(pReturnGraph, pRule),
177
- clone(pGraph)
184
+ (pReturnGraph, pRule) =>
185
+ addReachabilityToGraph(pReturnGraph, lIndexedGraph, pRule),
186
+ cloneDeep(pGraph)
178
187
  );
179
188
  };
@@ -1,6 +1,7 @@
1
1
  const bus = require("../utl/bus");
2
2
  const busLogLevels = require("../utl/bus-log-levels");
3
3
  const addFocus = require("../../src/graph-utl/add-focus");
4
+ const IndexedModuleGraph = require("../graph-utl/indexed-module-graph");
4
5
  const deriveCycles = require("./derive/circular");
5
6
  const deriveOrphans = require("./derive/orphan");
6
7
  const addDependents = require("./derive/dependents");
@@ -8,14 +9,13 @@ const deriveReachable = require("./derive/reachable");
8
9
  const addValidations = require("./add-validations");
9
10
  const softenKnownViolations = require("./soften-known-violations");
10
11
  const deriveModuleMetrics = require("./derive/metrics");
11
- const { findModuleByName } = require("./derive/module-utl");
12
12
 
13
13
  module.exports = function enrichModules(pModules, pOptions) {
14
14
  bus.emit("progress", "analyzing: cycles", { level: busLogLevels.INFO });
15
- let lModules = deriveCycles(pModules, {
15
+ const lIndexedModules = new IndexedModuleGraph(pModules);
16
+ let lModules = deriveCycles(pModules, lIndexedModules, {
16
17
  pSourceAttribute: "source",
17
18
  pDependencyName: "resolved",
18
- pFindNodeByName: findModuleByName,
19
19
  });
20
20
  bus.emit("progress", "analyzing: dependents", { level: busLogLevels.INFO });
21
21
  lModules = addDependents(lModules, pOptions);
@@ -1,7 +1,6 @@
1
1
  const enrichModules = require("./enrich-modules");
2
2
  const aggregateToFolders = require("./derive/folders");
3
3
  const summarize = require("./summarize");
4
- const clearCaches = require("./clear-caches");
5
4
 
6
5
  /**
7
6
  * Enriches the passed modules with things like cycle detection, validations,
@@ -17,11 +16,9 @@ const clearCaches = require("./clear-caches");
17
16
  * @returns {import("../..").ICruiseResult}
18
17
  */
19
18
  module.exports = function enrich(pModules, pOptions, pFileAndDirectoryArray) {
20
- clearCaches();
21
19
  const lModules = enrichModules(pModules, pOptions);
22
20
  const lFolders = aggregateToFolders(lModules, pOptions);
23
21
 
24
- clearCaches();
25
22
  const lReturnValue = {
26
23
  modules: lModules,
27
24
  ...lFolders,
@@ -53,19 +53,19 @@ function gatherScannableFilesFromDirectory(pDirectoryName, pOptions) {
53
53
  shouldNotBeExcluded(pathToPosix(pFullPathToFile), pOptions)
54
54
  )
55
55
  .reduce((pSum, pFullPathToFile) => {
56
- let lStat = {};
57
- try {
58
- lStat = fs.statSync(path.join(pOptions.baseDir, pFullPathToFile));
59
- } catch (pError) {
60
- return pSum;
61
- }
62
- if (lStat.isDirectory()) {
63
- return pSum.concat(
64
- gatherScannableFilesFromDirectory(pFullPathToFile, pOptions)
65
- );
66
- }
67
- if (fileIsScannable(pOptions, pFullPathToFile)) {
68
- return pSum.concat(pFullPathToFile);
56
+ let lStat = fs.statSync(path.join(pOptions.baseDir, pFullPathToFile), {
57
+ throwIfNoEntry: false,
58
+ });
59
+
60
+ if (lStat) {
61
+ if (lStat.isDirectory()) {
62
+ return pSum.concat(
63
+ gatherScannableFilesFromDirectory(pFullPathToFile, pOptions)
64
+ );
65
+ }
66
+ if (fileIsScannable(pOptions, pFullPathToFile)) {
67
+ return pSum.concat(pFullPathToFile);
68
+ }
69
69
  }
70
70
  return pSum;
71
71
  }, [])
@@ -1,18 +1,18 @@
1
+ /* eslint-disable security/detect-object-injection */
1
2
  module.exports = class IndexedModuleGraph {
2
- init(pModules) {
3
+ init(pModules, pIndexAttribute) {
3
4
  this.indexedGraph = new Map(
4
- pModules.map((pModule) => [pModule.source, pModule])
5
+ pModules.map((pModule) => [pModule[pIndexAttribute], pModule])
5
6
  );
6
7
  }
7
8
 
8
- constructor(pModules) {
9
- this.init(pModules);
9
+ constructor(pModules, pIndexAttribute = "source") {
10
+ this.init(pModules, pIndexAttribute);
10
11
  }
11
12
 
12
13
  /**
13
- *
14
14
  * @param {string} pName
15
- * @return {import("../types/cruise-result").IModule}
15
+ * @return {import("..").IModule}
16
16
  */
17
17
  findModuleByName(pName) {
18
18
  return this.indexedGraph.get(pName);
@@ -102,4 +102,78 @@ module.exports = class IndexedModuleGraph {
102
102
  }
103
103
  return lReturnValue;
104
104
  }
105
+
106
+ /**
107
+ * @param {string} pFrom
108
+ * @param {string} pTo
109
+ * @param {Set<string>} pVisited
110
+ * @returns {string[]}
111
+ */
112
+ getPath(pFrom, pTo, pVisited = new Set()) {
113
+ let lReturnValue = [];
114
+ const lFromNode = this.findModuleByName(pFrom);
115
+
116
+ pVisited.add(pFrom);
117
+
118
+ if (lFromNode) {
119
+ const lDirectUnvisitedDependencies = lFromNode.dependencies
120
+ .filter((pDependency) => !pVisited.has(pDependency.resolved))
121
+ .map((pDependency) => pDependency.resolved);
122
+ if (lDirectUnvisitedDependencies.includes(pTo)) {
123
+ lReturnValue = [pFrom, pTo];
124
+ } else {
125
+ for (const lFrom of lDirectUnvisitedDependencies) {
126
+ let lCandidatePath = this.getPath(lFrom, pTo, pVisited);
127
+ // eslint-disable-next-line max-depth
128
+ if (lCandidatePath.length > 0) {
129
+ lReturnValue = [pFrom].concat(lCandidatePath);
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ }
135
+ return lReturnValue;
136
+ }
137
+
138
+ /**
139
+ * Returns the first non-zero length path from pInitialSource to pInitialSource
140
+ * Returns the empty array if there is no such path
141
+ *
142
+ * @param {string} pInitialSource The 'source' attribute of the node to be tested
143
+ * (source uniquely identifying a node)
144
+ * @param {string} pCurrentSource The 'source' attribute of the 'to' node to
145
+ * be traversed
146
+ * @param {string} pDependencyName The attribute name of the dependency to use.
147
+ * defaults to "resolved" (which is in use for
148
+ * modules). For folders pass "name"
149
+ * @return {string[]} see description above
150
+ */
151
+ getCycle(pInitialSource, pCurrentSource, pDependencyName, pVisited) {
152
+ let lVisited = pVisited || new Set();
153
+ const lCurrentNode = this.findModuleByName(pCurrentSource);
154
+ const lDependencies = lCurrentNode.dependencies.filter(
155
+ (pDependency) => !lVisited.has(pDependency[pDependencyName])
156
+ );
157
+ const lMatch = lDependencies.find(
158
+ (pDependency) => pDependency[pDependencyName] === pInitialSource
159
+ );
160
+ if (lMatch) {
161
+ return [pCurrentSource, lMatch[pDependencyName]];
162
+ }
163
+ return lDependencies.reduce((pAll, pDependency) => {
164
+ if (!pAll.includes(pCurrentSource)) {
165
+ const lCycle = this.getCycle(
166
+ pInitialSource,
167
+ pDependency[pDependencyName],
168
+ pDependencyName,
169
+ lVisited.add(pDependency[pDependencyName])
170
+ );
171
+
172
+ if (lCycle.length > 0 && !lCycle.includes(pCurrentSource)) {
173
+ return pAll.concat(pCurrentSource).concat(lCycle);
174
+ }
175
+ }
176
+ return pAll;
177
+ }, []);
178
+ }
105
179
  };
package/src/meta.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* generated - don't edit */
2
2
 
3
3
  module.exports = {
4
- version: "12.5.1",
4
+ version: "12.7.0",
5
5
  engines: {
6
6
  node: "^14||^16||>=18",
7
7
  },
@@ -1,2 +1,2 @@
1
1
  /* generated - don't edit */
2
- module.exports={"title":"dependency-cruiser configuration","$schema":"http://json-schema.org/draft-07/schema#","$id":"https://dependency-cruiser.js.org/schema/configuration.schema.json","type":"object","additionalProperties":false,"properties":{"$schema":{"type":"string"},"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"}},"options":{"$ref":"#/definitions/OptionsType"},"extends":{"$ref":"#/definitions/ExtendsType"}},"definitions":{"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"},"scope":{"type":"string","enum":["module","folder"]},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"viaOnly":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"viaSomeNot":{"$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"}}},"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"]},"REAsStringsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"SeverityType":{"type":"string","enum":["error","warn","info","ignore"]},"OptionsType":{"type":"object","additionalProperties":false,"properties":{"doNotFollow":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundDoNotFollowType"}]},"exclude":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundExcludeType"}]},"includeOnly":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundIncludeOnlyType"}]},"focus":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundFocusType"}]},"reaches":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundReachesType"}]},"highlight":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundHighlightType"}]},"knownViolations":{"$ref":"#/definitions/ViolationsType"},"collapse":{"oneOf":[{"type":"string"},{"type":"integer","minimum":1,"maximum":9}]},"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"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean"},{"type":"string"},{"$ref":"#/definitions/CacheOptionsType"}]}}},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"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"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"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"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"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"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"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"}}},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"ExtendsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}}
2
+ module.exports={"title":"dependency-cruiser configuration","$schema":"http://json-schema.org/draft-07/schema#","$id":"https://dependency-cruiser.js.org/schema/configuration.schema.json","type":"object","additionalProperties":false,"properties":{"$schema":{"type":"string"},"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"}},"options":{"$ref":"#/definitions/OptionsType"},"extends":{"$ref":"#/definitions/ExtendsType"}},"definitions":{"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"},"scope":{"type":"string","enum":["module","folder"]},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"viaOnly":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"viaSomeNot":{"$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"}}},"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"]},"REAsStringsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"SeverityType":{"type":"string","enum":["error","warn","info","ignore"]},"OptionsType":{"type":"object","additionalProperties":false,"properties":{"doNotFollow":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundDoNotFollowType"}]},"exclude":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundExcludeType"}]},"includeOnly":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundIncludeOnlyType"}]},"focus":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundFocusType"}]},"reaches":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundReachesType"}]},"highlight":{"oneOf":[{"$ref":"#/definitions/REAsStringsType"},{"$ref":"#/definitions/CompoundHighlightType"}]},"knownViolations":{"$ref":"#/definitions/ViolationsType"},"collapse":{"oneOf":[{"type":"string"},{"type":"integer","minimum":1,"maximum":9}]},"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","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean"},{"type":"string"},{"$ref":"#/definitions/CacheOptionsType"}]}}},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"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"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"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"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"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"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"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"}}},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"ExtendsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}}
@@ -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"},"revisionData":{"$ref":"#/definitions/RevisionDataType"}},"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"},"matchesReaches":{"type":"boolean"},"matchesHighlight":{"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"},"scope":{"type":"string","enum":["module","folder"]},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"viaOnly":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"viaSomeNot":{"$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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"},"highlight":{"$ref":"#/definitions/CompoundHighlightType"},"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"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"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","markdown","mermaid"]},{"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"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"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"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"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"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"RevisionDataType":{"type":"object","required":["SHA1","changes"],"properties":{"SHA1":{"type":"string"},"changes":{"type":"array","items":{"type":"object","required":["name","changeType"],"properties":{"name":{"type":"string"},"changeType":{"type":"string","enum":["added","copied","deleted","modified","renamed","type changed","unmerged","pairing broken","unknown","unmodified","untracked","ignored"]},"oldName":{"type":"string"},"checksum":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"rulesFile":{"type":"string"}}}}}}}}
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"},"revisionData":{"$ref":"#/definitions/RevisionDataType"}},"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"},"matchesReaches":{"type":"boolean"},"matchesHighlight":{"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"},"scope":{"type":"string","enum":["module","folder"]},"from":{"$ref":"#/definitions/FromRestrictionType"},"to":{"$ref":"#/definitions/ToRestrictionType"}}},"ReachabilityAllowedRuleType":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"comment":{"type":"string"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"scope":{"type":"string","enum":["module","folder"]},"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"},"viaOnly":{"$ref":"#/definitions/REAsStringsType"},"viaNot":{"$ref":"#/definitions/REAsStringsType"},"viaSomeNot":{"$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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"},"highlight":{"$ref":"#/definitions/CompoundHighlightType"},"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","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"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","markdown","mermaid"]},{"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"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"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"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"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"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"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"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"RevisionDataType":{"type":"object","required":["SHA1","changes"],"properties":{"SHA1":{"type":"string"},"changes":{"type":"array","items":{"type":"object","required":["name","changeType"],"properties":{"name":{"type":"string"},"changeType":{"type":"string","enum":["added","copied","deleted","modified","renamed","type changed","unmerged","pairing broken","unknown","unmodified","untracked","ignored"]},"oldName":{"type":"string"},"checksum":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"rulesFile":{"type":"string"}}}}}}}}
@@ -13,12 +13,10 @@ const pathToPosix = require("./path-to-posix");
13
13
  * @returns {boolean}
14
14
  */
15
15
  function fileIsDirectory(pFullPathToFile, pBaseDirectory) {
16
- try {
17
- const lStat = statSync(join(pBaseDirectory, pFullPathToFile));
18
- return lStat.isDirectory();
19
- } catch (pError) {
20
- return false;
21
- }
16
+ const lStat = statSync(join(pBaseDirectory, pFullPathToFile), {
17
+ throwIfNoEntry: false,
18
+ });
19
+ return lStat?.isDirectory() ?? false;
22
20
  }
23
21
 
24
22
  /**
@@ -13,7 +13,11 @@ import { IFlattenedRuleSet } from "./rule-set";
13
13
  import { ModuleSystemType, OutputType } from "./shared-types";
14
14
 
15
15
  export type ExternalModuleResolutionStrategyType = "node_modules" | "yarn-pnp";
16
- export type ProgressType = "cli-feedback" | "performance-log" | "none";
16
+ export type ProgressType =
17
+ | "cli-feedback"
18
+ | "performance-log"
19
+ | "ndjson"
20
+ | "none";
17
21
 
18
22
  export interface ICruiseOptions {
19
23
  /**
@@ -1,5 +0,0 @@
1
- const utl = require("./derive/module-utl");
2
-
3
- module.exports = function clearCaches() {
4
- utl.clearCache();
5
- };
@@ -1,70 +0,0 @@
1
- /* eslint-disable security/detect-object-injection */
2
- /* about the absence of checks whether attributes/ objects actually
3
- * exist:
4
- * - it saves CPU cycles to the effect of being ~30% faster than with the
5
- * checks
6
- * - .dependencies is a mandatory attribute (as per json schema)
7
- * - .resolved is a mandatory attribute (as per json schema)
8
- */
9
-
10
- /**
11
- * Returns the first non-zero length path from pInitialSource to pInitialSource
12
- * Returns the empty array if there is no such path
13
- *
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
32
- */
33
- // eslint-disable-next-line max-params
34
- function getCycle(
35
- pGraph,
36
- pInitialSource,
37
- pCurrentSource,
38
- { pDependencyName, pFindNodeByName },
39
- pVisited
40
- ) {
41
- let lVisited = pVisited || new Set();
42
- const lCurrentNode = pFindNodeByName(pGraph, pCurrentSource);
43
- const lDependencies = lCurrentNode.dependencies.filter(
44
- (pDependency) => !lVisited.has(pDependency[pDependencyName])
45
- );
46
- const lMatch = lDependencies.find(
47
- (pDependency) => pDependency[pDependencyName] === pInitialSource
48
- );
49
- if (lMatch) {
50
- return [pCurrentSource, lMatch[pDependencyName]];
51
- }
52
- return lDependencies.reduce((pAll, pDependency) => {
53
- if (!pAll.includes(pCurrentSource)) {
54
- const lCycle = getCycle(
55
- pGraph,
56
- pInitialSource,
57
- pDependency[pDependencyName],
58
- { pDependencyName, pFindNodeByName },
59
- lVisited.add(pDependency[pDependencyName])
60
- );
61
-
62
- if (lCycle.length > 0 && !lCycle.includes(pCurrentSource)) {
63
- return pAll.concat(pCurrentSource).concat(lCycle);
64
- }
65
- }
66
- return pAll;
67
- }, []);
68
- }
69
-
70
- module.exports = getCycle;
@@ -1,29 +0,0 @@
1
- const { findModuleByName } = require("../module-utl");
2
-
3
- function getPath(pGraph, pFrom, pTo, pVisited = new Set()) {
4
- let lReturnValue = [];
5
- const lFromNode = findModuleByName(pGraph, pFrom);
6
-
7
- pVisited.add(pFrom);
8
-
9
- if (lFromNode) {
10
- const lDirectUnvisitedDependencies = lFromNode.dependencies
11
- .filter((pDependency) => !pVisited.has(pDependency.resolved))
12
- .map((pDependency) => pDependency.resolved);
13
- if (lDirectUnvisitedDependencies.includes(pTo)) {
14
- lReturnValue = [pFrom, pTo];
15
- } else {
16
- for (const lFrom of lDirectUnvisitedDependencies) {
17
- let lCandidatePath = getPath(pGraph, lFrom, pTo, pVisited);
18
- // eslint-disable-next-line max-depth
19
- if (lCandidatePath.length > 0) {
20
- lReturnValue = [pFrom].concat(lCandidatePath);
21
- break;
22
- }
23
- }
24
- }
25
- }
26
- return lReturnValue;
27
- }
28
-
29
- module.exports = getPath;