A TypeScript ESLint ruleset designed for large teams and projects
—
Mixin configurations provide optional enhancements that can be layered on top of base profiles to add specialized functionality. Mixins must be loaded after the profile in the extends array and are designed to override or extend specific rules without conflicting with the base configuration.
Requires explicit type declarations for local variables to improve code readability and maintainability. This mixin restores TypeScript's explicit typing requirements that were relaxed in the base profiles for easier adoption.
// Legacy format
module.exports = {
extends: [
"@rushstack/eslint-config/profile/node",
"@rushstack/eslint-config/mixins/friendly-locals" // Must come after profile
],
parserOptions: { tsconfigRootDir: __dirname }
};
// Flat format
import nodeProfile from "@rushstack/eslint-config/flat/profile/node";
import friendlyLocalsMixin from "@rushstack/eslint-config/flat/mixins/friendly-locals";
export default [...nodeProfile, ...friendlyLocalsMixin];Path: @rushstack/eslint-config/mixins/friendly-locals
Flat Path: @rushstack/eslint-config/flat/mixins/friendly-locals
Purpose: Requires explicit type declarations for local variables
Impact: Overrides @typescript-eslint/typedef rule to require variableDeclaration: true
Code Impact Example:
// Without friendly-locals (allowed)
const item = provider.getItem(provider.title);
const index = item.fetchIndex();
// With friendly-locals (required)
const item: ISalesReport = provider.getItem(provider.title);
const index: Map<string, IGeographicData> = item.fetchIndex();Enables the packlets organization system for structuring source files within a single project. Packlets provide a lightweight alternative to NPM packages for organizing code.
// Legacy format
module.exports = {
extends: [
"@rushstack/eslint-config/profile/node",
"@rushstack/eslint-config/mixins/packlets"
],
parserOptions: { tsconfigRootDir: __dirname }
};
// Flat format
import nodeProfile from "@rushstack/eslint-config/flat/profile/node";
import packletsMixin from "@rushstack/eslint-config/flat/mixins/packlets";
export default [...nodeProfile, ...packletsMixin];Path: @rushstack/eslint-config/mixins/packlets
Flat Path: @rushstack/eslint-config/flat/mixins/packlets
Plugin: @rushstack/eslint-plugin-packlets
Rules:
@rushstack/packlets/mechanics: Enforces packlet import/export rules@rushstack/packlets/circular-deps: Detects circular dependencies between packletsAdds ESLint rules specifically designed for React projects. Includes validation for JSX patterns, React-specific coding practices, and performance optimizations.
// Legacy format
module.exports = {
extends: [
"@rushstack/eslint-config/profile/web-app", // Recommended profile for React
"@rushstack/eslint-config/mixins/react"
],
parserOptions: { tsconfigRootDir: __dirname },
settings: {
react: {
version: "18.0" // Specify your React version
}
}
};
// Flat format
import webAppProfile from "@rushstack/eslint-config/flat/profile/web-app";
import reactMixin from "@rushstack/eslint-config/flat/mixins/react";
export default [
...webAppProfile,
...reactMixin
];Path: @rushstack/eslint-config/mixins/react
Flat Path: @rushstack/eslint-config/flat/mixins/react
Plugin: eslint-plugin-react
Required Settings: react.version should be specified to avoid automatic detection overhead
Key React Rules Enabled:
react/jsx-key: Requires keys for array elementsreact/jsx-no-bind: Prevents performance-impacting bind calls in JSXreact/jsx-no-comment-textnodes: Prevents common JSX mistakesreact/jsx-no-target-blank: Security rule for external linksreact/jsx-uses-react: Compatibility with React importsreact/jsx-uses-vars: Compatibility with JSX variable usagereact/no-children-prop: Prevents children prop misusereact/no-danger-with-children: Prevents dangerous DOM manipulationreact/no-deprecated: Prevents usage of deprecated React APIsValidates TypeScript documentation comments to ensure they follow the TSDoc standard. Essential for projects using API Extractor or other TSDoc-compatible documentation tools.
// Legacy format
module.exports = {
extends: [
"@rushstack/eslint-config/profile/node",
"@rushstack/eslint-config/mixins/tsdoc"
],
parserOptions: { tsconfigRootDir: __dirname }
};
// Flat format
import nodeProfile from "@rushstack/eslint-config/flat/profile/node";
import tsdocMixin from "@rushstack/eslint-config/flat/mixins/tsdoc";
export default [...nodeProfile, ...tsdocMixin];Path: @rushstack/eslint-config/mixins/tsdoc
Flat Path: @rushstack/eslint-config/flat/mixins/tsdoc
Plugin: eslint-plugin-tsdoc
Rules: tsdoc/syntax: Validates TSDoc comment syntax
TSDoc Example:
/**
* Calculates the total price including tax
* @param basePrice - The base price before tax
* @param taxRate - The tax rate as a decimal (e.g., 0.1 for 10%)
* @returns The total price including tax
* @public
*/
function calculateTotal(basePrice: number, taxRate: number): number {
return basePrice * (1 + taxRate);
}// .eslintrc.js
require('@rushstack/eslint-config/patch/modern-module-resolution');
module.exports = {
extends: [
"@rushstack/eslint-config/profile/node",
"@rushstack/eslint-config/mixins/tsdoc"
],
parserOptions: { tsconfigRootDir: __dirname }
};// .eslintrc.js
require('@rushstack/eslint-config/patch/modern-module-resolution');
module.exports = {
extends: [
"@rushstack/eslint-config/profile/web-app",
"@rushstack/eslint-config/mixins/react",
"@rushstack/eslint-config/mixins/friendly-locals",
"@rushstack/eslint-config/mixins/tsdoc"
],
parserOptions: { tsconfigRootDir: __dirname },
settings: {
react: {
version: "18.0"
}
}
};// eslint.config.js
import nodeProfile from "@rushstack/eslint-config/flat/profile/node";
import tsdocMixin from "@rushstack/eslint-config/flat/mixins/tsdoc";
import friendlyLocalsMixin from "@rushstack/eslint-config/flat/mixins/friendly-locals";
export default [
...nodeProfile,
...tsdocMixin,
...friendlyLocalsMixin
];// Legacy mixin structure
interface MixinConfig {
plugins?: string[];
settings?: {
react?: {
version: string;
};
};
overrides: Array<{
files: string[]; // Typically ['*.ts', '*.tsx']
rules: Record<string, RuleConfig>;
}>;
}
// Flat mixin structure
interface FlatMixinConfig extends Array<{
files?: string[];
plugins?: Record<string, any>;
rules: Record<string, RuleConfig>;
settings?: Record<string, any>;
}> {}
type RuleConfig =
| 'off' | 'warn' | 'error'
| 0 | 1 | 2
| ['off' | 'warn' | 'error' | 0 | 1 | 2, ...any[]];General Requirements:
extends array['*.ts', '*.tsx'])React Mixin Requirements:
web-app profilesettings.react.version for optimal performancetsconfig.json: "jsx": "react"TSDoc Mixin Requirements:
Packlets Mixin Requirements:
Install with Tessl CLI
npx tessl i tessl/npm-rushstack--eslint-config