Skip to content

Commit bd694e7

Browse files
KingDarBojaJosh Goldberg
authored andcommitted
Implement variable-name rule converter (#222)
* Implement variable-name converter * Feedback changes * Add more test cases * Set const values to improve readability and order converters rules * Optimize rules array on variable name
1 parent 6ae5bb7 commit bd694e7

File tree

3 files changed

+445
-4
lines changed

3 files changed

+445
-4
lines changed

src/rules/converters.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { convertClassName } from "./converters/class-name";
1212
import { convertCurly } from "./converters/curly";
1313
import { convertCyclomaticComplexity } from "./converters/cyclomatic-complexity";
1414
import { convertEofline } from "./converters/eofline";
15-
import { convertMemberAccess } from "./converters/member-access";
1615
import { convertFileNameCasing } from "./converters/file-name-casing";
1716
import { convertForin } from "./converters/forin";
1817
import { convertFunctionConstructor } from "./converters/function-constructor";
@@ -25,6 +24,7 @@ import { convertLinebreakStyle } from "./converters/linebreak-style";
2524
import { convertMaxClassesPerFile } from "./converters/max-classes-per-file";
2625
import { convertMaxFileLineCount } from "./converters/max-file-line-count";
2726
import { convertMaxLineLength } from "./converters/max-line-length";
27+
import { convertMemberAccess } from "./converters/member-access";
2828
import { convertMemberOrdering } from "./converters/member-ordering";
2929
import { convertNewlineBeforeReturn } from "./converters/newline-before-return";
3030
import { convertNewlinePerChainedCall } from "./converters/newline-per-chained-call";
@@ -105,12 +105,14 @@ import { convertPreferObjectSpread } from "./converters/prefer-object-spread";
105105
import { convertPreferReadonly } from "./converters/prefer-readonly";
106106
import { convertPreferTemplate } from "./converters/prefer-template";
107107
import { convertPromiseFunctionAsync } from "./converters/promise-function-async";
108+
import { convertQuotemark } from "./converters/quotemark";
108109
import { convertRadix } from "./converters/radix";
109110
import { convertRestrictPlusOperands } from "./converters/restrict-plus-operands";
110111
import { convertSemicolon } from "./converters/semicolon";
111112
import { convertSpaceBeforeFunctionParen } from "./converters/space-before-function-paren";
112113
import { convertSpaceWithinParens } from "./converters/space-within-parens";
113114
import { convertSwitchDefault } from "./converters/switch-default";
115+
import { convertTripleEquals } from "./converters/triple-equals";
114116
import { convertTypedefWhitespace } from "./converters/typedef-whitespace";
115117
import { convertTypeLiteralDelimiter } from "./converters/type-literal-delimiter";
116118
import { convertTypeofCompare } from "./converters/typeof-compare";
@@ -119,8 +121,7 @@ import { convertUnnecessaryBind } from "./converters/unnecessary-bind";
119121
import { convertUnnecessaryConstructor } from "./converters/unnecessary-constructor";
120122
import { convertUseDefaultTypeParameter } from "./converters/use-default-type-parameter";
121123
import { convertUseIsnan } from "./converters/use-isnan";
122-
import { convertQuotemark } from "./converters/quotemark";
123-
import { convertTripleEquals } from "./converters/triple-equals";
124+
import { convertVariableName } from "./converters/variable-name";
124125

125126
/**
126127
* Keys TSLint rule names to their ESLint rule converters.
@@ -249,6 +250,7 @@ export const converters = new Map([
249250
["unnecessary-constructor", convertUnnecessaryConstructor],
250251
["use-default-type-parameter", convertUseDefaultTypeParameter],
251252
["use-isnan", convertUseIsnan],
253+
["variable-name", convertVariableName],
252254

253255
// These converters are all for rules that need more complex option conversions.
254256
// Some of them will likely need to have notices about changed lint behaviors...
@@ -262,7 +264,6 @@ export const converters = new Map([
262264
// ["no-void-expression", convertNoVoidExpression], // (no exact equivalent)
263265
// ["quotemark", convertQuotemark], // quotes
264266
// ["triple-equals", convertTripleEquals], // eqeqeq
265-
// ["variable-name", convertVariableName], // a bunch of rules...
266267

267268
// tslint-microsoft-contrib rules:
268269
// ["max-func-body-length", convertMaxFuncBodyLength],
Lines changed: 331 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,331 @@
1+
import {
2+
convertVariableName,
3+
IgnoreLeadingTrailingUnderscoreMsg,
4+
ForbiddenLeadingTrailingIdentifierMsg,
5+
IgnoreLeadingTrailingIdentifierMsg,
6+
ForbiddenPascalSnakeMsg,
7+
ConstRequiredForAllCapsMsg,
8+
IgnoreOnlyLeadingUnderscoreMsg,
9+
IgnoreOnlyTrailingUnderscoreMsg,
10+
} from "../variable-name";
11+
12+
describe(convertVariableName, () => {
13+
test("conversion without arguments", () => {
14+
const result = convertVariableName({
15+
ruleArguments: [],
16+
});
17+
18+
expect(result).toEqual({
19+
rules: [
20+
{
21+
ruleName: "camelcase",
22+
notices: [IgnoreLeadingTrailingUnderscoreMsg],
23+
},
24+
{
25+
ruleName: "no-underscore-dangle",
26+
ruleArguments: [],
27+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
28+
},
29+
{
30+
ruleName: "id-blacklist",
31+
ruleArguments: [],
32+
},
33+
{
34+
ruleName: "id-match",
35+
},
36+
],
37+
});
38+
});
39+
40+
test("conversion with require-const-for-all-caps argument", () => {
41+
const result = convertVariableName({
42+
ruleArguments: ["require-const-for-all-caps"],
43+
});
44+
45+
expect(result).toEqual({
46+
rules: [
47+
{
48+
ruleName: "camelcase",
49+
notices: [IgnoreLeadingTrailingUnderscoreMsg, ConstRequiredForAllCapsMsg],
50+
},
51+
{
52+
ruleName: "no-underscore-dangle",
53+
ruleArguments: [],
54+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
55+
},
56+
{
57+
ruleName: "id-blacklist",
58+
ruleArguments: [],
59+
},
60+
{
61+
ruleName: "id-match",
62+
},
63+
],
64+
});
65+
});
66+
67+
test("conversion with allow-pascal-case argument", () => {
68+
const result = convertVariableName({
69+
ruleArguments: ["allow-pascal-case"],
70+
});
71+
72+
expect(result).toEqual({
73+
rules: [
74+
{
75+
ruleName: "camelcase",
76+
notices: [IgnoreLeadingTrailingUnderscoreMsg, ForbiddenPascalSnakeMsg],
77+
},
78+
{
79+
ruleName: "no-underscore-dangle",
80+
ruleArguments: [],
81+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
82+
},
83+
{
84+
ruleName: "id-blacklist",
85+
ruleArguments: [],
86+
},
87+
{
88+
ruleName: "id-match",
89+
},
90+
],
91+
});
92+
});
93+
94+
test("conversion with allow-snake-case argument", () => {
95+
const result = convertVariableName({
96+
ruleArguments: ["allow-snake-case"],
97+
});
98+
99+
expect(result).toEqual({
100+
rules: [
101+
{
102+
ruleName: "camelcase",
103+
notices: [IgnoreLeadingTrailingUnderscoreMsg, ForbiddenPascalSnakeMsg],
104+
},
105+
{
106+
ruleName: "no-underscore-dangle",
107+
ruleArguments: [],
108+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
109+
},
110+
{
111+
ruleName: "id-blacklist",
112+
ruleArguments: [],
113+
},
114+
{
115+
ruleName: "id-match",
116+
},
117+
],
118+
});
119+
});
120+
121+
test("conversion with allow-leading-underscore without check-format argument", () => {
122+
const result = convertVariableName({
123+
ruleArguments: ["allow-leading-underscore"],
124+
});
125+
126+
expect(result).toEqual({
127+
rules: [
128+
{
129+
ruleName: "camelcase",
130+
notices: [IgnoreLeadingTrailingUnderscoreMsg],
131+
},
132+
{
133+
ruleName: "no-underscore-dangle",
134+
ruleArguments: [],
135+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
136+
},
137+
{
138+
ruleName: "id-blacklist",
139+
ruleArguments: [],
140+
},
141+
{
142+
ruleName: "id-match",
143+
},
144+
],
145+
});
146+
});
147+
148+
test("conversion with allow-trailing-underscore without check-format argument", () => {
149+
const result = convertVariableName({
150+
ruleArguments: ["allow-trailing-underscore"],
151+
});
152+
153+
expect(result).toEqual({
154+
rules: [
155+
{
156+
ruleName: "camelcase",
157+
notices: [IgnoreLeadingTrailingUnderscoreMsg],
158+
},
159+
{
160+
ruleName: "no-underscore-dangle",
161+
ruleArguments: [],
162+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
163+
},
164+
{
165+
ruleName: "id-blacklist",
166+
ruleArguments: [],
167+
},
168+
{
169+
ruleName: "id-match",
170+
},
171+
],
172+
});
173+
});
174+
175+
test("conversion with check-format argument", () => {
176+
const result = convertVariableName({
177+
ruleArguments: ["check-format"],
178+
});
179+
180+
expect(result).toEqual({
181+
rules: [
182+
{
183+
ruleName: "camelcase",
184+
notices: [IgnoreLeadingTrailingUnderscoreMsg],
185+
},
186+
{
187+
ruleName: "no-underscore-dangle",
188+
ruleArguments: [],
189+
notices: [ForbiddenLeadingTrailingIdentifierMsg],
190+
},
191+
{
192+
ruleName: "id-blacklist",
193+
ruleArguments: [],
194+
},
195+
{
196+
ruleName: "id-match",
197+
},
198+
],
199+
});
200+
});
201+
202+
test("conversion with allow-leading-underscore and check-format argument", () => {
203+
const result = convertVariableName({
204+
ruleArguments: ["check-format", "allow-leading-underscore"],
205+
});
206+
207+
expect(result).toEqual({
208+
rules: [
209+
{
210+
ruleName: "camelcase",
211+
notices: [IgnoreOnlyLeadingUnderscoreMsg],
212+
},
213+
{
214+
ruleName: "no-underscore-dangle",
215+
ruleArguments: ["off"],
216+
notices: [IgnoreLeadingTrailingIdentifierMsg],
217+
},
218+
{
219+
ruleName: "id-blacklist",
220+
ruleArguments: [],
221+
},
222+
{
223+
ruleName: "id-match",
224+
},
225+
],
226+
});
227+
});
228+
229+
test("conversion with allow-trailing-underscore and check-format argument", () => {
230+
const result = convertVariableName({
231+
ruleArguments: ["check-format", "allow-trailing-underscore"],
232+
});
233+
234+
expect(result).toEqual({
235+
rules: [
236+
{
237+
ruleName: "camelcase",
238+
notices: [IgnoreOnlyTrailingUnderscoreMsg],
239+
},
240+
{
241+
ruleName: "no-underscore-dangle",
242+
ruleArguments: ["off"],
243+
notices: [IgnoreLeadingTrailingIdentifierMsg],
244+
},
245+
{
246+
ruleName: "id-blacklist",
247+
ruleArguments: [],
248+
},
249+
{
250+
ruleName: "id-match",
251+
},
252+
],
253+
});
254+
});
255+
256+
test("conversion with allow-leading-underscore, allow-trailing-underscore and check-format argument", () => {
257+
const result = convertVariableName({
258+
ruleArguments: [
259+
"check-format",
260+
"allow-leading-underscore",
261+
"allow-trailing-underscore",
262+
],
263+
});
264+
265+
expect(result).toEqual({
266+
rules: [
267+
{
268+
ruleName: "camelcase",
269+
notices: [],
270+
},
271+
{
272+
ruleName: "no-underscore-dangle",
273+
ruleArguments: ["off"],
274+
notices: [IgnoreLeadingTrailingIdentifierMsg],
275+
},
276+
{
277+
ruleName: "id-blacklist",
278+
ruleArguments: [],
279+
},
280+
{
281+
ruleName: "id-match",
282+
},
283+
],
284+
});
285+
});
286+
287+
test("conversion with all arguments", () => {
288+
const result = convertVariableName({
289+
ruleArguments: [
290+
"check-format",
291+
"allow-leading-underscore",
292+
"allow-pascal-case",
293+
"allow-snake-case",
294+
"allow-trailing-underscore",
295+
"require-const-for-all-caps",
296+
"ban-keywords",
297+
],
298+
});
299+
300+
expect(result).toEqual({
301+
rules: [
302+
{
303+
ruleName: "camelcase",
304+
notices: [ConstRequiredForAllCapsMsg, ForbiddenPascalSnakeMsg],
305+
},
306+
{
307+
ruleName: "no-underscore-dangle",
308+
ruleArguments: ["off"],
309+
notices: [IgnoreLeadingTrailingIdentifierMsg],
310+
},
311+
{
312+
ruleName: "id-blacklist",
313+
ruleArguments: [
314+
"any",
315+
"Number",
316+
"number",
317+
"String",
318+
"string",
319+
"Boolean",
320+
"boolean",
321+
"Undefined",
322+
"undefined",
323+
],
324+
},
325+
{
326+
ruleName: "id-match",
327+
},
328+
],
329+
});
330+
});
331+
});

0 commit comments

Comments
 (0)