Skip to content

Commit c3fb72e

Browse files
YashdalfTheGrayJosh Goldberg
authored and
Josh Goldberg
committed
added semicolon rule converter plus tests (#220)
* added the editor tab width for people who have their editors configured to be 2 spaces * added the semicolon rule and some tests, plus export from converters * fixed an eslint issue with the build * fixed not following converter naming convention * code review changes
1 parent 8ef52dd commit c3fb72e

File tree

3 files changed

+249
-0
lines changed

3 files changed

+249
-0
lines changed

src/rules/converters.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ import { convertPreferTemplate } from "./converters/prefer-template";
101101
import { convertPromiseFunctionAsync } from "./converters/promise-function-async";
102102
import { convertRadix } from "./converters/radix";
103103
import { convertRestrictPlusOperands } from "./converters/restrict-plus-operands";
104+
import { convertSemicolon } from "./converters/semicolon";
104105
import { convertSpaceBeforeFunctionParen } from "./converters/space-before-function-paren";
105106
import { convertSwitchDefault } from "./converters/switch-default";
106107
import { convertTypedefWhitespace } from "./converters/typedef-whitespace";
@@ -222,6 +223,7 @@ export const converters = new Map([
222223
["quotemark", convertQuotemark],
223224
["radix", convertRadix],
224225
["restrict-plus-operands", convertRestrictPlusOperands],
226+
["semicolon", convertSemicolon],
225227
["space-before-function-paren", convertSpaceBeforeFunctionParen],
226228
["switch-default", convertSwitchDefault],
227229
["triple-equals", convertTripleEquals],

src/rules/converters/semicolon.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { RuleConverter } from "../converter";
2+
3+
export const convertSemicolon: RuleConverter = tslintRule => {
4+
const getMultilineDelimiter = (strategy: "always" | "never") => {
5+
if (strategy === "always") {
6+
return "semi";
7+
}
8+
return "none";
9+
};
10+
11+
const ignoreInterfaces = tslintRule.ruleArguments.includes("ignore-interfaces");
12+
const strictBoundClassMethods = tslintRule.ruleArguments.includes("strict-bound-class-methods");
13+
14+
return {
15+
rules: [
16+
{
17+
ruleName: "@typescript-eslint/semi",
18+
ruleArguments: [tslintRule.ruleArguments[0]],
19+
},
20+
...(ignoreInterfaces
21+
? []
22+
: [
23+
{
24+
ruleName: "@typescript-eslint/member-delimiter-style",
25+
ruleArguments: [
26+
"error",
27+
{
28+
multiline: {
29+
delimiter: getMultilineDelimiter(tslintRule.ruleArguments[0]),
30+
requireLast: true,
31+
},
32+
singleline: {
33+
delimiter: "semi",
34+
requireLast: false,
35+
},
36+
},
37+
],
38+
},
39+
]),
40+
],
41+
42+
notices: strictBoundClassMethods
43+
? [
44+
"Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.",
45+
]
46+
: undefined,
47+
};
48+
};
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import { convertSemicolon } from "../semicolon";
2+
3+
describe(convertSemicolon, () => {
4+
test("conversion with always", () => {
5+
const result = convertSemicolon({
6+
ruleArguments: ["always"],
7+
});
8+
9+
expect(result).toEqual({
10+
rules: [
11+
{
12+
ruleName: "@typescript-eslint/semi",
13+
ruleArguments: ["always"],
14+
},
15+
{
16+
ruleName: "@typescript-eslint/member-delimiter-style",
17+
ruleArguments: [
18+
"error",
19+
{
20+
multiline: {
21+
delimiter: "semi",
22+
requireLast: true,
23+
},
24+
singleline: {
25+
delimiter: "semi",
26+
requireLast: false,
27+
},
28+
},
29+
],
30+
},
31+
],
32+
});
33+
});
34+
35+
test("conversion with never", () => {
36+
const result = convertSemicolon({
37+
ruleArguments: ["never"],
38+
});
39+
40+
expect(result).toEqual({
41+
rules: [
42+
{
43+
ruleName: "@typescript-eslint/semi",
44+
ruleArguments: ["never"],
45+
},
46+
{
47+
ruleName: "@typescript-eslint/member-delimiter-style",
48+
ruleArguments: [
49+
"error",
50+
{
51+
multiline: {
52+
delimiter: "none",
53+
requireLast: true,
54+
},
55+
singleline: {
56+
delimiter: "semi",
57+
requireLast: false,
58+
},
59+
},
60+
],
61+
},
62+
],
63+
});
64+
});
65+
66+
test("conversion with always and strict bound class methods", () => {
67+
const result = convertSemicolon({
68+
ruleArguments: ["always", "strict-bound-class-methods"],
69+
});
70+
71+
expect(result).toEqual({
72+
rules: [
73+
{
74+
ruleName: "@typescript-eslint/semi",
75+
ruleArguments: ["always"],
76+
},
77+
{
78+
ruleName: "@typescript-eslint/member-delimiter-style",
79+
ruleArguments: [
80+
"error",
81+
{
82+
multiline: {
83+
delimiter: "semi",
84+
requireLast: true,
85+
},
86+
singleline: {
87+
delimiter: "semi",
88+
requireLast: false,
89+
},
90+
},
91+
],
92+
},
93+
],
94+
notices: [
95+
"Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.",
96+
],
97+
});
98+
});
99+
100+
test("conversion with never and strict bound class methods", () => {
101+
const result = convertSemicolon({
102+
ruleArguments: ["never", "strict-bound-class-methods"],
103+
});
104+
105+
expect(result).toEqual({
106+
rules: [
107+
{
108+
ruleName: "@typescript-eslint/semi",
109+
ruleArguments: ["never"],
110+
},
111+
{
112+
ruleName: "@typescript-eslint/member-delimiter-style",
113+
ruleArguments: [
114+
"error",
115+
{
116+
multiline: {
117+
delimiter: "none",
118+
requireLast: true,
119+
},
120+
singleline: {
121+
delimiter: "semi",
122+
requireLast: false,
123+
},
124+
},
125+
],
126+
},
127+
],
128+
notices: [
129+
"Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.",
130+
],
131+
});
132+
});
133+
134+
test("conversion with always and ignore interfaces", () => {
135+
const result = convertSemicolon({
136+
ruleArguments: ["always", "ignore-interfaces"],
137+
});
138+
139+
expect(result).toEqual({
140+
rules: [
141+
{
142+
ruleName: "@typescript-eslint/semi",
143+
ruleArguments: ["always"],
144+
},
145+
],
146+
});
147+
});
148+
149+
test("conversion with never and ignore interfaces", () => {
150+
const result = convertSemicolon({
151+
ruleArguments: ["never", "ignore-interfaces"],
152+
});
153+
154+
expect(result).toEqual({
155+
rules: [
156+
{
157+
ruleName: "@typescript-eslint/semi",
158+
ruleArguments: ["never"],
159+
},
160+
],
161+
});
162+
});
163+
164+
test("conversion with always, strict bound class methods and ignore interfaces", () => {
165+
const result = convertSemicolon({
166+
ruleArguments: ["always", "ignore-interfaces", "strict-bound-class-methods"],
167+
});
168+
169+
expect(result).toEqual({
170+
rules: [
171+
{
172+
ruleName: "@typescript-eslint/semi",
173+
ruleArguments: ["always"],
174+
},
175+
],
176+
notices: [
177+
"Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.",
178+
],
179+
});
180+
});
181+
182+
test("conversion with always, strict bound class methods and ignore interfaces", () => {
183+
const result = convertSemicolon({
184+
ruleArguments: ["never", "ignore-interfaces", "strict-bound-class-methods"],
185+
});
186+
187+
expect(result).toEqual({
188+
rules: [
189+
{
190+
ruleName: "@typescript-eslint/semi",
191+
ruleArguments: ["never"],
192+
},
193+
],
194+
notices: [
195+
"Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.",
196+
],
197+
});
198+
});
199+
});

0 commit comments

Comments
 (0)