From cb72bb218bea131ebb5d6404986d52daa14a104d Mon Sep 17 00:00:00 2001 From: KingDarBoja Date: Mon, 7 Oct 2019 20:53:58 -0500 Subject: [PATCH 1/4] Handle rule options on member access tslint --- src/rules/converters/member-access.ts | 64 +++++++++- .../converters/tests/member-access.test.ts | 113 +++++++++++++++++- 2 files changed, 169 insertions(+), 8 deletions(-) diff --git a/src/rules/converters/member-access.ts b/src/rules/converters/member-access.ts index ccca098fc..d770e284f 100644 --- a/src/rules/converters/member-access.ts +++ b/src/rules/converters/member-access.ts @@ -1,15 +1,67 @@ import { RuleConverter } from "../converter"; -export const convertMemberAccess: RuleConverter = () => { +export enum AccessibilityLevel { + Explicit = "explicit", // require an accessor (including public) + NoPublic = "no-public", // don't require public + Off = "off", // don't check +} + +export enum MemberAccessArguments { + NoPublic = "no-public", + Accessor = "check-accessor", + Constructor = "check-constructor", + ParameterProp = "check-parameter-property", +} + +export const convertMemberAccess: RuleConverter = tslintRule => { + const schema: any = { + accessibility: AccessibilityLevel.Explicit, + }; + + if ( + !( + tslintRule.ruleArguments.length === 0 || + tslintRule.ruleArguments[0] === false || + tslintRule.ruleArguments.length < 2 + ) + ) { + tslintRule.ruleArguments.map(ruleArg => { + if (typeof ruleArg === "string") { + switch (ruleArg) { + case MemberAccessArguments.NoPublic: + schema.accessibility = AccessibilityLevel.NoPublic; + break; + case MemberAccessArguments.Accessor: + schema.overrides = { + ...schema.overrides, + accessors: AccessibilityLevel.Explicit, + }; + break; + case MemberAccessArguments.Constructor: + schema.overrides = { + ...schema.overrides, + constructors: AccessibilityLevel.Explicit, + }; + break; + case MemberAccessArguments.ParameterProp: + schema.overrides = { + ...schema.overrides, + parameterProperties: AccessibilityLevel.Explicit, + }; + break; + default: + break; + } + } + return ruleArg; + }); + } + return { rules: [ { ruleName: "@typescript-eslint/explicit-member-accessibility", - ruleArguments: [ - { - overrides: { constructors: "off" }, - }, - ], + ruleArguments: [schema], }, ], }; diff --git a/src/rules/converters/tests/member-access.test.ts b/src/rules/converters/tests/member-access.test.ts index b803dff23..1c23aa1ce 100644 --- a/src/rules/converters/tests/member-access.test.ts +++ b/src/rules/converters/tests/member-access.test.ts @@ -1,4 +1,4 @@ -import { convertMemberAccess } from "../member-access"; +import { convertMemberAccess, AccessibilityLevel } from "../member-access"; describe(convertMemberAccess, () => { test("conversion without arguments", () => { @@ -6,12 +6,121 @@ describe(convertMemberAccess, () => { ruleArguments: [], }); + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [{ accessibility: AccessibilityLevel.Explicit }], + }, + ], + }); + }); + + test("conversion with no-public argument", () => { + const result = convertMemberAccess({ + ruleArguments: [true, "no-public"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [{ accessibility: AccessibilityLevel.NoPublic }], + }, + ], + }); + }); + + test("conversion with check-accessor argument", () => { + const result = convertMemberAccess({ + ruleArguments: [true, "check-accessor"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [ + { + accessibility: AccessibilityLevel.Explicit, + overrides: { + accessors: AccessibilityLevel.Explicit, + }, + }, + ], + }, + ], + }); + }); + + test("conversion with check-constructor argument", () => { + const result = convertMemberAccess({ + ruleArguments: [true, "check-constructor"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [ + { + accessibility: AccessibilityLevel.Explicit, + overrides: { + constructors: AccessibilityLevel.Explicit, + }, + }, + ], + }, + ], + }); + }); + + test("conversion with check-parameter-property argument", () => { + const result = convertMemberAccess({ + ruleArguments: [true, "check-parameter-property"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [ + { + accessibility: AccessibilityLevel.Explicit, + overrides: { + parameterProperties: AccessibilityLevel.Explicit, + }, + }, + ], + }, + ], + }); + }); + + test("conversion with all arguments", () => { + const result = convertMemberAccess({ + ruleArguments: [ + true, + "no-public", + "check-accessor", + "check-constructor", + "check-parameter-property", + ], + }); + expect(result).toEqual({ rules: [ { ruleName: "@typescript-eslint/explicit-member-accessibility", ruleArguments: [ - { overrides: { constructors: "off" } }, + { + accessibility: AccessibilityLevel.NoPublic, + overrides: { + accessors: AccessibilityLevel.Explicit, + constructors: AccessibilityLevel.Explicit, + parameterProperties: AccessibilityLevel.Explicit, + }, + }, ], }, ], From 9afef4bc99528d9bf4f4fee6eadfdb9ffadc20f5 Mon Sep 17 00:00:00 2001 From: KingDarBoja Date: Fri, 11 Oct 2019 17:52:44 -0500 Subject: [PATCH 2/4] Improve code for member-access converter --- src/rules/converters/member-access.ts | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/rules/converters/member-access.ts b/src/rules/converters/member-access.ts index d770e284f..5c52a3f6d 100644 --- a/src/rules/converters/member-access.ts +++ b/src/rules/converters/member-access.ts @@ -1,9 +1,8 @@ import { RuleConverter } from "../converter"; export enum AccessibilityLevel { - Explicit = "explicit", // require an accessor (including public) - NoPublic = "no-public", // don't require public - Off = "off", // don't check + Explicit = "explicit", + NoPublic = "no-public", } export enum MemberAccessArguments { @@ -13,19 +12,19 @@ export enum MemberAccessArguments { ParameterProp = "check-parameter-property", } +interface IMemberAccessSchema { + accessibility: string; + overrides?: { [key: string]: string }; +} + export const convertMemberAccess: RuleConverter = tslintRule => { - const schema: any = { + const tslintRuleArguments = tslintRule.ruleArguments; + const schema: IMemberAccessSchema = { accessibility: AccessibilityLevel.Explicit, }; - if ( - !( - tslintRule.ruleArguments.length === 0 || - tslintRule.ruleArguments[0] === false || - tslintRule.ruleArguments.length < 2 - ) - ) { - tslintRule.ruleArguments.map(ruleArg => { + if (tslintRuleArguments.length >= 2 || tslintRuleArguments[0] !== false) { + tslintRuleArguments.forEach(ruleArg => { if (typeof ruleArg === "string") { switch (ruleArg) { case MemberAccessArguments.NoPublic: @@ -53,7 +52,6 @@ export const convertMemberAccess: RuleConverter = tslintRule => { break; } } - return ruleArg; }); } From dee72bb6dafaa684b35c8e28e98b97e0f5b98c6e Mon Sep 17 00:00:00 2001 From: KingDarBoja Date: Fri, 11 Oct 2019 18:02:28 -0500 Subject: [PATCH 3/4] Fix unused default statement and change interface for type --- src/rules/converters/member-access.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/rules/converters/member-access.ts b/src/rules/converters/member-access.ts index 5c52a3f6d..e8c1dfe5b 100644 --- a/src/rules/converters/member-access.ts +++ b/src/rules/converters/member-access.ts @@ -12,14 +12,14 @@ export enum MemberAccessArguments { ParameterProp = "check-parameter-property", } -interface IMemberAccessSchema { +type MemberAccessSchema = { accessibility: string; overrides?: { [key: string]: string }; -} +}; export const convertMemberAccess: RuleConverter = tslintRule => { const tslintRuleArguments = tslintRule.ruleArguments; - const schema: IMemberAccessSchema = { + const schema: MemberAccessSchema = { accessibility: AccessibilityLevel.Explicit, }; @@ -48,8 +48,6 @@ export const convertMemberAccess: RuleConverter = tslintRule => { parameterProperties: AccessibilityLevel.Explicit, }; break; - default: - break; } } }); From b3ddc4b7980b5da784d60c757c29afdfe4b6c504 Mon Sep 17 00:00:00 2001 From: KingDarBoja Date: Fri, 11 Oct 2019 21:18:59 -0500 Subject: [PATCH 4/4] Add missing test --- src/rules/converters/member-access.ts | 2 +- src/rules/converters/tests/member-access.test.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/rules/converters/member-access.ts b/src/rules/converters/member-access.ts index e8c1dfe5b..9c85d868d 100644 --- a/src/rules/converters/member-access.ts +++ b/src/rules/converters/member-access.ts @@ -23,7 +23,7 @@ export const convertMemberAccess: RuleConverter = tslintRule => { accessibility: AccessibilityLevel.Explicit, }; - if (tslintRuleArguments.length >= 2 || tslintRuleArguments[0] !== false) { + if (tslintRuleArguments.length >= 2 || tslintRuleArguments[0] === true) { tslintRuleArguments.forEach(ruleArg => { if (typeof ruleArg === "string") { switch (ruleArg) { diff --git a/src/rules/converters/tests/member-access.test.ts b/src/rules/converters/tests/member-access.test.ts index 1c23aa1ce..7ac840fd9 100644 --- a/src/rules/converters/tests/member-access.test.ts +++ b/src/rules/converters/tests/member-access.test.ts @@ -16,6 +16,21 @@ describe(convertMemberAccess, () => { }); }); + test("conversion with true argument", () => { + const result = convertMemberAccess({ + ruleArguments: [true], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/explicit-member-accessibility", + ruleArguments: [{ accessibility: AccessibilityLevel.Explicit }], + }, + ], + }); + }); + test("conversion with no-public argument", () => { const result = convertMemberAccess({ ruleArguments: [true, "no-public"],