or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

configuration.mdindex.mdjest-runner.mdwatch-plugin.md
tile.json

tessl/npm-jest-runner-eslint

An ESLint runner for Jest that integrates ESLint into the Jest testing framework for unified code testing and quality checks

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/jest-runner-eslint@2.3.x

To install, run

npx @tessl/cli install tessl/npm-jest-runner-eslint@2.3.0

index.mddocs/

jest-runner-eslint

jest-runner-eslint is a Jest runner that integrates ESLint into the Jest testing framework, allowing developers to run ESLint as part of their Jest test suite. It enables linting to be treated as tests, providing a unified interface for both code testing and code quality checks with seamless integration for JavaScript and TypeScript projects.

Package Information

  • Package Name: jest-runner-eslint
  • Package Type: npm
  • Language: JavaScript
  • Installation: npm install jest-runner-eslint

Core Imports

// Main Jest runner (CommonJS only)
const jestRunner = require("jest-runner-eslint");

// Watch plugin
const ESLintWatchFixPlugin = require("jest-runner-eslint/watch-fix");

Basic Usage

Standalone Configuration

// jest.config.js
module.exports = {
  runner: 'jest-runner-eslint',
  displayName: 'lint',
  testMatch: ['<rootDir>/src/**/*.js'],
};

Multi-Project Configuration

// jest.config.js
module.exports = {
  projects: [
    {
      displayName: 'test',
      // your regular Jest test configuration
    },
    {
      runner: 'jest-runner-eslint',
      displayName: 'lint',
      testMatch: ['<rootDir>/src/**/*.js'],
    },
  ],
};

With Configuration Options

// jest-runner-eslint.config.js
module.exports = {
  cliOptions: {
    fix: true,
    cache: true,
    format: 'codeframe',
    maxWarnings: 0,
  },
};

Architecture

jest-runner-eslint is built around several key components:

  • Main Runner: Jest runner that orchestrates ESLint execution within Jest framework
  • ESLint Integration: Core execution engine that runs ESLint and formats results for Jest
  • Configuration System: Flexible configuration loading using cosmiconfig with support for both legacy and flat ESLint configs
  • ESLint Compatibility Layer: Automatic detection and handling of ESLint versions (8.57.0+) and configuration types (flat vs legacy)
  • Watch Plugin: Interactive Jest watch mode plugin for toggling --fix option during development
  • Results Formatting: Transforms ESLint output into Jest-compatible test results with proper error reporting

ESLint Version Compatibility

The runner automatically detects and handles different ESLint versions and configuration formats:

  • ESLint 8.57.0+: Uses loadESLint() function to detect flat config vs legacy config automatically
  • ESLint <8.57.0: Falls back to compatibility mode using ESLint and FlatESLint constructors
  • Configuration Detection: Automatically determines whether to use flat config or legacy config format
  • API Normalization: Provides unified interface regardless of underlying ESLint version

Capabilities

Main Jest Runner

The primary Jest runner that integrates ESLint into Jest testing workflow, supporting all ESLint configurations and providing Jest-formatted output.

const runner = require("jest-runner-eslint");

Jest Runner Integration

Watch Mode Plugin

Interactive Jest watch plugin that allows toggling ESLint's --fix option during development without restarting the watch process.

class ESLintWatchFixPlugin {
  constructor(options: WatchPluginOptions);
  run(): Promise<boolean>;
  getUsageInfo(): WatchPluginUsageInfo;
}

interface WatchPluginOptions {
  stdout: NodeJS.WriteStream;
  config: { key?: string };
}

interface WatchPluginUsageInfo {
  key: string;
  prompt: string;
}

Watch Plugin

Configuration Management

Comprehensive configuration system supporting all ESLint CLI options with automatic detection of ESLint configuration type (legacy vs flat config).

interface JestRunnerESLintConfig {
  cliOptions?: ESLintCliOptions;
}

interface ESLintCliOptions {
  // Basic options
  cache?: boolean;
  cacheLocation?: string;
  config?: string;
  fix?: boolean;
  fixDryRun?: boolean;
  format?: string;
  maxWarnings?: number;
  quiet?: boolean;
  
  // Legacy config options (ESLint <8.57.0)
  ext?: string | string[];
  env?: string | string[];
  global?: string | string[];
  ignorePath?: string;
  ignorePattern?: string[];
  noEslintrc?: boolean;
  noIgnore?: boolean;
  noInlineConfig?: boolean;
  parser?: string;
  parserOptions?: object;
  plugin?: string | string[];
  reportUnusedDisableDirectives?: boolean;
  resolvePluginsRelativeTo?: string;
  rules?: object;
  rulesdir?: string | string[];
}

Configuration

Configuration Utilities

Internal utilities for configuration management and normalization across different ESLint versions and configuration formats.

/**
 * Configuration override management for watch mode
 */
class ConfigOverrides {
  setFix(fix: boolean): void;
  getFix(): boolean | undefined;
}

/**
 * Configuration normalization for ESLint options
 * @param configType - ESLint configuration type ('flat' | 'legacy')
 * @param config - Raw configuration object
 * @returns Normalized configuration with cliOptions
 */
function normalizeConfig(
  configType: 'flat' | 'legacy', 
  config: object
): { cliOptions: ESLintCliOptions };

Types

interface ESLintResult {
  filePath: string;
  messages: ESLintMessage[];
  errorCount: number;
  fatalErrorCount?: number;
  warningCount: number;
  fixableErrorCount: number;
  fixableWarningCount: number;
  source?: string;
  usedDeprecatedRules?: Array<{ ruleId: string; replacedBy: string[] }>;
}

interface ESLintMessage {
  ruleId: string | null;
  severity: 1 | 2;
  message: string;
  line: number;
  column: number;
  nodeType?: string;
  messageId?: string;
  endLine?: number;
  endColumn?: number;
  fix?: ESLintFix;
  suggestions?: ESLintSuggestion[];
}

interface ESLintFix {
  range: [number, number];
  text: string;
}

interface ESLintSuggestion {
  desc: string;
  messageId?: string;
  fix: ESLintFix;
}

interface TestResult {
  failureMessage: string;
  leaks: boolean;
  numFailingTests: number;
  numPassingTests: number;
  numPendingTests: number;
  numTodoTests: number;
  openHandles: any[];
  perfStats: {
    start: number;
    end: number;
    duration: number;
    runtime: number;
    slow: boolean;
  };
  skipped: boolean;
  snapshot: {
    added: number;
    fileDeleted: boolean;
    matched: number;
    unchecked: number;
    uncheckedKeys: any[];
    unmatched: number;
    updated: number;
  };
  testFilePath: string;
  testResults: TestAssertionResult[];
  cliOptions?: ESLintCliOptions;
}

interface TestAssertionResult {
  duration: number;
  ancestorTitles: string[];
  failureDetails: any[];
  failureMessages: string[];
  fullName: string;
  location?: {
    column: number;
    line: number;
  };
  testFilePath: string;
  numPassingAsserts: number;
  status: 'passed' | 'failed' | 'skipped';
  title: string;
}