Skip to content

Commit 312c7b7

Browse files
authored
Merge pull request #3 from ovos/feat/imports-order
add ordered-imports rule
2 parents 45353b9 + c9c98a4 commit 312c7b7

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

.prettierrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"singleQuote": true,
3+
"trailingComma": "es5",
4+
"arrowParens": "avoid"
5+
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"release": "standard-version"
1616
},
1717
"dependencies": {
18+
"resolve": "^1.12.0",
1819
"tslint-config-airbnb": "git+https://github.com/ovos/tslint-config-airbnb.git#5.11.1-mod.0",
1920
"tslint-consistent-codestyle": "^1.15.1",
2021
"tslint-react": "^4.0.0"
@@ -23,7 +24,7 @@
2324
"@types/node": "^12.7.4",
2425
"@types/prettier": "^1.18.2",
2526
"prettier": "^1.18.2",
26-
"tslint": "^5.19.0",
27+
"tslint": "^5.20.0",
2728
"typescript": "^3.6.2"
2829
},
2930
"files": [

tslint.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,71 @@
1+
import * as fs from 'fs';
2+
import * as path from 'path';
3+
import * as coreModules from 'resolve/lib/core';
14
import * as tslint from 'tslint';
25
import * as tslintAirbnb from 'tslint-config-airbnb';
36
const tslintReact = require('tslint-react');
47

58
const rulesAirbnb = tslintAirbnb.rules;
69
const rulesReact = tslintReact.rules;
710

11+
// prepare regex for node core modules for 'ordered-imports' rule
12+
const modules = Object.entries(coreModules as Record<string, boolean>).reduce(
13+
(acc: string[], [module, enabled]) => {
14+
enabled && !module.startsWith('_') && acc.push(module);
15+
return acc;
16+
},
17+
[]
18+
);
19+
const coreModulesRegex = '^(' + modules.join('|') + ')$';
20+
21+
// prepare import groups for 'ordered-imports' rule
22+
const projectPackageJson = path.join(process.cwd(), 'package.json');
23+
let dependenciesRegex;
24+
if (fs.existsSync(projectPackageJson)) {
25+
const packageJson = require(projectPackageJson);
26+
const dependencies = [
27+
...Object.keys(packageJson.dependencies || {}),
28+
...Object.keys(packageJson.devDependencies || {}),
29+
];
30+
31+
if (dependencies.length) {
32+
dependenciesRegex = '^(' + dependencies.join('|').replace(/\./g, '\\\\.') + ')(/|$)';
33+
}
34+
}
35+
36+
const importGroups = [
37+
{
38+
name: 'aliased paths, which begin with tilde in our convention',
39+
match: '^~',
40+
order: 30,
41+
},
42+
{
43+
name: 'parent directories',
44+
match: '^\\.\\.',
45+
order: 50,
46+
},
47+
{
48+
name: 'current directory',
49+
match: '^\\.',
50+
order: 60,
51+
},
52+
{
53+
name: 'built-in node modules',
54+
match: coreModulesRegex,
55+
order: 10,
56+
},
57+
dependenciesRegex && {
58+
name: 'dependencies',
59+
match: dependenciesRegex,
60+
order: 20,
61+
},
62+
{
63+
name: 'the rest, incl. typescript absolute imports',
64+
match: '\\.*',
65+
order: 40,
66+
},
67+
].filter(Boolean); // filter out empty dependencies group
68+
869
const rules : tslint.Configuration.RawRulesConfig = Object.assign({}, rulesAirbnb, rulesReact, {
970
// differences from airbnb ruleset
1071
'prefer-array-literal': [true, {'allow-size-argument': true}],
@@ -87,6 +148,11 @@ const rules : tslint.Configuration.RawRulesConfig = Object.assign({}, rulesAirbn
87148
'no-for-in-array': true,
88149
'no-return-await': true,
89150
'no-unused': [true, 'ignore-parameters'], // instead of "noUnusedLocals" in typescript
151+
'ordered-imports': [true, {
152+
'named-imports-order': 'lowercase-last',
153+
'grouped-imports': true,
154+
groups: importGroups,
155+
}],
90156

91157
// comments
92158
/**

0 commit comments

Comments
 (0)