Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

import/order does not respect consecutive pathGroups when 9 or 10 groups are defined #2494

Closed
Pearce-Ropion opened this issue Jul 14, 2022 · 0 comments · Fixed by #2506
Closed

Comments

@Pearce-Ropion
Copy link
Contributor

Pearce-Ropion commented Jul 14, 2022

Import types can be assigned the same rank when using 1 or more after patterns and 9-10 before patterns on consecutive import types.

Repro

Given the following config

module.exports = {
  parser: '@babel/eslint-parser',
  parserOptions: {
    requireConfigFile: false,
  },
  settings: {
    'import/internal-regex': '^(a|b|c|d|e|f|g|h|i|j|k|l|m)(\\/|$)',
  },
  plugins: ['import'],
  rules: {
    'import/order': [
      'error',
      {
        groups: ['builtin', 'external', 'internal', 'parent', ['sibling', 'index']],
        pathGroups: [
          { pattern: '@namespace/**', group: 'external', position: 'after' }, 
          { pattern: 'a', group: 'internal', position: 'before' },
          { pattern: 'b', group: 'internal', position: 'before' },
          { pattern: 'c', group: 'internal', position: 'before' },
          { pattern: 'd', group: 'internal', position: 'before' },
          { pattern: 'e', group: 'internal', position: 'before' },
          { pattern: 'f', group: 'internal', position: 'before' },
          { pattern: 'g', group: 'internal', position: 'before' },
          { pattern: 'h', group: 'internal', position: 'before' },
          { pattern: 'i', group: 'internal', position: 'before' },
        ],
        pathGroupsExcludedImportTypes: ['builtin'],
        'newlines-between': 'always',
      },
    ],
  },
};

The above config will result in the following file. With the 9 before patterns, a gets grouped with the @namespace imports. This doesn't happen with 8 or 11 before patterns.

// Notice how `import { a } from 'a'` gets grouped with the `@namespace` imports.

import React from 'react';

import { bar } from '@namespace/bar';
import { foo } from '@namespace/foo';
import { a } from 'a';

import { b } from 'b';

import { c } from 'c';

import { d } from 'd';

import { e } from 'e';

import { f } from 'f';

import { g } from 'g';

import { h } from 'h';

import { i } from 'i';

import { j } from 'j';
import { k } from 'k';
import { l } from 'l';
import { m } from 'm';

import parent from '../parent';

import sibling from './sibling';

The expected output with 9 before patterns should be :

import React from 'react';

import { bar } from '@namespace/bar';
import { foo } from '@namespace/foo';

import { a } from 'a';

import { b } from 'b';

import { c } from 'c';

import { d } from 'd';

import { e } from 'e';

import { f } from 'f';

import { g } from 'g';

import { h } from 'h';

import { i } from 'i';

import { j } from 'j';
import { k } from 'k';
import { l } from 'l';
import { m } from 'm';

import parent from '../parent';

import sibling from './sibling';

Similarly, with the 10 before patterns, a gets grouped with the external imports. This doesn't happen with 8 or 11 before patterns.

// Notice how `import { a } from 'a'` gets grouped with the `external` imports.

import React from 'react';
import { a } from 'a';

import { bar } from '@namespace/bar';
import { foo } from '@namespace/foo';
import { b } from 'b';

import { c } from 'c';

import { d } from 'd';

import { e } from 'e';

import { f } from 'f';

import { g } from 'g';

import { h } from 'h';

import { i } from 'i';

import { j } from 'j';

import { k } from 'k';
import { l } from 'l';
import { m } from 'm';

import parent from '../parent';

import sibling from './sibling';

I also tried logging the generated rankings from computeRank for each amount of before patterns.

8 pathGroups
react external 1
@namespace/bar external 1.1
@namespace/foo external 1.1
a internal 1.2
b internal 1.3
c internal 1.4
d internal 1.5
e internal 1.6
f internal 1.7
g internal 1.8
h internal 1.9
i internal 2
j internal 2
k internal 2
l internal 2
m internal 2
../parent parent 3
./sibling sibling 4

9 pathGroups
react external 1
@namespace/bar external 1.1
@namespace/foo external 1.1
a internal 1.1
b internal 1.2
c internal 1.3
d internal 1.4
e internal 1.5
f internal 1.6
g internal 1.7
h internal 1.8
i internal 1.9
j internal 2
k internal 2
l internal 2
m internal 2
../parent parent 3
./sibling sibling 4
10 pathGroups
a internal 1
react external 1
@namespace/bar external 1.1
@namespace/foo external 1.1
b internal 1.1
c internal 1.2
d internal 1.3
e internal 1.4
f internal 1.5
g internal 1.6
h internal 1.7
i internal 1.8
j internal 1.9
k internal 2
l internal 2
m internal 2
../parent parent 3
./sibling sibling 4
11 pathGroups
react external 1
@namespace/bar external 1.01
@namespace/foo external 1.01
a internal 1.89
b internal 1.9
c internal 1.91
d internal 1.92
e internal 1.93
f internal 1.94
g internal 1.95
h internal 1.96
i internal 1.97
j internal 1.98
k internal 1.99
l internal 2
m internal 2
../parent parent 3
./sibling sibling 4

I had a lot of trouble coming up with a generalized description for this since its a very specific issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
2 participants