dependency-cruiser 16.0.0-beta-1 → 16.0.0-beta-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -62,8 +62,8 @@ npx depcruise src --include-only "^src" --output-type dot | dot -T svg > depende
62
62
  > <details>
63
63
  > <summary>dependency-cruiser v12 and older: add --config option</summary>
64
64
  >
65
- > While not necessary from dependency-cruiser v13, in v12 and older you'll have
66
- > to pass the --config option to make it find the .dependency-cruiser.js
65
+ > While not necessary from dependency-cruiser v13 and later, in v12 and older
66
+ > you'll have to pass the --config option to make it find the .dependency-cruiser.js
67
67
  > configuration file:
68
68
  >
69
69
  > ```shell
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dependency-cruiser",
3
- "version": "16.0.0-beta-1",
3
+ "version": "16.0.0-beta-3",
4
4
  "description": "Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.",
5
5
  "keywords": [
6
6
  "static analysis",
package/src/cli/index.mjs CHANGED
@@ -137,7 +137,7 @@ async function runCruise(pFileDirectoryArray, pCruiseOptions) {
137
137
  /**
138
138
  *
139
139
  * @param {string[]} pFileDirectoryArray
140
- * @param {import("../../types/options").ICruiseOptions} lCruiseOptions
140
+ * @param {import("../../types/options.mjs").ICruiseOptions} lCruiseOptions
141
141
  * @returns {number}
142
142
  */
143
143
  export default async function executeCli(pFileDirectoryArray, pCruiseOptions) {
@@ -229,8 +229,20 @@ module.exports = {
229
229
  */
230
230
  // focus : '',
231
231
 
232
- /* list of module systems to cruise */
233
- // moduleSystems: ['amd', 'cjs', 'es6', 'tsd'],
232
+ /* List of module systems to cruise.
233
+ When left out dependency-cruiser will fall back to the list of _all_
234
+ module systems it knows of. It's the safe option, but might come at a
235
+ performance penalty:
236
+ moduleSystems: ['amd', 'cjs', 'es6', 'tsd']
237
+
238
+ As in practice only commonjs ('cjs') and ecmascript modules ('es6')
239
+ are widely used, we set these here as default. Might you make use of
240
+ asynchronous module definitions ('amd' - require.js style), or typescript's
241
+ legacy triple slash directives ('tsd') you can add these to the array
242
+ yourself or comment the moduleSystems entry out.
243
+ */
244
+
245
+ moduleSystems: ['cjs', 'es6'],
234
246
 
235
247
  /* prefix for links in html and svg output (e.g. 'https://github.com/you/yourrepo/blob/develop/'
236
248
  to open it on your online repo or \`vscode://file/$\{process.cwd()}/\` to
@@ -35,15 +35,18 @@ function writeToStdOut(pString, pBufferSize = PIPE_BUFFER_SIZE) {
35
35
  const lChunkStart = lIndex * pBufferSize;
36
36
  process.stdout.write(
37
37
  pString.substring(lChunkStart, lChunkStart + pBufferSize),
38
- "utf8"
38
+ "utf8",
39
39
  );
40
40
  }
41
41
  }
42
42
  export function write(pOutputTo, pContent) {
43
+ const lContentWithTrailingNewline = pContent.endsWith("\n")
44
+ ? pContent
45
+ : `${pContent}\n`;
43
46
  if ("-" === pOutputTo) {
44
- writeToStdOut(pContent);
47
+ writeToStdOut(lContentWithTrailingNewline);
45
48
  } else {
46
- writeToFile(pOutputTo, pContent);
49
+ writeToFile(pOutputTo, lContentWithTrailingNewline);
47
50
  }
48
51
  }
49
52
 
@@ -14,9 +14,10 @@ function extractRegularAMDDependencies(pNode, pDependencies) {
14
14
  moduleSystem: "amd",
15
15
  dynamic: false,
16
16
  exoticallyRequired: false,
17
+ dependencyTypes: ["amd-define"],
17
18
  });
18
19
  }
19
- })
20
+ }),
20
21
  );
21
22
  }
22
23
  }
@@ -30,16 +31,16 @@ function extractCommonJSWrappers(pNode, pDependencies, pExoticRequireStrings) {
30
31
  pArgument.params.some(
31
32
  (pParameter) =>
32
33
  pParameter.name === "require" ||
33
- pExoticRequireStrings.includes(pParameter.name)
34
- )
34
+ pExoticRequireStrings.includes(pParameter.name),
35
+ ),
35
36
  )
36
37
  .forEach((pFunction) =>
37
38
  extractCommonJSDependencies(
38
39
  pFunction.body,
39
40
  pDependencies,
40
41
  "amd",
41
- pExoticRequireStrings
42
- )
42
+ pExoticRequireStrings,
43
+ ),
43
44
  );
44
45
  }
45
46
  }
@@ -47,7 +48,7 @@ function extractCommonJSWrappers(pNode, pDependencies, pExoticRequireStrings) {
47
48
  export default function extractAMDDependencies(
48
49
  pAST,
49
50
  pDependencies,
50
- pExoticRequireStrings
51
+ pExoticRequireStrings,
51
52
  ) {
52
53
  walk_simple(
53
54
  pAST,
@@ -67,6 +68,6 @@ export default function extractAMDDependencies(
67
68
  },
68
69
  },
69
70
  // see https://github.com/acornjs/acorn/issues/746
70
- walk_base
71
+ walk_base,
71
72
  );
72
73
  }
@@ -13,10 +13,17 @@ function pryStringsFromArguments(pArguments) {
13
13
  return lReturnValue;
14
14
  }
15
15
 
16
+ function getRequireTypes(pModuleSystem) {
17
+ return pModuleSystem === "amd" ? ["amd-require"] : ["require"];
18
+ }
19
+ function getExoticRequireTypes(pModuleSystem) {
20
+ return pModuleSystem === "amd" ? ["amd-exotic-require"] : ["exotic-require"];
21
+ }
22
+
16
23
  function pushRequireCallsToDependencies(
17
24
  pDependencies,
18
25
  pModuleSystem,
19
- pRequireStrings
26
+ pRequireStrings,
20
27
  ) {
21
28
  return (pNode) => {
22
29
  for (let lName of pRequireStrings) {
@@ -28,8 +35,15 @@ function pushRequireCallsToDependencies(
28
35
  moduleSystem: pModuleSystem,
29
36
  dynamic: false,
30
37
  ...(lName === "require"
31
- ? { exoticallyRequired: false }
32
- : { exoticallyRequired: true, exoticRequire: lName }),
38
+ ? {
39
+ exoticallyRequired: false,
40
+ dependencyTypes: getRequireTypes(pModuleSystem),
41
+ }
42
+ : {
43
+ exoticallyRequired: true,
44
+ exoticRequire: lName,
45
+ dependencyTypes: getExoticRequireTypes(pModuleSystem),
46
+ }),
33
47
  });
34
48
  }
35
49
  }
@@ -41,7 +55,7 @@ export default function extractCommonJSDependencies(
41
55
  pAST,
42
56
  pDependencies,
43
57
  pModuleSystem,
44
- pExoticRequireStrings
58
+ pExoticRequireStrings,
45
59
  ) {
46
60
  // var/const lalala = require('./lalala');
47
61
  // require('./lalala');
@@ -58,10 +72,10 @@ export default function extractCommonJSDependencies(
58
72
  CallExpression: pushRequireCallsToDependencies(
59
73
  pDependencies,
60
74
  pModuleSystem,
61
- lRequireStrings
75
+ lRequireStrings,
62
76
  ),
63
77
  },
64
78
  // see https://github.com/acornjs/acorn/issues/746
65
- walk_base
79
+ walk_base,
66
80
  );
67
81
  }
@@ -12,6 +12,7 @@ function pushImportNodeValue(pDependencies) {
12
12
  moduleSystem: "es6",
13
13
  dynamic: true,
14
14
  exoticallyRequired: false,
15
+ dependencyTypes: ["dynamic-import"],
15
16
  });
16
17
  } else if (estreeHelpers.isPlaceholderlessTemplateLiteral(pNode.source)) {
17
18
  pDependencies.push({
@@ -19,19 +20,32 @@ function pushImportNodeValue(pDependencies) {
19
20
  moduleSystem: "es6",
20
21
  dynamic: true,
21
22
  exoticallyRequired: false,
23
+ dependencyTypes: ["dynamic-import"],
22
24
  });
23
25
  }
24
26
  };
25
27
  }
26
28
 
27
29
  export default function extractES6Dependencies(pAST, pDependencies) {
28
- function pushSourceValue(pNode) {
30
+ function pushImportSourceValue(pNode) {
29
31
  if (pNode.source && pNode.source.value) {
30
32
  pDependencies.push({
31
33
  module: pNode.source.value,
32
34
  moduleSystem: "es6",
33
35
  dynamic: false,
34
36
  exoticallyRequired: false,
37
+ dependencyTypes: ["import"],
38
+ });
39
+ }
40
+ }
41
+ function pushExportSourceValue(pNode) {
42
+ if (pNode.source && pNode.source.value) {
43
+ pDependencies.push({
44
+ module: pNode.source.value,
45
+ moduleSystem: "es6",
46
+ dynamic: false,
47
+ exoticallyRequired: false,
48
+ dependencyTypes: ["export"],
35
49
  });
36
50
  }
37
51
  }
@@ -39,12 +53,12 @@ export default function extractES6Dependencies(pAST, pDependencies) {
39
53
  walk_simple(
40
54
  pAST,
41
55
  {
42
- ImportDeclaration: pushSourceValue,
56
+ ImportDeclaration: pushImportSourceValue,
43
57
  ImportExpression: pushImportNodeValue(pDependencies),
44
- ExportAllDeclaration: pushSourceValue,
45
- ExportNamedDeclaration: pushSourceValue,
58
+ ExportAllDeclaration: pushExportSourceValue,
59
+ ExportNamedDeclaration: pushExportSourceValue,
46
60
  },
47
61
  // see https://github.com/acornjs/acorn/issues/746
48
- walk_base
62
+ walk_base,
49
63
  );
50
64
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-lines */
1
2
  /* eslint-disable no-inline-comments */
2
3
  import tryImport from "semver-try-require";
3
4
  import meta from "#meta.js";
@@ -43,28 +44,50 @@ function isTypeOnlyExport(pStatement) {
43
44
  */
44
45
 
45
46
  /**
46
- * Get all import and export statements from the top level AST node
47
+ * Get all import statements from the top level AST node
47
48
  *
48
49
  * @param {import("typescript").Node} pAST - the (top-level in this case) AST node
49
50
  * @returns {{module: string; moduleSystem: string; exoticallyRequired: boolean; dependencyTypes?: string[];}[]} -
50
- * all import and export statements in the
51
- * (top level) AST node
51
+ * all import statements in the (top level) AST node
52
+ */
53
+ function extractImports(pAST) {
54
+ return pAST.statements
55
+ .filter(
56
+ (pStatement) =>
57
+ typescript.SyntaxKind[pStatement.kind] === "ImportDeclaration" &&
58
+ Boolean(pStatement.moduleSpecifier),
59
+ )
60
+ .map((pStatement) => ({
61
+ module: pStatement.moduleSpecifier.text,
62
+ moduleSystem: "es6",
63
+ exoticallyRequired: false,
64
+ ...(isTypeOnlyImport(pStatement)
65
+ ? { dependencyTypes: ["type-only", "import"] }
66
+ : { dependencyTypes: ["import"] }),
67
+ }));
68
+ }
69
+
70
+ /**
71
+ * Get all export statements from the top level AST node
72
+ *
73
+ * @param {import("typescript").Node} pAST - the (top-level in this case) AST node
74
+ * @returns {{module: string; moduleSystem: string; exoticallyRequired: boolean; dependencyTypes?: string[];}[]} -
75
+ * all export statements in the (top level) AST node
52
76
  */
53
- function extractImportsAndExports(pAST) {
77
+ function extractExports(pAST) {
54
78
  return pAST.statements
55
79
  .filter(
56
80
  (pStatement) =>
57
- (typescript.SyntaxKind[pStatement.kind] === "ImportDeclaration" ||
58
- typescript.SyntaxKind[pStatement.kind] === "ExportDeclaration") &&
81
+ typescript.SyntaxKind[pStatement.kind] === "ExportDeclaration" &&
59
82
  Boolean(pStatement.moduleSpecifier),
60
83
  )
61
84
  .map((pStatement) => ({
62
85
  module: pStatement.moduleSpecifier.text,
63
86
  moduleSystem: "es6",
64
87
  exoticallyRequired: false,
65
- ...(isTypeOnlyImport(pStatement) || isTypeOnlyExport(pStatement)
66
- ? { dependencyTypes: ["type-only"] }
67
- : {}),
88
+ ...(isTypeOnlyExport(pStatement)
89
+ ? { dependencyTypes: ["type-only", "export"] }
90
+ : { dependencyTypes: ["export"] }),
68
91
  }));
69
92
  }
70
93
 
@@ -92,6 +115,7 @@ function extractImportEquals(pAST) {
92
115
  module: pStatement.moduleReference.expression.text,
93
116
  moduleSystem: "cjs",
94
117
  exoticallyRequired: false,
118
+ dependencyTypes: ["import-equals"],
95
119
  }));
96
120
  }
97
121
 
@@ -108,12 +132,20 @@ function extractTripleSlashDirectives(pAST) {
108
132
  module: pReference.fileName,
109
133
  moduleSystem: "tsd",
110
134
  exoticallyRequired: false,
135
+ dependencyTypes: [
136
+ "triple-slash-directive",
137
+ "triple-slash-file-reference",
138
+ ],
111
139
  }))
112
140
  .concat(
113
141
  pAST.typeReferenceDirectives.map((pReference) => ({
114
142
  module: pReference.fileName,
115
143
  moduleSystem: "tsd",
116
144
  exoticallyRequired: false,
145
+ dependencyTypes: [
146
+ "triple-slash-directive",
147
+ "triple-slash-type-reference",
148
+ ],
117
149
  })),
118
150
  )
119
151
  .concat(
@@ -121,6 +153,10 @@ function extractTripleSlashDirectives(pAST) {
121
153
  module: pReference.path,
122
154
  moduleSystem: "tsd",
123
155
  exoticallyRequired: false,
156
+ dependencyTypes: [
157
+ "triple-slash-directive",
158
+ "triple-slash-amd-dependency",
159
+ ],
124
160
  })),
125
161
  );
126
162
  }
@@ -224,6 +260,7 @@ function walk(pResult, pExoticRequireStrings) {
224
260
  module: pASTNode.arguments[0].text,
225
261
  moduleSystem: "cjs",
226
262
  exoticallyRequired: false,
263
+ dependencyTypes: ["require"],
227
264
  });
228
265
  }
229
266
 
@@ -235,6 +272,7 @@ function walk(pResult, pExoticRequireStrings) {
235
272
  moduleSystem: "cjs",
236
273
  exoticallyRequired: true,
237
274
  exoticRequire: pExoticRequireString,
275
+ dependencyTypes: ["exotic-require"],
238
276
  });
239
277
  }
240
278
  });
@@ -246,6 +284,7 @@ function walk(pResult, pExoticRequireStrings) {
246
284
  moduleSystem: "es6",
247
285
  dynamic: true,
248
286
  exoticallyRequired: false,
287
+ dependencyTypes: ["dynamic-import"],
249
288
  });
250
289
  }
251
290
 
@@ -256,6 +295,7 @@ function walk(pResult, pExoticRequireStrings) {
256
295
  module: pASTNode.argument.literal.text,
257
296
  moduleSystem: "es6",
258
297
  exoticallyRequired: false,
298
+ dependencyTypes: ["type-import"],
259
299
  });
260
300
  }
261
301
  typescript.forEachChild(pASTNode, walk(pResult, pExoticRequireStrings));
@@ -287,7 +327,8 @@ export default function extractTypeScriptDependencies(
287
327
  pExoticRequireStrings,
288
328
  ) {
289
329
  return Boolean(typescript)
290
- ? extractImportsAndExports(pTypeScriptAST)
330
+ ? extractImports(pTypeScriptAST)
331
+ .concat(extractExports(pTypeScriptAST))
291
332
  .concat(extractImportEquals(pTypeScriptAST))
292
333
  .concat(extractTripleSlashDirectives(pTypeScriptAST))
293
334
  .concat(
@@ -75,6 +75,7 @@ function extractExoticMemberCallExpression(pNode, pExoticRequireStrings) {
75
75
  exoticallyRequired: true,
76
76
  exoticRequire: pThing.string,
77
77
  dynamic: false,
78
+ dependencyTypes: ["exotic-require"],
78
79
  });
79
80
  }
80
81
  return pAll;
@@ -120,17 +121,30 @@ export default Visitor
120
121
  this.lExoticRequireStrings = pExoticRequireStrings;
121
122
  }
122
123
 
123
- pushImportExportSource(pNode) {
124
+ pushExportSource(pNode) {
124
125
  if (pNode.source) {
125
126
  this.lResult.push({
126
127
  module: pNode.source.value,
127
128
  moduleSystem: "es6",
128
129
  exoticallyRequired: false,
130
+ dependencyTypes: ["export"],
129
131
  });
130
132
  }
131
133
  }
134
+
135
+ pushImportSource(pNode) {
136
+ if (pNode.source) {
137
+ this.lResult.push({
138
+ module: pNode.source.value,
139
+ moduleSystem: "es6",
140
+ exoticallyRequired: false,
141
+ dependencyTypes: ["import"],
142
+ });
143
+ }
144
+ }
145
+
132
146
  visitImportDeclaration(pNode) {
133
- this.pushImportExportSource(pNode);
147
+ this.pushImportSource(pNode);
134
148
  return super.visitImportDeclaration(pNode);
135
149
  }
136
150
 
@@ -140,6 +154,7 @@ export default Visitor
140
154
  module: pNode.moduleRef.expression.value,
141
155
  moduleSystem: "cjs",
142
156
  exoticallyRequired: false,
157
+ dependencyTypes: ["import-equals"],
143
158
  });
144
159
  }
145
160
  return super.visitTsImportEqualsDeclaration(pNode);
@@ -149,7 +164,7 @@ export default Visitor
149
164
  // To anticipate that (and to remain backward compatible when that happens)
150
165
  // also include the same method, but with the correct spelling.
151
166
  visitExportAllDeclration(pNode) {
152
- this.pushImportExportSource(pNode);
167
+ this.pushExportSource(pNode);
153
168
  /* c8 ignore start */
154
169
  // @ts-expect-error see above
155
170
  if (super.visitExportAllDeclration) {
@@ -169,7 +184,7 @@ export default Visitor
169
184
 
170
185
  // same spelling error as the above - same solution
171
186
  visitExportNamedDeclration(pNode) {
172
- this.pushImportExportSource(pNode);
187
+ this.pushExportSource(pNode);
173
188
  /* c8 ignore start */
174
189
  // @ts-expect-error see above
175
190
  if (super.visitExportNamedDeclration) {
@@ -195,14 +210,23 @@ export default Visitor
195
210
  module: pryStringsFromArguments(pNode.arguments),
196
211
 
197
212
  ...(isImportCallExpression(pNode)
198
- ? { moduleSystem: "es6", dynamic: true }
199
- : { moduleSystem: "cjs", dynamic: false }),
213
+ ? {
214
+ moduleSystem: "es6",
215
+ dynamic: true,
216
+ dependencyTypes: ["dynamic-import"],
217
+ }
218
+ : {
219
+ moduleSystem: "cjs",
220
+ dynamic: false,
221
+ dependencyTypes: ["require"],
222
+ }),
200
223
 
201
224
  ...(isNonExoticallyRequiredExpression(pNode)
202
225
  ? { exoticallyRequired: false }
203
226
  : {
204
227
  exoticallyRequired: true,
205
228
  exoticRequire: pNode.callee.value,
229
+ dependencyTypes: ["exotic-require"],
206
230
  }),
207
231
  });
208
232
  }
@@ -235,6 +259,7 @@ export default Visitor
235
259
  module: pNode.typeAnnotation.argument.value,
236
260
  moduleSystem: "es6",
237
261
  exoticallyRequired: false,
262
+ dependencyTypes: ["type-import"],
238
263
  });
239
264
  return super.visitTsTypeAnnotation(pNode);
240
265
  }
@@ -160,6 +160,7 @@ function addResolutionAttributes(
160
160
  { baseDir, doNotFollow },
161
161
  pFileName,
162
162
  pResolveOptions,
163
+ pTranspileOptions,
163
164
  ) {
164
165
  return function addAttributes(pDependency) {
165
166
  const lResolved = resolve(
@@ -167,6 +168,7 @@ function addResolutionAttributes(
167
168
  baseDir,
168
169
  join(baseDir, dirname(pFileName)),
169
170
  pResolveOptions,
171
+ pTranspileOptions,
170
172
  );
171
173
  const lMatchesDoNotFollow = matchesDoNotFollow(lResolved, doNotFollow);
172
174
 
@@ -189,6 +191,8 @@ function matchesPattern(pFullPathToFile, pPattern) {
189
191
  * @returns {string}
190
192
  */
191
193
  function getDependencyUniqueKey({ module, moduleSystem, dependencyTypes }) {
194
+ // c8: dependencyTypes is hardly ever undefined anymore since PR #884, but
195
+ // we keep the `|| []` in for robustness sake
192
196
  return `${module} ${moduleSystem} ${(dependencyTypes || []).includes(
193
197
  "type-only",
194
198
  )}`;
@@ -231,7 +235,14 @@ export default function getDependencies(
231
235
  getDependencyUniqueKey,
232
236
  )
233
237
  .sort(compareDeps)
234
- .map(addResolutionAttributes(pCruiseOptions, pFileName, pResolveOptions))
238
+ .map(
239
+ addResolutionAttributes(
240
+ pCruiseOptions,
241
+ pFileName,
242
+ pResolveOptions,
243
+ pTranspileOptions,
244
+ ),
245
+ )
235
246
  .filter(
236
247
  ({ resolved }) =>
237
248
  (!pCruiseOptions?.exclude?.path ||
@@ -171,6 +171,7 @@ function determineExternalModuleDependencyTypes(
171
171
  * @param {string} pFileDirectory the directory relative to which to resolve (only used for npm deps here)
172
172
  * @param {import("../../../types/resolve-options.mjs").IResolveOptions} pResolveOptions an enhanced resolve 'resolve' key
173
173
  * @param {string} pBaseDirectory the base directory dependency cruise is run on
174
+ * @param {import("../../../types/dependency-cruiser.mjs").ITranspileOptions} pTranspileOptions
174
175
  *
175
176
  * @return {import("../../../types/shared-types.js").DependencyType[]} an array of dependency types for the dependency
176
177
  */
@@ -182,6 +183,7 @@ export default function determineDependencyTypes(
182
183
  pFileDirectory,
183
184
  pResolveOptions,
184
185
  pBaseDirectory,
186
+ pTranspileOptions,
185
187
  ) {
186
188
  /** @type {import("../../../types/shared-types.js").DependencyType[]}*/
187
189
  let lReturnValue = [];
@@ -196,6 +198,7 @@ export default function determineDependencyTypes(
196
198
  pDependency.resolved,
197
199
  lResolveOptions,
198
200
  pManifest,
201
+ pTranspileOptions,
199
202
  );
200
203
  if (lAliases.length > 0) {
201
204
  lReturnValue = lAliases;
@@ -160,15 +160,18 @@ function resolveWithRetry(
160
160
  * @param {string} pFileDirectory the directory of the file the dependency was
161
161
  * detected in
162
162
  * @param {import("../../../types/resolve-options.mjs").IResolveOptions} pResolveOptions
163
+ * @param {any} pTranspileOptions
163
164
  * @return {Partial <import("../../../types/cruise-result.mjs").IDependency>}
164
165
  *
166
+ *
165
167
  */
166
- // eslint-disable-next-line max-lines-per-function
168
+ // eslint-disable-next-line max-lines-per-function, max-params
167
169
  export default function resolve(
168
170
  pDependency,
169
171
  pBaseDirectory,
170
172
  pFileDirectory,
171
173
  pResolveOptions,
174
+ pTranspileOptions,
172
175
  ) {
173
176
  let lResolvedDependency = resolveWithRetry(
174
177
  pDependency,
@@ -197,6 +200,7 @@ export default function resolve(
197
200
  pFileDirectory,
198
201
  pResolveOptions,
199
202
  pBaseDirectory,
203
+ pTranspileOptions,
200
204
  ),
201
205
  };
202
206
 
@@ -25,7 +25,9 @@ function mergeDependencyArray(pClosestDependencyKey, pFurtherDependencyKey) {
25
25
  }
26
26
 
27
27
  function isInterestingKey(pKey) {
28
- return pKey.endsWith("ependencies") || pKey === "workspaces";
28
+ return (
29
+ pKey.endsWith("ependencies") || pKey === "workspaces" || pKey === "imports"
30
+ );
29
31
  }
30
32
 
31
33
  function getDependencyKeys(pPackage) {
@@ -1,4 +1,5 @@
1
1
  import { isAbsolute, resolve as path_resolve } from "node:path";
2
+ import { join as posix_join } from "node:path/posix";
2
3
  import { isMatch } from "picomatch";
3
4
  import getExtension from "#utl/get-extension.mjs";
4
5
 
@@ -31,8 +32,7 @@ export function isExternalModule(
31
32
  // WebPack treats these differently:
32
33
  // - absolute paths only match that exact path
33
34
  // - relative paths get a node lookup treatment so "turtle" matches
34
- // "turtle", "../turtle", "../../turtle", "../../../turtle" (.. =>
35
- // turtles all the way down)
35
+ // "turtle", "../turtle", "../../turtle", "../../../turtle"
36
36
  // hence we'll have to test for them in different fashion as well.
37
37
  // reference: https://webpack.js.org/configuration/resolve/#resolve-modules
38
38
  (pModuleFolderName) => {
@@ -50,15 +50,13 @@ export function isExternalModule(
50
50
  function determineFollowableExtensions(pResolveOptions) {
51
51
  let lReturnValue = new Set(pResolveOptions.extensions);
52
52
 
53
- // we could include things like pictures, movies, html, xml
54
- // etc in lKnownUnfollowables as well. Typically in
55
- // javascript-like sources you don't import non-javascript
56
- // stuff without mentioning the extension (`import 'styles.scss`
57
- // is more clear than`import 'styles'` as you'd expect that
58
- // to resolve to something javascript-like.
59
- // Defensively added the stylesheetlanguages here explicitly
60
- // nonetheless - they can contain import statements and the
61
- // fallback javascript parser will happily parse them, which
53
+ // we could include things like pictures, movies, html, xml etc in
54
+ // lKnownUnfollowables as well. Typically in javascript-like sources you don't
55
+ // import non-javascript stuff without mentioning the extension
56
+ // (`import 'styles.scss` is more clear than`import 'styles'` as you'd expect
57
+ // that to resolve to something javascript-like. Defensively added the
58
+ // stylesheetlanguages here explicitly nonetheless - they can contain import
59
+ // statements and the fallback javascript parser will happily parse them, which
62
60
  // will result in false positives.
63
61
  const lKnownUnfollowables = [
64
62
  ".json",
@@ -166,7 +164,7 @@ function isWorkspaceAliased(pModuleName, pResolvedModuleName, pManifest) {
166
164
  // the symlinked workspace folders are not resolved to their realpath.
167
165
  // So we need to check both the thing in node_modules _and_ the resolved
168
166
  // thing. Annoyingly, the symlink in node_modules is the `name` attribute
169
- // of the workspace, not the path of the workspace itself. So if it's
167
+ // of the workspace, not the path of the workspace itself. So if it's
170
168
  // in node_modules we need to check against the unresolved modulename.
171
169
  //
172
170
  // Other then the detection for when symlinks are resolved to their realpath
@@ -183,38 +181,83 @@ function isWorkspaceAliased(pModuleName, pResolvedModuleName, pManifest) {
183
181
  }
184
182
 
185
183
  /**
184
+ *
186
185
  * @param {string} pModuleName
187
- * @param {string} pResolvedModuleName
188
- * @param {import("../../../types/resolve-options.mjs").IResolveOptions} pResolveOptions
189
- * @param {string} pBaseDirectory
186
+ * @param {Record<string, string[]>} pPaths
190
187
  * @returns {boolean}
191
188
  */
192
- function isLikelyTSAliased(
189
+ function matchesTSConfigPaths(pModuleName, pPaths) {
190
+ // "paths patterns can contain a single * wildcard, which matches any string.
191
+ // The * token can then be used in the file path values to substitute the
192
+ // matched string."
193
+ // https://www.typescriptlang.org/docs/handbook/modules/reference.html#wildcard-substitutions
194
+ //
195
+ // So, just like with subpath imports, the LHS of a path pattern is not a glob
196
+ // and the '*' functions as a string replacement only.
197
+ //
198
+ // TODO: 'any string' - does this include the empty string as well? Checks seem
199
+ // to indicate it doesn't, so we use `.+` instead of `.*`
200
+ return Object.keys(pPaths).some((pPathLHS) => {
201
+ // eslint-disable-next-line security/detect-non-literal-regexp
202
+ const lMatchRE = new RegExp(`^${pPathLHS.replace(/\*/g, ".+")}$`);
203
+ return Boolean(pModuleName.match(lMatchRE));
204
+ });
205
+ }
206
+
207
+ function stripExtension(pModulePath) {
208
+ const lExtension = getExtension(pModulePath);
209
+ return lExtension ? pModulePath.slice(0, -lExtension.length) : pModulePath;
210
+ }
211
+
212
+ function stripIndex(pModulePath) {
213
+ return pModulePath.endsWith("/index")
214
+ ? pModulePath.slice(0, -"/index".length)
215
+ : pModulePath;
216
+ }
217
+
218
+ /**
219
+ *
220
+ * https://www.typescriptlang.org/docs/handbook/modules/reference.html#baseurl
221
+ *
222
+ * @param {string} pModuleName
223
+ * @param {string} pResolvedModuleName
224
+ * @param {string} pTSConfigBaseURL
225
+ */
226
+ function matchesTSConfigBaseURL(
193
227
  pModuleName,
194
228
  pResolvedModuleName,
195
- pResolveOptions,
196
- pBaseDirectory,
229
+ pTSConfigBaseURL,
197
230
  ) {
198
- return (
199
- pResolveOptions.tsConfig &&
200
- !isRelativeModuleName(pModuleName) &&
201
- pResolvedModuleName &&
202
- !isExternalModule(pResolvedModuleName, ["node_modules"], pBaseDirectory)
231
+ if (!pTSConfigBaseURL) {
232
+ return false;
233
+ }
234
+ // "If baseUrl is set, TypeScript will resolve non-relative module names
235
+ // relative to the baseUrl."
236
+ // https://www.typescriptlang.org/docs/handbook/modules.html#base-url
237
+ const strippedModuleNameJoinedToBaseURL = stripIndex(
238
+ stripExtension(posix_join(pTSConfigBaseURL, pModuleName)),
203
239
  );
240
+ const strippedResolvedModuleName = stripIndex(
241
+ stripExtension(pResolvedModuleName),
242
+ );
243
+ return strippedModuleNameJoinedToBaseURL.endsWith(strippedResolvedModuleName);
204
244
  }
205
245
 
206
246
  /**
207
247
  * @param {string} pModuleName
208
248
  * @param {string} pResolvedModuleName
209
249
  * @param {import("../../../types/resolve-options.mjs").IResolveOptions} pResolveOptions
210
- * @param {object} pManifest
250
+ * @param {any} pManifest
251
+ * @param {import("../../../types/dependency-cruiser.mjs").ITranspileOptions} pTranspileOptions
211
252
  * @returns {string[]}
212
253
  */
254
+ // eslint-disable-next-line max-params, complexity
213
255
  export function getAliasTypes(
214
256
  pModuleName,
215
257
  pResolvedModuleName,
216
258
  pResolveOptions,
217
259
  pManifest,
260
+ pTranspileOptions,
218
261
  ) {
219
262
  if (isRelativeModuleName(pModuleName)) {
220
263
  return [];
@@ -223,6 +266,23 @@ export function getAliasTypes(
223
266
  if (isWebPackAliased(pModuleName, pResolveOptions.alias)) {
224
267
  return ["aliased", "aliased-webpack"];
225
268
  }
269
+ if (
270
+ matchesTSConfigBaseURL(
271
+ pModuleName,
272
+ pResolvedModuleName,
273
+ pTranspileOptions?.tsConfig?.options?.baseUrl,
274
+ )
275
+ ) {
276
+ return ["aliased", "aliased-tsconfig", "aliased-tsconfig-base-url"];
277
+ }
278
+ if (
279
+ matchesTSConfigPaths(
280
+ pModuleName,
281
+ pTranspileOptions?.tsConfig?.options?.paths ?? {},
282
+ )
283
+ ) {
284
+ return ["aliased", "aliased-tsconfig", "aliased-tsconfig-paths"];
285
+ }
226
286
  // The order of subpath imports and workspaces isn't _that_ important, as they
227
287
  // can't be confused
228
288
  // - subpath imports _must_ start with a #
@@ -233,24 +293,5 @@ export function getAliasTypes(
233
293
  if (isWorkspaceAliased(pModuleName, pResolvedModuleName, pManifest)) {
234
294
  return ["aliased", "aliased-workspace"];
235
295
  }
236
- // We'd like to classify for ts config paths/ aliases earlier, but it's currently
237
- // partly guess work (the resolver wouldn't know, so it'd mean checking
238
- // against the tsconfig paths _again_ here which might not be conducive to
239
- // performance).
240
- // Putting it last is close enough for now because
241
- // - it's not a common scenario to have _both_ tsconfig paths and one of the
242
- // other (clearly superior) aliasing mechanisms
243
- // - if it does happen it's even less likely to have the same names for both
244
- // in both mechanisms
245
- if (
246
- isLikelyTSAliased(
247
- pModuleName,
248
- pResolvedModuleName,
249
- pResolveOptions,
250
- pResolveOptions.baseDirectory,
251
- )
252
- ) {
253
- return ["aliased", "aliased-tsconfig"];
254
- }
255
296
  return [];
256
297
  }
package/src/meta.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /* generated - don't edit */
2
2
 
3
3
  module.exports = {
4
- version: "16.0.0-beta-1",
4
+ version: "16.0.0-beta-3",
5
5
  engines: {
6
6
  node: "^18.17||>=20",
7
7
  },
@@ -8,13 +8,42 @@ function matchesRE(pValue, pRE) {
8
8
  return Boolean(lMatchResult) && lMatchResult.length > 0;
9
9
  }
10
10
 
11
+ function matchesCriterion(pModuleKey, pCriterion) {
12
+ return pModuleKey === pCriterion || matchesRE(pModuleKey, pCriterion);
13
+ }
14
+
11
15
  function moduleOrDependencyMatchesCriteria(pSchemeEntry, pModule) {
12
- return Object.keys(pSchemeEntry.criteria).every(
13
- (pKey) =>
14
- (get(pModule, pKey) || has(pModule, pKey)) &&
15
- (get(pModule, pKey) === get(pSchemeEntry.criteria, pKey) ||
16
- matchesRE(get(pModule, pKey), get(pSchemeEntry.criteria, pKey))),
17
- );
16
+ return Object.keys(pSchemeEntry.criteria).every((pKey) => {
17
+ // we use lodash.get here because in the criteria you can enter
18
+ // nested keys like "rules[0].severity" : "error", and lodash.get handles
19
+ // that for us
20
+ const lCriterion = get(pSchemeEntry.criteria, pKey);
21
+ const lModuleKey = get(pModule, pKey);
22
+
23
+ if (!(lModuleKey || has(pModule, pKey))) {
24
+ return false;
25
+ }
26
+
27
+ if (Array.isArray(lModuleKey)) {
28
+ if (Array.isArray(lCriterion)) {
29
+ return lCriterion.some((pCriterionEntry) =>
30
+ lModuleKey.some((pModuleKeyEntry) =>
31
+ matchesCriterion(pModuleKeyEntry, pCriterionEntry),
32
+ ),
33
+ );
34
+ } else {
35
+ return lModuleKey.some((pModuleKeyEntry) =>
36
+ matchesCriterion(pModuleKeyEntry, lCriterion),
37
+ );
38
+ }
39
+ }
40
+ if (Array.isArray(lCriterion)) {
41
+ return lCriterion.some((pCriterionEntry) =>
42
+ matchesCriterion(lModuleKey, pCriterionEntry),
43
+ );
44
+ }
45
+ return matchesCriterion(lModuleKey, lCriterion);
46
+ });
18
47
  }
19
48
 
20
49
  function determineAttributes(pModuleOrDependency, pAttributeCriteria) {
@@ -1 +1 @@
1
- /* generated - don't edit */export default {"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","aliased-subpath-import","aliased-tsconfig","aliased-webpack","aliased-workspace","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"]},"builtInModules":{"type":"object","additionalProperties":false,"properties":{"override":{"type":"array","items":{"type":"string"}},"add":{"type":"array","items":{"type":"string"}}}},"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","items":{"type":"string"}},"mainFiles":{"type":"array"},"aliasFields":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean"},{"type":"string"},{"$ref":"#/definitions/CacheOptionsType"}]}}},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"CompoundExcludeType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dynamic":{"type":"boolean"}}},"CompoundDoNotFollowType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}}}},"CompoundIncludeOnlyType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundFocusType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"ReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"anon":{"$ref":"#/definitions/AnonReporterOptionsType"},"archi":{"$ref":"#/definitions/DotReporterOptionsType"},"dot":{"$ref":"#/definitions/DotReporterOptionsType"},"ddot":{"$ref":"#/definitions/DotReporterOptionsType"},"flat":{"$ref":"#/definitions/DotReporterOptionsType"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"AnonReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"wordlist":{"type":"array","items":{"type":"string"}}}},"MetricsReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"orderBy":{"type":"string","enum":["instability","moduleCount","afferentCouplings","efferentCouplings","name"]},"hideModules":{"type":"boolean"},"hideFolders":{"type":"boolean"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"type":"boolean"}}},"DotReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"collapsePattern":{"$ref":"#/definitions/REAsStringsType"},"filters":{"$ref":"#/definitions/ReporterFiltersType"},"showMetrics":{"type":"boolean"},"theme":{"$ref":"#/definitions/DotThemeType"}}},"DotThemeType":{"type":"object","additionalProperties":false,"properties":{"replace":{"type":"boolean"},"graph":{"type":"object"},"node":{"type":"object"},"edge":{"type":"object"},"modules":{"$ref":"#/definitions/DotThemeArrayType"},"dependencies":{"$ref":"#/definitions/DotThemeArrayType"}}},"DotThemeArrayType":{"type":"array","items":{"$ref":"#/definitions/DotThemeEntryType"}},"DotThemeEntryType":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object"},"attributes":{"type":"object"}}},"ReporterFiltersType":{"type":"object","additionalProperties":false,"properties":{"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"$ref":"#/definitions/CompoundIncludeOnlyType"},"focus":{"$ref":"#/definitions/CompoundFocusType"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"ViolationsType":{"type":"array","items":{"$ref":"#/definitions/ViolationType"}},"ViolationType":{"type":"object","required":["from","to","rule"],"additionalProperties":false,"properties":{"from":{"type":"string"},"to":{"type":"string"},"type":{"$ref":"#/definitions/ViolationTypeType"},"rule":{"$ref":"#/definitions/RuleSummaryType"},"cycle":{"type":"array","items":{"type":"string"}},"via":{"type":"array","items":{"type":"string"}},"metrics":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"from":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}},"to":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}}}},"comment":{"type":"string"}}},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"},"compress":{"type":"boolean","default":false}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"ExtendsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}}
1
+ /* generated - don't edit */export default {"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-subpath-import","aliased-tsconfig-base-url","aliased-tsconfig-paths","aliased-tsconfig","aliased-webpack","aliased-workspace","aliased","amd-define","amd-require","amd-exotic-require","core","deprecated","dynamic-import","exotic-require","export","import-equals","import","local","localmodule","npm-bundled","npm-dev","npm-no-pkg","npm-optional","npm-peer","npm-unknown","npm","require","triple-slash-amd-dependency","triple-slash-directive","triple-slash-file-reference","triple-slash-type-reference","type-import","type-only","undetermined","unknown"]},"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"]},"builtInModules":{"type":"object","additionalProperties":false,"properties":{"override":{"type":"array","items":{"type":"string"}},"add":{"type":"array","items":{"type":"string"}}}},"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","items":{"type":"string"}},"mainFiles":{"type":"array"},"aliasFields":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean"},{"type":"string"},{"$ref":"#/definitions/CacheOptionsType"}]}}},"ModuleSystemType":{"type":"string","enum":["cjs","es6","amd","tsd"]},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"CompoundExcludeType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dynamic":{"type":"boolean"}}},"CompoundDoNotFollowType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"dependencyTypes":{"type":"array","items":{"$ref":"#/definitions/DependencyTypeType"}}}},"CompoundIncludeOnlyType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundFocusType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"},"depth":{"type":"number","minimum":1,"maximum":4}}},"CompoundReachesType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"CompoundHighlightType":{"type":"object","additionalProperties":false,"properties":{"path":{"$ref":"#/definitions/REAsStringsType"}}},"ReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"anon":{"$ref":"#/definitions/AnonReporterOptionsType"},"archi":{"$ref":"#/definitions/DotReporterOptionsType"},"dot":{"$ref":"#/definitions/DotReporterOptionsType"},"ddot":{"$ref":"#/definitions/DotReporterOptionsType"},"flat":{"$ref":"#/definitions/DotReporterOptionsType"},"markdown":{"$ref":"#/definitions/MarkdownReporterOptionsType"},"metrics":{"$ref":"#/definitions/MetricsReporterOptionsType"},"mermaid":{"$ref":"#/definitions/MermaidReporterOptionsType"},"text":{"$ref":"#/definitions/TextReporterOptionsType"}}},"AnonReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"wordlist":{"type":"array","items":{"type":"string"}}}},"MetricsReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"orderBy":{"type":"string","enum":["instability","moduleCount","afferentCouplings","efferentCouplings","name"]},"hideModules":{"type":"boolean"},"hideFolders":{"type":"boolean"}}},"MarkdownReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"showTitle":{"type":"boolean"},"title":{"type":"string"},"showSummary":{"type":"boolean"},"showSummaryHeader":{"type":"boolean"},"summaryHeader":{"type":"string"},"showStatsSummary":{"type":"boolean"},"showRulesSummary":{"type":"boolean"},"includeIgnoredInSummary":{"type":"boolean"},"showDetails":{"type":"boolean"},"includeIgnoredInDetails":{"type":"boolean"},"showDetailsHeader":{"type":"boolean"},"detailsHeader":{"type":"string"},"collapseDetails":{"type":"boolean"},"collapsedMessage":{"type":"string"},"noViolationsMessage":{"type":"string"},"showFooter":{"type":"boolean"}}},"MermaidReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"minify":{"type":"boolean"}}},"TextReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"highlightFocused":{"type":"boolean"}}},"DotReporterOptionsType":{"type":"object","additionalProperties":false,"properties":{"collapsePattern":{"$ref":"#/definitions/REAsStringsType"},"filters":{"$ref":"#/definitions/ReporterFiltersType"},"showMetrics":{"type":"boolean"},"theme":{"$ref":"#/definitions/DotThemeType"}}},"DotThemeType":{"type":"object","additionalProperties":false,"properties":{"replace":{"type":"boolean"},"graph":{"type":"object"},"node":{"type":"object"},"edge":{"type":"object"},"modules":{"$ref":"#/definitions/DotThemeArrayType"},"dependencies":{"$ref":"#/definitions/DotThemeArrayType"}}},"DotThemeArrayType":{"type":"array","items":{"$ref":"#/definitions/DotThemeEntryType"}},"DotThemeEntryType":{"type":"object","additionalProperties":false,"properties":{"criteria":{"type":"object"},"attributes":{"type":"object"}}},"ReporterFiltersType":{"type":"object","additionalProperties":false,"properties":{"exclude":{"$ref":"#/definitions/CompoundExcludeType"},"includeOnly":{"$ref":"#/definitions/CompoundIncludeOnlyType"},"focus":{"$ref":"#/definitions/CompoundFocusType"},"reaches":{"$ref":"#/definitions/CompoundReachesType"}}},"ViolationsType":{"type":"array","items":{"$ref":"#/definitions/ViolationType"}},"ViolationType":{"type":"object","required":["from","to","rule"],"additionalProperties":false,"properties":{"from":{"type":"string"},"to":{"type":"string"},"type":{"$ref":"#/definitions/ViolationTypeType"},"rule":{"$ref":"#/definitions/RuleSummaryType"},"cycle":{"type":"array","items":{"type":"string"}},"via":{"type":"array","items":{"type":"string"}},"metrics":{"type":"object","required":["from","to"],"additionalProperties":false,"properties":{"from":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}},"to":{"type":"object","required":["instability"],"additionalProperties":false,"properties":{"instability":{"type":"number"}}}}},"comment":{"type":"string"}}},"RuleSummaryType":{"type":"object","required":["name","severity"],"additionalProperties":false,"properties":{"name":{"type":"string"},"severity":{"$ref":"#/definitions/SeverityType"}}},"ViolationTypeType":{"type":"string","enum":["dependency","module","reachability","cycle","instability","folder"]},"CacheOptionsType":{"type":"object","additionalProperties":false,"properties":{"folder":{"type":"string"},"strategy":{"$ref":"#/definitions/CacheStrategyType"},"compress":{"type":"boolean","default":false}}},"CacheStrategyType":{"type":"string","enum":["metadata","content"]},"ExtendsType":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}}
@@ -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"},"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","aliased-subpath-import","aliased-tsconfig","aliased-webpack","aliased-workspace","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"]},"builtInModules":{"type":"object","additionalProperties":false,"properties":{"override":{"type":"array","items":{"type":"string"}},"add":{"type":"array","items":{"type":"string"}}}},"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","items":{"type":"string"}},"mainFiles":{"type":"array"},"aliasFields":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics","markdown","mermaid","d2","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"},"compress":{"type":"boolean","default":false}}},"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-subpath-import","aliased-tsconfig-base-url","aliased-tsconfig-paths","aliased-tsconfig","aliased-webpack","aliased-workspace","aliased","amd-define","amd-require","amd-exotic-require","core","deprecated","dynamic-import","exotic-require","export","import-equals","import","local","localmodule","npm-bundled","npm-dev","npm-no-pkg","npm-optional","npm-peer","npm-unknown","npm","require","triple-slash-amd-dependency","triple-slash-directive","triple-slash-file-reference","triple-slash-type-reference","type-import","type-only","undetermined","unknown"]},"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"]},"builtInModules":{"type":"object","additionalProperties":false,"properties":{"override":{"type":"array","items":{"type":"string"}},"add":{"type":"array","items":{"type":"string"}}}},"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","items":{"type":"string"}},"mainFiles":{"type":"array"},"aliasFields":{"type":"array","items":{"type":"string"}},"cachedInputFileSystem":{"type":"object","additionalProperties":false,"properties":{"cacheDuration":{"type":"integer","minimum":0,"maximum":1800000}}}}},"babelConfig":{"type":"object","additionalProperties":false,"properties":{"fileName":{"type":"string"}}},"parser":{"type":"string","enum":["acorn","swc","tsc"]},"exoticRequireStrings":{"type":"array","items":{"type":"string"}},"reporterOptions":{"$ref":"#/definitions/ReporterOptionsType"},"progress":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","enum":["cli-feedback","performance-log","ndjson","none"]},"maximumLevel":{"type":"number","enum":[-1,40,50,60,70,80,99]}}},"metrics":{"type":"boolean"},"baseDir":{"type":"string"},"cache":{"oneOf":[{"type":"boolean","enum":[false]},{"$ref":"#/definitions/CacheOptionsType"}]},"args":{"type":"string"},"rulesFile":{"type":"string"},"outputTo":{"type":"string"},"outputType":{"$ref":"#/definitions/OutputType"}}},"ModuleSystemsType":{"type":"array","items":{"$ref":"#/definitions/ModuleSystemType"}},"OutputType":{"oneOf":[{"type":"string","enum":["json","html","dot","ddot","cdot","archi","fdot","flat","csv","err","err-long","err-html","teamcity","anon","text","metrics","markdown","mermaid","d2","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"},"compress":{"type":"boolean","default":false}}},"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"}}}}}}}}
@@ -15,7 +15,7 @@ const EXTENSION_RE = /(?<extension>((\.d\.(c|m)?ts)|\.coffee\.md)$)/;
15
15
  * @param {string} pFileName path to the file to be parsed
16
16
  * @return {string} extension
17
17
  */
18
- export default function getExtensions(pFileName) {
18
+ export default function getExtension(pFileName) {
19
19
  const lMatchResult = pFileName.match(EXTENSION_RE);
20
20
 
21
21
  return lMatchResult?.groups?.extension ?? extname(pFileName);
@@ -3,13 +3,21 @@ import has from "lodash/has.js";
3
3
  import { replaceGroupPlaceholders } from "#utl/regex-util.mjs";
4
4
  import { intersects } from "#utl/array-util.mjs";
5
5
 
6
- const NOT_REALLY_DUPLICATES = new Set([
7
- "aliased",
8
- "aliased-subpath-import",
9
- "aliased-tsconfig",
10
- "aliased-webpack",
11
- "aliased-workspace",
12
- "type-only",
6
+ // by their nature some dependency types always occur alongside other
7
+ // dependency types - aliased, type-only, import, export will always
8
+ // occur paired with 'local', 'npm' or core. Hence we only include
9
+ // a subset of dependency types where we _care_ if they are duplicates
10
+ const DEPENDENCY_TYPE_DUPLICATES_THAT_MATTER = new Set([
11
+ "core",
12
+ "local",
13
+ "localmodule",
14
+ "npm",
15
+ "npm-bundled",
16
+ "npm-dev",
17
+ "npm-no-pkg",
18
+ "npm-optional",
19
+ "npm-peer",
20
+ "npm-unknown",
13
21
  ]);
14
22
 
15
23
  function propertyEquals(pRule, pDependency, pProperty) {
@@ -169,8 +177,8 @@ function matchesMoreThanOneDependencyType(pRule, pDependency) {
169
177
  if (has(pRule.to, "moreThanOneDependencyType")) {
170
178
  return (
171
179
  pRule.to.moreThanOneDependencyType ===
172
- pDependency.dependencyTypes.filter(
173
- (pDependencyType) => !NOT_REALLY_DUPLICATES.has(pDependencyType),
180
+ pDependency.dependencyTypes.filter((pDependencyType) =>
181
+ DEPENDENCY_TYPE_DUPLICATES_THAT_MATTER.has(pDependencyType),
174
182
  ).length >
175
183
  1
176
184
  );
@@ -35,25 +35,41 @@ export type SeverityType = "error" | "warn" | "info" | "ignore";
35
35
 
36
36
  // cruise options, cruise result, rule set
37
37
  export type DependencyType =
38
- | "aliased"
39
38
  | "aliased-subpath-import"
39
+ | "aliased-tsconfig-base-url"
40
+ | "aliased-tsconfig-paths"
40
41
  | "aliased-tsconfig"
41
42
  | "aliased-webpack"
42
43
  | "aliased-workspace"
44
+ | "aliased"
45
+ | "amd-define"
46
+ | "amd-require"
47
+ | "amd-exotic-require"
43
48
  | "core"
44
49
  | "deprecated"
50
+ | "dynamic-import"
51
+ | "exotic-require"
52
+ | "export"
53
+ | "import-equals"
54
+ | "import"
45
55
  | "local"
46
56
  | "localmodule"
47
- | "npm"
48
57
  | "npm-bundled"
49
58
  | "npm-dev"
50
59
  | "npm-no-pkg"
51
60
  | "npm-optional"
52
61
  | "npm-peer"
53
62
  | "npm-unknown"
63
+ | "npm"
64
+ | "require"
65
+ | "triple-slash-amd-dependency"
66
+ | "triple-slash-directive"
67
+ | "triple-slash-file-reference"
68
+ | "triple-slash-type-reference"
69
+ | "type-import"
70
+ | "type-only"
54
71
  | "undetermined"
55
- | "unknown"
56
- | "type-only";
72
+ | "unknown";
57
73
 
58
74
  export type ProtocolType = "data:" | "file:" | "node:";
59
75