diff --git a/src/rules/mergers.ts b/src/rules/mergers.ts index 446d68615..3697234f4 100644 --- a/src/rules/mergers.ts +++ b/src/rules/mergers.ts @@ -1,5 +1,6 @@ import { mergeBanTypes } from "./mergers/ban-types"; import { mergeIndent } from "./mergers/indent"; +import { mergeNoMemberDelimiterStyle } from "./mergers/member-delimiter-style"; import { mergeNoCaller } from "./mergers/no-caller"; import { mergeNoEval } from "./mergers/no-eval"; import { mergeNoUnnecessaryTypeAssertion } from "./mergers/no-unnecessary-type-assertion"; @@ -7,6 +8,7 @@ import { mergeNoUnnecessaryTypeAssertion } from "./mergers/no-unnecessary-type-a export const mergers = new Map([ ["@typescript-eslint/ban-types", mergeBanTypes], ["@typescript-eslint/indent", mergeIndent], + ["@typescript-eslint/member-delimiter-style", mergeNoMemberDelimiterStyle], ["@typescript-eslint/no-unnecessary-type-assertion", mergeNoUnnecessaryTypeAssertion], ["no-caller", mergeNoCaller], ["no-eval", mergeNoEval], diff --git a/src/rules/mergers/member-delimiter-style.ts b/src/rules/mergers/member-delimiter-style.ts new file mode 100644 index 000000000..52cfa1e9e --- /dev/null +++ b/src/rules/mergers/member-delimiter-style.ts @@ -0,0 +1,21 @@ +import { RuleMerger } from "../merger"; + +export const mergeNoMemberDelimiterStyle: RuleMerger = (existingOptions, newOptions) => { + if (existingOptions === undefined && newOptions === undefined) { + return []; + } + + return [merge((existingOptions || [])[0] || {}, (newOptions || [])[0] || {})]; +}; + +const merge = (...objs: Record[]) => + [...objs].reduce( + (acc, obj) => ({ + ...acc, + ...Object.keys(obj).reduce((_, k) => { + acc[k] = obj[k]; + return acc; + }, {}), + }), + {}, + ); diff --git a/src/rules/mergers/tests/member-delimiter-style.test.ts b/src/rules/mergers/tests/member-delimiter-style.test.ts new file mode 100644 index 000000000..17ad6346b --- /dev/null +++ b/src/rules/mergers/tests/member-delimiter-style.test.ts @@ -0,0 +1,98 @@ +import { mergeNoMemberDelimiterStyle } from "../member-delimiter-style"; + +describe(mergeNoMemberDelimiterStyle, () => { + test("neither options existing", () => { + const result = mergeNoMemberDelimiterStyle(undefined, undefined); + + expect(result).toEqual([]); + }); + + test("new object config existing", () => { + const result = mergeNoMemberDelimiterStyle(undefined, [ + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ]); + + expect(result).toEqual([ + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ]); + }); + + test("original object config existing", () => { + const result = mergeNoMemberDelimiterStyle( + [ + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + }, + ], + undefined, + ); + + expect(result).toEqual([ + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + }, + ]); + }); + + test("both object config existing", () => { + const result = mergeNoMemberDelimiterStyle( + [ + { + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + [ + { + singleline: { + delimiter: "semi", + requireLast: false, + }, + multiline: { + delimiter: "semi", + requireLast: true, + }, + }, + ], + ); + + expect(result).toEqual([ + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ]); + }); +});