diff --git a/src/creation/formatting/formatters/withKeysSorted.ts b/src/creation/formatting/formatters/withKeysSorted.ts index b0fad6bba..ea5975f13 100644 --- a/src/creation/formatting/formatters/withKeysSorted.ts +++ b/src/creation/formatting/formatters/withKeysSorted.ts @@ -1,7 +1,10 @@ export const withKeysSorted = (input: any) => { - return Object.fromEntries( - Object.keys(input) - .sort((a, b) => a.localeCompare(b)) - .map(key => [key, input[key]]), - ); + const output: Record = {}; + const keys = Object.keys(input).sort((a, b) => a.localeCompare(b)); + + for (const key of keys) { + output[key] = input[key]; + } + + return output; }; diff --git a/src/input/findESLintConfiguration.ts b/src/input/findESLintConfiguration.ts index 3704bb65f..0a3f25216 100644 --- a/src/input/findESLintConfiguration.ts +++ b/src/input/findESLintConfiguration.ts @@ -2,6 +2,7 @@ import { Exec } from "../adapters/exec"; import { SansDependencies } from "../binding"; import { ESLintRuleSeverity } from "../rules/types"; import { TSLintToESLintSettings } from "../types"; +import { uniqueFromSources } from "../utils"; import { findRawConfiguration } from "./findRawConfiguration"; import { findReportedConfiguration } from "./findReportedConfiguration"; import { OriginalConfigurations } from "./findOriginalConfigurations"; @@ -60,9 +61,7 @@ export const findESLintConfiguration = async ( return reportedConfiguration; } - const extensions = [rawConfiguration.extends, [reportedConfiguration.extends || []]].flat( - Infinity, - ); + const extensions = uniqueFromSources(rawConfiguration.extends, reportedConfiguration.extends); return { full: { diff --git a/src/input/findTSLintConfiguration.ts b/src/input/findTSLintConfiguration.ts index 1fe432455..777725566 100644 --- a/src/input/findTSLintConfiguration.ts +++ b/src/input/findTSLintConfiguration.ts @@ -2,8 +2,8 @@ import { findRawConfiguration } from "./findRawConfiguration"; import { findReportedConfiguration } from "./findReportedConfiguration"; import { Exec } from "../adapters/exec"; import { SansDependencies } from "../binding"; +import { uniqueFromSources } from "../utils"; import { importer } from "./importer"; -import { isDefined } from "../utils"; export type TSLintConfiguration = { extends?: string[]; @@ -44,13 +44,7 @@ export const findTSLintConfiguration = async ( return rawConfiguration; } - const extensions = Array.from( - new Set( - [[rawConfiguration.extends], [reportedConfiguration.extends]] - .flat(Infinity) - .filter(isDefined), - ), - ); + const extensions = uniqueFromSources(rawConfiguration.extends, reportedConfiguration.extends); const rules = { ...rawConfiguration.rules, diff --git a/src/utils.test.ts b/src/utils.test.ts index 11417a9c9..f0180a1ff 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,4 +1,4 @@ -import { isDefined, isError } from "./utils"; +import { isDefined, isError, uniqueFromSources } from "./utils"; describe("isDefined", () => { it("returns true when the item is defined", () => { @@ -47,3 +47,38 @@ describe("isError", () => { expect(result).toBe(false); }); }); + +describe("uniqueFromSources", () => { + it("returns unique items when multiple are given", () => { + // Arange + const sources = ["a", "b", "b", "c"]; + + // Act + const result = uniqueFromSources(...sources); + + // Assert + expect(result).toEqual(["a", "b", "c"]); + }); + + it("returns items from a nested array", () => { + // Arange + const sources = ["a", ["b"], "c"]; + + // Act + const result = uniqueFromSources(...sources); + + // Assert + expect(result).toEqual(["a", "b", "c"]); + }); + + it("filters out undefined inputs", () => { + // Arange + const sources = ["a", "b", "c", undefined]; + + // Act + const result = uniqueFromSources(...sources); + + // Assert + expect(result).toEqual(["a", "b", "c"]); + }); +}); diff --git a/src/utils.ts b/src/utils.ts index 8deffdcd4..65139d347 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,3 +7,17 @@ export type RemoveErrors = { }; export type PromiseValue = T extends Promise ? R : never; + +export const uniqueFromSources = (...sources: (T | T[] | undefined)[]) => { + const items: T[] = []; + + for (const source of sources) { + if (source instanceof Array) { + items.push(...source.filter(isDefined)); + } else if (source !== undefined) { + items.push(source); + } + } + + return Array.from(new Set(items)); +}; diff --git a/tsconfig.json b/tsconfig.json index d836d023d..b7b75c811 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "declaration": true, "esModuleInterop": true, "incremental": true, - "lib": ["esnext"], + "lib": ["es2017"], "module": "commonjs", "noFallthroughCasesInSwitch": true, "noImplicitAny": true,