Utilities for working with ESLint Flat Config format, providing object-based syntax and monorepo configuration management.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Utilities for merging ESLint configurations across multiple directories in monorepos, providing bulk configuration processing and convenient helper functions.
Merges ESLint configurations from multiple directories in a monorepo structure. Reads all subdirectories within specified directories and combines their configurations into a single flat config array.
/**
* Merges ESLint configurations from multiple directories
* @param {string|URL} cwd - Current working directory or file URL
* @param {string|Array<string>} directories - Directory name(s) to read configs from
* @param {Object} [options] - Optional override functions { readdir, readESLintConfig }
* @returns {Promise<Array<Object>>} Promise resolving to flattened array of merged ESLint config objects
*/
async function mergeESLintConfigs(cwd, directories, options);Parameters:
cwd (string|URL): Current working directory or file:// URLdirectories (string|Array): Single directory name or array of directory names to processoptions (Object, optional): Override functions for dependency injection
readdir (function): Custom directory reading functionReturns: Promise resolving to a flattened array of all merged ESLint configuration objects.
Usage Examples:
Single Directory Processing:
const { mergeESLintConfigs } = require('@putout/eslint-flat');
// Process all packages in ./packages directory
const config = await mergeESLintConfigs(__dirname, 'packages');
// This will:
// 1. Read all subdirectories in ./packages
// 2. Read ESLint config from each subdirectory
// 3. Use matchToFlatDir for each subdirectory
// 4. Flatten all configs into single arrayMultiple Directory Processing:
const { mergeESLintConfigs } = require('@putout/eslint-flat');
// Process multiple directory types
const config = await mergeESLintConfigs(__dirname, ['packages', 'tools', 'scripts']);With File URL (ESM):
import { mergeESLintConfigs } from '@putout/eslint-flat';
const config = await mergeESLintConfigs(import.meta.url, ['packages']);Complete Monorepo ESLint Configuration:
import { safeAlign } from 'eslint-plugin-putout/config';
import { mergeESLintConfigs } from '@putout/eslint-flat';
const packageConfigs = await mergeESLintConfigs(import.meta.url, ['packages']);
export default [
...safeAlign,
...packageConfigs,
];With Custom Options:
const { mergeESLintConfigs } = require('@putout/eslint-flat');
const fs = require('fs/promises');
// Custom directory reading for filtered processing
const customReaddir = async (path) => {
const items = await fs.readdir(path);
// Only process directories starting with 'pkg-'
return items.filter(item => item.startsWith('pkg-'));
};
const config = await mergeESLintConfigs(__dirname, 'packages', {
readdir: customReaddir,
});Convenience function that serves as an alias to ESLint's defineConfig function, providing a cleaner API for creating ESLint configurations.
/**
* Alias to ESLint's defineConfig function for creating configurations
* @param {Array<Object>} configs - Array of ESLint configuration objects
* @returns {Array<Object>} Processed configuration array from ESLint's defineConfig
*/
function createESLintConfig(configs);Parameters:
configs (Array<Object>): Array of ESLint configuration objects to be processedReturns: Array of ESLint configuration objects processed by ESLint's defineConfig function.
Usage Examples:
Simple Configuration Creation:
const { createESLintConfig } = require('@putout/eslint-flat');
const { safeAlign } = require('eslint-plugin-putout/config');
// Instead of spreading arrays manually
export default createESLintConfig([
...safeAlign,
{
files: ['**/*.js'],
rules: {
'no-console': 'warn',
},
},
]);Compared to Manual Spreading:
// Without createESLintConfig (more verbose)
export default [
...safeAlign,
...otherConfigs,
customConfig,
];
// With createESLintConfig (cleaner)
export default createESLintConfig([safeAlign, otherConfigs, customConfig]);The mergeESLintConfigs function follows this processing flow:
readESLintConfigmatchToFlatDir to process and prefix file patternsmy-monorepo/
├── packages/
│ ├── package-a/
│ │ └── eslint.config.js
│ ├── package-b/
│ │ └── eslint.config.js
│ └── package-c/
│ └── .eslintrc.json
└── tools/
├── build-tool/
│ └── eslint.config.js
└── dev-tool/
└── eslint.config.jsConfiguration:
const config = await mergeESLintConfigs(__dirname, ['packages', 'tools']);
// Processes: package-a, package-b, package-c, build-tool, dev-tool
// Returns: Single flattened array with all configurationsPromise.allArray.flat()Install with Tessl CLI
npx tessl i tessl/npm-putout--eslint-flat