Core plugin structure and metadata for ESLint integration, providing access to rules, configurations, and plugin metadata.
The plugin exports separate named exports for rules, configurations, and flat configurations. These are combined at build time into a single plugin object.
/**
* Named exports from the plugin
*/
// Rules collection
export const rules = { [ruleName: string]: Rule.RuleModule };
// Legacy configurations
export const configs = { [configName: string]: Linter.LegacyConfig };
// Flat configurations for ESLint 9+
export const flatConfigs = { [configName: string]: Linter.FlatConfig };
/**
* Plugin metadata (internal, used for flat configs)
*/
const meta = {
name: string, // From package.json
version: string // From package.json
};
/**
* Final plugin object (built version combines all exports)
* @type {ESLint.Plugin}
*/
const plugin = {
meta,
rules,
configs,
flatConfigs
};
// Built version exports as CommonJS
module.exports = plugin;Information about the plugin name and version.
/**
* Plugin metadata object
*/
interface PluginMeta {
/** Plugin name from package.json */
name: string;
/** Plugin version from package.json */
version: string;
}Collection of all 46 ESLint rules provided by the plugin.
/**
* Rules object containing all plugin rules
* @type {{ [ruleName: string]: Rule.RuleModule }}
*/
const rules = {
// Helpful warnings (8 rules)
"export": Rule.RuleModule,
"no-deprecated": Rule.RuleModule,
"no-empty-named-blocks": Rule.RuleModule,
"no-extraneous-dependencies": Rule.RuleModule,
"no-mutable-exports": Rule.RuleModule,
"no-named-as-default": Rule.RuleModule,
"no-named-as-default-member": Rule.RuleModule,
"no-unused-modules": Rule.RuleModule,
// Module systems (5 rules)
"no-amd": Rule.RuleModule,
"no-commonjs": Rule.RuleModule,
"no-import-module-exports": Rule.RuleModule,
"no-nodejs-modules": Rule.RuleModule,
"unambiguous": Rule.RuleModule,
// Static analysis (15 rules)
"default": Rule.RuleModule,
"enforce-node-protocol-usage": Rule.RuleModule,
"named": Rule.RuleModule,
"namespace": Rule.RuleModule,
"no-absolute-path": Rule.RuleModule,
"no-cycle": Rule.RuleModule,
"no-dynamic-require": Rule.RuleModule,
"no-internal-modules": Rule.RuleModule,
"no-relative-packages": Rule.RuleModule,
"no-relative-parent-imports": Rule.RuleModule,
"no-restricted-paths": Rule.RuleModule,
"no-self-import": Rule.RuleModule,
"no-unresolved": Rule.RuleModule,
"no-useless-path-segments": Rule.RuleModule,
"no-webpack-loader-syntax": Rule.RuleModule,
// Style guide (18 rules)
"consistent-type-specifier-style": Rule.RuleModule,
"dynamic-import-chunkname": Rule.RuleModule,
"exports-last": Rule.RuleModule,
"extensions": Rule.RuleModule,
"first": Rule.RuleModule,
"group-exports": Rule.RuleModule,
"imports-first": Rule.RuleModule, // deprecated
"max-dependencies": Rule.RuleModule,
"newline-after-import": Rule.RuleModule,
"no-anonymous-default-export": Rule.RuleModule,
"no-default-export": Rule.RuleModule,
"no-duplicates": Rule.RuleModule,
"no-named-default": Rule.RuleModule,
"no-named-export": Rule.RuleModule,
"no-namespace": Rule.RuleModule,
"no-unassigned-import": Rule.RuleModule,
"order": Rule.RuleModule,
"prefer-default-export": Rule.RuleModule
};Pre-configured rule sets for traditional ESLint configuration format.
/**
* Legacy configurations object for ESLint < 9
* @type {{ [configName: string]: Linter.LegacyConfig }}
*/
const configs = {
/** Essential rules for import/export validation */
recommended: {
plugins: ["import"],
rules: {
"import/no-unresolved": "error",
"import/named": "error",
"import/namespace": "error",
"import/default": "error",
"import/export": "error",
"import/no-named-as-default": "warn",
"import/no-named-as-default-member": "warn",
"import/no-duplicates": "warn"
},
parserOptions: {
sourceType: "module",
ecmaVersion: 2018
}
},
/** Error-level rules only */
errors: Linter.LegacyConfig,
/** Warning-level rules only */
warnings: Linter.LegacyConfig,
/** Experimental rules (work in progress) */
"stage-0": Linter.LegacyConfig,
/** React-specific optimizations */
react: Linter.LegacyConfig,
/** React Native environment */
"react-native": Linter.LegacyConfig,
/** Electron application support */
electron: Linter.LegacyConfig,
/** TypeScript project optimizations */
typescript: Linter.LegacyConfig
};Pre-configured rule sets for ESLint v9+ flat configuration format.
/**
* Flat configurations object for ESLint >= 9
* @type {{ [configName: string]: Linter.FlatConfig }}
*/
const flatConfigs = {
/** Essential rules for import/export validation */
recommended: {
name: "import/recommended",
plugins: { import: plugin },
rules: {
"import/no-unresolved": "error",
"import/named": "error",
"import/namespace": "error",
"import/default": "error",
"import/export": "error",
"import/no-named-as-default": "warn",
"import/no-named-as-default-member": "warn",
"import/no-duplicates": "warn"
},
languageOptions: {
ecmaVersion: 2018,
sourceType: "module"
}
},
/** Error-level rules only */
errors: {
name: "import/errors",
plugins: { import: plugin },
rules: Linter.FlatConfig["rules"],
languageOptions: {
ecmaVersion: 2018,
sourceType: "module"
}
},
/** Warning-level rules only */
warnings: Linter.FlatConfig,
/** React-specific optimizations */
react: Linter.FlatConfig,
/** React Native environment (uses legacy config) */
"react-native": Linter.FlatConfig,
/** Electron application support (uses legacy config) */
electron: Linter.FlatConfig,
/** TypeScript project optimizations (uses legacy config) */
typescript: Linter.FlatConfig
};// ESM
import importPlugin from "eslint-plugin-import";
// CommonJS
const importPlugin = require("eslint-plugin-import");
// Access plugin properties
console.log(importPlugin.meta.name); // "eslint-plugin-import"
console.log(importPlugin.meta.version); // "2.32.0"import importPlugin from "eslint-plugin-import";
// Access specific rule
const noUnresolvedRule = importPlugin.rules["no-unresolved"];
// Check if rule exists
if ("no-duplicates" in importPlugin.rules) {
console.log("Rule exists");
}
// List all rule names
const ruleNames = Object.keys(importPlugin.rules);
console.log(`Plugin provides ${ruleNames.length} rules`);import importPlugin from "eslint-plugin-import";
// Use flat config (ESLint 9+)
export default [
importPlugin.flatConfigs.recommended
];
// Use legacy config (ESLint < 9)
module.exports = {
extends: ["plugin:import/recommended"]
};
// Custom configuration with plugin rules
export default [{
plugins: { import: importPlugin },
rules: {
...importPlugin.flatConfigs.recommended.rules,
"import/order": ["error", { "newlines-between": "always" }]
}
}];