An ESLint runner for Jest that integrates ESLint into the Jest testing framework for unified code testing and quality checks
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Comprehensive configuration system supporting all ESLint CLI options with automatic detection of ESLint configuration type (legacy vs flat config).
Configuration loading system using cosmiconfig to find and parse jest-runner-eslint configuration.
/**
* Loads ESLint options from configuration files
* Supports package.json, .jest-runner-eslintrc, and jest-runner-eslint.config.js
* @param configType - ESLint configuration type ('flat' or 'legacy')
* @param config - Jest configuration object containing rootDir
* @returns Normalized ESLint options object
*/
function getESLintOptions(
configType: 'flat' | 'legacy',
config: { rootDir: string }
): { cliOptions: ESLintCliOptions };Usage Examples:
// package.json configuration
{
"jest-runner-eslint": {
"cliOptions": {
"fix": true,
"cache": true,
"format": "codeframe"
}
}
}
// jest-runner-eslint.config.js
module.exports = {
cliOptions: {
fix: true,
cache: true,
cacheLocation: './eslint-cache',
maxWarnings: 0,
format: 'stylish'
}
};
// .jest-runner-eslintrc (JSON)
{
"cliOptions": {
"quiet": true,
"fix": false,
"ext": [".js", ".jsx", ".ts", ".tsx"]
}
}System for normalizing configuration options based on ESLint configuration type.
/**
* Normalizes configuration object with proper CLI options
* @param configType - ESLint configuration type
* @param config - Raw configuration object
* @returns Normalized configuration with cliOptions
*/
function normalizeConfig(
configType: 'flat' | 'legacy',
config: Partial<JestRunnerESLintConfig>
): JestRunnerESLintConfig;
/**
* Normalizes CLI options based on configuration type
* @param configType - ESLint configuration type
* @param rawConfig - Raw CLI options object
* @returns Normalized CLI options object
*/
function normalizeCliOptions(
configType: 'flat' | 'legacy',
rawConfig: Partial<ESLintCliOptions>
): ESLintCliOptions;Configuration schemas for different ESLint configuration types.
/** Base configuration schema shared by both config types */
const BASE_CONFIG: ConfigSchema;
/** Legacy ESLint configuration schema (ESLint <8.57.0) */
const LEGACY_CONFIG: ConfigSchema;
/** Flat ESLint configuration schema (ESLint >=8.57.0) */
const FLAT_CONFIG: ConfigSchema;
interface ConfigSchema {
[key: string]: {
name?: string;
default: any;
transform?: (value: any) => any;
};
}Complete interface for ESLint CLI options supported by jest-runner-eslint.
interface ESLintCliOptions {
// Basic options (supported in both legacy and flat config)
/** Enable ESLint caching */
cache?: boolean;
/** Location of cache file */
cacheLocation?: string;
/** Path to ESLint configuration file */
config?: string;
/** Automatically fix problems */
fix?: boolean;
/** Fix problems without saving files */
fixDryRun?: boolean;
/** Output format for ESLint results */
format?: string;
/** Maximum number of warnings allowed */
maxWarnings?: number;
/** Disable warning output, only show errors */
quiet?: boolean;
/** Disable ignore files and patterns */
noIgnore?: boolean;
/** Disable inline configuration comments */
noInlineConfig?: boolean;
// Legacy config options (ESLint <8.57.0)
/** File extensions to lint */
ext?: string | string[];
/** Environment presets to enable */
env?: string | string[];
/** Global variables to define */
global?: string | string[];
/** Path to ignore file */
ignorePath?: string;
/** Ignore patterns to apply */
ignorePattern?: string[];
/** Disable .eslintrc files */
noEslintrc?: boolean;
/** Parser to use for code analysis */
parser?: string;
/** Parser options object */
parserOptions?: Record<string, any>;
/** ESLint plugins to load */
plugin?: string | string[];
/** Report unused disable directives */
reportUnusedDisableDirectives?: boolean;
/** Base path for resolving plugins */
resolvePluginsRelativeTo?: string;
/** Rules configuration object */
rules?: Record<string, any>;
/** Additional rules directories */
rulesdir?: string | string[];
}
interface JestRunnerESLintConfig {
/** CLI options for ESLint */
cliOptions?: ESLintCliOptions;
}Usage Examples:
// Comprehensive configuration example
module.exports = {
cliOptions: {
// Basic options
cache: true,
cacheLocation: './node_modules/.cache/eslint',
format: 'codeframe',
fix: false,
maxWarnings: 10,
quiet: false,
// Legacy config options (if using ESLint <8.57.0)
ext: ['.js', '.jsx', '.ts', '.tsx'],
env: ['browser', 'node'],
global: ['window', 'document'],
plugin: ['react', 'import'],
rules: {
'no-console': 'warn',
'prefer-const': 'error'
},
// File patterns
ignorePattern: ['dist/*', 'build/*'],
noIgnore: false,
noInlineConfig: false
}
};Utility functions for transforming configuration values.
/** Identity function - returns value unchanged */
const identity: <T>(value: T) => T;
/** Negation function - returns boolean opposite */
const negate: (value: boolean) => boolean;
/** Array conversion function - converts string to single-item array */
const asArray: (value: string | string[]) => string[];
/** Integer conversion function - converts string to number */
const asInt: (value: string | number) => number;Usage Examples:
// Configuration with type transformations
const config = {
cliOptions: {
ext: '.js', // Transformed to ['.js'] by asArray
maxWarnings: '5', // Transformed to 5 by asInt
noEslintrc: true, // Transformed to useEslintrc: false by negate
}
};
// Dot-prop path transformation for nested properties
const legacyConfig = {
env: ['browser'], // Becomes overrideConfig.env
global: ['window'], // Becomes overrideConfig.globals
rules: { 'no-console': 'warn' } // Becomes overrideConfig.rules
};Configuration files are discovered using cosmiconfig in the following order:
jest-runner-eslint property in package.json.jest-runner-eslintrc file (JSON).jest-runner-eslintrc.json file.jest-runner-eslintrc.js filejest-runner-eslint.config.js fileThe search starts from the Jest rootDir and traverses up the directory tree until a configuration is found or the file system root is reached.