From 252610c003c4013e40a9995c01c5ba443b42f822 Mon Sep 17 00:00:00 2001 From: Fernando Maia Date: Mon, 24 May 2021 16:08:11 -0300 Subject: [PATCH 1/2] feat(alias): auto-detect aliases Auto-detection relies on isAbsoluteModule and isNodeModule BREAKING CHANGE: options.alias is no longer required/valid fix #11 --- README.md | 16 ++++++++++++---- src/index.ts | 13 ++----------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index fe43224..772fc92 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,20 @@ A style for [import-sort](https://github.com/renke/import-sort) that is focused on modules with relative modules alias support. +## Migrating from v1 to v2 + +Previously, we had to fill an `alias` option with the aliases list (e.g. `["components", "modules"]`). + +Now it auto-detects aliases using the following combined rules: + +- Aliases are absolute modules: `isAbsoluteModule` +- Aliases aren't node modules: `not(isNodeModule)` + ## Options -| Name | Type | Description | Default value | -| ---------------------- | -------- | ----------------------------------------------------------------- | ------------- | -| alias | string[] | List of resolver aliases | [] | -| overrideBuiltInModules | boolean | Whether an alias should override a Node built-in module (e.g. fs) | true | +| Name | Type | Description | Default value | +| ---------------------- | ------- | ----------------------------------------------------------------- | ------------- | +| overrideBuiltInModules | boolean | Whether an alias should override a Node built-in module (e.g. fs) | true | ## Configuration diff --git a/src/index.ts b/src/index.ts index b073455..bdea9cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,22 +1,13 @@ -import { IImport } from 'import-sort-parser'; import { IStyleAPI, IStyleItem } from 'import-sort-style'; export interface Options { - alias: string[]; overrideBuiltinModules: boolean; } -const hasAlias = (aliases: string[]) => (imported: IImport): boolean => - aliases.some( - (alias: string): boolean => - imported.moduleName === alias || - imported.moduleName.indexOf(`${alias}/`) === 0 - ); - export default ( styleApi: IStyleAPI, _file?: string, - { alias: aliases = [], overrideBuiltinModules = true } = {} as Options + { overrideBuiltinModules = true } = {} as Options ): IStyleItem[] => { const { alias, @@ -32,7 +23,7 @@ export default ( unicode, } = styleApi; - const isAliasModule = hasAlias(aliases || []); + const isAliasModule = not(isNodeModule); return [ // import "foo" From 8c3573f43734a859e7fb008b5bf33516ee99bff0 Mon Sep 17 00:00:00 2001 From: Fernando Maia Date: Mon, 24 May 2021 18:11:14 -0300 Subject: [PATCH 2/2] feat(alias): enhance detection by considering isInstalledModule --- README.md | 11 +++-------- src/index.ts | 24 +++++++++++------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 772fc92..0f739ed 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,9 @@ Previously, we had to fill an `alias` option with the aliases list (e.g. `["comp Now it auto-detects aliases using the following combined rules: -- Aliases are absolute modules: `isAbsoluteModule` -- Aliases aren't node modules: `not(isNodeModule)` - -## Options - -| Name | Type | Description | Default value | -| ---------------------- | ------- | ----------------------------------------------------------------- | ------------- | -| overrideBuiltInModules | boolean | Whether an alias should override a Node built-in module (e.g. fs) | true | +- Aliased imports are absolute modules (e.g. `foo`): `isAbsoluteModule` +- Aliased imports aren't installed modules (e.g. `react`): `not(isInstalledModule(file))` +- Aliased imports aren't node modules (e.g. `fs`): `not(isNodeModule)` ## Configuration diff --git a/src/index.ts b/src/index.ts index bdea9cf..1f95c93 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,11 +4,7 @@ export interface Options { overrideBuiltinModules: boolean; } -export default ( - styleApi: IStyleAPI, - _file?: string, - { overrideBuiltinModules = true } = {} as Options -): IStyleItem[] => { +export default (styleApi: IStyleAPI, file: string): IStyleItem[] => { const { alias, and, @@ -16,22 +12,26 @@ export default ( hasNoMember, isNodeModule, isAbsoluteModule, + isInstalledModule, isRelativeModule, moduleName, naturally, not, + or, unicode, } = styleApi; - const isAliasModule = not(isNodeModule); + const isExternalModule = or(isNodeModule, isInstalledModule(file)); return [ // import "foo" - { match: and(hasNoMember, isAbsoluteModule, not(isAliasModule)) }, + { + match: and(hasNoMember, isAbsoluteModule, isExternalModule), + }, { separator: true }, // import "{relativeAlias}/foo" - { match: and(hasNoMember, isAbsoluteModule, isAliasModule) }, + { match: and(hasNoMember, isAbsoluteModule, not(isExternalModule)) }, { separator: true }, // import "./foo" @@ -40,9 +40,7 @@ export default ( // import … from "fs"; { - match: overrideBuiltinModules - ? and(isNodeModule, not(isAliasModule)) - : isNodeModule, + match: isNodeModule, sort: moduleName(naturally), sortNamedMembers: alias(unicode), }, @@ -50,7 +48,7 @@ export default ( // import … from "foo"; { - match: and(isAbsoluteModule, not(isAliasModule)), + match: and(isAbsoluteModule, isInstalledModule(file)), sort: moduleName(naturally), sortNamedMembers: alias(unicode), }, @@ -58,7 +56,7 @@ export default ( // import … from "{relativeAlias}/foo"; { - match: and(isAbsoluteModule, isAliasModule), + match: and(isAbsoluteModule, not(isExternalModule)), sort: moduleName(naturally), sortNamedMembers: alias(unicode), },