ESLint plugin that enforces one imported binding per import declaration.
This keeps import diffs small, reduces merge conflicts, and makes imports
easier to edit by hand, inspired by Rust's
M-SINGLE-USE
style guideline.
npm install --save-dev eslint-plugin-import-onelineThe package is ESM-only and supports ESLint 9 and 10 with flat config.
// eslint.config.js
import importOneline from "eslint-plugin-import-oneline";
export default [
...importOneline.configs.recommended
];Or configure the rule directly:
// eslint.config.js
import importOneline from "eslint-plugin-import-oneline";
export default [
{
plugins: {
"import-oneline": importOneline
},
rules: {
"import-oneline/import-oneline": "error"
}
}
];The recommended config also disables ESLint core no-duplicate-imports.
That rule conflicts with this plugin because import-oneline intentionally
creates separate import declarations from the same module.
If you use eslint-plugin-import, also disable import/no-duplicates in the
same config layer:
// eslint.config.js
import importOneline from "eslint-plugin-import-oneline";
export default [
...importOneline.configs.recommended,
{
rules: {
"import/no-duplicates": "off"
}
}
];Requires each imported binding to use its own import declaration.
Incorrect:
import { RichTextRun, TextBounds } from "./text-utils";
import type { RichTextRun, TextBounds } from "./text-utils";
import React, { useMemo, useState } from "react";
import {
RichTextRun,
TextBounds
} from "./text-utils";Correct:
import { RichTextRun } from "./text-utils";
import { TextBounds } from "./text-utils";
import type { RichTextRun } from "./text-utils";
import type { TextBounds } from "./text-utils";
import React from "react";
import { useMemo } from "react";
import { useState } from "react";This rule is autofixable. It preserves the module source, aliases, type-only imports, import attributes, quote style, and semicolon style.