An ESLint plugin for enforcing consistent import paths across a project. It rewrites relative imports to absolute ones (or the reverse), based on the paths and baseUrl in your tsconfig.json / jsconfig.json.
# npm
npm install eslint-plugin-path --save-dev
# yarn
yarn add eslint-plugin-path --devThis plugin requires ESLint 10 or later and Node.js ^20.19.0 || ^22.13.0 || >=24 — the same range ESLint 10 supports.
It uses the flat config format (eslint.config.js). The legacy .eslintrc format was removed in ESLint 10 and is not supported.
import eslintPluginPath from 'eslint-plugin-path';
export default [
{
files: ['**/*.{js,ts,jsx,tsx}'],
plugins: {
path: eslintPluginPath,
},
rules: {
'path/no-relative-imports': [
'error',
{
maxDepth: 2,
suggested: false,
},
],
},
},
];import { defineConfig } from 'eslint/config';
import eslintPluginPath from 'eslint-plugin-path';
export default defineConfig([
{
files: ['**/*.{js,ts,jsx,tsx}'],
plugins: {
path: eslintPluginPath,
},
rules: {
'path/no-relative-imports': [
'error',
{
maxDepth: 2,
suggested: false,
},
],
},
},
]);import eslintPluginPath from 'eslint-plugin-path';
export default [
...eslintPluginPath.configs.recommended,
];If you are using custom paths in your tsconfig.json or jsconfig.json file, you can specify the path to the configuration file in your ESLint settings:
import eslintPluginPath from 'eslint-plugin-path';
export default [
{
plugins: { path: eslintPluginPath },
settings: {
path: {
config: 'tsconfig.json', // or 'jsconfig.json'
},
},
rules: {
'path/no-relative-imports': 'error',
},
},
];Enable the rules in your ESLint flat configuration:
import eslintPluginPath from 'eslint-plugin-path';
export default [
{
plugins: { path: eslintPluginPath },
rules: {
'path/no-relative-imports': 'error',
},
},
];Or use the recommended preset:
import eslintPluginPath from 'eslint-plugin-path';
export default [
...eslintPluginPath.configs.recommended,
];All three rules inspect the specifier of these forms:
import x from '../../components/button'; // static import
import('../../components/button'); // dynamic import
require('../../components/button'); // CommonJS requireRe-export declarations are not checked:
export * from '../../components/button'; // not reported
export { Button } from '../../components/button'; // not reportedBare specifiers that resolve inside node_modules (e.g. react) are always skipped.
✔ included in the "recommended" preset
🔧 fixable using the --fix command line option
💡 provides editor suggestions
| Name | Description | |||
|---|---|---|---|---|
| ✔ | 🔧 | 💡 | no-relative-imports | disallow relative imports of files where absolute is preferred |
| 🔧 | 💡 | no-absolute-imports | disallow absolute imports of files where relative is preferred | |
| 🔧 | 💡 | only-absolute-imports | disallow relative imports of files through the whole project |
recommended— enablesno-relative-importswith{ maxDepth: 1, suggested: true }. Note this is stricter than the rule's own defaults ({ maxDepth: 2, suggested: false }).
recommended is the only preset. The three rules express mutually exclusive policies, so no single config can enable them together — pick the one rule that matches your project and configure it explicitly.
Removed in 3.0.0: the
allpreset. It never enabled all rules — it enabled onlyno-relative-imports, with weaker settings thanrecommended. See the CHANGELOG.