From 6464cc5392232962f7213adb662ef660210f19c4 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 8 Dec 2019 16:17:52 -0500 Subject: [PATCH 1/3] WIP --- README.md | 2 +- docs/Architecture.md | 2 +- package.json | 2 +- src/conversion/convertConfig.ts | 3 +- .../simplification/collectTSLintRulesets.ts | 32 +++++++++++ .../simplification/resolveExtensionNames.ts | 3 +- .../simplification/retrieveExtendsValues.ts | 57 +++++++++++++------ .../simplification/simplifyPackageRules.ts | 26 ++++++--- src/creation/writeConversionResults.ts | 6 +- src/input/findOriginalConfigurations.ts | 2 +- src/reporting/reportConversionResults.ts | 2 +- 11 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 src/creation/simplification/collectTSLintRulesets.ts diff --git a/README.md b/README.md index 2811f3f32..30b0d1f5f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Join the chat at https://gitter.im/tslint-to-eslint-config/community](https://img.shields.io/badge/chat-gitter-informational.svg)](https://gitter.im/tslint-to-eslint-config/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Code Style: Prettier](https://img.shields.io/badge/speed-blazingly_fast-blueviolet.svg)](https://prettier.io) -Converts your TSLint configuration to the closest possible ESLint equivalent. +Converts your TSLint configuration to the closest reasonable ESLint equivalent. 👉 Did you know [TSLint is being deprecated this year](https://github.com/palantir/tslint/issues/4534)? Hooray! diff --git a/docs/Architecture.md b/docs/Architecture.md index 610fa0834..dca0f355c 100644 --- a/docs/Architecture.md +++ b/docs/Architecture.md @@ -12,7 +12,7 @@ Within `src/conversion/convertConfig.ts`, the following steps occur: 1. Existing configurations are read from disk 2. TSLint rules are converted into their ESLint configurations -3. ESLint configurations are simplified based on extended ESLint presets +3. ESLint configurations are simplified based on extended ESLint and TSLint presets 4. The simplified configuration is written to the output config file 5. A summary of the results is printed to the user's console diff --git a/package.json b/package.json index 71ca94e17..cb171511a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "bugs": { "url": "https://github.com/typescript-eslint/tslint-to-eslint-config/issues" }, - "description": "Converts your TSLint configuration to the closest possible ESLint equivalent.", + "description": "Converts your TSLint configuration to the closest reasonable ESLint equivalent.", "dependencies": { "chalk": "3.0.0", "commander": "4.0.1", diff --git a/src/conversion/convertConfig.ts b/src/conversion/convertConfig.ts index 17195d7f5..c016a0ba3 100644 --- a/src/conversion/convertConfig.ts +++ b/src/conversion/convertConfig.ts @@ -33,11 +33,12 @@ export const convertConfig = async ( originalConfigurations.data.tslint.full.rules, ); - // 3. ESLint configurations are simplified based on extended ESLint presets + // 3. ESLint configurations are simplified based on extended ESLint and TSLint presets const simplifiedConfiguration = { ...ruleConversionResults, ...(await dependencies.simplifyPackageRules( originalConfigurations.data.eslint, + originalConfigurations.data.tslint, ruleConversionResults, )), }; diff --git a/src/creation/simplification/collectTSLintRulesets.ts b/src/creation/simplification/collectTSLintRulesets.ts new file mode 100644 index 000000000..df08fbd18 --- /dev/null +++ b/src/creation/simplification/collectTSLintRulesets.ts @@ -0,0 +1,32 @@ +import { OriginalConfigurations } from "../../input/findOriginalConfigurations"; +import { TSLintConfiguration } from "../../input/findTSLintConfiguration"; +import { uniqueFromSources } from "../../utils"; + +const nativeExtensions = new Map([ + ["tslint:all", ["plugin:@typescript-eslint/all"]], + [ + "tslint:recommended", + [ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + ], + ], +]); + +export const collectTSLintRulesets = (tslint: OriginalConfigurations) => { + const allExtensions = uniqueFromSources(tslint.full.extends, tslint.raw.extends); + + const extensions = new Set(); + + for (const extension of allExtensions) { + const mappedExtensions = nativeExtensions.get(extension); + + if (mappedExtensions !== undefined) { + for (const mappedExtension of mappedExtensions) { + extensions.add(mappedExtension); + } + } + } + + return Array.from(extensions); +}; diff --git a/src/creation/simplification/resolveExtensionNames.ts b/src/creation/simplification/resolveExtensionNames.ts index 7b1b1b645..028219d24 100644 --- a/src/creation/simplification/resolveExtensionNames.ts +++ b/src/creation/simplification/resolveExtensionNames.ts @@ -6,7 +6,8 @@ export const resolveExtensionNames = (rawExtensionNames: string | string[]) => { return rawExtensionNames.map(rawExtensionName => rawExtensionName.startsWith(".") || rawExtensionName.startsWith("eslint-plugin-") || - rawExtensionName.startsWith("eslint:") + rawExtensionName.startsWith("eslint:") || + rawExtensionName.startsWith("plugin:") ? rawExtensionName : `eslint-plugin-${rawExtensionName}`, ); diff --git a/src/creation/simplification/retrieveExtendsValues.ts b/src/creation/simplification/retrieveExtendsValues.ts index 6138d23ff..fda3cfc8a 100644 --- a/src/creation/simplification/retrieveExtendsValues.ts +++ b/src/creation/simplification/retrieveExtendsValues.ts @@ -13,6 +13,29 @@ export type RetrievedExtensionValues = { importedExtensions: Partial[]; }; +const builtInExtensions = new Map([ + ["eslint:all", "eslint/conf/eslint-all"], + ["eslint:recommended", "eslint/conf/eslint-recommended"], +]); + +const typescriptPluginExtensions = new Map([ + [ + "plugin:@typescript-eslint/all", + "node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.json", + ], + [ + "plugin:@typescript-eslint/recommended", + "node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.json", + ], + [ + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.json", + ], +]); + +/** + * Imports any extended ESLint rulesets as ESLint configurations. + */ export const retrieveExtendsValues = async ( dependencies: RetrieveExtendsValuesDependencies, rawExtensionNames: string | string[], @@ -21,26 +44,24 @@ export const retrieveExtendsValues = async ( const configurationErrors: ConfigurationError[] = []; const extensionNames = resolveExtensionNames(rawExtensionNames); - const builtInExtensionGetters = new Map Promise>([ - [ - "eslint:all", - async () => - (await dependencies.importer("eslint/conf/eslint-all")) as ESLintConfiguration, - ], - [ - "eslint:recommended", - async () => - (await dependencies.importer( - "eslint/conf/eslint-recommended", - )) as ESLintConfiguration, - ], - ]); - await Promise.all( extensionNames.map(async extensionName => { - const getBuiltInExtension = builtInExtensionGetters.get(extensionName); - if (getBuiltInExtension !== undefined) { - importedExtensions.push(await getBuiltInExtension()); + const builtInExtension = builtInExtensions.get(extensionName); + if (builtInExtension !== undefined) { + importedExtensions.push( + (await dependencies.importer(builtInExtension)) as ESLintConfiguration, + ); + return; + } + + const typescriptPluginExtension = typescriptPluginExtensions.get(extensionName); + if (typescriptPluginExtension !== undefined) { + const importedTypeScriptPlugin = (await dependencies.importer( + typescriptPluginExtension, + )) as ESLintConfiguration; + importedExtensions.push({ + rules: importedTypeScriptPlugin.rules, + }); return; } diff --git a/src/creation/simplification/simplifyPackageRules.ts b/src/creation/simplification/simplifyPackageRules.ts index b813ddda8..f9776977a 100644 --- a/src/creation/simplification/simplifyPackageRules.ts +++ b/src/creation/simplification/simplifyPackageRules.ts @@ -1,28 +1,39 @@ import { SansDependencies } from "../../binding"; +import { ESLintConfiguration } from "../../input/findESLintConfiguration"; +import { OriginalConfigurations } from "../../input/findOriginalConfigurations"; +import { TSLintConfiguration } from "../../input/findTSLintConfiguration"; import { RuleConversionResults } from "../../rules/convertRules"; +import { uniqueFromSources } from "../../utils"; +import { collectTSLintRulesets } from "./collectTSLintRulesets"; import { removeExtendsDuplicatedRules } from "./removeExtendsDuplicatedRules"; import { retrieveExtendsValues } from "./retrieveExtendsValues"; -import { ESLintConfiguration } from "../../input/findESLintConfiguration"; -import { OriginalConfigurations } from "../../input/findOriginalConfigurations"; export type SimplifyPackageRulesDependencies = { removeExtendsDuplicatedRules: typeof removeExtendsDuplicatedRules; retrieveExtendsValues: SansDependencies; }; -export type SimplifiedRuleConversionResults = Pick; +export type SimplifiedRuleConversionResults = Pick< + RuleConversionResults, + "converted" | "failed" +> & { + extends?: string[]; +}; +/** + * Given an initial set of rule conversion results and original configurations, + * determines which ESLint rulesets to extend from and removes redundant rule values. + */ export const simplifyPackageRules = async ( dependencies: SimplifyPackageRulesDependencies, eslint: Pick, "full"> | undefined, + tslint: OriginalConfigurations, ruleConversionResults: SimplifiedRuleConversionResults, ): Promise => { - if (eslint === undefined || eslint.full.extends.length === 0) { - return ruleConversionResults; - } + const extendedRulesets = collectTSLintRulesets(tslint); const { configurationErrors, importedExtensions } = await dependencies.retrieveExtendsValues( - eslint.full.extends, + uniqueFromSources(eslint?.full.extends ?? [], extendedRulesets), ); const converted = dependencies.removeExtendsDuplicatedRules( @@ -32,6 +43,7 @@ export const simplifyPackageRules = async ( return { converted, + extends: extendedRulesets, failed: [...ruleConversionResults.failed, ...configurationErrors], }; }; diff --git a/src/creation/writeConversionResults.ts b/src/creation/writeConversionResults.ts index 6fc0ebd99..132cf6bd7 100644 --- a/src/creation/writeConversionResults.ts +++ b/src/creation/writeConversionResults.ts @@ -1,9 +1,10 @@ import { FileSystem } from "../adapters/fileSystem"; import { RuleConversionResults } from "../rules/convertRules"; -import { formatConvertedRules } from "./formatConvertedRules"; import { AllOriginalConfigurations } from "../input/findOriginalConfigurations"; import { createEnv } from "./eslint/createEnv"; +import { formatConvertedRules } from "./formatConvertedRules"; import { formatOutput } from "./formatting/formatOutput"; +import { SimplifiedRuleConversionResults } from "./simplification/simplifyPackageRules"; export type WriteConversionResultsDependencies = { fileSystem: Pick; @@ -12,7 +13,7 @@ export type WriteConversionResultsDependencies = { export const writeConversionResults = async ( dependencies: WriteConversionResultsDependencies, outputPath: string, - ruleConversionResults: RuleConversionResults, + ruleConversionResults: RuleConversionResults & SimplifiedRuleConversionResults, originalConfigurations: AllOriginalConfigurations, ) => { const plugins = ["@typescript-eslint"]; @@ -26,6 +27,7 @@ export const writeConversionResults = async ( ...(eslint && eslint.full), env: createEnv(originalConfigurations), ...(eslint && { globals: eslint.raw.globals }), + ...(ruleConversionResults.extends && { extends: ruleConversionResults.extends }), parser: "@typescript-eslint/parser", parserOptions: { project: "tsconfig.json", diff --git a/src/input/findOriginalConfigurations.ts b/src/input/findOriginalConfigurations.ts index fcfe10140..b112aae1b 100644 --- a/src/input/findOriginalConfigurations.ts +++ b/src/input/findOriginalConfigurations.ts @@ -51,7 +51,7 @@ export const findOriginalConfigurations = async ( dependencies.findTypeScriptConfiguration(rawSettings.typescript), ]); - // Out of those configurations, only TSLint's is required to run + // Out of those configurations, only TSLint's is always required to run if (tslint instanceof Error) { return { complaints: [tslint.message], diff --git a/src/reporting/reportConversionResults.ts b/src/reporting/reportConversionResults.ts index b8c9288f4..c1e8efb57 100644 --- a/src/reporting/reportConversionResults.ts +++ b/src/reporting/reportConversionResults.ts @@ -48,7 +48,7 @@ const logFailedConversions = (failed: ErrorSummary[], logger: Logger) => { logger.stderr.write(chalk.red(" thrown.")); logger.stderr.write(chalk.redBright(` 💀${EOL}`)); - logger.info.write(failed.map(failed => failed.getSummary()).join("")); + logger.info.write(failed.map(failed => failed.getSummary()).join("\n\n") + "\n\n"); logger.stderr.write(chalk.gray(`Check ${logger.debugFileName} for details.${EOL}`)); }; From b962eb5ec867635d065103295a2418753935474b Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 22 Dec 2019 19:12:01 -0500 Subject: [PATCH 2/3] Fixed tsc failures and existing or new unit tests --- src/conversion/convertConfig.test.ts | 6 ++- .../collectTSLintRulesets.test.ts | 50 +++++++++++++++++++ .../simplification/collectTSLintRulesets.ts | 4 +- .../resolveExtensionNames.test.ts | 12 +++++ .../retrieveExtendsValues.test.ts | 14 +++--- .../simplifyPackageRules.test.ts | 28 ++++++++--- .../simplification/simplifyPackageRules.ts | 13 +++-- src/input/importer.ts | 5 +- 8 files changed, 112 insertions(+), 20 deletions(-) create mode 100644 src/creation/simplification/collectTSLintRulesets.test.ts diff --git a/src/conversion/convertConfig.test.ts b/src/conversion/convertConfig.test.ts index 8a456bb12..66f202de1 100644 --- a/src/conversion/convertConfig.test.ts +++ b/src/conversion/convertConfig.test.ts @@ -14,7 +14,11 @@ const createStubDependencies = ( status: ResultStatus.Succeeded, }), reportConversionResults: jest.fn(), - simplifyPackageRules: async (_configurations, data) => data, + simplifyPackageRules: async (_configurations, data) => ({ + ...data, + converted: new Map(), + failed: [], + }), writeConversionResults: jest.fn().mockReturnValue(Promise.resolve()), ...overrides, }); diff --git a/src/creation/simplification/collectTSLintRulesets.test.ts b/src/creation/simplification/collectTSLintRulesets.test.ts new file mode 100644 index 000000000..97822efa9 --- /dev/null +++ b/src/creation/simplification/collectTSLintRulesets.test.ts @@ -0,0 +1,50 @@ +import { collectTSLintRulesets } from "./collectTSLintRulesets"; + +describe("collectTSLintRulesets", () => { + it("includes mapped ESLint extensions for a full TSLint extension when it exists", () => { + const tslint = { + full: { + extends: ["tslint:recommended"], + }, + raw: {}, + }; + + const extensions = collectTSLintRulesets(tslint); + + expect(extensions).toEqual([ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + ]); + }); + + it("includes mapped ESLint extensions for a raw TSLint extension when it exists", () => { + const tslint = { + full: {}, + raw: { + extends: ["tslint:recommended"], + }, + }; + + const extensions = collectTSLintRulesets(tslint); + + expect(extensions).toEqual([ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + ]); + }); + + it("ignores a TSLint extension when it has no mapped ESLint extensions", () => { + const tslint = { + full: { + extends: ["does not exist"], + }, + raw: { + extends: ["also does not exist"], + }, + }; + + const extensions = collectTSLintRulesets(tslint); + + expect(extensions).toEqual([]); + }); +}); diff --git a/src/creation/simplification/collectTSLintRulesets.ts b/src/creation/simplification/collectTSLintRulesets.ts index df08fbd18..66f8685e0 100644 --- a/src/creation/simplification/collectTSLintRulesets.ts +++ b/src/creation/simplification/collectTSLintRulesets.ts @@ -13,7 +13,9 @@ const nativeExtensions = new Map([ ], ]); -export const collectTSLintRulesets = (tslint: OriginalConfigurations) => { +export const collectTSLintRulesets = ( + tslint: OriginalConfigurations>, +) => { const allExtensions = uniqueFromSources(tslint.full.extends, tslint.raw.extends); const extensions = new Set(); diff --git a/src/creation/simplification/resolveExtensionNames.test.ts b/src/creation/simplification/resolveExtensionNames.test.ts index 5fa8322ca..6a8e7d2c7 100644 --- a/src/creation/simplification/resolveExtensionNames.test.ts +++ b/src/creation/simplification/resolveExtensionNames.test.ts @@ -55,6 +55,7 @@ describe("resolveExtensionNames", () => { // Assert expect(extensionNames).toEqual(["eslint-plugin-value"]); }); + it("doesn't prepend eslint-plugin- when a plugin starts with eslint:", () => { // Arrange const rawExtensionName = "eslint:recommended"; @@ -65,4 +66,15 @@ describe("resolveExtensionNames", () => { // Assert expect(extensionNames).toEqual(["eslint:recommended"]); }); + + it("doesn't prepend eslint-plugin- when a plugin starts with plugin:", () => { + // Arrange + const rawExtensionName = "eslint:recommended"; + + // Act + const extensionNames = resolveExtensionNames(rawExtensionName); + + // Assert + expect(extensionNames).toEqual(["eslint:recommended"]); + }); }); diff --git a/src/creation/simplification/retrieveExtendsValues.test.ts b/src/creation/simplification/retrieveExtendsValues.test.ts index aec6c80e7..f85cb4b00 100644 --- a/src/creation/simplification/retrieveExtendsValues.test.ts +++ b/src/creation/simplification/retrieveExtendsValues.test.ts @@ -1,7 +1,7 @@ import { retrieveExtendsValues } from "./retrieveExtendsValues"; describe("retrieveExtendsValues", () => { - it("retrieves eslint-all when an extension is named eslint:all", async () => { + it("retrieves an equivalent ESLint configuration when a retrieved extensions is an ESLint builtin", async () => { // Arrange const eslintAll = { rules: {} }; const importer = async (extensionName: string) => @@ -16,22 +16,22 @@ describe("retrieveExtendsValues", () => { expect(importedExtensions).toEqual([eslintAll]); }); - it("retrieves eslint-recommended when an extension is named eslint:recommended", async () => { + it("retrieves an equivalent typescript-eslint configuration when a retrieved extensions is a typescript-eslint builtin", async () => { // Arrange - const eslintRecommended = { rules: {} }; + const eslintAll = { rules: {} }; const importer = async (extensionName: string) => - extensionName === "eslint/conf/eslint-recommended" - ? eslintRecommended + extensionName === "node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.json" + ? eslintAll : new Error(`Unknown extension name: '${extensionName}`); // Act const { importedExtensions } = await retrieveExtendsValues( { importer }, - "eslint:recommended", + "plugin:@typescript-eslint/all", ); // Assert - expect(importedExtensions).toEqual([eslintRecommended]); + expect(importedExtensions).toEqual([eslintAll]); }); it("reports a failure when an extension fails to import", async () => { diff --git a/src/creation/simplification/simplifyPackageRules.test.ts b/src/creation/simplification/simplifyPackageRules.test.ts index e603dbcbb..d4fdee016 100644 --- a/src/creation/simplification/simplifyPackageRules.test.ts +++ b/src/creation/simplification/simplifyPackageRules.test.ts @@ -5,10 +5,13 @@ import { simplifyPackageRules } from "./simplifyPackageRules"; const createStubDependencies = () => ({ removeExtendsDuplicatedRules: jest.fn(), - retrieveExtendsValues: jest.fn(), + retrieveExtendsValues: async () => ({ + configurationErrors: [], + importedExtensions: [], + }), }); -const createStubESLintConfiguration = (fullExtends: string | string[]) => ({ +const createStubESLintConfiguration = (fullExtends: string[]) => ({ full: { env: {}, extends: fullExtends, @@ -16,17 +19,24 @@ const createStubESLintConfiguration = (fullExtends: string | string[]) => ({ }, }); +const createStubTSLintConfiguration = () => ({ + full: {}, + raw: {}, +}); + describe("simplifyPackageRules", () => { - it("returns the conversion results directly when there is no loaded eslint configuration", async () => { + it("returns the conversion results directly when there is no loaded ESLint configuration and no TSLint extensions", async () => { // Arrange const dependencies = createStubDependencies(); const eslint = undefined; + const tslint = createStubTSLintConfiguration(); const ruleConversionResults = createEmptyConversionResults(); // Act const simplifiedResults = await simplifyPackageRules( dependencies, eslint, + tslint, ruleConversionResults, ); @@ -34,16 +44,18 @@ describe("simplifyPackageRules", () => { expect(simplifiedResults).toBe(ruleConversionResults); }); - it("returns the conversion results directly when the eslint configuration has an empty extends", async () => { + it("returns the conversion results directly when there is an empty ESLint configuration and no TSLint extensions", async () => { // Arrange const dependencies = createStubDependencies(); const eslint = createStubESLintConfiguration([]); + const tslint = createStubTSLintConfiguration(); const ruleConversionResults = createEmptyConversionResults(); // Act const simplifiedResults = await simplifyPackageRules( dependencies, eslint, + tslint, ruleConversionResults, ); @@ -51,7 +63,7 @@ describe("simplifyPackageRules", () => { expect(simplifiedResults).toBe(ruleConversionResults); }); - it("includes deduplicated rules and extension failures when the eslint configuration extends", async () => { + it("includes deduplicated rules and extension failures when the ESLint configuration extends", async () => { // Arrange const configurationErrors = [new ConfigurationError(new Error("oh no"), "darn")]; const deduplicatedRules = new Map([ @@ -71,19 +83,23 @@ describe("simplifyPackageRules", () => { importedExtensions: [], }), }; - const eslint = createStubESLintConfiguration(["extension-name"]); + const eslintExtends = ["extension-name"]; + const eslint = createStubESLintConfiguration(eslintExtends); + const tslint = createStubTSLintConfiguration(); const ruleConversionResults = createEmptyConversionResults(); // Act const simplifiedResults = await simplifyPackageRules( dependencies, eslint, + tslint, ruleConversionResults, ); // Assert expect(simplifiedResults).toEqual({ converted: deduplicatedRules, + extends: eslintExtends, failed: configurationErrors, }); }); diff --git a/src/creation/simplification/simplifyPackageRules.ts b/src/creation/simplification/simplifyPackageRules.ts index f9776977a..b7b9d8bd8 100644 --- a/src/creation/simplification/simplifyPackageRules.ts +++ b/src/creation/simplification/simplifyPackageRules.ts @@ -27,13 +27,18 @@ export type SimplifiedRuleConversionResults = Pick< export const simplifyPackageRules = async ( dependencies: SimplifyPackageRulesDependencies, eslint: Pick, "full"> | undefined, - tslint: OriginalConfigurations, + tslint: OriginalConfigurations>, ruleConversionResults: SimplifiedRuleConversionResults, ): Promise => { - const extendedRulesets = collectTSLintRulesets(tslint); + const extendedESLintRulesets = eslint?.full.extends ?? []; + const extendedTSLintRulesets = collectTSLintRulesets(tslint); + const allExtensions = uniqueFromSources(extendedESLintRulesets, extendedTSLintRulesets); + if (allExtensions.length === 0) { + return ruleConversionResults; + } const { configurationErrors, importedExtensions } = await dependencies.retrieveExtendsValues( - uniqueFromSources(eslint?.full.extends ?? [], extendedRulesets), + uniqueFromSources(extendedESLintRulesets, extendedTSLintRulesets), ); const converted = dependencies.removeExtendsDuplicatedRules( @@ -43,7 +48,7 @@ export const simplifyPackageRules = async ( return { converted, - extends: extendedRulesets, + extends: allExtensions, failed: [...ruleConversionResults.failed, ...configurationErrors], }; }; diff --git a/src/input/importer.ts b/src/input/importer.ts index 03955ffba..360e281b7 100644 --- a/src/input/importer.ts +++ b/src/input/importer.ts @@ -10,7 +10,10 @@ export type ImporterDependencies = { nativeImporter: NativeImporter; }; -export const importer = async (dependencies: ImporterDependencies, moduleName: string) => { +export const importer = async ( + dependencies: ImporterDependencies, + moduleName: string, +): Promise => { const pathAttempts = [path.join(dependencies.getCwd(), moduleName), moduleName]; const importFile = async (filePath: string) => { From 187105472e442da5555a8c68a65bf6651241d670 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 22 Dec 2019 19:18:03 -0500 Subject: [PATCH 3/3] Brought coverage back up to 100% --- src/creation/writeConversionResults.test.ts | 43 ++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/creation/writeConversionResults.test.ts b/src/creation/writeConversionResults.test.ts index b64e1c6a6..1ada4801d 100644 --- a/src/creation/writeConversionResults.test.ts +++ b/src/creation/writeConversionResults.test.ts @@ -2,8 +2,11 @@ import { createEmptyConversionResults } from "../conversion/conversionResults.st import { writeConversionResults } from "./writeConversionResults"; import { AllOriginalConfigurations } from "../input/findOriginalConfigurations"; import { formatJsonOutput } from "./formatting/formatters/formatJsonOutput"; +import { SimplifiedRuleConversionResults } from "./simplification/simplifyPackageRules"; -const createStubOriginalConfigurations = (overrides: Partial = {}) => ({ +const createStubOriginalConfigurations = ( + overrides: Partial = {}, +) => ({ tslint: { full: { rulesDirectory: [], @@ -146,6 +149,44 @@ describe("writeConversionResults", () => { ); }); + it("includes extensions when they exist", async () => { + // Arrange + const extension = ["stub-extension"]; + const conversionResults = { + ...createEmptyConversionResults(), + extends: extension, + }; + const fileSystem = { writeFile: jest.fn().mockReturnValue(Promise.resolve()) }; + + // Act + await writeConversionResults( + { fileSystem }, + ".eslintrc.json", + conversionResults, + createStubOriginalConfigurations(), + ); + + // Assert + expect(fileSystem.writeFile).toHaveBeenLastCalledWith( + ".eslintrc.json", + formatJsonOutput({ + env: { + browser: true, + es6: true, + node: true, + }, + extends: extension, + parser: "@typescript-eslint/parser", + parserOptions: { + project: "tsconfig.json", + sourceType: "module", + }, + plugins: ["@typescript-eslint"], + rules: {}, + }), + ); + }); + it("includes raw globals when they exist", async () => { // Arrange const conversionResults = createEmptyConversionResults();