ESLint plugin for Nx monorepos with boundary enforcement and dependency management rules.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
The dependency-checks rule validates package.json dependencies against actual code usage, ensuring dependency declarations stay synchronized with implementation requirements across the workspace.
Analyzes project files to detect missing dependencies, obsolete packages, and version mismatches in package.json files.
/**
* ESLint rule that validates package.json dependencies against actual usage
* Rule name: "@nx/dependency-checks"
*/
interface DependencyChecksRule {
name: "dependency-checks";
meta: {
type: "suggestion";
docs: {
description: "Checks dependencies in project's package.json for version mismatches";
};
fixable: "code";
schema: [DependencyChecksOptions];
messages: Record<MessageIds, string>;
};
defaultOptions: [DependencyChecksOptions];
create: (context: RuleContext) => RuleListener;
}Complete configuration interface for dependency validation behavior.
interface DependencyChecksOptions {
/** Build target names used to determine production vs development dependencies */
buildTargets?: string[];
/** Check for dependencies used in code but missing from package.json */
checkMissingDependencies?: boolean;
/** Check for dependencies in package.json that are not used in code */
checkObsoleteDependencies?: boolean;
/** Check for version mismatches between declared and installed versions */
checkVersionMismatches?: boolean;
/** Package names to ignore during dependency checks */
ignoredDependencies?: string[];
/** File patterns to exclude from dependency analysis */
ignoredFiles?: string[];
/** Include transitive dependencies in the analysis */
includeTransitiveDependencies?: boolean;
/** Use local workspace paths instead of npm versions for workspace dependencies */
useLocalPathsForWorkspaceDependencies?: boolean;
/** Runtime helper packages that should be treated specially */
runtimeHelpers?: string[];
}The rule comes with sensible defaults for most Nx workspaces.
const DEFAULT_OPTIONS: DependencyChecksOptions = {
buildTargets: ['build'],
checkMissingDependencies: true,
checkObsoleteDependencies: true,
checkVersionMismatches: true,
ignoredDependencies: [],
ignoredFiles: [],
includeTransitiveDependencies: false,
useLocalPathsForWorkspaceDependencies: false,
runtimeHelpers: []
};All possible validation messages returned by the rule.
type MessageIds =
| "missingDependency"
| "obsoleteDependency"
| "versionMismatch"
| "missingDependencySection";
interface ErrorMessages {
missingDependency: string; // 'The "{{projectName}}" project uses the following packages, but they are missing from "{{section}}":{{packageNames}}'
obsoleteDependency: string; // 'The "{{packageName}}" package is not used by "{{projectName}}" project.'
versionMismatch: string; // 'The version specifier does not contain the installed version of "{{packageName}}" package: {{version}}.'
missingDependencySection: string; // 'Dependency sections are missing from the "package.json" but following dependencies were detected:{{dependencies}}'
}Usage Examples:
// Basic dependency checking
{
rules: {
"@nx/dependency-checks": [
"error",
{
checkMissingDependencies: true,
checkObsoleteDependencies: true,
checkVersionMismatches: true
}
]
}
}
// Ignore specific packages and files
{
rules: {
"@nx/dependency-checks": [
"error",
{
ignoredDependencies: [
"@types/node", // Type definitions
"nx", // Workspace tooling
"typescript" // Build tooling
],
ignoredFiles: [
"**/*.spec.ts", // Test files
"**/*.stories.ts", // Storybook files
"**/jest.config.ts" // Config files
]
}
]
}
}
// Custom build targets and workspace handling
{
rules: {
"@nx/dependency-checks": [
"error",
{
buildTargets: ["build", "build-prod", "compile"],
useLocalPathsForWorkspaceDependencies: true,
includeTransitiveDependencies: false,
runtimeHelpers: ["tslib", "@babel/runtime"]
}
]
}
}
// Development vs production dependency checking
{
rules: {
"@nx/dependency-checks": [
"error",
{
buildTargets: ["build"],
// Will check that runtime dependencies are in dependencies
// and build-time dependencies are in devDependencies
checkMissingDependencies: true
}
]
}
}The rule performs several types of dependency analysis:
The rule uses build targets to determine dependency placement:
dependencies)devDependencies)devDependencies)The rule analyzes various import patterns:
// ES6 imports
import { something } from 'package-name';
import * as pkg from 'package-name';
import pkg from 'package-name';
// CommonJS requires
const pkg = require('package-name');
const { something } = require('package-name');
// Dynamic imports
const pkg = await import('package-name');
// Type-only imports (TypeScript)
import type { SomeType } from 'package-name';The rule integrates with Nx workspace features:
Install with Tessl CLI
npx tessl i tessl/npm-nx--eslint-plugin