dependency-cruiser
Version:
Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.
364 lines (339 loc) • 14.7 kB
JavaScript
/* eslint-disable max-lines, no-useless-escape */
export default `/** @type {import('dependency-cruiser').IConfiguration} */
module.exports = {
forbidden: [
{
name: 'no-circular',
severity: 'warn',
comment:
"This dependency is part of a circular relationship. You might want to revise " +
"your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ",
from: {},
to: {
circular: true
}
},
{
name: 'no-orphans',
comment:
"This is an orphan module - it's likely not used (anymore?). Either use it or " +
"remove it. If it's logical this module is an orphan (i.e. it's a config file), " +
"add an exception for it in your dependency-cruiser configuration. By default " +
"this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " +
"files (.d.ts), tsconfig.json and some of the babel and webpack configs.",
severity: 'warn',
from: {
orphan: true,
pathNot: [
'(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files
'[.]d[.]ts$', // TypeScript declaration files
'(^|/)tsconfig[.]json$', // TypeScript config
'(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs
]
},
to: {},
},
{
name: 'no-deprecated-core',
comment:
'A module depends on a node core module that has been deprecated. Find an alternative - these are ' +
"bound to exist - node doesn't deprecate lightly.",
severity: 'warn',
from: {},
to: {
dependencyTypes: [
'core'
],
path: [
'^v8\/tools\/codemap$',
'^v8\/tools\/consarray$',
'^v8\/tools\/csvparser$',
'^v8\/tools\/logreader$',
'^v8\/tools\/profile_view$',
'^v8\/tools\/profile$',
'^v8\/tools\/SourceMap$',
'^v8\/tools\/splaytree$',
'^v8\/tools\/tickprocessor-driver$',
'^v8\/tools\/tickprocessor$',
'^node-inspect\/lib\/_inspect$',
'^node-inspect\/lib\/internal\/inspect_client$',
'^node-inspect\/lib\/internal\/inspect_repl$',
'^async_hooks$',
'^punycode$',
'^domain$',
'^constants$',
'^sys$',
'^_linklist$',
'^_stream_wrap$'
],
}
},
{
name: 'not-to-deprecated',
comment:
'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' +
'version of that module, or find an alternative. Deprecated modules are a security risk.',
severity: 'warn',
from: {},
to: {
dependencyTypes: [
'deprecated'
]
}
},
{
name: 'no-non-package-json',
severity: 'error',
comment:
"This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " +
"That's problematic as the package either (1) won't be available on live (2 - worse) will be " +
"available on live with an non-guaranteed version. Fix it by adding the package to the dependencies " +
"in your package.json.",
from: {},
to: {
dependencyTypes: [
'npm-no-pkg',
'npm-unknown'
]
}
},
{
name: 'not-to-unresolvable',
comment:
"This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " +
'module: add it to your package.json. In all other cases you likely already know what to do.',
severity: 'error',
from: {},
to: {
couldNotResolve: true
}
},
{
name: 'no-duplicate-dep-types',
comment:
"Likely this module depends on an external ('npm') package that occurs more than once " +
"in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " +
"maintenance problems later on.",
severity: 'warn',
from: {},
to: {
moreThanOneDependencyType: true,
// as it's common to use a devDependency for type-only imports: don't
// consider type-only dependencyTypes for this rule
dependencyTypesNot: ["type-only"]
}
},
// rules you might want to tweak for your specific situation:
{{notToTestRule}}
{
name: 'not-to-spec',
comment:
'This module depends on a spec (test) file. The responsibility of a spec file is to test code. ' +
"If there's something in a spec that's of use to other modules, it doesn't have that single " +
'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.',
severity: 'error',
from: {},
to: {
path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$'
}
},
{
name: 'not-to-dev-dep',
severity: 'error',
comment:
"This module depends on an npm package from the 'devDependencies' section of your " +
'package.json. It looks like something that ships to production, though. To prevent problems ' +
"with npm packages that aren't there on production declare it (only!) in the 'dependencies'" +
'section of your package.json. If this module is development only - add it to the ' +
'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration',
from: {
path: '{{sourceLocationRE}}',
pathNot: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$'
},
to: {
dependencyTypes: [
'npm-dev',
],
// type only dependencies are not a problem as they don't end up in the
// production code or are ignored by the runtime.
dependencyTypesNot: [
'type-only'
],
pathNot: [
'node_modules/@types/'
]
}
},
{
name: 'optional-deps-used',
severity: 'info',
comment:
"This module depends on an npm package that is declared as an optional dependency " +
"in your package.json. As this makes sense in limited situations only, it's flagged here. " +
"If you use an optional dependency here by design - add an exception to your" +
"dependency-cruiser configuration.",
from: {},
to: {
dependencyTypes: [
'npm-optional'
]
}
},
{
name: 'peer-deps-used',
comment:
"This module depends on an npm package that is declared as a peer dependency " +
"in your package.json. This makes sense if your package is e.g. a plugin, but in " +
"other cases - maybe not so much. If the use of a peer dependency is intentional " +
"add an exception to your dependency-cruiser configuration.",
severity: 'warn',
from: {},
to: {
dependencyTypes: [
'npm-peer'
]
}
}
],
options: {
// Which modules not to follow further when encountered
doNotFollow: {
// path: an array of regular expressions in strings to match against
path: ['node_modules']
},
// Which modules to exclude
// exclude : {
// // path: an array of regular expressions in strings to match against
// path: '',
// },
// Which modules to exclusively include (array of regular expressions in strings)
// dependency-cruiser will skip everything that doesn't match this pattern
// includeOnly : [''],
// List of module systems to cruise.
// When left out dependency-cruiser will fall back to the list of _all_
// module systems it knows of ('amd', 'cjs', 'es6', 'tsd']). It's the
// default because it's the safe option. It comes at a performance penalty, though
// As in practice only commonjs ('cjs') and ecmascript modules ('es6')
// are in wide use, you can limit the moduleSystems to those.
// moduleSystems: ['cjs', 'es6'],
// false: don't look at JSDoc imports (the default)
// true: detect dependencies in JSDoc-style import statements.
// Implies parser: 'tsc', which a.o. means the typescript compiler will need
// to be installed in the same spot you run dependency-cruiser from.
{{detectJSDocImportsAttribute}}
// false: don't look at process.getBuiltinModule calls (the default)
// true: dependency-cruiser will detect calls to process.getBuiltinModule/
// globalThis.process.getBuiltinModule as imports.
{{detectProcessBuiltinModuleCalls}}
// prefix for links in html, d2, mermaid and dot/ svg output (e.g. 'https://github.com/you/yourrepo/blob/main/'
// to open it on your online repo or \`vscode://file/$\{process.cwd()}/\` to
// open it in visual studio code),
// prefix: \`vscode://file/$\{process.cwd()}/\`,
// suffix for links in output. E.g. put .html here if you use it to link to
// your coverage reports.
// suffix: '.html',
// false (the default): ignore dependencies that only exist before typescript-to-javascript compilation
// true: also detect dependencies that only exist before typescript-to-javascript compilation
// 'specify': for each dependency identify whether it only exists before compilation or also after
{{tsPreCompilationDepsAttribute}}
// list of extensions to scan that aren't javascript or compile-to-javascript.
// Empty by default. Only put extensions in here that you want to take into
// account that are _not_ parsable.
// extraExtensionsToScan: ['.json', '.jpg', '.png', '.svg', '.webp'],
// if true combines the package.jsons found from the module up to the base
// folder the cruise is initiated from. Useful for how (some) mono-repos
// manage dependencies & dependency definitions.
{{combinedDependenciesAttribute}}
// if true leave symlinks untouched, otherwise use the realpath
// preserveSymlinks: false,
// TypeScript project file ('tsconfig.json') to use for
// (1) compilation and
// (2) resolution (e.g. with the paths property)
//
// The (optional) fileName attribute specifies which file to take (relative to
// dependency-cruiser's current working directory). When not provided
// defaults to './tsconfig.json'.
{{tsOrJsConfigAttribute}}
// Webpack configuration to use to get resolve options from.
//
// The (optional) fileName attribute specifies which file to take (relative
// to dependency-cruiser's current working directory. When not provided defaults
// to './webpack.conf.js'.
//
// The (optional) 'env' and 'arguments' attributes contain the parameters
// to be passed if your webpack config is a function and takes them (see
// webpack documentation for details)
{{webpackConfigAttribute}}
// Babel config ('.babelrc', '.babelrc.json', '.babelrc.json5', ...) to use
// for compilation
{{babelConfigAttribute}}
// List of strings you have in use in addition to cjs/ es6 requires
// & imports to declare module dependencies. Use this e.g. if you've
// re-declared require, use a require-wrapper or use window.require as
// a hack.
// exoticRequireStrings: [],
// options to pass on to enhanced-resolve, the package dependency-cruiser
// uses to resolve module references to disk. The values below should be
// suitable for most situations
//
// If you use webpack: you can also set these in webpack.conf.js. The set
// there will override the ones specified here.
enhancedResolveOptions: {
// What to consider as an 'exports' field in package.jsons
exportsFields: ['exports'],
// List of conditions to check for in the exports field.
// Only works when the 'exportsFields' array is non-empty.
conditionNames: ['import', 'require', 'node', 'default', 'types'],
// The extensions, by default are the same as the ones dependency-cruiser
// can access (run \`npx depcruise --info\` to see which ones that are in
// _your_ environment). If that list is larger than you need you can pass
// the extensions you actually use (e.g. ['.js', '.jsx']). This can speed
// up module resolution, which is the most expensive step.
{{extensionsAttribute}}
// What to consider a 'main' field in package.json
{{mainFieldsAttribute}}
// A list of alias fields in package.jsons
// See https://github.com/defunctzombie/package-browser-field-spec and
// the webpack [resolve.alias](https://webpack.js.org/configuration/resolve/#resolvealiasfields)
// documentation.
// Defaults to an empty array (= don't use alias fields).
// aliasFields: ['browser'],
},
// skipAnalysisNotInRules will make dependency-cruiser execute
// analysis strictly necessary for checking the rule set only.
// See https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#skipanalysisnotinrules
skipAnalysisNotInRules: true,
{{builtInModulesAttribute}}
reporterOptions: {
dot: {
// Pattern of modules to consolidate to. The default pattern in this configuration
// collapses everything in node_modules to one folder deep so you see
// the external modules, but not their innards.
collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)',
// Options to tweak the appearance of your graph. See
// https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions
// If you don't specify a theme dependency-cruiser falls back to a built-in one.
// theme: {
// graph: {
// // splines: 'ortho' - straight lines; slow on big graphs
// // splines: 'true' - bezier curves; fast but not as nice as ortho
// splines: 'true'
// },
// },
},
archi: {
// Pattern of modules to consolidate to.
collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)',
// Options to tweak the appearance of your graph. If you don't specify a
// theme for 'archi' dependency-cruiser will use the one specified in the
// dot section above and otherwise use the default one.
// theme: { },
},
text: {
highlightFocused: true
},
}
}
};
// generated: dependency-cruiser@{{version}} on {{date}}
`;