Skip to main content
Rev-dep is designed to serve as a high-speed gatekeeper for your CI pipeline, ensuring your dependency graph remains lean and your architecture stays intact as you iterate.

Quick Setup

Add Rev-dep to your project’s scripts in package.json:
package.json
{
  "scripts": {
    "check:deps": "rev-dep config run",
    "check:deps:verbose": "rev-dep config run --list-all-issues",
    "fix:deps": "rev-dep config run --fix"
  },
  "devDependencies": {
    "rev-dep": "^2.0.0"
  }
}
Then in your CI configuration:
name: Dependency Check

on:
  pull_request:
  push:
    branches: [main]

jobs:
  check-deps:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm ci
      - run: npm run check:deps

Exit Codes

Rev-dep uses standard exit codes to communicate results to your CI system:
Exit CodeMeaning
0All checks passed successfully
1One or more checks found issues
>1Error occurred during execution
By default, Rev-dep will fail your CI pipeline (exit code 1) when it detects issues. This is the recommended behavior for enforcing code quality.

Override Exit Code

For specific commands that support it, you can force a zero exit code:
# These commands won't fail CI even if issues are found
rev-dep node-modules unused --zero-exit-code
rev-dep node-modules missing --zero-exit-code
The --zero-exit-code flag is useful during migration or for non-blocking checks, but should be used sparingly in production CI.

Performance Benefits

Rev-dep’s configuration approach provides massive performance advantages in CI environments:

Single Dependency Tree

Builds one comprehensive dependency tree for all rules instead of multiple passes

Parallel Rule Execution

Processes multiple rules simultaneously using all available CPU cores

Parallel Check Execution

Runs all enabled checks within each rule in parallel

Optimized File Discovery

Discovers files once and reuses across all checks

Real-World Performance

Rev-dep can execute a full suite of governance checks on a 500k+ LoC monorepo in approximately 500ms:
Check TypeRev-depAlternativeSpeedup
Circular dependencies289 msdpdm-fast: 7061 ms24x faster
Unused exports303 msknip: 6606 ms22x faster
Unused files277 msknip: 6596 ms23x faster
Unused node modules287 msknip: 6572 ms22x faster
Missing node modules270 msknip: 6568 ms24x faster
  • Written in Go: Eliminates the performance tax of Node-based analysis
  • Parallel processing: Utilizes all available CPU cores
  • Single-pass analysis: Builds dependency graph once and reuses it
  • Optimized algorithms: Custom-built for dependency analysis
10x-200x faster execution means significantly reduced CI costs and shorter developer wait times.

Configuration Strategies

Progressive Adoption

Start with non-breaking checks and gradually enable stricter rules:
Phase 1: Detection Only
{
  "configVersion": "1.6",
  "rules": [
    {
      "path": ".",
      "prodEntryPoints": ["src/main.tsx"],
      "circularImportsDetection": { "enabled": true },
      "unusedNodeModulesDetection": { "enabled": true }
    }
  ]
}
Phase 2: Add Autofix Checks
{
  "configVersion": "1.6",
  "rules": [
    {
      "path": ".",
      "prodEntryPoints": ["src/main.tsx"],
      "circularImportsDetection": { "enabled": true },
      "unusedNodeModulesDetection": { "enabled": true },
      "unusedExportsDetection": {
        "enabled": true,
        "autofix": true
      },
      "orphanFilesDetection": {
        "enabled": true,
        "autofix": true
      }
    }
  ]
}
Phase 3: Full Enforcement
{
  "configVersion": "1.6",
  "rules": [
    {
      "path": ".",
      "prodEntryPoints": ["src/main.tsx"],
      "circularImportsDetection": { "enabled": true },
      "unusedNodeModulesDetection": { "enabled": true },
      "missingNodeModulesDetection": { "enabled": true },
      "unusedExportsDetection": { "enabled": true, "autofix": true },
      "orphanFilesDetection": { "enabled": true, "autofix": true },
      "moduleBoundaries": [
        {
          "name": "ui-components",
          "pattern": "src/components/**/*",
          "deny": ["src/api/**/*"]
        }
      ]
    }
  ]
}

Monorepo Setup

For monorepos, create rules for each package:
{
  "configVersion": "1.6",
  "conditionNames": ["import", "default"],
  "rules": [
    {
      "path": ".",
      "followMonorepoPackages": true,
      "prodEntryPoints": ["packages/*/src/index.ts"]
    },
    {
      "path": "packages/frontend",
      "followMonorepoPackages": true,
      "prodEntryPoints": ["src/main.tsx"],
      "devDepsUsageOnProdDetection": {
        "enabled": true,
        "ignoreTypeImports": true
      }
    },
    {
      "path": "packages/backend",
      "followMonorepoPackages": true,
      "prodEntryPoints": ["src/server.ts"],
      "restrictedImportsDetection": {
        "enabled": true,
        "entryPoints": ["src/server.ts"],
        "denyFiles": ["**/*.tsx"],
        "denyModules": ["react", "react-*"]
      }
    }
  ]
}
Run rev-dep config init at your monorepo root to automatically generate a rule for each workspace package.

Advanced CI Workflows

Pre-commit Hooks

Use with husky and lint-staged for faster feedback:
package.json
{
  "lint-staged": {
    "*.{ts,tsx,js,jsx}": [
      "eslint --fix",
      "rev-dep config run --fix"
    ]
  }
}

Separate Check and Fix Jobs

check-deps:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
    - run: npm ci
    - run: npm run check:deps

Cache for Faster Builds

- uses: actions/cache@v3
  with:
    path: |
      ~/.npm
      node_modules
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    
- run: npm ci
- run: npm run check:deps

Monitoring and Reporting

Verbose Output for Debugging

# Get detailed information about all issues
rev-dep config run --list-all-issues --verbose

Save Results to File

# Redirect output for artifact storage
rev-dep config run --list-all-issues > dependency-report.txt
Then in your CI:
- run: npm run check:deps:verbose > dependency-report.txt
  continue-on-error: true
  
- uses: actions/upload-artifact@v3
  if: always()
  with:
    name: dependency-report
    path: dependency-report.txt

Best Practices

1

Start with detection

Enable checks in detection-only mode first to understand your codebase’s current state
2

Fix existing issues

Use --fix flag locally to auto-fix issues before enforcing in CI
3

Enable in CI

Add to CI pipeline once your codebase is clean
4

Monitor performance

Track CI execution time - Rev-dep should complete in under 1 second for most projects
5

Iterate on rules

Gradually add stricter rules (module boundaries, import conventions) as your architecture solidifies
Don’t skip checks with --zero-exit-code in production CI. If you need to bypass a specific check temporarily, disable it in the config instead.

Build docs developers (and LLMs) love