Skip to content

Latest commit

 

History

History
370 lines (299 loc) · 9.99 KB

File metadata and controls

370 lines (299 loc) · 9.99 KB

prefer-import-tag

Prefer @import tags to inline import() statements.

Fixer

Creates @import tags if an already existing matching @typedef or @import is not found.

Options

A single options object has the following properties.

enableFixer

Whether or not to enable the fixer to add @import tags.

exemptTypedefs

Whether to allow import() statements within @typedef

outputType

What kind of @import to generate when no matching @typedef or @import is found

Context everywhere
Tags augments, class, constant, enum, implements, member, module, namespace, param, property, returns, throws, type, typedef, yields
Aliases constructor, const, extends, var, arg, argument, prop, return, exception, yield
Closure-only package, private, protected, public, static
Recommended false
Settings mode
Options enableFixer, exemptTypedefs, outputType

Failing examples

The following patterns are considered problems:

/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule.Node}
 */
// Settings: {"jsdoc":{"mode":"permissive"}}
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"named-import"}]
// Message: Inline `import()` found; prefer `@import`

// Copyright 2026
/**
 * @type {import('foo')}
 */
let x;
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"namespaced-import"}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule['Node']}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"named-import"}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').Rule['Node']}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"namespaced-import"}]
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint2').Rule.Node} RuleNode  */
/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":false}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint')}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint')}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').default}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').default}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/** @import * as eslint2 from 'eslint'; */
/**
 * @type {import('eslint')}
 */
// Message: Inline `import()` found; prefer `@import`

/** @import eslint2 from 'eslint'; */
/**
 * @type {import('eslint').default}
 */
// Message: Inline `import()` found; prefer `@import`

/** @import eslint2 from 'eslint'; */
/**
 * @type {import('eslint').default}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/** @import {Rule} from 'eslint' */
/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/** @import {Rule} from 'eslint' */
/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/** @import * as eslint2 from 'eslint' */
/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/** @import * as eslint2 from 'eslint' */
/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false}]
// Message: Inline `import()` found; prefer `@import`

/** @import LinterDef2, * as LinterDef3 from "eslint" */
/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @import LinterDef2, * as LinterDef3 from "eslint"
 */
/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @import LinterDef2,
 *   * as LinterDef3 from "eslint"
 */
/**
 * @type {import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/**
 * @import {
 *   ESLint
 * } from "eslint"
 */
/**
 * @type {import('eslint').ESLint.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule.Node.Abc.Def}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule.Node.Abc['Def']}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule.Node} RuleNode  */
/**
 * @type {import('eslint').Rule.Node}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/**
 * @type {number|import('eslint').Rule.Node}
 */
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule.Node} Rule  */
/**
 * @type {import('eslint').Rule}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule.Node} Rule  */
/**
 * @type {import('eslint').Rule.Abc}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule.Node.Abc.Rule}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule.Node.Abc.Rule}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"enableFixer":false,"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule.Rule} Rule  */
/**
 * @type {import('eslint').Abc.Rule}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; prefer `@import`

/**
 * @type {import('eslint').anchors[keyof DataMap.anchors]}
 */
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule[keyof import('eslint').Rule]} Rule  */
/**
 * @type {import('eslint').Abc.Rule}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; prefer `@import`

/** @typedef {import('eslint').Rule[keyof import('eslint').Rule]} Rule  */
/**
 * @type {import('eslint').Rule[keyof import('eslint').Rule]}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @typedef {import('eslint').Rule} Rule  */
/**
 * @type {import('eslint').Rule[keyof import('eslint').Rule]}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]
// Message: Inline `import()` found; using `@typedef`

/** @type {import('foo')} */
let foo;
// Message: Inline `import()` found; prefer `@import`

/** @type {import('foo')} */
let foo;
// Message: Inline `import()` found; prefer `@import`

/** @type {import('foo').bar} */
let foo;
// Message: Inline `import()` found; prefer `@import`

/** @type {import('foo').bar} */
let foo;
// "jsdoc/prefer-import-tag": ["error"|"warn", {"outputType":"named-import"}]
// Message: Inline `import()` found; prefer `@import`

/** @type {import('foo').default} */
let foo;
// Message: Inline `import()` found; prefer `@import`

/** @type { import('@typescript-eslint/utils').TSESLint.FlatConfig.Config['rules'] } */
// Message: Inline `import()` found; prefer `@import`

/** @type { import('node:zlib').createGzip } */
// Message: Inline `import()` found; prefer `@import`

/** @type { import('./lib/someFile.js').someImport } */
// Message: Inline `import()` found; prefer `@import`

Passing examples

The following patterns are not considered problems:

/** @typedef {import('eslint').Rule.Node} RuleNode  */
/**
 * @type {RuleNode}
 */
// "jsdoc/prefer-import-tag": ["error"|"warn", {"exemptTypedefs":true}]

/** @import {Rule} from 'eslint' */
/**
 * @type {Rule.Node}
 */

/** @import * as eslint from 'eslint' */
/**
 * @type {eslint.Rule.Node}
 */

/**
 * @type {Rule['Node']}
 */

/**
 * Silently ignores error
 * @type {Rule['Node'}
 */