dependency-cruiser 12.3.0 → 12.4.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016-2022 Sander Verweij
3
+ Copyright (c) 2016-2023 Sander Verweij
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dependency-cruiser",
3
- "version": "12.3.0",
3
+ "version": "12.4.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}\" --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.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",
@@ -147,18 +147,19 @@
147
147
  "acorn-jsx-walk": "2.0.0",
148
148
  "acorn-loose": "8.3.0",
149
149
  "acorn-walk": "8.2.0",
150
- "ajv": "8.11.2",
150
+ "ajv": "8.12.0",
151
151
  "chalk": "^4.1.2",
152
- "commander": "9.4.1",
152
+ "commander": "9.5.0",
153
153
  "enhanced-resolve": "5.12.0",
154
154
  "figures": "^3.2.0",
155
155
  "get-stream": "^6.0.1",
156
156
  "glob": "7.2.0",
157
157
  "handlebars": "4.7.7",
158
+ "ignore": "5.2.4",
158
159
  "indent-string": "^4.0.0",
159
160
  "interpret": "^3.1.0",
160
161
  "is-installed-globally": "0.4.0",
161
- "json5": "2.2.2",
162
+ "json5": "2.2.3",
162
163
  "lodash": "4.17.21",
163
164
  "prompts": "2.4.2",
164
165
  "rechoir": "^0.8.0",
@@ -171,23 +172,23 @@
171
172
  "wrap-ansi": "^7.0.0"
172
173
  },
173
174
  "devDependencies": {
174
- "@babel/core": "7.20.7",
175
+ "@babel/core": "7.20.12",
175
176
  "@babel/plugin-transform-modules-commonjs": "7.20.11",
176
177
  "@babel/preset-typescript": "7.18.6",
177
- "@swc/core": "1.3.24",
178
+ "@swc/core": "1.3.25",
178
179
  "@types/lodash": "4.14.191",
179
180
  "@types/node": "18.11.18",
180
181
  "@types/prompts": "2.4.2",
181
- "@typescript-eslint/eslint-plugin": "5.47.1",
182
- "@typescript-eslint/parser": "5.47.1",
182
+ "@typescript-eslint/eslint-plugin": "5.48.0",
183
+ "@typescript-eslint/parser": "5.48.0",
183
184
  "@vue/compiler-sfc": "3.2.45",
184
185
  "c8": "7.12.0",
185
186
  "chai": "4.3.7",
186
187
  "chai-json-schema": "1.5.1",
187
188
  "coffeescript": "2.7.0",
188
- "eslint": "8.30.0",
189
+ "eslint": "8.31.0",
189
190
  "eslint-config-moving-meadow": "4.0.2",
190
- "eslint-config-prettier": "8.5.0",
191
+ "eslint-config-prettier": "8.6.0",
191
192
  "eslint-plugin-budapestian": "5.0.1",
192
193
  "eslint-plugin-eslint-comments": "3.2.0",
193
194
  "eslint-plugin-import": "2.26.0",
@@ -195,13 +196,13 @@
195
196
  "eslint-plugin-node": "11.1.0",
196
197
  "eslint-plugin-security": "1.5.0",
197
198
  "eslint-plugin-unicorn": "^45.0.0",
198
- "husky": "8.0.2",
199
+ "husky": "8.0.3",
199
200
  "intercept-stdout": "0.1.2",
200
201
  "lint-staged": "13.1.0",
201
202
  "mocha": "10.2.0",
202
203
  "normalize-newline": "^3.0.0",
203
204
  "npm-run-all": "4.1.5",
204
- "prettier": "2.8.1",
205
+ "prettier": "2.8.2",
205
206
  "proxyquire": "2.1.3",
206
207
  "shx": "0.3.4",
207
208
  "svelte": "3.55.0",
@@ -1,25 +1,36 @@
1
1
  const { readFileSync, mkdirSync, writeFileSync } = require("fs");
2
2
  const { join } = require("path");
3
+ const meta = require("../extract/transpile/meta");
3
4
  const { optionsAreCompatible } = require("./options-compatible");
4
- const { revisionDataEqual } = require("./revision-data");
5
+ const { getRevisionData, revisionDataEqual } = require("./git-revision-data");
5
6
 
6
7
  const CACHE_FILE_NAME = "cache.json";
8
+ let gRevisionData = null;
9
+
7
10
  /**
8
- *
9
11
  * @param {string} pCacheFolder
10
- * @param {import("../../types/cruise-result").ICruiseResult} pCruiseResult
12
+ * @param {import("../..").ICruiseResult} pCruiseResult
13
+ * @param {import("../..").IRevisionData=} pRevisionData
11
14
  */
12
- function writeCache(pCacheFolder, pCruiseResult) {
15
+ function writeCache(pCacheFolder, pCruiseResult, pRevisionData) {
16
+ const lRevisionData = pRevisionData ?? gRevisionData;
17
+
13
18
  mkdirSync(pCacheFolder, { recursive: true });
14
19
  writeFileSync(
15
20
  join(pCacheFolder, CACHE_FILE_NAME),
16
- JSON.stringify(pCruiseResult),
21
+ JSON.stringify(
22
+ lRevisionData
23
+ ? {
24
+ ...pCruiseResult,
25
+ revisionData: lRevisionData,
26
+ }
27
+ : pCruiseResult
28
+ ),
17
29
  "utf8"
18
30
  );
19
31
  }
20
32
 
21
33
  /**
22
- *
23
34
  * @param {string} pCacheFolder
24
35
  * @returns {import("../..").ICruiseResult}
25
36
  */
@@ -34,23 +45,30 @@ function readCache(pCacheFolder) {
34
45
  }
35
46
 
36
47
  /**
37
- *
38
48
  * @param {import("../../types/strict-options").IStrictCruiseOptions} pOptions
39
- * @param {import("../..").IRevisionData} pRevisionData
49
+ * @param {import("../..").ICruiseResult} pCachedCruiseResult
50
+ * @param {import("../..").IRevisionData=} pRevisionData
40
51
  * @returns {boolean}
41
52
  */
42
- function canServeFromCache(pOptions, pRevisionData) {
43
- /** @type {import("../..").ICruiseResult} */
44
- const lCachedResults = readCache(pOptions.cache);
45
-
53
+ function canServeFromCache(pOptions, pCachedCruiseResult, pRevisionData) {
54
+ gRevisionData =
55
+ pRevisionData ??
56
+ getRevisionData(
57
+ new Set(meta.scannableExtensions.concat(pOptions.extraExtensionsToScan))
58
+ );
46
59
  return (
47
- revisionDataEqual(lCachedResults.revisionData, pRevisionData) &&
48
- optionsAreCompatible(lCachedResults.summary.optionsUsed, pOptions)
60
+ revisionDataEqual(pCachedCruiseResult.revisionData, gRevisionData) &&
61
+ optionsAreCompatible(pCachedCruiseResult.summary.optionsUsed, pOptions)
49
62
  );
50
63
  }
51
64
 
65
+ function clearCache() {
66
+ gRevisionData = null;
67
+ }
68
+
52
69
  module.exports = {
53
70
  writeCache,
54
71
  readCache,
55
72
  canServeFromCache,
73
+ clearCache,
56
74
  };
@@ -1,8 +1,7 @@
1
- const { createHash } = require("crypto");
2
- const { readFileSync } = require("fs");
3
1
  const { extname } = require("path");
2
+ const { isDeepStrictEqual } = require("util");
4
3
  const { getSHASync, listSync } = require("watskeburt");
5
- const { objectsAreEqual } = require("./utl");
4
+ const { getFileHash } = require("./utl");
6
5
 
7
6
  // skipping: "pairing broken", "unmodified", "unmerged", "type changed"
8
7
  const DEFAULT_INTERESTING_CHANGE_TYPES = new Set([
@@ -36,29 +35,9 @@ function isInterestingChangeType(pInterestingChangeTypes) {
36
35
  return (pChange) => pInterestingChangeTypes.has(pChange.changeType);
37
36
  }
38
37
 
39
- /**
40
- * @param {string} pString
41
- * @returns {string}
42
- */
43
- function hash(pString) {
44
- return createHash("sha1").update(pString).digest("base64");
45
- }
46
-
47
- /**
48
- * @param {import("fs").PathOrFileDescriptor} pFileName
49
- * @returns {string}
50
- */
51
- function getFileHash(pFileName) {
52
- try {
53
- return hash(readFileSync(pFileName, "utf8"));
54
- } catch (pError) {
55
- return "file not found";
56
- }
57
- }
58
-
59
38
  /**
60
39
  * @param {import("watskeburt").IChange} pChange
61
- * @param {import("../..").IRevisionChange}
40
+ * @param {import("../../types/dependency-cruiser").IRevisionChange}
62
41
  */
63
42
  function addChecksum(pChange) {
64
43
  return {
@@ -75,7 +54,7 @@ function addChecksum(pChange) {
75
54
  * @param {() => string} pOptions.shaRetrievalFn
76
55
  * @param {(pString:string) => Array<import("watskeburt").IChange>} pOptions.diffListFn
77
56
  * @param {(import("watskeburt").IChange) => import("../..").IRevisionChange} pOptions.checkSumFn
78
- * @returns {import("../..").IRevisionData}
57
+ * @returns {import("../../types/dependency-cruiser").IRevisionData}
79
58
  */
80
59
  function getRevisionData(
81
60
  pExtensions,
@@ -108,8 +87,8 @@ function getRevisionData(
108
87
  }
109
88
 
110
89
  /**
111
- * @param {import("../..").IRevisionData} pExistingRevisionData
112
- * @param {import("../..").IRevisionData} pNewRevisionData
90
+ * @param {import("../../types/dependency-cruiser").IRevisionData} pExistingRevisionData
91
+ * @param {import("../../types/dependency-cruiser").IRevisionData} pNewRevisionData
113
92
  * @returns {boolean}
114
93
  */
115
94
  function revisionDataEqual(pExistingRevisionData, pNewRevisionData) {
@@ -117,7 +96,7 @@ function revisionDataEqual(pExistingRevisionData, pNewRevisionData) {
117
96
  Boolean(pExistingRevisionData) &&
118
97
  Boolean(pNewRevisionData) &&
119
98
  pExistingRevisionData.SHA1 === pNewRevisionData.SHA1 &&
120
- objectsAreEqual(pExistingRevisionData.changes, pNewRevisionData.changes)
99
+ isDeepStrictEqual(pExistingRevisionData.changes, pNewRevisionData.changes)
121
100
  );
122
101
  }
123
102
 
@@ -1,4 +1,4 @@
1
- const { objectsAreEqual } = require("./utl");
1
+ const { isDeepStrictEqual } = require("util");
2
2
 
3
3
  /*
4
4
  # command line options
@@ -55,11 +55,11 @@ const { objectsAreEqual } = require("./utl");
55
55
 
56
56
  function includeOnlyIsCompatible(pExistingFilter, pNewFilter) {
57
57
  return (
58
- !pExistingFilter || objectsAreEqual({ path: pExistingFilter }, pNewFilter)
58
+ !pExistingFilter || isDeepStrictEqual({ path: pExistingFilter }, pNewFilter)
59
59
  );
60
60
  }
61
- function optionIsCompatible(pExistingFilter, pNewFilter) {
62
- return !pExistingFilter || objectsAreEqual(pExistingFilter, pNewFilter);
61
+ function optionIsCompatible(pExistingOption, pNewOption) {
62
+ return !pExistingOption || isDeepStrictEqual(pExistingOption, pNewOption);
63
63
  }
64
64
 
65
65
  function limitIsCompatible(pExistingLimit, pNewLimit) {
@@ -70,6 +70,16 @@ function metricsIsCompatible(pExistingMetrics, pNewMetrics) {
70
70
  return pExistingMetrics || pExistingMetrics === pNewMetrics;
71
71
  }
72
72
 
73
+ function cacheOptionIsCompatible(pExistingCacheOption, pNewCacheOption) {
74
+ if (!pExistingCacheOption || !pNewCacheOption) {
75
+ return false;
76
+ }
77
+ return (
78
+ pExistingCacheOption === pNewCacheOption ||
79
+ isDeepStrictEqual(pExistingCacheOption, pNewCacheOption)
80
+ );
81
+ }
82
+
73
83
  /**
74
84
  *
75
85
  * @param {import("../../types/strict-options").IStrictCruiseOptions} pOldOptions
@@ -106,7 +116,8 @@ function optionsAreCompatible(pOldOptions, pNewOptions) {
106
116
  optionIsCompatible(
107
117
  pOldOptions.exoticRequireStrings,
108
118
  pNewOptions.exoticRequireStrings
109
- )
119
+ ) &&
120
+ cacheOptionIsCompatible(pOldOptions.cache, pNewOptions.cache)
110
121
  );
111
122
  }
112
123
 
@@ -116,4 +127,5 @@ module.exports = {
116
127
  limitsAreCompatible: limitIsCompatible,
117
128
  metricsAreCompatible: metricsIsCompatible,
118
129
  includeOnlyFiltersAreCompatible: includeOnlyIsCompatible,
130
+ cacheOptionIsCompatible,
119
131
  };
package/src/cache/utl.js CHANGED
@@ -1,17 +1,24 @@
1
- const { deepEqual } = require("assert");
1
+ const { createHash } = require("crypto");
2
+ const { readFileSync } = require("fs");
2
3
 
3
4
  /**
4
- *
5
- * @param {any} pLeftObject
6
- * @param {any} pRightObject
7
- * @returns {boolean}
5
+ * @param {string} pString
6
+ * @returns {string}
8
7
  */
9
- function objectsAreEqual(pLeftObject, pRightObject) {
8
+ function hash(pString) {
9
+ return createHash("sha1").update(pString).digest("base64");
10
+ }
11
+
12
+ /**
13
+ * @param {import("fs").PathOrFileDescriptor} pFileName
14
+ * @returns {string}
15
+ */
16
+ function getFileHash(pFileName) {
10
17
  try {
11
- deepEqual(pLeftObject, pRightObject);
12
- return true;
18
+ return hash(readFileSync(pFileName, "utf8"));
13
19
  } catch (pError) {
14
- return false;
20
+ return "file not found";
15
21
  }
16
22
  }
17
- module.exports = { objectsAreEqual };
23
+
24
+ module.exports = { getFileHash };
package/src/cli/index.js CHANGED
@@ -12,6 +12,7 @@ const extractTSConfig = require("../config-utl/extract-ts-config");
12
12
  const extractBabelConfig = require("../config-utl/extract-babel-config");
13
13
  const extractWebpackResolveConfig = require("../config-utl/extract-webpack-resolve-config");
14
14
  const extractKnownViolations = require("../config-utl/extract-known-violations");
15
+ const { INFO } = require("../utl/bus-log-levels");
15
16
  const validateFileExistence = require("./utl/validate-file-existence");
16
17
  const normalizeCliOptions = require("./normalize-cli-options");
17
18
  const io = require("./utl/io");
@@ -83,9 +84,12 @@ function setUpListener(pCruiseOptions) {
83
84
  pCruiseOptions?.ruleSet?.options?.progress?.type;
84
85
  // eslint-disable-next-line security/detect-object-injection
85
86
  const lListenerFunction = lString2Listener?.[lListenerID];
86
- /* c8 ignore next 3 */
87
+ /* c8 ignore next 6 */
87
88
  if (Boolean(lListenerFunction)) {
88
- lListenerFunction(bus);
89
+ lListenerFunction(
90
+ bus,
91
+ pCruiseOptions?.ruleSet?.options?.progress?.maximumLevel ?? INFO
92
+ );
89
93
  }
90
94
  }
91
95
 
@@ -116,7 +120,7 @@ function runCruise(pFileDirectoryArray, pCruiseOptions) {
116
120
  }
117
121
  );
118
122
 
119
- bus.emit("progress", "cli: writing results");
123
+ bus.emit("progress", "cli: writing results", { complete: 1 });
120
124
  bus.emit("write-start");
121
125
  io.write(lCruiseOptions.outputTo, lReportingResult.output);
122
126
 
@@ -1,67 +1,8 @@
1
1
  // @ts-check
2
2
  /* eslint-disable security/detect-object-injection */
3
- const fs = require("fs");
4
- const path = require("path");
5
- const pathToPosix = require("../../utl/path-to-posix");
6
3
  const getExtension = require("../../utl/get-extension.js");
7
4
  const meta = require("../../extract/transpile/meta");
8
-
9
- /**
10
- * @param {string[]} pIgnorablePathElements
11
- * @returns {(string) => boolean}
12
- */
13
- function notIgnorable(pIgnorablePathElements) {
14
- return (pPath) => {
15
- return !pIgnorablePathElements.includes(pPath);
16
- };
17
- }
18
-
19
- /**
20
- * @param {string} pFullPathToFile
21
- * @param {string} pBaseDirectory
22
- * @returns {boolean}
23
- */
24
- function fileIsDirectory(pFullPathToFile, pBaseDirectory) {
25
- try {
26
- const lStat = fs.statSync(path.join(pBaseDirectory, pFullPathToFile));
27
- return lStat.isDirectory();
28
- } catch (pError) {
29
- return false;
30
- }
31
- }
32
-
33
- /**
34
- * @param {string} pDirectoryName
35
- * @param {{baseDir: string; ignorablePathElements: string[]}} pOptions
36
- * @returns {string[]}
37
- */
38
- function listAllModules(pDirectoryName, { baseDir, ignorablePathElements }) {
39
- return fs
40
- .readdirSync(path.join(baseDir, pDirectoryName))
41
- .filter(notIgnorable(ignorablePathElements))
42
- .map((pFileName) => path.join(pDirectoryName, pFileName))
43
- .map((pFullPathToFile) => ({
44
- fullPathToFile: pFullPathToFile,
45
- isDirectory: fileIsDirectory(pFullPathToFile, baseDir),
46
- }))
47
- .reduce(
48
- /**
49
- * @param {string[]} pSum
50
- * @param {{fullPathToFile: string; isDirectory: boolean}} pCurrentValue
51
- * @returns {string[]}
52
- */
53
- (pSum, { fullPathToFile, isDirectory }) => {
54
- if (isDirectory) {
55
- return pSum.concat(
56
- listAllModules(fullPathToFile, { baseDir, ignorablePathElements })
57
- );
58
- }
59
- return pSum.concat(fullPathToFile);
60
- },
61
- []
62
- )
63
- .map((pFullPathToFile) => pathToPosix(pFullPathToFile));
64
- }
5
+ const findAllFiles = require("../../utl/find-all-files");
65
6
 
66
7
  /**
67
8
  * @param {Record<string,number>} pAll
@@ -84,27 +25,24 @@ function compareByCount(pCountsObject) {
84
25
 
85
26
  /**
86
27
  * @param {string[]} pDirectories
87
- * @param {{baseDir?: string; ignorablePathElements?: string[], scannableExtensions?: string[]}=} pOptions
28
+ * @param {{baseDir?: string; ignoreFileContents?: string}=} pOptions
88
29
  * @returns {string[]}
89
30
  */
90
31
  module.exports = function findExtensions(pDirectories, pOptions) {
91
32
  const lOptions = {
92
33
  baseDir: process.cwd(),
93
- ignorablePathElements: [
94
- ".git",
95
- ".husky",
96
- ".vscode",
97
- "coverage",
98
- "node_nodules",
99
- "nyc",
100
- ],
101
34
  scannableExtensions: meta.scannableExtensions,
102
35
  ...pOptions,
103
36
  };
104
37
 
105
38
  const lExtensionsWithCounts = pDirectories
106
39
  .flatMap((pDirectory) =>
107
- listAllModules(pDirectory, lOptions).map(getExtension).filter(Boolean)
40
+ findAllFiles(pDirectory, {
41
+ baseDir: lOptions.baseDir,
42
+ ignoreFileContents: lOptions?.ignoreFileContents,
43
+ })
44
+ .map(getExtension)
45
+ .filter(Boolean)
108
46
  )
109
47
  .reduce(reduceToCounts, {});
110
48
 
@@ -29,8 +29,11 @@ function populate(pInitOptions) {
29
29
  ),
30
30
  };
31
31
  if (lReturnValue.specifyResolutionExtensions) {
32
+ const lFoldersToScan = lReturnValue.sourceLocation.concat(
33
+ lReturnValue.testLocation
34
+ );
32
35
  lReturnValue.resolutionExtensions = findExtensions(
33
- lReturnValue.sourceLocation.concat(lReturnValue.testLocation)
36
+ lFoldersToScan.length > 0 ? lFoldersToScan : ["."]
34
37
  );
35
38
  }
36
39
  return lReturnValue;
@@ -1,6 +1,6 @@
1
1
  const chalk = require("chalk");
2
2
  const figures = require("figures");
3
- const busLogLevels = require("../../../utl/bus-log-levels");
3
+ const busLogLevels = require("../../utl/bus-log-levels");
4
4
 
5
5
  const FULL_ON = 100;
6
6
 
@@ -144,19 +144,6 @@ function normalizeProgress(pCliOptions) {
144
144
  return lProgress ? { progress: lProgress } : {};
145
145
  }
146
146
 
147
- function normalizeCacheFolderName(pCliOptions) {
148
- const lCache = get(pCliOptions, "cache", false);
149
- let lReturnValue = clone(pCliOptions);
150
-
151
- if (lCache === true) {
152
- lReturnValue = {
153
- ...lReturnValue,
154
- cache: defaults.CACHE_FOLDER,
155
- };
156
- }
157
- return lReturnValue;
158
- }
159
-
160
147
  /**
161
148
  * returns the pOptionsAsPassedFromCommander, so that the returned value contains a
162
149
  * valid value for each possible option
@@ -170,7 +157,6 @@ module.exports = function normalizeOptions(pOptionsAsPassedFromCommander) {
170
157
  outputTo: defaults.OUTPUT_TO,
171
158
  outputType: defaults.OUTPUT_TYPE,
172
159
  ...pOptionsAsPassedFromCommander,
173
- // ...ejectNonCLIOptions(pOptionsAsPassedFromCommander, pKnownCliOptions),
174
160
  };
175
161
 
176
162
  if (has(lOptions, "moduleSystems")) {
@@ -186,7 +172,6 @@ module.exports = function normalizeOptions(pOptionsAsPassedFromCommander) {
186
172
  lOptions = { ...lOptions, ...normalizeValidationOption(lOptions) };
187
173
  lOptions = { ...lOptions, ...normalizeProgress(lOptions) };
188
174
  lOptions = { ...lOptions, ...normalizeKnownViolationsOption(lOptions) };
189
- lOptions = normalizeCacheFolderName(lOptions);
190
175
  lOptions = normalizeConfigFileName(
191
176
  lOptions,
192
177
  "webpackConfig",
package/src/main/index.js CHANGED
@@ -6,8 +6,12 @@ const enrich = require("../enrich");
6
6
  const cruiseResultSchema = require("../schema/cruise-result.schema.js");
7
7
  const meta = require("../extract/transpile/meta");
8
8
  const bus = require("../utl/bus");
9
- const { canServeFromCache, readCache, writeCache } = require("../cache/cache");
10
- const { getRevisionData } = require("../cache/revision-data");
9
+ const {
10
+ canServeFromCache,
11
+ readCache,
12
+ writeCache,
13
+ clearCache,
14
+ } = require("../cache/cache");
11
15
  const normalizeFilesAndDirectories = require("./files-and-dirs/normalize");
12
16
  const validateRuleSet = require("./rule-set/validate");
13
17
  const normalizeRuleSet = require("./rule-set/normalize");
@@ -41,23 +45,20 @@ function format(pResult, pFormatOptions = {}) {
41
45
  return reportWrap(pResult, lFormatOptions);
42
46
  }
43
47
 
44
- const TOTAL_STEPS = 8;
48
+ const TOTAL_STEPS = 9;
45
49
 
46
50
  function c(pComplete, pTotal = TOTAL_STEPS) {
47
51
  return { complete: pComplete / pTotal };
48
52
  }
49
53
 
50
54
  /** @type {import("../..").futureCruise} */
51
- // eslint-disable-next-line max-lines-per-function, complexity, max-statements
55
+ // eslint-disable-next-line max-lines-per-function, max-statements
52
56
  function futureCruise(
53
57
  pFileAndDirectoryArray,
54
58
  pCruiseOptions,
55
59
  pResolveOptions,
56
60
  pTranspileOptions
57
61
  ) {
58
- /** @type {import("../../types/cruise-result").IRevisionData|null} */
59
- let lRevisionData = null;
60
-
61
62
  bus.emit("progress", "parsing options", c(1));
62
63
  /** @type {import("../../types/strict-options").IStrictCruiseOptions} */
63
64
  let lCruiseOptions = normalizeCruiseOptions(
@@ -67,16 +68,11 @@ function futureCruise(
67
68
 
68
69
  if (lCruiseOptions.cache) {
69
70
  bus.emit("progress", "cache: checking freshness", c(2));
70
- lRevisionData = getRevisionData(
71
- new Set(
72
- meta.scannableExtensions.concat(lCruiseOptions.extraExtensionsToScan)
73
- )
74
- );
75
- if (lRevisionData && canServeFromCache(lCruiseOptions, lRevisionData)) {
76
- bus.emit("progress", "cache: retrieving from cache", c(3));
77
- const lCachedResults = readCache(lCruiseOptions.cache);
78
71
 
79
- bus.emit("progress", "cache: reporting from cache", c(4));
72
+ const lCachedResults = readCache(lCruiseOptions.cache.folder);
73
+
74
+ if (canServeFromCache(lCruiseOptions, lCachedResults)) {
75
+ bus.emit("progress", "cache: reporting from cache", c(8));
80
76
  return reportWrap(lCachedResults, lCruiseOptions);
81
77
  }
82
78
  }
@@ -114,17 +110,18 @@ function futureCruise(
114
110
  lNormalizedFileAndDirectoryArray
115
111
  );
116
112
 
117
- if (lCruiseOptions.cache && lRevisionData) {
118
- lCruiseResult.revisionData = lRevisionData;
119
- writeCache(lCruiseOptions.cache, lCruiseResult);
113
+ if (lCruiseOptions.cache) {
114
+ bus.emit("progress", "cache: saving", c(7));
115
+ writeCache(lCruiseOptions.cache.folder, lCruiseResult);
116
+ clearCache();
120
117
  }
121
118
 
122
- bus.emit("progress", "reporting", c(7));
119
+ bus.emit("progress", "reporting", c(8));
123
120
  return reportWrap(lCruiseResult, lCruiseOptions);
124
121
  }
125
122
 
126
123
  // see [api.md](../../doc/api.md) and/ or the
127
- // [type definition](../...d.ts) for details
124
+ // [type definition](../../types/dependency-cruiser.d.ts) for details
128
125
  /** @type {import("../..").cruise} */
129
126
  function cruise(pFileAndDirectoryArray, pOptions, pResolveOptions, pTSConfig) {
130
127
  return futureCruise(pFileAndDirectoryArray, pOptions, pResolveOptions, {
@@ -5,6 +5,9 @@ const has = require("lodash/has");
5
5
  const { normalizeREProperties } = require("../utl/normalize-re-properties");
6
6
  const defaults = require("./defaults.js");
7
7
 
8
+ const DEFAULT_CACHE_FOLDER = "node_modules/.cache/dependency-cruiser";
9
+ const DEFAULT_CACHE_STRATEGY = "metadata";
10
+
8
11
  function uniq(pArray) {
9
12
  return [...new Set(pArray)];
10
13
  }
@@ -139,6 +142,33 @@ function shouldCalculateMetrics(pOptions) {
139
142
  );
140
143
  }
141
144
 
145
+ /**
146
+ * @param {string|boolean|Partial<import("../../../types/cache-options").ICacheOptions>} pCacheOptions
147
+ * @returns {import("../../../types/cache-options").ICacheOptions}
148
+ */
149
+ function normalizeCacheOptions(pCacheOptions) {
150
+ let lNormalizedCacheOptions = pCacheOptions;
151
+
152
+ if (typeof pCacheOptions === "string") {
153
+ lNormalizedCacheOptions = {
154
+ folder: pCacheOptions,
155
+ };
156
+ }
157
+
158
+ if (pCacheOptions === true) {
159
+ lNormalizedCacheOptions = {};
160
+ }
161
+
162
+ // TODO: put these values in a central spot as constants
163
+ // (folder is already in src/cli/defaults.js but depending on the UI (cli)
164
+ // is not OK. We might b.t.w. wanna deduplicate the defaulting)
165
+ return {
166
+ folder: DEFAULT_CACHE_FOLDER,
167
+ strategy: DEFAULT_CACHE_STRATEGY,
168
+ ...lNormalizedCacheOptions,
169
+ };
170
+ }
171
+
142
172
  /**
143
173
  *
144
174
  * @param {import('../../../types/options').ICruiseOptions} pOptions
@@ -186,6 +216,9 @@ function normalizeCruiseOptions(pOptions, pFileAndDirectoryArray = []) {
186
216
  // if (has(pOptions, "ruleSet")) {
187
217
  // lReturnValue.ruleSet = normalizeRuleSet(pOptions.ruleSet);
188
218
  // }
219
+ if (lReturnValue.cache) {
220
+ lReturnValue.cache = normalizeCacheOptions(lReturnValue.cache);
221
+ }
189
222
 
190
223
  return normalizeFocusDepth(lReturnValue);
191
224
  }
package/src/meta.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* generated - don't edit */
2
2
 
3
3
  module.exports = {
4
- version: "12.3.0",
4
+ version: "12.4.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"]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"type":"string"}]}}},"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"]},"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","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"]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"type":"string"}]},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics","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"}}},"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","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"}}}}}}}}
@@ -0,0 +1,79 @@
1
+ const { readdirSync, statSync, readFileSync } = require("fs");
2
+ const { join } = require("path");
3
+ const ignore = require("ignore");
4
+ const pathToPosix = require("./path-to-posix");
5
+
6
+ /**
7
+ * @param {string} pFullPathToFile
8
+ * @param {string} pBaseDirectory
9
+ * @returns {boolean}
10
+ */
11
+ function fileIsDirectory(pFullPathToFile, pBaseDirectory) {
12
+ try {
13
+ const lStat = statSync(join(pBaseDirectory, pFullPathToFile));
14
+ return lStat.isDirectory();
15
+ } catch (pError) {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ /**
21
+ * @param {string} pDirectoryName
22
+ * @param {{baseDir: string; ignoreFilterFn: (pString:string, pIndex: number, pArray: string[]) => boolean)}} pOptions
23
+ * @returns {string[]}
24
+ */
25
+ function walk(pDirectoryName, { baseDir, ignoreFilterFn }) {
26
+ return readdirSync(join(baseDir, pDirectoryName))
27
+ .map((pFileName) => join(pDirectoryName, pFileName))
28
+ .filter(ignoreFilterFn)
29
+ .map((pFullPathToFile) => ({
30
+ fullPathToFile: pFullPathToFile,
31
+ isDirectory: fileIsDirectory(pFullPathToFile, baseDir),
32
+ }))
33
+ .reduce(
34
+ /**
35
+ * @param {string[]} pSum
36
+ * @param {{fullPathToFile: string; isDirectory: boolean}} pCurrentValue
37
+ * @returns {string[]}
38
+ */
39
+ (pSum, { fullPathToFile, isDirectory }) => {
40
+ if (isDirectory) {
41
+ return pSum.concat(walk(fullPathToFile, { baseDir, ignoreFilterFn }));
42
+ }
43
+ return pSum.concat(fullPathToFile);
44
+ },
45
+ []
46
+ )
47
+ .map((pFullPathToFile) => pathToPosix(pFullPathToFile));
48
+ }
49
+
50
+ function readIgnoreFile(pFileName) {
51
+ try {
52
+ return readFileSync(pFileName, "utf8");
53
+ } catch (pError) {
54
+ return "";
55
+ }
56
+ }
57
+
58
+ /**
59
+ * @param {string} pDirectoryName
60
+ * @param {{baseDir: string; ignoreFileContents?: string; additionalIgnorePatterns?: string[]}} pOptions
61
+ * @returns {string[]}
62
+ */
63
+ module.exports = function findAllFiles(
64
+ pDirectoryName,
65
+ { baseDir, ignoreFileContents, additionalIgnorePatterns }
66
+ ) {
67
+ const lIgnoreFileContents =
68
+ ignoreFileContents ?? readIgnoreFile(join(baseDir, ".gitignore"));
69
+ const lAdditionalIgnorePatterns = additionalIgnorePatterns ?? [".git"];
70
+ const lIgnoreFilterFunction = ignore()
71
+ .add(lIgnoreFileContents)
72
+ .add(lAdditionalIgnorePatterns)
73
+ .createFilter();
74
+
75
+ return walk(pDirectoryName, {
76
+ baseDir,
77
+ ignoreFilterFn: lIgnoreFilterFunction,
78
+ });
79
+ };
@@ -0,0 +1,22 @@
1
+ export type cacheStrategyType = "metadata" | "content";
2
+
3
+ export interface ICacheOptions {
4
+ /**
5
+ * The folder to store the cache in.
6
+ *
7
+ * Defaults to node_modules/.cache/dependency-cruiser/
8
+ */
9
+ folder: string;
10
+ /**
11
+ * The strategy to use for caching.
12
+ * - 'metadata': use git metadata to detect changes;
13
+ * - 'content': use (a checksum of) the contents of files to detect changes.
14
+ *
15
+ * The last one is useful if you're not on git or work on partial clones
16
+ * (which is typical on CI's). Trade-of: might be a bit slower, will not
17
+ * detect changes on files that are entirely new.
18
+ *
19
+ * Defaults to 'metadata'
20
+ */
21
+ strategy: cacheStrategyType;
22
+ }
@@ -1,15 +1,16 @@
1
- import { IReporterOptions } from "./reporter-options";
2
- import { IFlattenedRuleSet } from "./rule-set";
3
- import { ModuleSystemType, OutputType } from "./shared-types";
1
+ import { IBaselineViolations } from "./baseline-violations";
2
+ import { ICacheOptions } from "./cache-options";
4
3
  import {
5
4
  IDoNotFollowType,
6
5
  IExcludeType,
7
6
  IFocusType,
7
+ IHighlightType,
8
8
  IIncludeOnlyType,
9
9
  IReachesType,
10
- IHighlightType,
11
10
  } from "./filter-types";
12
- import { IBaselineViolations } from "./baseline-violations";
11
+ import { IReporterOptions } from "./reporter-options";
12
+ import { IFlattenedRuleSet } from "./rule-set";
13
+ import { ModuleSystemType, OutputType } from "./shared-types";
13
14
 
14
15
  export type ExternalModuleResolutionStrategyType = "node_modules" | "yarn-pnp";
15
16
  export type ProgressType = "cli-feedback" | "performance-log" | "none";
@@ -210,7 +211,7 @@ export interface ICruiseOptions {
210
211
  * attribute. E.g. when you're 100% sure you _only_ have typescript & json
211
212
  * and nothing else you can pass `['.ts', '.json']` - which can lead to performance
212
213
  * gains on systems with slow i/o (like ms-windows), especially when your
213
- * tsconfig contains paths/ aliasses.
214
+ * tsconfig contains paths/ aliases.
214
215
  */
215
216
  extensions?: string[];
216
217
  /**
@@ -220,7 +221,7 @@ export interface ICruiseOptions {
220
221
  cachedInputFileSystem?: {
221
222
  /**
222
223
  * The number of milliseconds [enhanced-resolve](webpack/enhanced-resolve)'s
223
- * cached file system should use for cache duration. Typicially you won't
224
+ * cached file system should use for cache duration. Typically you won't
224
225
  * have to touch this - the default works well for repos up to 5000 modules/
225
226
  * 20000 dependencies, and likely for numbers above as well.
226
227
  *
@@ -247,6 +248,12 @@ export interface ICruiseOptions {
247
248
  * of each major step to stderr.
248
249
  */
249
250
  type: ProgressType;
251
+ /**
252
+ * The maximum log level to emit messages at. Ranges from OFF (-1, don't " +
253
+ * show any messages), via SUMMARY (40), INFO (50), DEBUG (60) all the " +
254
+ * way to show ALL messages (99)."
255
+ */
256
+ maximumLevel?: -1 | 40 | 50 | 60 | 70 | 80 | 99;
250
257
  };
251
258
  /**
252
259
  * When this flag is set to true, dependency-cruiser will calculate (stability) metrics
@@ -254,10 +261,16 @@ export interface ICruiseOptions {
254
261
  */
255
262
  metrics?: boolean;
256
263
  /**
257
- * Location dependency-cruiser will store its cache. 'false' means: don't use
258
- * caching. Defaults to false.
264
+ * - false: don't use caching.
265
+ * - true or empty object: use caching with the default settings
266
+ * - a string (deprecated): cache in the folder denoted by the string & use the
267
+ * default caching strategy. This is deprecated - instead pass a cache object
268
+ * e.g. ```{ folder: 'your/cache/location' }```
269
+ *
270
+ * Defaults to false.
271
+ * When caching is switched on the default cache folder is 'node_modules/.cache/dependency-cruiser/'
259
272
  */
260
- cache?: false | string;
273
+ cache?: boolean | string | Partial<ICacheOptions>;
261
274
  }
262
275
 
263
276
  export interface IFormatOptions {
@@ -13,6 +13,7 @@ import {
13
13
  IStrictIncludeOnlyType,
14
14
  IStrictReachesType,
15
15
  } from "./strict-filter-types";
16
+ import { ICacheOptions } from "./cache-options";
16
17
 
17
18
  /**
18
19
  * the ICruiseOptions interface is lenient in what it accepts for convenience
@@ -40,6 +41,7 @@ export interface IStrictCruiseOptions extends ICruiseOptions {
40
41
  externalModuleResolutionStrategy: ExternalModuleResolutionStrategyType;
41
42
  exoticRequireStrings: string[];
42
43
  metrics: boolean;
44
+ cache?: false | ICacheOptions;
43
45
  }
44
46
 
45
47
  export interface IStrictFormatOptions extends IFormatOptions {