Skip to content

Commit 2830122

Browse files
committed
Merge branch 'master' into feature/opt-in-flag-convert-disable-comments
2 parents 67b4d66 + 6621439 commit 2830122

30 files changed

+347
-66
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ jobs:
9191
- attach_workspace:
9292
at: "."
9393

94-
- run: npm run test -- --coverage
94+
- run: npm run test:ci
9595

9696
tsc:
9797
docker:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*.map
55
coverage/
66
node_modules/
7+
pnpm-lock.yaml
78
src/**/*.js
89
test/*.js
910
~test/jest.config.js

.npmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
engine-strict=true

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
![Coverage: 100%](https://img.shields.io/badge/coverage-100%25-orange.svg)
55
![TypeScript: Strict](https://img.shields.io/badge/typescript-strict-yellow.svg)
66
[![NPM version](https://badge.fury.io/js/tslint-to-eslint-config.svg)](http://badge.fury.io/js/tslint-to-eslint-config)
7-
[![Circle CI](https://img.shields.io/circleci/build/github/typescript-eslint/tslint-to-eslint-config.svg)](https://circleci.com/gh/typescript-eslint/tslint-to-eslint-config)
7+
[![Circle CI](https://img.shields.io/circleci/build/github/typescript-eslint/tslint-to-eslint-config.svg)](https://circleci.com/gh/typescript-eslint/tslint-to-eslint-config)
88
[![Join the chat at https://gitter.im/tslint-to-eslint-config/community](https://img.shields.io/badge/chat-gitter-informational.svg)](https://gitter.im/tslint-to-eslint-config/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
99
[![Code Style: Prettier](https://img.shields.io/badge/speed-blazingly_fast-blueviolet.svg)](https://prettier.io)
1010

@@ -32,7 +32,7 @@ The `tslint-to-eslint-config` command reads in any existing linter, TypeScript,
3232
For any TSLint rules with corresponding ESLint equivalents, those equivalents will be used in the new configuration.
3333
TSLint rules without ESLint equivalents will be wrapped with [eslint-plugin-tslint](https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin-tslint).
3434

35-
> Requires Node 8+ (LTS)
35+
> Requires Node 10+ (LTS) and TSLint 5.18+
3636
3737
### CLI Flags
3838

package-lock.json

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
"url": "https://github.com/typescript-eslint/tslint-to-eslint-config/issues"
77
},
88
"description": "Converts your TSLint configuration to the closest reasonable ESLint equivalent.",
9+
"engines": {
10+
"node": ">=8.0.0"
11+
},
912
"dependencies": {
1013
"chalk": "3.0.0",
1114
"commander": "4.0.1",
@@ -61,7 +64,8 @@
6164
"prettier": "prettier \"./src/*.{js,json,ts,xml,yaml}\" \"./src/**/*.{js,json,ts,xml,yaml}\" --ignore-path .prettierignore",
6265
"prettier:write": "npm run prettier -- --write",
6366
"test": "jest",
67+
"test:ci": "jest --coverage --maxWorkers=2",
6468
"tsc": "tsc"
6569
},
66-
"version": "0.5.0"
70+
"version": "0.5.2"
6771
}

src/reporting/reportConversionResults.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ describe("reportConversionResults", () => {
172172
);
173173
expectEqualWrites(
174174
logger.info.write,
175-
"tslint-rule-one does not yet have an ESLint equivalent.",
175+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one"',
176176
);
177177
});
178178

@@ -206,8 +206,8 @@ describe("reportConversionResults", () => {
206206
);
207207
expectEqualWrites(
208208
logger.info.write,
209-
"tslint-rule-one does not yet have an ESLint equivalent.",
210-
"tslint-rule-two does not yet have an ESLint equivalent.",
209+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one"',
210+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-two"',
211211
);
212212
});
213213

src/reporting/reportConversionResults.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const reportConversionResults = (
2929
logMissingConversionTarget(
3030
"rule",
3131
(setting: TSLintRuleOptions) =>
32-
`${setting.ruleName} does not yet have an ESLint equivalent.${EOL}`,
32+
`tslint-to-eslint-config does not know the ESLint equivalent for TSLint's "${setting.ruleName}"${EOL}`,
3333
ruleConversionResults.missing,
3434
dependencies.logger,
3535
[

src/reporting/reportEditorSettingConversionResults.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ describe("reportEditorSettingConversionResults", () => {
126126
);
127127
expectEqualWrites(
128128
logger.info.write,
129-
"tslint-editor-setting-one does not yet have an ESLint equivalent.",
129+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one"',
130130
);
131131
});
132132

@@ -156,8 +156,8 @@ describe("reportEditorSettingConversionResults", () => {
156156
);
157157
expectEqualWrites(
158158
logger.info.write,
159-
"tslint-editor-setting-one does not yet have an ESLint equivalent.",
160-
"tslint-editor-setting-two does not yet have an ESLint equivalent.",
159+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one"',
160+
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-two"',
161161
);
162162
});
163163
});

src/reporting/reportEditorSettingConversionResults.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ export const reportEditorSettingConversionResults = (
2828
if (editorSettingConversionResults.missing.length !== 0) {
2929
const missingEditorSettingOutputMapping = (
3030
editorSetting: Pick<EditorSetting, "editorSettingName">,
31-
) => `${editorSetting.editorSettingName} does not yet have an ESLint equivalent.${EOL}`;
31+
) =>
32+
`tslint-to-eslint-config does not know the ESLint equivalent for TSLint's "${editorSetting.editorSettingName}"${EOL}`;
3233
logMissingConversionTarget(
3334
"editor setting",
3435
missingEditorSettingOutputMapping,

src/rules/converters/array-type.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { RuleConverter } from "../converter";
22

3-
export const convertArrayType: RuleConverter = () => {
3+
export const convertArrayType: RuleConverter = tslintRule => {
44
return {
55
rules: [
66
{
7+
...(tslintRule.ruleArguments.length > 0 && {
8+
ruleArguments: [{ default: tslintRule.ruleArguments[0] }],
9+
}),
710
ruleName: "@typescript-eslint/array-type",
811
},
912
],

src/rules/converters/arrow-parens.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { RuleConverter } from "../converter";
22

33
export const convertArrowParens: RuleConverter = tslintRule => {
44
const ruleArguments = [
5-
tslintRule.ruleArguments.length !== 0 && tslintRule.ruleArguments[0] === "always"
6-
? "always"
7-
: "as-needed",
5+
tslintRule.ruleArguments.length !== 0 &&
6+
tslintRule.ruleArguments[0] === "ban-single-arg-parens"
7+
? "as-needed"
8+
: "always",
89
];
910

1011
return {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { RuleConverter } from "../converter";
2+
import { RequireAtLeastOne } from "../../utils";
3+
4+
type ESLintOptionPath = {
5+
name: string;
6+
importNames: string[];
7+
message?: string;
8+
};
9+
type ESLintSimpleOption = string[];
10+
type ESLintComplexOption = RequireAtLeastOne<{
11+
paths: (string | ESLintOptionPath)[];
12+
patterns: string[];
13+
}>;
14+
type ESLintOptions = ESLintSimpleOption | ESLintComplexOption;
15+
16+
const NOTICE_MATCH_PATTERNS =
17+
"ESLint and TSLint use different strategies to match patterns. TSLint uses standard regular expressions, but ESLint .gitignore spec.";
18+
19+
export const convertImportBlacklist: RuleConverter = tslintRule => {
20+
let ruleArguments: ESLintOptions = [];
21+
const notices = [];
22+
23+
if (tslintRule.ruleArguments.every(isString)) {
24+
ruleArguments = tslintRule.ruleArguments;
25+
} else {
26+
const objectOption = tslintRule.ruleArguments.reduce((rules, rule) => {
27+
if (!Array.isArray(rule)) {
28+
const eslintRule = isString(rule)
29+
? rule
30+
: {
31+
name: Object.keys(rule)[0],
32+
importNames: Object.values(rule)[0] as string[],
33+
};
34+
return { ...rules, paths: [...(rules.paths || []), eslintRule] };
35+
}
36+
37+
return { ...rules, patterns: [...(rules.patterns || []), ...rule] };
38+
}, {} as ESLintComplexOption);
39+
40+
if ("patterns" in objectOption && objectOption.patterns.length > 0) {
41+
notices.push(NOTICE_MATCH_PATTERNS);
42+
}
43+
44+
ruleArguments = [objectOption];
45+
}
46+
47+
return {
48+
rules: [
49+
{
50+
ruleArguments,
51+
...(notices.length > 0 && { notices }),
52+
ruleName: "no-restricted-imports",
53+
},
54+
],
55+
};
56+
};
57+
58+
function isString(value: string): boolean {
59+
return typeof value === "string";
60+
}

src/rules/converters/jsdoc-format.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { RuleConverter, ConvertedRuleChanges } from "../converter";
2+
3+
export const JSDocNoticeMsg =
4+
"ESLint does not support enforcing the first line of multiline JSDoc comments be empty.";
5+
6+
export const convertJSDocFormat: RuleConverter = () => {
7+
const ruleNames = [
8+
"jsdoc/check-alignment",
9+
"jsdoc/check-indentation",
10+
"jsdoc/newline-after-description",
11+
];
12+
13+
const mappedRuleNames: ConvertedRuleChanges[] = ruleNames.map(ruleName => {
14+
return { ruleName };
15+
});
16+
17+
return {
18+
rules: [...mappedRuleNames],
19+
notices: [JSDocNoticeMsg],
20+
plugins: ["eslint-plugin-jsdoc"],
21+
};
22+
};

src/rules/converters/member-access.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const convertMemberAccess: RuleConverter = tslintRule => {
2222
accessibility: AccessibilityLevel.Explicit,
2323
};
2424

25-
if (tslintRule.ruleArguments.length >= 2 || tslintRule.ruleArguments[0] === true) {
25+
if (tslintRule.ruleArguments.length >= 1 || tslintRule.ruleArguments[0] === true) {
2626
for (const ruleArg of tslintRule.ruleArguments) {
2727
if (typeof ruleArg === "string") {
2828
switch (ruleArg) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { RuleConverter } from "../converter";
2+
3+
export const convertNoBooleanLiteralCompare: RuleConverter = () => {
4+
return {
5+
rules: [
6+
{
7+
ruleName: "@typescript-eslint/no-unnecessary-boolean-literal-compare",
8+
},
9+
],
10+
};
11+
};

src/rules/converters/prefer-readonly.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export const convertPreferReadonly: RuleConverter = tslintRule => {
77
...(tslintRule.ruleArguments.includes("only-inline-lambdas") && {
88
ruleArguments: [{ onlyInlineLambdas: true }],
99
}),
10-
ruleName: "prefer-readonly",
10+
ruleName: "@typescript-eslint/prefer-readonly",
1111
},
1212
],
1313
};

src/rules/converters/space-within-parens.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export const convertSpaceWithinParens: RuleConverter = tslintRule => {
44
let notices: string[] | undefined;
55
let arg: string;
66

7-
if (tslintRule.ruleArguments.length === 1) {
7+
if (tslintRule.ruleArguments.length === 1 && tslintRule.ruleArguments[0] !== 0) {
88
arg = "always";
99
notices = ["The number of spaces will be ignored"];
1010
} else {
@@ -16,7 +16,7 @@ export const convertSpaceWithinParens: RuleConverter = tslintRule => {
1616
{
1717
...(notices !== undefined && { notices }),
1818
ruleArguments: [arg],
19-
ruleName: "@typescript-eslint/space-within-parens",
19+
ruleName: "space-in-parens",
2020
},
2121
],
2222
};

src/rules/converters/tests/array-type.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,46 @@ describe(convertArrayType, () => {
1414
],
1515
});
1616
});
17+
test("conversion with argument array-simple", () => {
18+
const result = convertArrayType({
19+
ruleArguments: ["array-simple"],
20+
});
21+
22+
expect(result).toEqual({
23+
rules: [
24+
{
25+
ruleName: "@typescript-eslint/array-type",
26+
ruleArguments: [{ default: "array-simple" }],
27+
},
28+
],
29+
});
30+
});
31+
test("conversion with argument generic", () => {
32+
const result = convertArrayType({
33+
ruleArguments: ["generic"],
34+
});
35+
36+
expect(result).toEqual({
37+
rules: [
38+
{
39+
ruleName: "@typescript-eslint/array-type",
40+
ruleArguments: [{ default: "generic" }],
41+
},
42+
],
43+
});
44+
});
45+
test("conversion with argument simple", () => {
46+
const result = convertArrayType({
47+
ruleArguments: ["simple"],
48+
});
49+
50+
expect(result).toEqual({
51+
rules: [
52+
{
53+
ruleName: "@typescript-eslint/array-type",
54+
ruleArguments: [{ default: "simple" }],
55+
},
56+
],
57+
});
58+
});
1759
});

0 commit comments

Comments
 (0)