dependency-cruiser 13.0.0-beta-5 → 13.0.0-beta-7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dependency-cruiser",
3
- "version": "13.0.0-beta-5",
3
+ "version": "13.0.0-beta-7",
4
4
  "description": "Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.",
5
5
  "keywords": [
6
6
  "static analysis",
@@ -169,19 +169,19 @@
169
169
  "semver-try-require": "6.2.2",
170
170
  "teamcity-service-messages": "0.1.14",
171
171
  "tsconfig-paths-webpack-plugin": "4.0.1",
172
- "watskeburt": "0.10.2",
172
+ "watskeburt": "0.11.1",
173
173
  "wrap-ansi": "8.1.0"
174
174
  },
175
175
  "devDependencies": {
176
- "@babel/core": "7.21.4",
177
- "@babel/plugin-transform-modules-commonjs": "7.21.2",
178
- "@babel/preset-typescript": "7.21.4",
179
- "@swc/core": "1.3.53",
176
+ "@babel/core": "7.21.5",
177
+ "@babel/plugin-transform-modules-commonjs": "7.21.5",
178
+ "@babel/preset-typescript": "7.21.5",
179
+ "@swc/core": "1.3.55",
180
180
  "@types/lodash": "4.14.194",
181
- "@types/node": "18.16.0",
181
+ "@types/node": "18.16.3",
182
182
  "@types/prompts": "2.4.4",
183
- "@typescript-eslint/eslint-plugin": "5.59.0",
184
- "@typescript-eslint/parser": "5.59.0",
183
+ "@typescript-eslint/eslint-plugin": "5.59.1",
184
+ "@typescript-eslint/parser": "5.59.1",
185
185
  "@vue/compiler-sfc": "3.2.47",
186
186
  "c8": "7.13.0",
187
187
  "chai": "4.3.7",
@@ -199,7 +199,7 @@
199
199
  "eslint-plugin-unicorn": "^46.0.0",
200
200
  "husky": "8.0.3",
201
201
  "intercept-stdout": "0.1.2",
202
- "lint-staged": "13.2.1",
202
+ "lint-staged": "13.2.2",
203
203
  "mocha": "10.2.0",
204
204
  "normalize-newline": "4.1.0",
205
205
  "npm-run-all": "4.1.5",
@@ -1,6 +1,7 @@
1
- import { readFileSync, mkdirSync, writeFileSync } from "node:fs";
1
+ import { readFile, mkdir, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { scannableExtensions } from "../extract/transpile/meta.mjs";
4
+ import { bus } from "../utl/bus.mjs";
4
5
  import { optionsAreCompatible } from "./options-compatible.mjs";
5
6
  import MetadataStrategy from "./metadata-strategy.mjs";
6
7
  import ContentStrategy from "./content-strategy.mjs";
@@ -25,10 +26,10 @@ export default class Cache {
25
26
  * @param {import("../../types/dependency-cruiser.js").IRevisionData=} pRevisionData
26
27
  * @returns {boolean}
27
28
  */
28
- canServeFromCache(pCruiseOptions, pCachedCruiseResult, pRevisionData) {
29
+ async canServeFromCache(pCruiseOptions, pCachedCruiseResult, pRevisionData) {
29
30
  this.revisionData =
30
31
  pRevisionData ??
31
- this.cacheStrategy.getRevisionData(
32
+ (await this.cacheStrategy.getRevisionData(
32
33
  ".",
33
34
  pCachedCruiseResult,
34
35
  pCruiseOptions,
@@ -37,7 +38,8 @@ export default class Cache {
37
38
  scannableExtensions.concat(pCruiseOptions.extraExtensionsToScan)
38
39
  ),
39
40
  }
40
- );
41
+ ));
42
+ bus.debug("cache: - comparing");
41
43
  return (
42
44
  this.cacheStrategy.revisionDataEqual(
43
45
  pCachedCruiseResult.revisionData,
@@ -54,10 +56,10 @@ export default class Cache {
54
56
  * @param {string} pCacheFolder
55
57
  * @returns {import("../../types/dependency-cruiser.js").ICruiseResult}
56
58
  */
57
- read(pCacheFolder) {
59
+ async read(pCacheFolder) {
58
60
  try {
59
61
  return JSON.parse(
60
- readFileSync(join(pCacheFolder, CACHE_FILE_NAME), "utf8")
62
+ await readFile(join(pCacheFolder, CACHE_FILE_NAME), "utf8")
61
63
  );
62
64
  } catch (pError) {
63
65
  return { modules: [], summary: {} };
@@ -69,11 +71,11 @@ export default class Cache {
69
71
  * @param {import("../../types/dependency-cruiser.js").ICruiseResult} pCruiseResult
70
72
  * @param {import("../../types/dependency-cruiser.js").IRevisionData=} pRevisionData
71
73
  */
72
- write(pCacheFolder, pCruiseResult, pRevisionData) {
74
+ async write(pCacheFolder, pCruiseResult, pRevisionData) {
73
75
  const lRevisionData = pRevisionData ?? this.revisionData;
74
76
 
75
- mkdirSync(pCacheFolder, { recursive: true });
76
- writeFileSync(
77
+ await mkdir(pCacheFolder, { recursive: true });
78
+ await writeFile(
77
79
  join(pCacheFolder, CACHE_FILE_NAME),
78
80
  JSON.stringify(
79
81
  this.cacheStrategy.prepareRevisionDataForSaving(
@@ -2,9 +2,8 @@ import { isDeepStrictEqual } from "node:util";
2
2
  import { join } from "node:path/posix";
3
3
  import findContentChanges from "./find-content-changes.mjs";
4
4
  import {
5
- getFileHash,
5
+ getFileHashSync,
6
6
  isInterestingChangeType,
7
- addCheckSumToChange,
8
7
  moduleIsInterestingForDiff,
9
8
  } from "./helpers.mjs";
10
9
 
@@ -17,7 +16,7 @@ function addCheckSumToModule(pBaseDirectory) {
17
16
  if (moduleIsInterestingForDiff(pModule)) {
18
17
  return {
19
18
  ...pModule,
20
- checksum: getFileHash(join(pBaseDirectory, pModule.source)),
19
+ checksum: getFileHashSync(join(pBaseDirectory, pModule.source)),
21
20
  };
22
21
  }
23
22
  return pModule;
@@ -56,7 +55,6 @@ export default class ContentStrategy {
56
55
  getRevisionData(pDirectory, pCachedCruiseResult, pCruiseOptions, pOptions) {
57
56
  const lOptions = {
58
57
  diffListFn: findContentChanges,
59
- checksumFn: addCheckSumToChange,
60
58
  baseDir: process.cwd(),
61
59
  ...pOptions,
62
60
  };
@@ -1,26 +1,23 @@
1
1
  import { join } from "node:path/posix";
2
- import bus from "../utl/bus.mjs";
3
- import busLogLevels from "../utl/bus-log-levels.mjs";
2
+ import { bus } from "../utl/bus.mjs";
4
3
  import findAllFiles from "../utl/find-all-files.mjs";
5
4
  import {
6
- getFileHash,
5
+ getFileHashSync,
7
6
  excludeFilter,
8
7
  includeOnlyFilter,
9
8
  hasInterestingExtension,
10
9
  moduleIsInterestingForDiff,
11
10
  } from "./helpers.mjs";
12
11
 
13
- const { DEBUG } = busLogLevels;
14
-
15
12
  /**
16
13
  * @param {Set<string>} pFileSet
17
- * @param {typeof getFileHash} pFileHashFunction
14
+ * @param {typeof getFileHashSync} pFileHashFunction
18
15
  * @returns {(pModule:import("../..").IModule) => import('../..').IRevisionChange}
19
16
  */
20
17
  function diffCachedModuleAgainstFileSet(
21
18
  pFileSet,
22
19
  pBaseDirectory,
23
- pFileHashFunction = getFileHash
20
+ pFileHashFunction = getFileHashSync
24
21
  ) {
25
22
  return (pModule) => {
26
23
  if (!moduleIsInterestingForDiff(pModule)) {
@@ -75,7 +72,7 @@ export default function findContentChanges(
75
72
  pCachedCruiseResult,
76
73
  pOptions
77
74
  ) {
78
- bus.emit("progress", "cache: - hauling revision data", { level: DEBUG });
75
+ bus.debug("cache: - getting revision data");
79
76
  const lFileSet = new Set(
80
77
  findAllFiles(pDirectory, {
81
78
  baseDir: pOptions.baseDir,
@@ -84,12 +81,12 @@ export default function findContentChanges(
84
81
  }).filter(hasInterestingExtension(pOptions.extensions))
85
82
  );
86
83
 
87
- bus.emit("progress", "cache: - determining cached vs new", { level: DEBUG });
84
+ bus.debug("cache: - getting (cached - new)");
88
85
  const lDiffCachedVsNew = pCachedCruiseResult.modules.map(
89
86
  diffCachedModuleAgainstFileSet(lFileSet, pOptions.baseDir)
90
87
  );
91
88
 
92
- bus.emit("progress", "cache: - determining new vs cached", { level: DEBUG });
89
+ bus.debug("cache: - getting (new - cached)");
93
90
  lDiffCachedVsNew.forEach(({ name }) => lFileSet.delete(name));
94
91
 
95
92
  const lDiffNewVsCached = [];
@@ -97,10 +94,10 @@ export default function findContentChanges(
97
94
  lDiffNewVsCached.push({
98
95
  name: lFileName,
99
96
  changeType: "added",
100
- checksum: getFileHash(join(pOptions.baseDir, lFileName)),
97
+ checksum: getFileHashSync(join(pOptions.baseDir, lFileName)),
101
98
  });
102
99
  }
103
100
 
104
- bus.emit("progress", "cache: - returning revision data", { level: DEBUG });
101
+ bus.debug("cache: - returning revision data");
105
102
  return lDiffCachedVsNew.concat(lDiffNewVsCached);
106
103
  }
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable import/exports-last */
2
2
  import { createHash } from "node:crypto";
3
3
  import { readFileSync } from "node:fs";
4
+ import { readFile } from "node:fs/promises";
4
5
  import { extname } from "node:path";
5
6
  import memoize from "lodash/memoize.js";
6
7
  import { filenameMatchesPattern } from "../graph-utl/match-facade.mjs";
@@ -13,11 +14,32 @@ function hash(pString) {
13
14
  return createHash("sha1").update(pString).digest("base64");
14
15
  }
15
16
 
17
+ /**
18
+ * @param {import("fs").PathOrFileDescriptor} pFileName
19
+ * @returns {Promise<string>}
20
+ */
21
+ async function _getFileHash(pFileName) {
22
+ try {
23
+ return hash(await readFile(pFileName, "utf8"));
24
+ } catch (pError) {
25
+ return "file not found";
26
+ }
27
+ }
28
+
29
+ export const getFileHash = memoize(_getFileHash);
30
+
31
+ export async function addCheckSumToChange(pChange) {
32
+ return {
33
+ ...pChange,
34
+ checksum: await getFileHash(pChange.name),
35
+ };
36
+ }
37
+
16
38
  /**
17
39
  * @param {import("fs").PathOrFileDescriptor} pFileName
18
40
  * @returns {string}
19
41
  */
20
- function _getFileHash(pFileName) {
42
+ function _getFileHashSync(pFileName) {
21
43
  try {
22
44
  return hash(readFileSync(pFileName, "utf8"));
23
45
  } catch (pError) {
@@ -25,16 +47,16 @@ function _getFileHash(pFileName) {
25
47
  }
26
48
  }
27
49
 
28
- export const getFileHash = memoize(_getFileHash);
50
+ export const getFileHashSync = memoize(_getFileHashSync);
29
51
 
30
52
  /**
31
53
  * @param {import("watskeburt").IChange} pChange
32
54
  * @param {import("../../types/dependency-cruiser.js").IRevisionChange}
33
55
  */
34
- export function addCheckSumToChange(pChange) {
56
+ export function addCheckSumToChangeSync(pChange) {
35
57
  return {
36
58
  ...pChange,
37
- checksum: getFileHash(pChange.name),
59
+ checksum: getFileHashSync(pChange.name),
38
60
  };
39
61
  }
40
62
 
@@ -1,8 +1,9 @@
1
1
  import { isDeepStrictEqual } from "node:util";
2
- import { getSHASync, listSync } from "watskeburt";
2
+ import { getSHA, list } from "watskeburt";
3
+ import { bus } from "../utl/bus.mjs";
3
4
  import {
4
5
  isInterestingChangeType,
5
- addCheckSumToChange,
6
+ addCheckSumToChangeSync,
6
7
  excludeFilter,
7
8
  includeOnlyFilter,
8
9
  changeHasInterestingExtension,
@@ -21,26 +22,34 @@ export default class MetaDataStrategy {
21
22
  * @param {(import("watskeburt").IChange) => import("../..").IRevisionChange} pOptions.checksumFn
22
23
  * @returns {import("../../types/dependency-cruiser.js").IRevisionData}
23
24
  */
24
- getRevisionData(pDirectory, pCachedCruiseResult, pCruiseOptions, pOptions) {
25
+ async getRevisionData(
26
+ pDirectory,
27
+ pCachedCruiseResult,
28
+ pCruiseOptions,
29
+ pOptions
30
+ ) {
25
31
  const lOptions = {
26
- shaRetrievalFn: getSHASync,
27
- diffListFn: listSync,
28
- checksumFn: addCheckSumToChange,
32
+ shaRetrievalFn: getSHA,
33
+ diffListFn: list,
34
+ checksumFn: addCheckSumToChangeSync,
29
35
  ...pOptions,
30
36
  };
31
37
  try {
32
- const lSHA = lOptions.shaRetrievalFn();
38
+ bus.debug("cache: - getting sha");
39
+ const lSHA = await lOptions.shaRetrievalFn();
40
+ bus.debug("cache: - getting diff");
41
+ const lDiff = await lOptions.diffListFn(lSHA);
42
+ const lChanges = lDiff
43
+ .filter(({ name }) => excludeFilter(pCruiseOptions.exclude)(name))
44
+ .filter(({ name }) =>
45
+ includeOnlyFilter(pCruiseOptions.includeOnly)(name)
46
+ )
47
+ .filter(changeHasInterestingExtension(lOptions.extensions))
48
+ .filter(isInterestingChangeType(lOptions.interestingChangeTypes));
49
+ bus.debug("cache: - sha-summing diff");
33
50
  return {
34
51
  SHA1: lSHA,
35
- changes: lOptions
36
- .diffListFn(lSHA)
37
- .filter(({ name }) => excludeFilter(pCruiseOptions.exclude)(name))
38
- .filter(({ name }) =>
39
- includeOnlyFilter(pCruiseOptions.includeOnly)(name)
40
- )
41
- .filter(changeHasInterestingExtension(lOptions.extensions))
42
- .filter(isInterestingChangeType(lOptions.interestingChangeTypes))
43
- .map(lOptions.checksumFn),
52
+ changes: lChanges.map(lOptions.checksumFn),
44
53
  };
45
54
  } catch (pError) {
46
55
  throw new Error(
@@ -117,8 +117,8 @@ export function optionsAreCompatible(pOldOptions, pNewOptions) {
117
117
  filterOptionIsCompatible(pOldOptions.collapse, pNewOptions.collapse) &&
118
118
  limitIsCompatible(pOldOptions.maxDepth, pNewOptions.maxDepth) &&
119
119
  optionIsCompatible(
120
- pOldOptions.knownViolations,
121
- pNewOptions.knownViolations
120
+ pOldOptions.knownViolations || [],
121
+ pNewOptions.knownViolations || []
122
122
  ) &&
123
123
  optionIsCompatible(
124
124
  pOldOptions.enhancedResolveOptions,
package/src/cli/index.mjs CHANGED
@@ -1,4 +1,3 @@
1
- /* eslint-disable import/max-dependencies */
2
1
  import { join } from "node:path";
3
2
  import { glob } from "glob";
4
3
  import cloneDeep from "lodash/cloneDeep.js";
@@ -7,9 +6,8 @@ import isInstalledGlobally from "is-installed-globally";
7
6
  import chalk from "chalk";
8
7
 
9
8
  import cruise from "../main/cruise.mjs";
10
- import bus from "../utl/bus.mjs";
9
+ import { INFO, bus } from "../utl/bus.mjs";
11
10
 
12
- import busLogLevels from "../utl/bus-log-levels.mjs";
13
11
  import validateFileExistence from "./utl/validate-file-existence.mjs";
14
12
  import normalizeCliOptions from "./normalize-cli-options.mjs";
15
13
  import { write } from "./utl/io.mjs";
@@ -97,8 +95,7 @@ function setUpListener(pCruiseOptions) {
97
95
  if (Boolean(lListenerFunction)) {
98
96
  lListenerFunction(
99
97
  bus,
100
- pCruiseOptions?.ruleSet?.options?.progress?.maximumLevel ??
101
- busLogLevels.INFO
98
+ pCruiseOptions?.ruleSet?.options?.progress?.maximumLevel ?? INFO
102
99
  );
103
100
  }
104
101
  }
@@ -132,7 +129,7 @@ async function runCruise(pFileDirectoryArray, pCruiseOptions) {
132
129
  { tsConfig, babelConfig }
133
130
  );
134
131
 
135
- bus.emit("progress", "cli: writing results", { complete: 1 });
132
+ bus.progress("cli: writing results", { complete: 1 });
136
133
  bus.emit("write-start");
137
134
  write(lCruiseOptions.outputTo, lReportingResult.output);
138
135
 
@@ -1,6 +1,6 @@
1
1
  import chalk from "chalk";
2
2
  import figures from "figures";
3
- import busLogLevels from "../../utl/bus-log-levels.mjs";
3
+ import { SUMMARY } from "../../utl/bus.mjs";
4
4
 
5
5
  const FULL_ON = 100;
6
6
 
@@ -26,7 +26,7 @@ function getPercentageBar(pPercentage, pParameters) {
26
26
  function getProgressMessageWriter(pStream, pState, pMaxLogLevel) {
27
27
  return (pMessage, pOptions) => {
28
28
  const lOptions = {
29
- level: busLogLevels.SUMMARY,
29
+ level: SUMMARY,
30
30
  complete: pState.complete,
31
31
  ...(pOptions || {}),
32
32
  };
@@ -56,7 +56,7 @@ function getStartWriter(pStream) {
56
56
 
57
57
  export default function setUpCliFeedbackListener(
58
58
  pEventEmitter,
59
- pMaxLogLevel = busLogLevels.SUMMARY,
59
+ pMaxLogLevel = SUMMARY,
60
60
  pStream = process.stderr
61
61
  ) {
62
62
  const lState = {
@@ -1,5 +1,5 @@
1
1
  import { EOL } from "node:os";
2
- import busLogLevels from "../../utl/bus-log-levels.mjs";
2
+ import { INFO, SUMMARY } from "../../utl/bus.mjs";
3
3
 
4
4
  const MICRO_SECONDS_PER_SECOND = 1000000;
5
5
 
@@ -63,7 +63,7 @@ function getProgressLine(pMessage, pState, pLevel, pMaxLevel) {
63
63
 
64
64
  function getProgressWriter(pStream, pState, pMaxLevel) {
65
65
  return (pMessage, pOptions) => {
66
- const lOptions = { level: busLogLevels.SUMMARY, ...(pOptions || {}) };
66
+ const lOptions = { level: SUMMARY, ...(pOptions || {}) };
67
67
 
68
68
  pStream.write(getProgressLine(pMessage, pState, lOptions.level, pMaxLevel));
69
69
  };
@@ -71,12 +71,12 @@ function getProgressWriter(pStream, pState, pMaxLevel) {
71
71
 
72
72
  export default function setUpNDJSONListener(
73
73
  pEventEmitter,
74
- pMaxLevel = busLogLevels.INFO,
74
+ pMaxLevel = INFO,
75
75
  pStream = process.stderr
76
76
  ) {
77
77
  let lState = {
78
78
  runStartTime: new Date(Date.now()).toISOString(),
79
- previousMessage: "start of node process",
79
+ previousMessage: "nodejs starting",
80
80
  previousTime: 0,
81
81
  previousUserUsage: 0,
82
82
  previousSystemUsage: 0,
@@ -38,13 +38,13 @@ export function formatHeader() {
38
38
  return chalk
39
39
  .bold(
40
40
  `${
41
- pad("elapsed real") +
42
- pad("user") +
43
- pad("system") +
44
41
  pad("∆ rss") +
45
42
  pad("∆ heapTotal") +
46
43
  pad("∆ heapUsed") +
47
- pad("∆ external")
44
+ pad("∆ external") +
45
+ pad("⏱ system") +
46
+ pad("⏱ user") +
47
+ pad("⏱ real")
48
48
  }after step...\n`
49
49
  )
50
50
  .concat(formatDividerLine());
@@ -73,13 +73,13 @@ export function formatPerfLine({
73
73
  message,
74
74
  }) {
75
75
  return `${
76
- formatTime(elapsedTime) +
77
- formatTime(elapsedUser, MS_PER_MICRO_SECOND) +
78
- formatTime(elapsedSystem, MS_PER_MICRO_SECOND) +
79
76
  formatMemory(deltaRss) +
80
77
  formatMemory(deltaHeapTotal) +
81
78
  formatMemory(deltaHeapUsed) +
82
79
  formatMemory(deltaExternal) +
80
+ formatTime(elapsedSystem, MS_PER_MICRO_SECOND) +
81
+ formatTime(elapsedUser, MS_PER_MICRO_SECOND) +
82
+ formatTime(elapsedTime) +
83
83
  message
84
84
  }\n`;
85
85
  }
@@ -1,12 +1,9 @@
1
- import chalk from "chalk";
2
- import busLogLevels from "../../../utl/bus-log-levels.mjs";
1
+ import { INFO, SUMMARY } from "../../../utl/bus.mjs";
3
2
  import { getHeader, getProgressLine, getEndText } from "./handlers.mjs";
4
3
 
5
- let gUnderline = false;
6
-
7
4
  function getHeaderWriter(pStream, pMaxLevel) {
8
5
  return (_pMessage, pOptions) => {
9
- const lOptions = { level: busLogLevels.SUMMARY, ...(pOptions || {}) };
6
+ const lOptions = { level: SUMMARY, ...(pOptions || {}) };
10
7
 
11
8
  pStream.write(getHeader(lOptions.level, pMaxLevel));
12
9
  };
@@ -14,22 +11,19 @@ function getHeaderWriter(pStream, pMaxLevel) {
14
11
 
15
12
  function getProgressWriter(pStream, pState, pMaxLevel) {
16
13
  return (pMessage, pOptions) => {
17
- const lOptions = { level: busLogLevels.SUMMARY, ...(pOptions || {}) };
14
+ const lOptions = { level: SUMMARY, ...(pOptions || {}) };
18
15
  const lProgressLine = getProgressLine(
19
16
  pMessage,
20
17
  pState,
21
18
  lOptions.level,
22
19
  pMaxLevel
23
20
  );
24
- pStream.write(
25
- gUnderline ? `${chalk.underline(lProgressLine)}` : lProgressLine
26
- );
27
- gUnderline = !gUnderline;
21
+ pStream.write(lProgressLine);
28
22
  };
29
23
  }
30
24
 
31
25
  function getEndWriter(pStream, pState, pMaxLevel) {
32
- return (_pMessage, pLevel = busLogLevels.SUMMARY) => {
26
+ return (_pMessage, pLevel = SUMMARY) => {
33
27
  pStream.write(getEndText(pState, pLevel, pMaxLevel));
34
28
  pStream.end();
35
29
  };
@@ -37,11 +31,11 @@ function getEndWriter(pStream, pState, pMaxLevel) {
37
31
 
38
32
  export default function setUpPerformanceLogListener(
39
33
  pEventEmitter,
40
- pMaxLevel = busLogLevels.INFO,
34
+ pMaxLevel = INFO,
41
35
  pStream = process.stderr
42
36
  ) {
43
37
  let lState = {
44
- previousMessage: "start of node process",
38
+ previousMessage: "nodejs starting",
45
39
  previousTime: 0,
46
40
  previousUserUsage: 0,
47
41
  previousSystemUsage: 0,
@@ -1,5 +1,4 @@
1
- import bus from "../utl/bus.mjs";
2
- import busLogLevels from "../utl/bus-log-levels.mjs";
1
+ import { bus } from "../utl/bus.mjs";
3
2
  import addFocus from "../graph-utl/add-focus.mjs";
4
3
  import IndexedModuleGraph from "../graph-utl/indexed-module-graph.mjs";
5
4
  import deriveCycles from "./derive/circular.mjs";
@@ -11,31 +10,27 @@ import softenKnownViolations from "./soften-known-violations.mjs";
11
10
  import deriveModuleMetrics from "./derive/metrics/index.mjs";
12
11
 
13
12
  export default function enrichModules(pModules, pOptions) {
14
- bus.emit("progress", "analyzing: cycles", { level: busLogLevels.INFO });
13
+ bus.info("analyzing: cycles");
15
14
  const lIndexedModules = new IndexedModuleGraph(pModules);
16
15
  let lModules = deriveCycles(pModules, lIndexedModules, {
17
16
  pSourceAttribute: "source",
18
17
  pDependencyName: "resolved",
19
18
  });
20
- bus.emit("progress", "analyzing: dependents", { level: busLogLevels.INFO });
19
+ bus.info("analyzing: dependents");
21
20
  lModules = addDependents(lModules);
22
- bus.emit("progress", "analyzing: orphans", { level: busLogLevels.INFO });
21
+ bus.info("analyzing: orphans");
23
22
  lModules = deriveOrphans(lModules);
24
- bus.emit("progress", "analyzing: reachables", { level: busLogLevels.INFO });
23
+ bus.info("analyzing: reachables");
25
24
  lModules = deriveReachable(lModules, pOptions.ruleSet);
26
- bus.emit("progress", "analyzing: module metrics", {
27
- level: busLogLevels.INFO,
28
- });
25
+ bus.info("analyzing: module metrics");
29
26
  lModules = deriveModuleMetrics(lModules, pOptions);
30
- bus.emit("progress", "analyzing: add focus (if any)", {
31
- level: busLogLevels.INFO,
32
- });
27
+ bus.info("analyzing: add focus (if any)");
33
28
  lModules = addFocus(lModules, pOptions.focus);
34
29
 
35
30
  // when validate === false we might want to skip the addValidations.
36
31
  // We don't at this time, however, as "valid" is a mandatory
37
32
  // attribute (to simplify reporter logic)
38
- bus.emit("progress", "analyzing: validations", { level: busLogLevels.INFO });
33
+ bus.info("analyzing: validations");
39
34
  lModules = addValidations(lModules, pOptions.ruleSet, pOptions.validate);
40
35
 
41
36
  lModules = softenKnownViolations(lModules, pOptions.knownViolations);
@@ -1,5 +1,4 @@
1
- import bus from "../utl/bus.mjs";
2
- import busLogLevels from "../utl/bus-log-levels.mjs";
1
+ import { bus } from "../utl/bus.mjs";
3
2
  import isSameViolation from "./summarize/is-same-violation.mjs";
4
3
 
5
4
  function softenModuleViolation(
@@ -118,9 +117,7 @@ export default function softenKnownViolations(
118
117
  pSoftenedSeverity = "ignore"
119
118
  ) {
120
119
  if (Boolean(pKnownViolations)) {
121
- bus.emit("progress", "analyzing: comparing against known errors", {
122
- level: busLogLevels.INFO,
123
- });
120
+ bus.info("analyzing: comparing against known errors");
124
121
  return pModules.map((pModule) =>
125
122
  softenKnownViolation(pModule, pKnownViolations, pSoftenedSeverity)
126
123
  );
@@ -1,6 +1,5 @@
1
1
  import has from "lodash/has.js";
2
- import bus from "../utl/bus.mjs";
3
- import busLogLevels from "../utl/bus-log-levels.mjs";
2
+ import { bus } from "../utl/bus.mjs";
4
3
  import getDependencies from "./get-dependencies.mjs";
5
4
  import gatherInitialSources from "./gather-initial-sources.mjs";
6
5
  import clearCaches from "./clear-caches.mjs";
@@ -62,17 +61,13 @@ function extractFileDirectoryArray(
62
61
  ) {
63
62
  let lVisited = new Set();
64
63
 
65
- bus.emit("progress", "reading files: gathering initial sources", {
66
- level: busLogLevels.INFO,
67
- });
64
+ bus.info("reading files: gathering initial sources");
68
65
  const lInitialSources = gatherInitialSources(
69
66
  pFileDirectoryArray,
70
67
  pCruiseOptions
71
68
  );
72
69
 
73
- bus.emit("progress", "reading files: visiting dependencies", {
74
- level: busLogLevels.INFO,
75
- });
70
+ bus.info("reading files: visiting dependencies");
76
71
  return lInitialSources.reduce((pDependencies, pFilename) => {
77
72
  if (!lVisited.has(pFilename)) {
78
73
  lVisited.add(pFilename);
@@ -1,4 +1,77 @@
1
- import { getWrapper } from "./meta.mjs";
1
+ /* eslint-disable import/exports-last */
2
+ /* eslint security/detect-object-injection : 0*/
3
+ import javaScriptWrap from "./javascript-wrap.mjs";
4
+ import typeScriptWrap from "./typescript-wrap.mjs";
5
+ import liveScriptWrap from "./livescript-wrap.mjs";
6
+ import coffeeWrap from "./coffeescript-wrap.mjs";
7
+ import vueWrap from "./vue-template-wrap.cjs";
8
+ import babelWrap from "./babel-wrap.mjs";
9
+ import svelteDingus from "./svelte-wrap.mjs";
10
+
11
+ const typeScriptVanillaWrap = typeScriptWrap();
12
+ const typeScriptESMWrap = typeScriptWrap("esm");
13
+ const typeScriptTsxWrap = typeScriptWrap("tsx");
14
+ const coffeeVanillaWrap = coffeeWrap();
15
+ const litCoffeeWrap = coffeeWrap(true);
16
+ const svelteWrap = svelteDingus(typeScriptVanillaWrap);
17
+
18
+ export const EXTENSION2WRAPPER = {
19
+ ".js": javaScriptWrap,
20
+ ".cjs": javaScriptWrap,
21
+ ".mjs": javaScriptWrap,
22
+ ".jsx": javaScriptWrap,
23
+ ".ts": typeScriptVanillaWrap,
24
+ ".tsx": typeScriptTsxWrap,
25
+ ".d.ts": typeScriptVanillaWrap,
26
+ ".cts": typeScriptVanillaWrap,
27
+ ".d.cts": typeScriptVanillaWrap,
28
+ ".mts": typeScriptESMWrap,
29
+ ".d.mts": typeScriptESMWrap,
30
+ ".vue": vueWrap,
31
+ ".svelte": svelteWrap,
32
+ ".ls": liveScriptWrap,
33
+ ".coffee": coffeeVanillaWrap,
34
+ ".litcoffee": litCoffeeWrap,
35
+ ".coffee.md": litCoffeeWrap,
36
+ ".csx": coffeeVanillaWrap,
37
+ ".cjsx": coffeeVanillaWrap,
38
+ };
39
+
40
+ const BABELEABLE_EXTENSIONS = [
41
+ ".js",
42
+ ".cjs",
43
+ ".mjs",
44
+ ".jsx",
45
+ ".ts",
46
+ ".tsx",
47
+ ".d.ts",
48
+ ];
49
+
50
+ /**
51
+ * returns the babel wrapper if there's a babelConfig in the transpiler
52
+ * options for babeleable extensions (javascript and typescript - currently
53
+ * not configurable)
54
+ *
55
+ * returns the wrapper module configured for the extension pExtension if
56
+ * not.
57
+ *
58
+ * returns the javascript wrapper if there's no wrapper module configured
59
+ * for the extension.
60
+ *
61
+ * @param {string} pExtension the extension (e.g. ".ts", ".js", ".litcoffee")
62
+ * @param {any} pTranspilerOptions
63
+ * @returns {module} the module
64
+ */
65
+ export function getWrapper(pExtension, pTranspilerOptions) {
66
+ if (
67
+ Object.keys(pTranspilerOptions?.babelConfig ?? {}).length > 0 &&
68
+ BABELEABLE_EXTENSIONS.includes(pExtension)
69
+ ) {
70
+ return babelWrap;
71
+ }
72
+
73
+ return EXTENSION2WRAPPER[pExtension] || javaScriptWrap;
74
+ }
2
75
 
3
76
  /**
4
77
  * Transpiles the string pFile with the transpiler configured for extension
@@ -1,66 +1,58 @@
1
+ /* eslint-disable import/exports-last */
1
2
  /* eslint security/detect-object-injection : 0*/
2
3
  import meta from "../../meta.js";
3
- import swc from "../parse/to-swc-ast.mjs";
4
- import javaScriptWrap from "./javascript-wrap.mjs";
5
- import typeScriptWrap from "./typescript-wrap.mjs";
6
- import liveScriptWrap from "./livescript-wrap.mjs";
7
- import coffeeWrap from "./coffeescript-wrap.mjs";
8
- import vueWrap from "./vue-template-wrap.cjs";
9
- import babelWrap from "./babel-wrap.mjs";
10
- import svelteDingus from "./svelte-wrap.mjs";
4
+ import tryAvailable from "./try-import-available.mjs";
11
5
 
12
- const typeScriptVanillaWrap = typeScriptWrap();
13
- const typeScriptESMWrap = typeScriptWrap("esm");
14
- const typeScriptTsxWrap = typeScriptWrap("tsx");
15
- const coffeeVanillaWrap = coffeeWrap();
16
- const litCoffeeWrap = coffeeWrap(true);
17
- const svelteWrap = svelteDingus(typeScriptVanillaWrap);
6
+ function gotCoffee() {
7
+ return (
8
+ tryAvailable("coffeescript", meta.supportedTranspilers.coffeescript) ||
9
+ tryAvailable("coffee-script", meta.supportedTranspilers["coffee-script"])
10
+ );
11
+ }
18
12
 
19
- const EXTENSION2WRAPPER = {
20
- ".js": javaScriptWrap,
21
- ".cjs": javaScriptWrap,
22
- ".mjs": javaScriptWrap,
23
- ".jsx": javaScriptWrap,
24
- ".ts": typeScriptVanillaWrap,
25
- ".tsx": typeScriptTsxWrap,
26
- ".d.ts": typeScriptVanillaWrap,
27
- ".cts": typeScriptVanillaWrap,
28
- ".d.cts": typeScriptVanillaWrap,
29
- ".mts": typeScriptESMWrap,
30
- ".d.mts": typeScriptESMWrap,
31
- ".vue": vueWrap,
32
- ".svelte": svelteWrap,
33
- ".ls": liveScriptWrap,
34
- ".coffee": coffeeVanillaWrap,
35
- ".litcoffee": litCoffeeWrap,
36
- ".coffee.md": litCoffeeWrap,
37
- ".csx": coffeeVanillaWrap,
38
- ".cjsx": coffeeVanillaWrap,
13
+ const TRANSPILER2AVAILABLE = {
14
+ babel: tryAvailable("@babel/core", meta.supportedTranspilers.babel),
15
+ javascript: true,
16
+ "coffee-script": gotCoffee(),
17
+ coffeescript: gotCoffee(),
18
+ livescript: tryAvailable("livescript", meta.supportedTranspilers.livescript),
19
+ svelte: tryAvailable("svelte/compiler", meta.supportedTranspilers.svelte),
20
+ swc: tryAvailable("@swc/core", meta.supportedTranspilers.swc),
21
+ typescript: tryAvailable("typescript", meta.supportedTranspilers.typescript),
22
+ "vue-template-compiler": tryAvailable(
23
+ "vue-template-compiler",
24
+ meta.supportedTranspilers["vue-template-compiler"]
25
+ ),
26
+ "@vue/compiler-sfc": tryAvailable(
27
+ "@vue/compiler-sfc",
28
+ meta.supportedTranspilers["@vue/compiler-sfc"]
29
+ ),
39
30
  };
40
31
 
41
- const TRANSPILER2WRAPPER = {
42
- babel: babelWrap,
43
- javascript: javaScriptWrap,
44
- "coffee-script": coffeeVanillaWrap,
45
- coffeescript: coffeeVanillaWrap,
46
- livescript: liveScriptWrap,
47
- svelte: svelteWrap,
48
- swc,
49
- typescript: typeScriptVanillaWrap,
50
- "vue-template-compiler": vueWrap,
51
- "@vue/compiler-sfc": vueWrap,
32
+ export const EXTENSION2AVAILABLE = {
33
+ ".js": TRANSPILER2AVAILABLE.javascript,
34
+ ".cjs": TRANSPILER2AVAILABLE.javascript,
35
+ ".mjs": TRANSPILER2AVAILABLE.javascript,
36
+ ".jsx": TRANSPILER2AVAILABLE.javascript,
37
+ ".ts": TRANSPILER2AVAILABLE.typescript,
38
+ ".tsx": TRANSPILER2AVAILABLE.typescript,
39
+ ".d.ts": TRANSPILER2AVAILABLE.typescript,
40
+ ".cts": TRANSPILER2AVAILABLE.typescript,
41
+ ".d.cts": TRANSPILER2AVAILABLE.typescript,
42
+ ".mts": TRANSPILER2AVAILABLE.typescript,
43
+ ".d.mts": TRANSPILER2AVAILABLE.typescript,
44
+ ".vue":
45
+ TRANSPILER2AVAILABLE["vue-template-compiler"] ||
46
+ TRANSPILER2AVAILABLE["@vue/compiler-sfc"],
47
+ ".svelte": TRANSPILER2AVAILABLE.svelte,
48
+ ".ls": TRANSPILER2AVAILABLE.livescript,
49
+ ".coffee": gotCoffee(),
50
+ ".litcoffee": gotCoffee(),
51
+ ".coffee.md": gotCoffee(),
52
+ ".csx": gotCoffee(),
53
+ ".cjsx": gotCoffee(),
52
54
  };
53
55
 
54
- const BABELEABLE_EXTENSIONS = [
55
- ".js",
56
- ".cjs",
57
- ".mjs",
58
- ".jsx",
59
- ".ts",
60
- ".tsx",
61
- ".d.ts",
62
- ];
63
-
64
56
  const EXTENSIONS_PER_PARSER = {
65
57
  swc: [".js", ".cjs", ".mjs", ".jsx", ".ts", ".tsx", ".d.ts"],
66
58
  // tsc: [".js", ".cjs", ".mjs", ".jsx", ".ts", ".tsx", ".d.ts"],
@@ -69,44 +61,19 @@ const EXTENSIONS_PER_PARSER = {
69
61
 
70
62
  function extensionIsAvailable(pExtension) {
71
63
  return (
72
- EXTENSION2WRAPPER[pExtension].isAvailable() ||
64
+ EXTENSION2AVAILABLE[pExtension] ||
73
65
  // should eventually also check whether swc is enabled as a parser?
74
- (swc.isAvailable() && EXTENSIONS_PER_PARSER.swc.includes(pExtension))
66
+ (TRANSPILER2AVAILABLE.swc && EXTENSIONS_PER_PARSER.swc.includes(pExtension))
75
67
  );
76
68
  }
77
69
 
78
- /**
79
- * returns the babel wrapper if there's a babelConfig in the transpiler
80
- * options for babeleable extensions (javascript and typescript - currently
81
- * not configurable)
82
- *
83
- * returns the wrapper module configured for the extension pExtension if
84
- * not.
85
- *
86
- * returns the javascript wrapper if there's no wrapper module configured
87
- * for the extension.
88
- *
89
- * @param {string} pExtension the extension (e.g. ".ts", ".js", ".litcoffee")
90
- * @param {any} pTranspilerOptions
91
- * @returns {module} the module
92
- */
93
- export function getWrapper(pExtension, pTranspilerOptions) {
94
- if (
95
- Object.keys(pTranspilerOptions?.babelConfig ?? {}).length > 0 &&
96
- BABELEABLE_EXTENSIONS.includes(pExtension)
97
- ) {
98
- return babelWrap;
99
- }
100
- return EXTENSION2WRAPPER[pExtension] || javaScriptWrap;
101
- }
102
-
103
70
  /**
104
71
  * all supported extensions and whether or not it is supported
105
72
  * in the current environment
106
73
  *
107
74
  * @type {IAvailableExtension[]}
108
75
  */
109
- export const allExtensions = Object.keys(EXTENSION2WRAPPER).map(
76
+ export const allExtensions = Object.keys(EXTENSION2AVAILABLE).map(
110
77
  (pExtension) => ({
111
78
  extension: pExtension,
112
79
  available: extensionIsAvailable(pExtension),
@@ -120,7 +87,7 @@ export const allExtensions = Object.keys(EXTENSION2WRAPPER).map(
120
87
  * @type {string[]}
121
88
  */
122
89
  export const scannableExtensions =
123
- Object.keys(EXTENSION2WRAPPER).filter(extensionIsAvailable);
90
+ Object.keys(EXTENSION2AVAILABLE).filter(extensionIsAvailable);
124
91
 
125
92
  /**
126
93
  * returns an array of supported transpilers, with for each transpiler:
@@ -133,6 +100,6 @@ export function getAvailableTranspilers() {
133
100
  return Object.keys(meta.supportedTranspilers).map((pTranspiler) => ({
134
101
  name: pTranspiler,
135
102
  version: meta.supportedTranspilers[pTranspiler],
136
- available: TRANSPILER2WRAPPER[pTranspiler].isAvailable(),
103
+ available: TRANSPILER2AVAILABLE[pTranspiler],
137
104
  }));
138
105
  }
@@ -0,0 +1,46 @@
1
+ import path from "node:path/posix";
2
+ import { createRequire } from "node:module";
3
+ import { coerce, satisfies } from "semver";
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const PACKAGE_RE = "[^/]+";
8
+ const SCOPED_PACKAGE_RE = "@[^/]+(/[^/]+)";
9
+ const ROOT_MODULE_RE = new RegExp(`^(${SCOPED_PACKAGE_RE}|${PACKAGE_RE})`, "g");
10
+
11
+ function extractRootModuleName(pModuleName) {
12
+ return (pModuleName.match(ROOT_MODULE_RE) || []).shift();
13
+ }
14
+
15
+ function getVersion(pModuleName) {
16
+ // of course we'd love to use something like an import with an import assertion
17
+ // (yo, you're import-ing 'json'!), but that's _experimental_, printing scary
18
+ // messages to stderr so: ¯\_(ツ)_/¯
19
+ // eslint-disable-next-line import/no-dynamic-require, security/detect-non-literal-require
20
+ const lManifest = require(path.join(
21
+ extractRootModuleName(pModuleName),
22
+ "package.json"
23
+ ));
24
+ return lManifest.version;
25
+ }
26
+
27
+ export default function tryImportAvailable(pModuleName, pSemanticVersion) {
28
+ try {
29
+ if (pSemanticVersion) {
30
+ const lVersion = getVersion(pModuleName);
31
+ const lCoerced = coerce(lVersion);
32
+ if (
33
+ lVersion &&
34
+ lCoerced &&
35
+ !satisfies(lCoerced.version, pSemanticVersion)
36
+ ) {
37
+ return false;
38
+ }
39
+ }
40
+ // of course we'd love to use something like import.meta.resolve, but
41
+ // that's _experimental_, so ¯\_(ツ)_/¯
42
+ return Boolean(require.resolve(pModuleName));
43
+ } catch (pError) {
44
+ return false;
45
+ }
46
+ }
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable no-return-await */
2
2
  /* eslint-disable no-magic-numbers */
3
-
4
- import bus from "../utl/bus.mjs";
3
+ import { bus } from "../utl/bus.mjs";
5
4
  import { validateCruiseOptions } from "./options/validate.mjs";
6
5
  import { normalizeCruiseOptions } from "./options/normalize.mjs";
7
6
  import reportWrap from "./report-wrap.mjs";
@@ -20,7 +19,7 @@ export default async function cruise(
20
19
  pResolveOptions,
21
20
  pTranspileOptions
22
21
  ) {
23
- bus.emit("progress", "parsing options", c(1));
22
+ bus.summary("parsing options", c(1));
24
23
  /** @type {import("../../types/strict-options.js").IStrictCruiseOptions} */
25
24
  let lCruiseOptions = normalizeCruiseOptions(
26
25
  validateCruiseOptions(pCruiseOptions),
@@ -29,23 +28,22 @@ export default async function cruise(
29
28
  let lCache = null;
30
29
 
31
30
  if (lCruiseOptions.cache) {
32
- bus.emit(
33
- "progress",
34
- `cache: check freshness with ${lCruiseOptions.cache.strategy}`,
31
+ bus.summary(
32
+ `cache: checking freshness with ${lCruiseOptions.cache.strategy}`,
35
33
  c(2)
36
34
  );
37
35
 
38
36
  const { default: Cache } = await import("../cache/cache.mjs");
39
37
  lCache = new Cache(lCruiseOptions.cache.strategy);
40
- const lCachedResults = lCache.read(lCruiseOptions.cache.folder);
38
+ const lCachedResults = await lCache.read(lCruiseOptions.cache.folder);
41
39
 
42
- if (lCache.canServeFromCache(lCruiseOptions, lCachedResults)) {
43
- bus.emit("progress", "cache: reporting from cache", c(8));
40
+ if (await lCache.canServeFromCache(lCruiseOptions, lCachedResults)) {
41
+ bus.summary("cache: reporting from cache", c(8));
44
42
  return await reportWrap(lCachedResults, lCruiseOptions);
45
43
  }
46
44
  }
47
45
 
48
- bus.emit("progress", "importing analytical modules", c(3));
46
+ bus.summary("importing analytical modules", c(3));
49
47
  const [
50
48
  { default: normalizeRuleSet },
51
49
  { default: validateRuleSet },
@@ -65,7 +63,7 @@ export default async function cruise(
65
63
  ]);
66
64
 
67
65
  if (Boolean(lCruiseOptions.ruleSet)) {
68
- bus.emit("progress", "parsing rule set", c(4));
66
+ bus.summary("parsing rule set", c(4));
69
67
  lCruiseOptions.ruleSet = normalizeRuleSet(
70
68
  validateRuleSet(lCruiseOptions.ruleSet)
71
69
  );
@@ -75,14 +73,14 @@ export default async function cruise(
75
73
  pFileAndDirectoryArray
76
74
  );
77
75
 
78
- bus.emit("progress", "determining how to resolve", c(5));
76
+ bus.summary("determining how to resolve", c(5));
79
77
  const lNormalizedResolveOptions = await normalizeResolveOptions(
80
78
  pResolveOptions,
81
79
  lCruiseOptions,
82
80
  pTranspileOptions?.tsConfig
83
81
  );
84
82
 
85
- bus.emit("progress", "reading files", c(6));
83
+ bus.summary("reading files", c(6));
86
84
  const lExtractionResult = extract(
87
85
  lNormalizedFileAndDirectoryArray,
88
86
  lCruiseOptions,
@@ -90,7 +88,7 @@ export default async function cruise(
90
88
  pTranspileOptions
91
89
  );
92
90
 
93
- bus.emit("progress", "analyzing", c(7));
91
+ bus.summary("analyzing", c(7));
94
92
  const lCruiseResult = enrich(
95
93
  lExtractionResult,
96
94
  lCruiseOptions,
@@ -98,10 +96,10 @@ export default async function cruise(
98
96
  );
99
97
 
100
98
  if (lCruiseOptions.cache) {
101
- bus.emit("progress", "cache: save", c(8));
102
- lCache.write(lCruiseOptions.cache.folder, lCruiseResult);
99
+ bus.summary("cache: saving", c(8));
100
+ await lCache.write(lCruiseOptions.cache.folder, lCruiseResult);
103
101
  }
104
102
 
105
- bus.emit("progress", "reporting", c(9));
103
+ bus.summary("reporting", c(9));
106
104
  return await reportWrap(lCruiseResult, lCruiseOptions);
107
105
  }
package/src/meta.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* generated - don't edit */
2
2
 
3
3
  module.exports = {
4
- version: "13.0.0-beta-5",
4
+ version: "13.0.0-beta-7",
5
5
  engines: {
6
6
  node: "^16.14||>=18",
7
7
  },
@@ -1 +1 @@
1
- /* generated - don't edit */export default {"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"}},"mainFields":{"type":"array"},"mainFiles":{"type":"array"},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics","markdown","mermaid"]},{"type":"string","pattern":"^plugin:[^:]+$"}]},"CompoundExcludeType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dynamic":{"type":"boolean"}}},"CompoundDoNotFollowType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}}}},"CompoundIncludeOnlyType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundFocusType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"ReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"anon":{"$ref":"#/definitions/AnonReporterOptionsType"},"archi":{"$ref":"#/definitions/DotReporterOptionsType"},"dot":{"$ref":"#/definitions/DotReporterOptionsType"},"ddot":{"$ref":"#/definitions/DotReporterOptionsType"},"flat":{"$ref":"#/definitions/DotReporterOptionsType"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"AnonReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"wordlist":{"type":"array","items":{"type":"string"}}}},"MetricsReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"orderBy":{"type":"string","enum":["instability","moduleCount","afferentCouplings","efferentCouplings","name"]},"hideModules":{"type":"boolean"},"hideFolders":{"type":"boolean"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"type":"boolean"}}},"DotReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"collapsePattern":{"$ref":"#/definitions/REAsStringsType"},"filters":{"$ref":"#/definitions/ReporterFiltersType"},"showMetrics":{"type":"boolean"},"theme":{"$ref":"#/definitions/DotThemeType"}}},"DotThemeType":{"type":"object","additionalProperties":false,"properties":{"replace":{"type":"boolean"},"graph":{"type":"object"},"node":{"type":"object"},"edge":{"type":"object"},"modules":{"$ref":"#/definitions/DotThemeArrayType"},"dependencies":{"$ref":"#/definitions/DotThemeArrayType"}}},"DotThemeArrayType":{"type":"array","items":{"$ref":"#/definitions/DotThemeEntryType"}},"DotThemeEntryType":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object"},"attributes":{"type":"object"}}},"ReporterFiltersType":{"type":"object","additionalProperties":false,"properties":{"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"$ref":"#/definitions/CompoundIncludeOnlyType"},"focus":{"$ref":"#/definitions/CompoundFocusType"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"RevisionDataType":{"type":"object","required":["SHA1","changes"],"properties":{"SHA1":{"type":"string"},"changes":{"type":"array","items":{"type":"object","required":["name","changeType"],"properties":{"name":{"type":"string"},"changeType":{"type":"string","enum":["added","copied","deleted","modified","renamed","type changed","unmerged","pairing broken","unknown","unmodified","untracked","ignored"]},"oldName":{"type":"string"},"checksum":{"type":"string"},"args":{"type":"array","items":{"type":"string"}},"rulesFile":{"type":"string"}}}}}}}}
1
+ /* generated - don't edit */export default {"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"},"checksum":{"type":"string"}}},"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"}},"mainFields":{"type":"array"},"mainFiles":{"type":"array"},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics","markdown","mermaid","null"]},{"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"}}}}}}}}
package/src/utl/bus.mjs CHANGED
@@ -1,5 +1,30 @@
1
+ /* eslint-disable import/exports-last */
1
2
  import EventEmitter from "node:events";
2
3
 
3
- const gBus = new EventEmitter();
4
+ export const OFF = -1;
5
+ export const SUMMARY = 40;
6
+ export const INFO = 50;
7
+ export const DEBUG = 60;
8
+ export const TRACE = 70;
9
+ export const EXTRA_STRONG = 80;
10
+ export const ALL = 99;
4
11
 
5
- export default gBus;
12
+ class Bus extends EventEmitter {
13
+ progress(pMessage, pOptions, ...pArguments) {
14
+ this.emit("progress", pMessage, pOptions, pArguments);
15
+ }
16
+
17
+ summary(pMessage, pOptions, ...pArguments) {
18
+ this.progress(pMessage, { ...pOptions, level: SUMMARY }, pArguments);
19
+ }
20
+
21
+ info(pMessage, pOptions, ...pArguments) {
22
+ this.progress(pMessage, { ...pOptions, level: INFO }, pArguments);
23
+ }
24
+
25
+ debug(pMessage, pOptions, ...pArguments) {
26
+ this.progress(pMessage, { ...pOptions, level: DEBUG }, pArguments);
27
+ }
28
+ }
29
+
30
+ export const bus = new Bus();
@@ -139,6 +139,12 @@ export interface IModule {
139
139
  * was asked to calculate metrics.
140
140
  */
141
141
  instability?: number;
142
+ /**
143
+ * checksum of the contents of the module. This attribute is currently only
144
+ * available when the cruise was executed with caching and the cache strategy
145
+ * is 'content'.
146
+ */
147
+ checksum?: string;
142
148
  }
143
149
 
144
150
  export interface IDependency {
@@ -21,6 +21,7 @@ export type OutputType =
21
21
  | "metrics"
22
22
  | "markdown"
23
23
  | "mermaid"
24
+ | "null"
24
25
  // for plugins: string. TODO: research whether it's possible to
25
26
  // tie this down to the `^plugin:[^:]+-reporter-plugin.c?js$` regex
26
27
  | string;
@@ -1,9 +0,0 @@
1
- export default {
2
- OFF: -1,
3
- SUMMARY: 40,
4
- INFO: 50,
5
- DEBUG: 60,
6
- TRACE: 70,
7
- EXTRA_STRONG: 80,
8
- ALL: 99,
9
- };