Skip to content

Commit bc4d8fa

Browse files
authored
feat: allow configuration of organizeImportsTypeOrder (#152)
1 parent ed9c19a commit bc4d8fa

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

index.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,25 @@ const plugin = {
7070
category: 'OrganizeImports',
7171
description: 'Skip destructive code actions like removing unused imports.',
7272
},
73+
organizeImportsTypeOrder: {
74+
type: 'choice',
75+
choices: [
76+
{
77+
value: 'last',
78+
description: 'Places type imports last.',
79+
},
80+
{
81+
value: 'first',
82+
description: 'Places type imports first.',
83+
},
84+
{
85+
value: 'inline',
86+
description: 'Keeps type imports in place.',
87+
},
88+
],
89+
category: 'OrganizeImports',
90+
description: 'How to sort type imports when mixed in an import statement.',
91+
},
7392
},
7493
parsers: {
7594
babel: withOrganizeImportsPreprocess(babelParsers.babel),

lib/organize.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const { getLanguageService } = require('./get-language-service');
1010
*/
1111
module.exports.organize = (
1212
code,
13-
{ filepath = 'file.ts', organizeImportsSkipDestructiveCodeActions, parentParser, parser },
13+
{ filepath = 'file.ts', organizeImportsSkipDestructiveCodeActions, parentParser, parser, organizeImportsTypeOrder },
1414
) => {
1515
if (parentParser === 'vue') {
1616
// we already did the preprocessing in the parent parser, so we skip the child parsers
@@ -26,7 +26,7 @@ module.exports.organize = (
2626
const fileChanges = languageService.organizeImports(
2727
{ type: 'file', fileName: filepath, skipDestructiveCodeActions: organizeImportsSkipDestructiveCodeActions },
2828
{},
29-
{},
29+
{ organizeImportsTypeOrder },
3030
)[0];
3131

3232
return fileChanges ? applyTextChanges(code, fileChanges.textChanges) : code;

prettier.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import ts = require('typescript');
2+
13
declare module 'prettier' {
24
interface Options {
35
organizeImportsSkipDestructiveCodeActions?: boolean;
6+
organizeImportsTypeOrder?: ts.OrganizeImportsTypeOrder;
47
}
58
interface ParserOptions {
69
organizeImportsSkipDestructiveCodeActions?: boolean;
10+
organizeImportsTypeOrder?: ts.OrganizeImportsTypeOrder;
711
}
812
}
913

test/main.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,15 @@ test('does not remove unused imports with `organizeImportsSkipDestructiveCodeAct
8787

8888
t.is(formattedCode, code);
8989
});
90+
91+
test('sorts type imports according to the `organizeImportsTypeOrder` option', async (t) => {
92+
const code = `import { foo, type baz, bar } from "./foobarbaz";\n\nexport const foobar: baz = foo + bar;\n`;
93+
94+
const formattedCode1 = await prettify(code, { parser: 'typescript', organizeImportsTypeOrder: 'last' });
95+
const formattedCode2 = await prettify(code, { parser: 'typescript', organizeImportsTypeOrder: 'first' });
96+
const formattedCode3 = await prettify(code, { parser: 'typescript', organizeImportsTypeOrder: 'inline' });
97+
98+
t.is(formattedCode1, `import { bar, foo, type baz } from "./foobarbaz";\n\nexport const foobar: baz = foo + bar;\n`);
99+
t.is(formattedCode2, `import { type baz, bar, foo } from "./foobarbaz";\n\nexport const foobar: baz = foo + bar;\n`);
100+
t.is(formattedCode3, `import { bar, type baz, foo } from "./foobarbaz";\n\nexport const foobar: baz = foo + bar;\n`);
101+
});

0 commit comments

Comments
 (0)