Skip to content

Commit e4a1b27

Browse files
Merge pull request #224 from KLewin23/Fix-conflicts-for-sort-by-length
Add sort by length option
2 parents e663d1d + ed4f1c2 commit e4a1b27

14 files changed

+620
-468
lines changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,13 @@ with options as a JSON string of the plugin array:
207207
importOrderParserPlugins: []
208208
```
209209

210+
### `importOrderSortByLength`
211+
**type**: `'asc' | 'desc' | null`
212+
**default value**: `null`
213+
214+
A choice value to enable sorting imports within their groups based on their string lengths, the two options being ascending and descending.
215+
Leaving the value blank or setting it to null will result in length being ignored
216+
210217
### `importOrderSideEffects`
211218
**type**: `boolean`
212219
**default value**: `true`
@@ -310,10 +317,10 @@ debug some code in the plugin, check [Debugging Guidelines](./docs/DEBUG.md)
310317

311318
### Maintainers
312319

313-
| [Ayush Sharma](https://github.com/ayusharma) | [Behrang Yarahmadi](https://github.com/byara) |
314-
| ------------------------------------------------------------------------ | --------------------------------------------------------------------- |
315-
| ![ayusharma](https://avatars2.githubusercontent.com/u/6918450?s=120&v=4) | ![@byara](https://avatars2.githubusercontent.com/u/6979966?s=120&v=4) |
316-
| [@ayusharma\_](https://twitter.com/ayusharma_) | [@behrang_y](https://twitter.com/behrang_y) |
320+
| [Ayush Sharma](https://github.com/ayusharma) | [Behrang Yarahmadi](https://github.com/byara) | [Vladislav Arsenev](https://github.com/vladislavarsenev) |
321+
| ------------------------------------------------------------------------ | --------------------------------------------------------------------- |--------------------------------------------------------------------------|
322+
| ![ayusharma](https://avatars2.githubusercontent.com/u/6918450?s=120&v=4) | ![@byara](https://avatars2.githubusercontent.com/u/6979966?s=120&v=4) |![@vladislavarsenev](https://avatars.githubusercontent.com/u/51095682?s=120&v=4)|
323+
| [@ayusharma](https://twitter.com/ayusharma_) | [@behrang_y](https://twitter.com/behrang_y) | |
317324

318325
### Disclaimer
319326

src/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ const options: Options = {
5656
default: false,
5757
description: 'Should specifiers be sorted?',
5858
},
59+
importOrderSortByLength: {
60+
type: 'choice',
61+
category: 'Global',
62+
default: null,
63+
choices: [
64+
{value: 'asc', description: 'will sort from shortest to longest'},
65+
{value: 'desc', description: 'will sort from longest to shortest'},
66+
{value: null, description: 'will disable sorting based on length'}
67+
],
68+
description: 'Should imports be sorted by their string length'
69+
},
5970
importOrderSideEffects: {
6071
type: 'boolean',
6172
category: 'Global',
@@ -67,7 +78,7 @@ const options: Options = {
6778
category: 'Global',
6879
default: 'with',
6980
description: 'Provide a keyword for import attributes',
70-
},
81+
}
7182
};
7283

7384
export default {

src/preprocessors/preprocessor.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ export function preprocessor(code: string, options: PrettierOptions) {
1616
importOrderSeparation,
1717
importOrderGroupNamespaceSpecifiers,
1818
importOrderSortSpecifiers,
19+
importOrderSortByLength,
1920
importOrderSideEffects,
20-
importOrderImportAttributesKeyword,
21+
importOrderImportAttributesKeyword
2122
} = options;
2223

2324
const parserOptions: ParserOptions = {
@@ -44,7 +45,8 @@ export function preprocessor(code: string, options: PrettierOptions) {
4445
importOrderSeparation,
4546
importOrderGroupNamespaceSpecifiers,
4647
importOrderSortSpecifiers,
47-
importOrderSideEffects,
48+
importOrderSortByLength,
49+
importOrderSideEffects
4850
});
4951

5052
return getCodeFromAst(allImports, directives, code, interpreter, {

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type GetSortedNodes = (
1919
| 'importOrderSeparation'
2020
| 'importOrderGroupNamespaceSpecifiers'
2121
| 'importOrderSortSpecifiers'
22+
| 'importOrderSortByLength'
2223
| 'importOrderSideEffects'
2324
>,
2425
) => ImportOrLine[];

src/utils/__tests__/get-all-comments-from-nodes.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const getSortedImportNodes = (code: string, options?: ParserOptions) => {
1515
importOrderSeparation: false,
1616
importOrderGroupNamespaceSpecifiers: false,
1717
importOrderSortSpecifiers: false,
18-
importOrderSideEffects: true,
18+
importOrderSortByLength: null,
19+
importOrderSideEffects: true
1920
});
2021
};
2122

src/utils/__tests__/get-code-from-ast.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import a from 'a';
2525
importOrderSeparation: false,
2626
importOrderGroupNamespaceSpecifiers: false,
2727
importOrderSortSpecifiers: false,
28-
importOrderSideEffects: true,
28+
importOrderSortByLength: null,
29+
importOrderSideEffects: true
2930
});
3031
const formatted = getCodeFromAst(sortedNodes, [], code, null);
3132
expect(await format(formatted, { parser: 'babel' })).toEqual(

src/utils/__tests__/get-import-nodes-matched-group.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { expect, test } from 'vitest'
22

3-
import { THIRD_PARTY_MODULES_SPECIAL_WORD } from '../../constants.js';
4-
import { ImportGroups } from '../../types';
53
import { getImportNodes } from '../get-import-nodes.js';
64
import { getImportNodesMatchedGroup } from '../get-import-nodes-matched-group.js';
75

src/utils/__tests__/get-sorted-nodes-by-import-order.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ test('it returns all sorted nodes', () => {
3131
importOrderSeparation: false,
3232
importOrderGroupNamespaceSpecifiers: false,
3333
importOrderSortSpecifiers: false,
34+
importOrderSortByLength: null,
3435
importOrderSideEffects: true,
3536
}) as ImportDeclaration[];
3637

@@ -76,6 +77,7 @@ test('it returns all sorted nodes case-insensitive', () => {
7677
importOrderSeparation: false,
7778
importOrderGroupNamespaceSpecifiers: false,
7879
importOrderSortSpecifiers: false,
80+
importOrderSortByLength: null,
7981
importOrderSideEffects: true,
8082
}) as ImportDeclaration[];
8183

@@ -121,6 +123,7 @@ test('it returns all sorted nodes with sort order', () => {
121123
importOrderSeparation: false,
122124
importOrderGroupNamespaceSpecifiers: false,
123125
importOrderSortSpecifiers: false,
126+
importOrderSortByLength: null,
124127
importOrderSideEffects: true,
125128
}) as ImportDeclaration[];
126129

@@ -166,6 +169,7 @@ test('it returns all sorted nodes with sort order case-insensitive', () => {
166169
importOrderSeparation: false,
167170
importOrderGroupNamespaceSpecifiers: false,
168171
importOrderSortSpecifiers: false,
172+
importOrderSortByLength: null,
169173
importOrderSideEffects: true,
170174
}) as ImportDeclaration[];
171175
expect(getSortedNodesNames(sorted)).toEqual([
@@ -210,6 +214,7 @@ test('it returns all sorted import nodes with sorted import specifiers', () => {
210214
importOrderSeparation: false,
211215
importOrderGroupNamespaceSpecifiers: false,
212216
importOrderSortSpecifiers: true,
217+
importOrderSortByLength: null,
213218
importOrderSideEffects: true,
214219
}) as ImportDeclaration[];
215220
expect(getSortedNodesNames(sorted)).toEqual([
@@ -254,6 +259,7 @@ test('it returns all sorted import nodes with sorted import specifiers with case
254259
importOrderSeparation: false,
255260
importOrderGroupNamespaceSpecifiers: false,
256261
importOrderSortSpecifiers: true,
262+
importOrderSortByLength: null,
257263
importOrderSideEffects: true,
258264
}) as ImportDeclaration[];
259265
expect(getSortedNodesNames(sorted)).toEqual([
@@ -298,6 +304,7 @@ test('it returns all sorted nodes with custom third party modules', () => {
298304
importOrderCaseInsensitive: true,
299305
importOrderGroupNamespaceSpecifiers: false,
300306
importOrderSortSpecifiers: false,
307+
importOrderSortByLength: null,
301308
importOrderSideEffects: true,
302309
}) as ImportDeclaration[];
303310
expect(getSortedNodesNames(sorted)).toEqual([
@@ -323,6 +330,7 @@ test('it returns all sorted nodes with namespace specifiers at the top', () => {
323330
importOrderSeparation: false,
324331
importOrderGroupNamespaceSpecifiers: true,
325332
importOrderSortSpecifiers: false,
333+
importOrderSortByLength: null,
326334
importOrderSideEffects: true,
327335
}) as ImportDeclaration[];
328336

@@ -350,6 +358,7 @@ test('it returns the default separations if `importOrderSeparation` is false', (
350358
importOrderGroupNamespaceSpecifiers: false,
351359
importOrderSortSpecifiers: false,
352360
importOrderSideEffects: true,
361+
importOrderSortByLength: null,
353362
});
354363
expect(getSeparationData(sorted)).toEqual([
355364
{ type: "ImportDeclaration", value: 'XY' },
@@ -376,6 +385,7 @@ test('it returns default import module separations', () => {
376385
importOrderGroupNamespaceSpecifiers: false,
377386
importOrderSortSpecifiers: false,
378387
importOrderSideEffects: true,
388+
importOrderSortByLength: null,
379389
});
380390
expect(getSeparationData(sorted)).toEqual([
381391
{ type: "ImportDeclaration", value: 'XY' },
@@ -407,6 +417,7 @@ test('it returns targeted import module separations', () => {
407417
importOrderGroupNamespaceSpecifiers: false,
408418
importOrderSortSpecifiers: false,
409419
importOrderSideEffects: true,
420+
importOrderSortByLength: null,
410421
});
411422
expect(getSeparationData(sorted)).toEqual([
412423
{ type: "ImportDeclaration", value: 'XY' },
@@ -437,6 +448,7 @@ test('it never returns a separation at the top of the list (leading separator)',
437448
importOrderGroupNamespaceSpecifiers: false,
438449
importOrderSortSpecifiers: false,
439450
importOrderSideEffects: true,
451+
importOrderSortByLength: null,
440452
});
441453
expect(getSeparationData(sorted)).toEqual([
442454
{ type: "ImportDeclaration", value: './test' },
@@ -455,6 +467,7 @@ test('it never returns a separation at the top of the list (zero preceding impor
455467
importOrderGroupNamespaceSpecifiers: false,
456468
importOrderSortSpecifiers: false,
457469
importOrderSideEffects: true,
470+
importOrderSortByLength: null,
458471
});
459472
expect(getSeparationData(sorted)).toEqual([
460473
{ type: "ImportDeclaration", value: './test' },

src/utils/__tests__/get-sorted-nodes.spec.ts

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ test('it returns all sorted nodes', () => {
4747
importOrderSeparation: false,
4848
importOrderGroupNamespaceSpecifiers: false,
4949
importOrderSortSpecifiers: false,
50-
importOrderSideEffects: true,
50+
importOrderSortByLength: null,
51+
importOrderSideEffects: true
5152
}) as ImportDeclaration[];
5253

5354
expect(getSortedNodesNames(sorted)).toEqual([
@@ -92,7 +93,8 @@ test('it returns all sorted nodes case-insensitive', () => {
9293
importOrderSeparation: false,
9394
importOrderGroupNamespaceSpecifiers: false,
9495
importOrderSortSpecifiers: false,
95-
importOrderSideEffects: true,
96+
importOrderSortByLength: null,
97+
importOrderSideEffects: true
9698
}) as ImportDeclaration[];
9799

98100
expect(getSortedNodesNames(sorted)).toEqual([
@@ -137,7 +139,8 @@ test('it returns all sorted nodes with sort order', () => {
137139
importOrderSeparation: false,
138140
importOrderGroupNamespaceSpecifiers: false,
139141
importOrderSortSpecifiers: false,
140-
importOrderSideEffects: true,
142+
importOrderSortByLength: null,
143+
importOrderSideEffects: true
141144
}) as ImportDeclaration[];
142145

143146
expect(getSortedNodesNames(sorted)).toEqual([
@@ -182,7 +185,8 @@ test('it returns all sorted nodes with sort order case-insensitive', () => {
182185
importOrderSeparation: false,
183186
importOrderGroupNamespaceSpecifiers: false,
184187
importOrderSortSpecifiers: false,
185-
importOrderSideEffects: true,
188+
importOrderSortByLength: null,
189+
importOrderSideEffects: true
186190
}) as ImportDeclaration[];
187191
expect(getSortedNodesNames(sorted)).toEqual([
188192
'c',
@@ -226,7 +230,8 @@ test('it returns all sorted import nodes with sorted import specifiers', () => {
226230
importOrderSeparation: false,
227231
importOrderGroupNamespaceSpecifiers: false,
228232
importOrderSortSpecifiers: true,
229-
importOrderSideEffects: true,
233+
importOrderSortByLength: null,
234+
importOrderSideEffects: true
230235
}) as ImportDeclaration[];
231236
expect(getSortedNodesNames(sorted)).toEqual([
232237
'XY',
@@ -270,7 +275,8 @@ test('it returns all sorted import nodes with sorted import specifiers with case
270275
importOrderSeparation: false,
271276
importOrderGroupNamespaceSpecifiers: false,
272277
importOrderSortSpecifiers: true,
273-
importOrderSideEffects: true,
278+
importOrderSortByLength: null,
279+
importOrderSideEffects: true
274280
}) as ImportDeclaration[];
275281
expect(getSortedNodesNames(sorted)).toEqual([
276282
'c',
@@ -314,7 +320,8 @@ test('it returns all sorted nodes with custom third party modules', () => {
314320
importOrderCaseInsensitive: true,
315321
importOrderGroupNamespaceSpecifiers: false,
316322
importOrderSortSpecifiers: false,
317-
importOrderSideEffects: true,
323+
importOrderSortByLength: null,
324+
importOrderSideEffects: true
318325
}) as ImportDeclaration[];
319326
expect(getSortedNodesNames(sorted)).toEqual([
320327
'a',
@@ -339,7 +346,8 @@ test('it returns all sorted nodes with namespace specifiers at the top', () => {
339346
importOrderSeparation: false,
340347
importOrderGroupNamespaceSpecifiers: true,
341348
importOrderSortSpecifiers: false,
342-
importOrderSideEffects: true,
349+
importOrderSortByLength: null,
350+
importOrderSideEffects: true
343351
}) as ImportDeclaration[];
344352

345353
expect(getSortedNodesNames(sorted)).toEqual([
@@ -357,6 +365,58 @@ test('it returns all sorted nodes with namespace specifiers at the top', () => {
357365
]);
358366
});
359367

368+
test('it returns all sorted nodes, sorted shortest to longest', () => {
369+
const result = getImportNodes(code)
370+
const sorted = getSortedNodes(result, {
371+
importOrder: [],
372+
importOrderCaseInsensitive: false,
373+
importOrderSeparation: false,
374+
importOrderGroupNamespaceSpecifiers: false,
375+
importOrderSortSpecifiers: false,
376+
importOrderSideEffects: true,
377+
importOrderSortByLength: 'asc'
378+
}) as ImportDeclaration[];
379+
expect(getSortedNodesNames(sorted)).toEqual([
380+
'g',
381+
'z',
382+
'Ba',
383+
'BY',
384+
'Xa',
385+
'XY',
386+
'a',
387+
'x',
388+
'c',
389+
'k',
390+
't',
391+
]);
392+
});
393+
394+
test('it returns all sorted nodes, sorted longest to shortest', () => {
395+
const result = getImportNodes(code)
396+
const sorted = getSortedNodes(result, {
397+
importOrder: [],
398+
importOrderCaseInsensitive: false,
399+
importOrderSeparation: false,
400+
importOrderGroupNamespaceSpecifiers: false,
401+
importOrderSortSpecifiers: false,
402+
importOrderSideEffects: false,
403+
importOrderSortByLength: 'desc'
404+
}) as ImportDeclaration[];
405+
expect(getSortedNodesNames(sorted)).toEqual([
406+
't',
407+
'k',
408+
'c',
409+
'a',
410+
'x',
411+
'Ba',
412+
'BY',
413+
'Xa',
414+
'XY',
415+
'g',
416+
'z'
417+
]);
418+
});
419+
360420
test('it returns all sorted nodes with types', () => {
361421
const result = getImportNodes(typeCode, {
362422
plugins: ['typescript'],
@@ -368,6 +428,7 @@ test('it returns all sorted nodes with types', () => {
368428
importOrderGroupNamespaceSpecifiers: false,
369429
importOrderSortSpecifiers: false,
370430
importOrderSideEffects: true,
431+
importOrderSortByLength: null,
371432
}) as ImportDeclaration[];
372433

373434
expect(getSortedNodesNames(sorted)).toEqual([

src/utils/__tests__/remove-nodes-from-original-code.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ test('it should remove nodes from the original code', async () => {
2626
importOrderSeparation: false,
2727
importOrderGroupNamespaceSpecifiers: false,
2828
importOrderSortSpecifiers: false,
29-
importOrderSideEffects: true,
29+
importOrderSortByLength: null,
30+
importOrderSideEffects: true
3031
});
3132
const allCommentsFromImports = getAllCommentsFromNodes(sortedNodes);
3233

0 commit comments

Comments
 (0)