Skip to content

Latest commit

 

History

History
451 lines (287 loc) · 26.5 KB

CHANGELOG.md

File metadata and controls

451 lines (287 loc) · 26.5 KB

eslint-plugin-import-x

4.5.0

Minor Changes

  • #192 fbf639b Thanks @SukkaW! - The PR implements the new resolver design proposed in un-ts#40 (comment)

    For eslint-plugin-import-x users

    Like the ESLint flat config allows you to use js objects (e.g. import and require) as ESLint plugins, the new eslint-plugin-import-x resolver settings allow you to use js objects as custom resolvers through the new setting import-x/resolver-next:

    // eslint.config.js
    import { createTsResolver } from '#custom-resolver';
    const { createOxcResolver } = require('path/to/a/custom/resolver');
    
    const resolverInstance = new ResolverFactory({});
    const customResolverObject = {
      interfaceVersion: 3,
      name: 'my-custom-eslint-import-resolver',
      resolve(modPath, sourcePath) {
        const path = resolverInstance.resolve(modPath, sourcePath);
        if (path) {
          return {
            found: true,
            path
          };
        }
    
        return {
          found: false,
          path: null
        }
      };
    };
    
    module.exports = {
      settings: {
        // multiple resolvers
        'import-x/resolver-next': [
          customResolverObject,
          createTsResolver(enhancedResolverOptions),
          createOxcResolver(oxcOptions),
        ],
        // single resolver:
        'import-x/resolver-next': [createOxcResolver(oxcOptions)]
      }
    }

    The new import-x/resolver-next no longer accepts strings as the resolver, thus will not be compatible with the ESLint legacy config (a.k.a. .eslintrc). Those who are still using the ESLint legacy config should stick with import-x/resolver.

    In the next major version of eslint-plugin-import-x (v5), we will rename the currently existing import-x/resolver to import-x/resolver-legacy (which allows the existing ESLint legacy config users to use their existing resolver settings), and import-x/resolver-next will become the new import-x/resolver. When ESLint v9 (the last ESLint version with ESLint legacy config support) reaches EOL in the future, we will remove import-x/resolver-legacy.

    We have also made a few breaking changes to the new resolver API design, so you can't use existing custom resolvers directly with import-x/resolver-next:

    // When migrating to `import-x/resolver-next`, you CAN'T use legacy versions of resolvers directly:
    module.exports = {
      settings: {
        // THIS WON'T WORK, the resolver interface required for `import-x/resolver-next` is different.
        'import-x/resolver-next': [
           require('eslint-import-resolver-node'),
           require('eslint-import-resolver-webpack'),
           require('some-custom-resolver')
        ];
      }
    }

    For easier migration, the PR also introduces a compat utility importXResolverCompat that you can use in your eslint.config.js:

    // eslint.config.js
    import eslintPluginImportX, { importXResolverCompat } from 'eslint-plugin-import-x';
    // or
    const eslintPluginImportX = require('eslint-plugin-import-x');
    const { importXResolverCompat } = eslintPluginImportX;
    
    module.exports = {
      settings: {
        // THIS WILL WORK as you have wrapped the previous version of resolvers with the `importXResolverCompat`
        'import-x/resolver-next': [
           importXResolverCompat(require('eslint-import-resolver-node'), nodeResolveOptions),
           importXResolverCompat(require('eslint-import-resolver-webpack'), webpackResolveOptions),
           importXResolverCompat(require('some-custom-resolver'), { option1: true, option2: '' })
        ];
      }
    }

    For custom import resolver developers

    This is the new API design of the resolver interface:

    export interface NewResolver {
      interfaceVersion: 3;
      name?: string; // This will be included in the debug log
      resolve: (modulePath: string, sourceFile: string) => ResolvedResult;
    }
    
    // The `ResultNotFound` (returned when not resolved) is the same, no changes
    export interface ResultNotFound {
      found: false;
      path?: undefined;
    }
    
    // The `ResultFound` (returned resolve result) is also the same, no changes
    export interface ResultFound {
      found: true;
      path: string | null;
    }
    
    export type ResolvedResult = ResultNotFound | ResultFound;

    You will be able to import NewResolver from eslint-plugin-import-x/types.

    The most notable change is that eslint-plugin-import-x no longer passes the third argument (options) to the resolve function.

    We encourage custom resolvers' authors to consume the options outside the actual resolve function implementation. You can export a factory function to accept the options, this factory function will then be called inside the eslint.config.js to get the actual resolver:

    // custom-resolver.js
    exports.createCustomResolver = (options) => {
      // The options are consumed outside the `resolve` function.
      const resolverInstance = new ResolverFactory(options);
    
      return {
        name: 'custom-resolver',
        interfaceVersion: 3,
        resolve(mod, source) {
          const found = resolverInstance.resolve(mod, {});
    
          // Of course, you still have access to the `options` variable here inside
          // the `resolve` function. That's the power of JavaScript Closures~
        }
      }
    };
    
    // eslint.config.js
    const { createCustomResolver } = require('custom-resolver')
    
    module.exports = {
      settings: {
        'import-x/resolver-next': [
           createCustomResolver(options)
        ];
      }
    }

    This allows you to create a reusable resolver instance to improve the performance. With the existing version of the resolver interface, because the options are passed to the resolver function, you will have to create a resolver instance every time the resolve function is called:

    module.exports = {
      interfaceVersion: 2,
      resolve(mod, source) {
        // every time the `resolve` function is called, a new instance is created
        // This is very slow
        const resolverInstance = ResolverFactory.createResolver({});
        const found = resolverInstance.resolve(mod, {});
      },
    };

    With the factory function pattern, you can create a resolver instance beforehand:

    exports.createCustomResolver = (options) => {
      // `enhance-resolve` allows you to create a reusable instance:
      const resolverInstance = ResolverFactory.createResolver({});
      const resolverInstance = enhanceResolve.create({});
    
      // `oxc-resolver` also allows you to create a reusable instance:
      const resolverInstance = new ResolverFactory({});
    
      return {
        name: "custom-resolver",
        interfaceVersion: 3,
        resolve(mod, source) {
          // the same re-usable instance is shared across `resolve` invocations.
          // more performant
          const found = resolverInstance.resolve(mod, {});
        },
      };
    };

Patch Changes

  • #184 bc4de89 Thanks @marcalexiei! - fix(no-cycle): improves the type declaration of the rule no-cycle’s maxDepth option

  • #184 bc4de89 Thanks @marcalexiei! - fix(first): improves the type declaration of the rule first's option

  • #184 bc4de89 Thanks @marcalexiei! - fix(no-unused-modules): improves the type declaration of the rule no-unused-modules’s missingExports option

  • #184 bc4de89 Thanks @marcalexiei! - fix(no-deprecated): improve error message when no description is available

4.4.3

Patch Changes

  • #187 a428f82 Thanks @SukkaW! - Attach ecmaVersion and sourceType to parserOptions during parse

4.4.2

Patch Changes

  • #181 cc4ee65 Thanks @SukkaW! - Fix #144, read proper sourceType for both eslint flat config and legacy eslintrc config.

4.4.1

Patch Changes

4.4.0

Minor Changes

Patch Changes

  • #171 9715220 Thanks @SukkaW! - Perf: avoid regexp during parser choosing

  • #171 9715220 Thanks @SukkaW! - Add extra guard for rule no-named-as-default. A few guards are borrowed from import-js#3032, but we don't sync the rest of changes from upstream since we have already implemented a way more performant check.

  • #171 9715220 Thanks @SukkaW! - More test cases for no-named-export and no-defualt-export rule specifically with non-module sourceType

  • #171 9715220 Thanks @SukkaW! - Fix export when there is only one TSDeclareFunction (import-js#3065)

  • #171 9715220 Thanks @SukkaW! - Prevent ExportMap's cache is being tainted by incompatible parser (e.g. old babel-eslint). The cache is now skipped w/ incompatible parsers, which might introduce performance impacts only for those who are using incompatible parsers. (import-js#3062)

  • #171 9715220 Thanks @SukkaW! - Docs: fix a few typos here and there

  • #168 5de039c Thanks @hyoban! - Fixes un-ts#167, the no-duplicates rule now allows co-existing inline type imports and namespace imports.

  • #171 9715220 Thanks @SukkaW! - Properly fix espree parser w/ ESLint Flat Config

4.3.1

Patch Changes

  • #162 38d0081 Thanks @AaronMoat! - Fix issue where no-duplicates rule with prefer-inline incorrectly marks default type and named type imports as duplicates

4.3.0

Minor Changes

4.2.1

Patch Changes

4.2.0

Minor Changes

  • #142 f12447e Thanks @Zamiell! - Add new option "whitelist" for rule "no-extraneous-dependencies"

Patch Changes

4.1.1

Patch Changes

  • #133 757ffa9 Thanks @SukkaW! - Fix #123 where the rule no-named-as-default will confuse TypeScript namespace exports with actual exports.

4.1.0

Minor Changes

  • #122 cd52e86 Thanks @michaelfaith! - Add ESLint flat configuration presets. You can access them with:

    import eslintPluginImportX from "eslint-plugin-import-x";
    
    eslintPluginImportX.flatConfigs.recommended;
    eslintPluginImportX.flatConfigs.react;
    eslintPluginImportX.flatConfigs.typescript;
    eslintPluginImportX.flatConfigs.electron;
  • #132 9948c78 Thanks @SukkaW! - Added no-rename-default that forbid importing a default export by a different name. Originally created by @whitneyit, ported by @SukkaW

4.0.0

Major Changes

  • #112 4ba14da Thanks @SukkaW! - Use typescript-eslint v8. The minimum supported ESLint version is now >= 8.57.0 and the minimum required Node.js version is now 18.18.0.

3.1.0

Minor Changes

Patch Changes

  • #118 0307ff2 Thanks @SukkaW! - Reverts #111. The introduction of SCC causes extra overhead that overcomes the early return it introduced.

    A new no-cycle-next rule is being implemented using the graph. It won't be backward compatible with the current rule no-cycle. The current no-cycle rule will become no-cycle-legacy in the next major version.

3.0.1

Patch Changes

3.0.0

Major Changes

  • #106 19f10aa Thanks @SukkaW! - eslint-plugin-import-x is a fork of eslint-plugin-import that aims to provide a more performant and more lightweight version of the original plugin.

    Due to the nature of the fork, all eslint-plugin-import's git tags and releases have been copied over to eslint-plugin-import-x. This causes version conflicts when publishing new versions of eslint-plugin-import-x.

    To prevent this, we have decided to publish a new major version of eslint-plugin-import-x that will not conflict with the original eslint-plugin-import's versions.

    See also un-ts#76

Patch Changes

0.5.3

Patch Changes

  • #101 c0cea7b Thanks @SukkaW! - Allow incorrect file path in extraneous deps check

  • #100 293fcf4 Thanks @SukkaW! - feat: webpack comment regex support webpackFetchPriority

  • #85 ded3e80 Thanks @kosmotema! - add languageOptions to ChildContext

  • #100 293fcf4 Thanks @SukkaW! - Allow empty chunk name when webpackMode: 'eager' is set; add suggestions to remove name in eager mode

0.5.2

Patch Changes

  • #93 64bf1a6 Thanks @SukkaW! - fix: enable isolation parsing w/ typescript-eslint v8

0.5.1

Patch Changes

0.5.0

Minor Changes

0.4.4

Patch Changes

0.4.3

Patch Changes

0.4.2

Patch Changes

  • #62 1dbb323 Thanks @JounQin! - feat: use eslint-compat-utils to support eslint v9 (not flat config yet)

0.4.1

Patch Changes

0.4.0

Minor Changes

  • #54 54d0c95 Thanks @JounQin! - chore!: bump node requirement (>=16), enable more lint rules

0.3.1

Patch Changes

0.3.0

Minor Changes

Patch Changes

0.2.0

Minor Changes

Patch Changes

0.1.1

Patch Changes

0.1.0

Minor Changes