196 lines
6.9 KiB
JavaScript
196 lines
6.9 KiB
JavaScript
|
|
const metroConfig = require("./metro.config.js")
|
||
|
|
|
||
|
|
const platforms = ["ios", "android", "web", "native"]
|
||
|
|
const extensions = metroConfig?.resolver?.sourceExts.flatMap((pExt) =>
|
||
|
|
platforms.map((platform) => `.${platform}.${pExt}`).concat(`.${pExt}`),
|
||
|
|
)
|
||
|
|
|
||
|
|
/** @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|json)$",
|
||
|
|
"\\.d\\.ts$",
|
||
|
|
"(^|/)tsconfig\\.json$",
|
||
|
|
"(^|/)(babel|webpack)\\.config\\.(js|cjs|mjs|ts|json)$",
|
||
|
|
"crashReporting\\.ts$", // Boilerplate file for future crash reporting setup
|
||
|
|
"utils/delay\\.ts$", // Utility function for delaying execution
|
||
|
|
],
|
||
|
|
},
|
||
|
|
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: ["^(punycode)$", "^(domain)$", "^(constants)$", "^(sys)$"],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
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) 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,
|
||
|
|
dependencyTypesNot: ["type-only"],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: "not-to-spec",
|
||
|
|
comment:
|
||
|
|
"This module depends on a spec (test) file. The sole 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: {
|
||
|
|
pathNot: "\\.(spec|test)\\.(js|mjs|cjs|ts|tsx)$",
|
||
|
|
},
|
||
|
|
to: {
|
||
|
|
path: "\\.(spec|test)\\.(js|mjs|cjs|ts|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: "^(app|src)",
|
||
|
|
pathNot: "\\.(spec|test)\\.(js|mjs|cjs|ts|tsx)$",
|
||
|
|
},
|
||
|
|
to: {
|
||
|
|
dependencyTypes: ["npm-dev"],
|
||
|
|
pathNot: ["node_modules/@types/"],
|
||
|
|
exoticRequireNot: [
|
||
|
|
"react-native/Libraries/Utilities/codegenNativeComponent",
|
||
|
|
"react-native/Libraries/Utilities/codegenNativeCommands",
|
||
|
|
],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
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're using 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: {
|
||
|
|
doNotFollow: {
|
||
|
|
path: "node_modules",
|
||
|
|
},
|
||
|
|
tsPreCompilationDeps: true,
|
||
|
|
tsConfig: {
|
||
|
|
fileName: "tsconfig.json",
|
||
|
|
},
|
||
|
|
enhancedResolveOptions: {
|
||
|
|
exportsFields: ["exports"],
|
||
|
|
conditionNames: ["import", "require", "node", "default"],
|
||
|
|
// React Native / Metro bundler support for platform-specific extensions
|
||
|
|
// See: https://reactnative.dev/docs/platform-specific-code
|
||
|
|
// See: https://github.com/sverweij/dependency-cruiser/issues/511
|
||
|
|
extensions,
|
||
|
|
},
|
||
|
|
reporterOptions: {
|
||
|
|
dot: {
|
||
|
|
collapsePattern: "node_modules/(@[^/]+/[^/]+|[^/]+)",
|
||
|
|
},
|
||
|
|
archi: {
|
||
|
|
collapsePattern: "^(app|src|test)/[^/]+",
|
||
|
|
},
|
||
|
|
text: {
|
||
|
|
highlightFocused: true,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}
|