How to quickly configure ESLint for import sorting
• 3 min read
Introduction
I can get a bit obsessive with the way the code is formatted and styled not only in a team setting but in my own personal projects. Something that I took note of along the way is that I really liked by imports at the beginning of the file being ordered in a specific way:
- Dependencies / Built-in modules (eg ‘react’, ‘react-router-dom’)
- Internal routes of absolute folders (eg ‘components’, ‘assets’)
- Relative routes (eg ./, ../)
And within those same subcategories, I also wanted it to be alphabetical.
ESLINT
With ESLint there are two options to flag errors or warnings when the imports are set in an incorrect order: sort-imports and with the help of a plugin eslint-plugin-import another rule with the name import/order.
sort-imports
sort-imports offers a way to alphabetically organize the imports using the declarations or the members of the declaration. For example:
Will become:
Great! We can also add a few options to ignore letter cases. In order to hook up this to ESLint we have to add a rule in the ESLint config file:
"rules": { // ..other rules, "sort-imports": ["error", { "ignoreCase": true, "ignoreDeclarationSort": true }], }
You may have noticed I am ignored declaration sort here. This is intentional, we are going to have a more nuanced approach to sorting the declarations using eslint-plugin-import.
import/orders
For this to work the ESLint plugin must first be installed:
yarn add eslint-plugin-import --dev
Great! It offers a rule configuration to get very granular about how we want our imports to look. We can first differentiate the groups of our imports and split them up by groups:
JSON"rules: {
"import/order":
[1,{
"groups": [
"external",
"builtin",
"internal",
"sibling",
"parent",
"index"],
}
]
}
This will split the imports by the groups we specified at the beginning! Great! However, when using aliases with Typescript a few of our imports can be confused with dependencies.
This particular rule can help us circumvent these particular edge cases by specifying something called pathGroups.
JSON{
"groups": [
["external", "builtin"],
"internal",
["sibling", "parent"],
"index"
],
"pathGroups": [
{ "pattern": "components", "group": "internal" },
{ "pattern": "components/**", "group": "internal" },
{ "pattern": "constants/**", "group": "internal" },
{ "pattern": "common", "group": "internal" },
{ "pattern": "error/**", "group": "internal" },
{ "pattern": "hooks/**", "group": "internal" },
{ "pattern": "locale/**", "group": "internal" },
{ "pattern": "routes/**", "group": "internal" },
{ "pattern": "selectors", "group": "internal" },
{ "pattern": "store", "group": "internal" },
{ "pattern": "assets/**", "group": "internal", "position": "after" }
],
"pathGroupsExcludedImportTypes": ["internal"],
"alphabetize": {
"order": "asc",
"caseInsensitive": true
}
}
Great now it will consider those aliased folders under the group internal!
As part of the linting process you could now run:
Bash/Shellyarn lint --fix
And it’ll fix all import sorting warnings.
If you see any typos or errors you can edit the article directly on GitHub
Hi, I'm Diego Ballesteros 👋.
Stay on top of the tech industry and grow as a developerwith a curated selection of articles and news alongside personal advice, observations, and insight. 🚀
No spam 🙅♂️. Unsubscribe whenever.
You may also like these articles:
- 2023-06-05T00:41:29.681Z
- 2022-10-25T11:29:26.663Z
- 2022-10-17T14:44:10.229Z
- 2022-10-10T14:02:10.349Z