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

Feature: importOrderCombineTypeAndValueImports #20

Merged
merged 26 commits into from Oct 24, 2022
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
d4df2f0
Add TypeScript enforcement to not-forgetting our Options schema!
fbartho May 18, 2022
cf4e6af
Change syntax of getCodeFromAst to allow for node deletion
fbartho May 18, 2022
f03f96b
Github-linguist doesn't understand `ecmascript 6`
fbartho May 18, 2022
6c47166
Feature: `importOrderMergeDuplicateImports` - Fixes #4
fbartho May 18, 2022
dc43318
Merge branch 'main' into fb/simplify-import-duplicates
fbartho May 18, 2022
a62bcd1
Feature: `importOrderMergeTypeImportsIntoRegular`
fbartho May 18, 2022
db923e7
merge-tests: extract defaultOptions
fbartho May 18, 2022
e2ab51d
merge-imports: Add test cases from codemod
fbartho May 18, 2022
9ef2abe
switch from toMatchInlineSnapshot to toEqual
fbartho May 19, 2022
61f7797
Merge branch 'fb/simplify-import-duplicates' into fb/merge-type-impor…
fbartho May 19, 2022
8edeb51
switch from toMatchInlineSnapshot to toEqual
fbartho May 19, 2022
f5f9e26
PR Feedback: rename `regular` imports to `value` imports
fbartho May 20, 2022
42999c9
PR Feedback: Readme wording
fbartho May 20, 2022
2fe3128
PR Feedback: rename getCodeFromAst parameters
fbartho May 20, 2022
e393e5e
PR Feedback: import-flavor @returns documentation
fbartho May 20, 2022
e569488
PR Feedback: hoist hasIgnoreNextNode for reuse
fbartho May 20, 2022
0e3a871
PR Feedback: Add strong types for ChunkType/FlavorType
fbartho May 20, 2022
d0a2692
PR Feedback: deleteContext -> nodesToDelete
fbartho May 20, 2022
6cb7764
PR Feedback: comment-update: once you mutate nodes, lines/locations a…
fbartho May 20, 2022
3c3c142
Merge branch 'fb/simplify-import-duplicates' into fb/merge-type-impor…
fbartho May 20, 2022
99b6716
PR Feedback: apply getCodeFromAst renames
fbartho May 20, 2022
826a973
Merge branch 'main' into fb/merge-type-imports-with-regular-imports
fbartho Jun 15, 2022
03b9926
Minor review comments
IanVS Oct 24, 2022
beb9066
Group type imports after value in importOrderSortSpecifiers
IanVS Oct 24, 2022
75b11fe
Rename option for clarity
IanVS Oct 24, 2022
a5e4f6b
Add TOC to readme, re-arrange a bit
IanVS Oct 24, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions README.md
Expand Up @@ -100,6 +100,7 @@ module.exports = {
"importOrderCaseInsensitive": true,
"importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy"],
"importOrderMergeDuplicateImports": true,
"importOrderMergeTypeImportsIntoRegular": true,
"importOrderSeparation": true,
"importOrderSortSpecifiers": true,
}
Expand Down Expand Up @@ -218,6 +219,28 @@ import ExampleView from './ExampleView';

When `true`, multiple import statements from the same module will be combined into a single import.

#### `importOrderMergeTypeImportsIntoRegular`

**type**: `boolean`

**default value:** `false`

A boolean value to control merging `import type` expressions into `import {…}`.

```diff
- import type { C1 } from 'c';
- import { C2 } from 'c';
+ import { type C1, C2 } from "c";

- import { D1 } from 'd';
- import type { D2 } from 'd';
+ import { D1, type D2 } from "d";

- import type { A1 } from 'a';
- import type { A2 } from 'a';
+ import type { A1, A2 } from "a";
```

#### `importOrderParserPlugins`

**type**: `Array<string>`
Expand Down
7 changes: 7 additions & 0 deletions src/index.ts
Expand Up @@ -72,6 +72,13 @@ const options: Record<
default: false,
description: 'Should duplicate imports be merged?',
},
importOrderMergeTypeImportsIntoRegular: {
type: 'boolean',
category: 'Global',
default: false,
description:
'Should import-type expressions be merged into import-value expressions?',
},
};

module.exports = {
Expand Down
11 changes: 11 additions & 0 deletions src/preprocessor.ts
Expand Up @@ -15,10 +15,20 @@ export function preprocessor(code: string, options: PrettierOptions): string {
importOrderCaseInsensitive,
importOrderGroupNamespaceSpecifiers,
importOrderMergeDuplicateImports,
importOrderMergeTypeImportsIntoRegular,
importOrderSeparation,
importOrderSortSpecifiers,
} = options;

if (
importOrderMergeTypeImportsIntoRegular &&
!importOrderMergeDuplicateImports
) {
console.warn(
"[@ianvs/prettier-plugin-sort-imports]: Option combination of both importOrderMergeTypeImportsIntoRegular: true and importOrderMergeDuplicateImports: false is not won't do anything!",
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"[@ianvs/prettier-plugin-sort-imports]: Option combination of both importOrderMergeTypeImportsIntoRegular: true and importOrderMergeDuplicateImports: false is not won't do anything!",
"[@ianvs/prettier-plugin-sort-imports]: Enabling importOrderMergeTypeImportsIntoRegular will have no effect unless importOrderMergeDuplicateImports is also enabled.",

);
}

const allOriginalImportNodes: ImportDeclaration[] = [];
const parserOptions: ParserOptions = {
sourceType: 'module',
Expand Down Expand Up @@ -52,6 +62,7 @@ export function preprocessor(code: string, options: PrettierOptions): string {
importOrderCaseInsensitive,
importOrderGroupNamespaceSpecifiers,
importOrderMergeDuplicateImports,
importOrderMergeTypeImportsIntoRegular,
importOrderSeparation,
importOrderSortSpecifiers,
});
Expand Down
3 changes: 3 additions & 0 deletions src/types.ts
Expand Up @@ -16,6 +16,7 @@ export interface PrettierOptions extends RequiredOptions {
importOrderBuiltinModulesToTop: boolean;
importOrderGroupNamespaceSpecifiers: boolean;
importOrderMergeDuplicateImports: boolean;
importOrderMergeTypeImportsIntoRegular: boolean;
importOrderSeparation: boolean;
importOrderSortSpecifiers: boolean;
// should be of type ParserPlugin from '@babel/parser' but prettier does not support nested arrays in options
Expand Down Expand Up @@ -46,6 +47,7 @@ export type GetSortedNodes = (
| 'importOrderCaseInsensitive'
| 'importOrderGroupNamespaceSpecifiers'
| 'importOrderMergeDuplicateImports'
| 'importOrderMergeTypeImportsIntoRegular'
| 'importOrderSeparation'
| 'importOrderSortSpecifiers'
>,
Expand All @@ -57,4 +59,5 @@ export type GetImportFlavorOfNode = (node: ImportDeclaration) => FlavorType;

export type MergeNodesWithMatchingImportFlavors = (
nodes: ImportDeclaration[],
options: { importOrderMergeTypeImportsIntoRegular: boolean },
) => ImportDeclaration[];
1 change: 1 addition & 0 deletions src/utils/__tests__/get-all-comments-from-nodes.spec.ts
Expand Up @@ -14,6 +14,7 @@ const getSortedImportNodes = (code: string, options?: ParserOptions) => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
});
Expand Down
9 changes: 5 additions & 4 deletions src/utils/__tests__/get-code-from-ast.spec.ts
Expand Up @@ -21,6 +21,7 @@ import a from 'a';
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
});
Expand All @@ -47,14 +48,13 @@ it('merges duplicate imports correctly', () => {
// second comment
import z from 'z';
import c from 'c';
import type {C} from 'c';
import type {See} from 'c';
import g from 'g';
import t from 't';
import k from 'k';
import a from 'a';
import {b} from 'a';
import {type Bee} from 'a';
import {b, type Bee} from 'a';
import type {C} from 'c';
import type {See} from 'c';
`;
const importNodes = getImportNodes(code, { plugins: ['typescript'] });
const sortedNodes = getSortedNodes(importNodes, {
Expand All @@ -63,6 +63,7 @@ import {type Bee} from 'a';
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: true,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
});
Expand Down
14 changes: 14 additions & 0 deletions src/utils/__tests__/get-sorted-nodes-by-import-order.spec.ts
Expand Up @@ -32,6 +32,7 @@ test('it returns all sorted nodes', () => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -86,6 +87,7 @@ test('it returns all sorted nodes case-insensitive', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -140,6 +142,7 @@ test('it returns all sorted nodes with sort order', () => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -194,6 +197,7 @@ test('it returns all sorted nodes with sort order case-insensitive', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -247,6 +251,7 @@ test('it returns all sorted import nodes with sorted import specifiers', () => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: true,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -300,6 +305,7 @@ test('it returns all sorted import nodes with sorted import specifiers with case
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: true,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -353,6 +359,7 @@ test('it returns all sorted nodes with custom third party modules', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -383,6 +390,7 @@ test('it returns all sorted nodes with namespace specifiers at the top', () => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: true,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -414,6 +422,7 @@ test('it returns all sorted nodes with builtin specifiers at the top, ', () => {
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -445,6 +454,7 @@ test('it returns all sorted nodes with custom third party modules and builtins a
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -475,6 +485,7 @@ test('it adds newlines when importOrderSeparation is true', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: true,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -515,6 +526,7 @@ test('it returns all sorted nodes with custom separation', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -553,6 +565,7 @@ test('it allows both importOrderSeparation and custom separation (but why?)', ()
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: true,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down Expand Up @@ -597,6 +610,7 @@ test('it does not add multiple custom import separators', () => {
importOrderCaseInsensitive: true,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down
1 change: 1 addition & 0 deletions src/utils/__tests__/get-sorted-nodes.spec.ts
Expand Up @@ -33,6 +33,7 @@ test('it returns all sorted nodes, preserving the order side effect nodes', () =
importOrderCaseInsensitive: false,
importOrderGroupNamespaceSpecifiers: false,
importOrderMergeDuplicateImports: false,
importOrderMergeTypeImportsIntoRegular: false,
importOrderSeparation: false,
importOrderSortSpecifiers: false,
}) as ImportDeclaration[];
Expand Down