Skip to content

Feature/convert editor settings 133 #250

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
1deac7b
feat (editor): add cli option to specify editor config path to conver…
Oct 13, 2019
d8d92b0
fix (editor): remove option configuration to fix default value
Oct 13, 2019
59bcca2
feat (editor): add editor cli option to TSLintToESLintSettings
Oct 13, 2019
d600d78
feat(editor): conversion of multiple configs, read config and replace
MrCube42 Oct 21, 2019
7452b3d
test(editor): adjust tests to receive convertConfigs array
MrCube42 Oct 21, 2019
be3704d
style (editor): fix incorrect import statement with js ending
MrCube42 Oct 21, 2019
7ee90c1
Merge branch 'master' into feature/convert-editor-settings_133
MrCube42 Oct 21, 2019
ffb7f54
fix(editor): get error return value instead of try/catch
MrCube42 Oct 22, 2019
da92c2b
style: format with prettier
MrCube42 Oct 22, 2019
129de28
fix: capture every error while processing multiple configs
MrCube42 Oct 22, 2019
85c9db2
Merge branch 'master' into feature/convert-editor-settings_133
MrCube42 Oct 22, 2019
ce99325
fix: log success only once
MrCube42 Oct 22, 2019
119849f
feat(editor): add error for editor settings conversion
MrCube42 Oct 27, 2019
a0b6bcd
feat(editor): make editor conversion extendable like rule conversion,…
MrCube42 Oct 27, 2019
8f409ca
refactor(editor): extract vscode settings path and editor config into…
MrCube42 Oct 27, 2019
77eee95
fix: remove file ending from import statement
MrCube42 Nov 1, 2019
effbacc
fix: change import of DeepPartial
MrCube42 Nov 1, 2019
48956ea
feat(editor): report converted settings
MrCube42 Nov 1, 2019
d53f7b2
Merge branch 'refs/heads/master' into feature/convert-editor-settings…
MrCube42 Nov 30, 2019
07ad57f
refactor: extract general log outputs from report rules and settings …
MrCube42 Nov 30, 2019
b2a5db1
test: report setting conversion results
MrCube42 Nov 30, 2019
6e3cc18
test: conversion of editor.codeActions source.fixAll.tslint into esli…
MrCube42 Nov 30, 2019
fe3034b
test: convert setting
MrCube42 Nov 30, 2019
186c128
test: convert settings, adjust missing and converted conversion results
MrCube42 Dec 1, 2019
1d427ee
test: exlcude settings converters from coverage
MrCube42 Dec 1, 2019
9eb7843
test: find editor configuration, stub file system
MrCube42 Dec 1, 2019
98cc72c
feat: simplify convertSettings because multiple setting changes don't…
MrCube42 Dec 3, 2019
83b9dcc
refactor: adjust naming of test variable
MrCube42 Dec 3, 2019
85b1e25
test: write editor config conversion results to proper path
MrCube42 Dec 3, 2019
7d6ce31
test: write editor config output with sorted keys to file system
MrCube42 Dec 4, 2019
d63d03b
test: conversion of editor config
MrCube42 Dec 4, 2019
53f858d
refactor: change generics into actual types
MrCube42 Dec 16, 2019
75ba2da
refactor: rename converters to specific rulesConverters and settingsC…
MrCube42 Dec 16, 2019
a8af16e
test: clean up outcommented code
MrCube42 Dec 16, 2019
5e6879e
fix: change ignored coverage path
MrCube42 Dec 16, 2019
03e8372
fix: add typing and dependency property name
MrCube42 Dec 16, 2019
b339028
fix: only convert editor settings from the editor configuration
MrCube42 Dec 16, 2019
fbd54df
fix: set the already converted setting properly to the conversion res…
MrCube42 Dec 16, 2019
beca462
feat: use findRawConfiguration to read editor configuration with json…
MrCube42 Dec 16, 2019
88fbe88
test: adjust tests for usage of findRawConfiguration in findEditorCon…
MrCube42 Dec 16, 2019
1c6b364
Merge branch 'refs/heads/master' into feature/convert-editor-settings…
MrCube42 Dec 16, 2019
53f37d4
refactor: specify naming, every "setting" to be an "editorSetting"
MrCube42 Dec 16, 2019
db860ff
style: format imports
MrCube42 Dec 16, 2019
8733b0d
style: change sample name of editor-setting in tests
MrCube42 Dec 16, 2019
419b939
fix: revert removal of no-explicit-any
MrCube42 Dec 16, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ module.exports = {
"!./src/**/*.d.ts",
"!./src/**/*.stubs.ts",
"!./src/adapters/*.ts",
"!./src/rules/converters.ts",
"!./src/rules/rulesConverters.ts",
"!./src/editorSettings/editorSettingsConverters.ts",
"!./src/rules/mergers.ts",
"!./src/cli/main.ts",
],
Expand Down
11 changes: 11 additions & 0 deletions src/adapters/fileSystem.stub.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const createStubFileSystem = ({ data = {}, exists = true } = {}) => ({
fileExists: jest.fn().mockReturnValue(exists),
readFile: jest.fn().mockReturnValue(Promise.resolve(data)),
writeFile: jest.fn(),
});

export const createStubThrowingFileSystem = ({ err = "" } = {}) => ({
fileExists: jest.fn().mockRejectedValue(Promise.resolve(new Error(err))),
readFile: jest.fn().mockRejectedValue(Promise.resolve(new Error(err))),
writeFile: jest.fn().mockRejectedValue(Promise.resolve(new Error(err))),
});
61 changes: 49 additions & 12 deletions src/cli/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ import { fsFileSystem } from "../adapters/fsFileSystem";
import { nativeImporter } from "../adapters/nativeImporter";
import { processLogger } from "../adapters/processLogger";
import { bind } from "../binding";
import { ConvertConfigDependencies, convertConfig } from "../conversion/convertConfig";
import { convertConfig, ConvertConfigDependencies } from "../conversion/convertConfig";
import {
convertEditorConfig,
ConvertEditorConfigDependencies,
} from "../conversion/convertEditorConfig";
import { removeExtendsDuplicatedRules } from "../creation/simplification/removeExtendsDuplicatedRules";
import {
RetrieveExtendsValuesDependencies,
retrieveExtendsValues,
RetrieveExtendsValuesDependencies,
} from "../creation/simplification/retrieveExtendsValues";
import {
simplifyPackageRules,
Expand All @@ -19,30 +23,43 @@ import {
writeConversionResults,
WriteConversionResultsDependencies,
} from "../creation/writeConversionResults";
import { writeConversionResults as writeEditorConfigConversionResults } from "../creation/writeEditorConfigConversionResults";
import {
convertEditorSettings,
ConvertEditorSettingsDependencies,
} from "../editorSettings/convertEditorSettings";
import { editorSettingsConverters } from "../editorSettings/editorSettingsConverters";
import {
findEditorConfiguration,
FindEditorConfigurationDependencies,
} from "../input/findEditorConfiguration";
import { findESLintConfiguration } from "../input/findESLintConfiguration";
import {
findOriginalConfigurations,
FindOriginalConfigurationsDependencies,
} from "../input/findOriginalConfigurations";
import { findPackagesConfiguration } from "../input/findPackagesConfiguration";
import { findESLintConfiguration } from "../input/findESLintConfiguration";
import { findTSLintConfiguration } from "../input/findTSLintConfiguration";
import { findTypeScriptConfiguration } from "../input/findTypeScriptConfiguration";
import { importer, ImporterDependencies } from "../input/importer";
import { mergeLintConfigurations } from "../input/mergeLintConfigurations";
import {
reportConversionResults,
ReportConversionResultsDependencies,
} from "../reporting/reportConversionResults";
import { converters } from "../rules/converters";
import { convertRules } from "../rules/convertRules";
import { ReportConversionResultsDependencies } from "../reporting/dependencies";
import { reportConversionResults } from "../reporting/reportConversionResults";
import { reportEditorSettingConversionResults } from "../reporting/reportEditorSettingConversionResults";
import { convertRules, ConvertRulesDependencies } from "../rules/convertRules";
import { mergers } from "../rules/mergers";
import { rulesConverters } from "../rules/rulesConverters";
import { runCli, RunCliDependencies } from "./runCli";

const convertRulesDependencies = {
converters,
const convertRulesDependencies: ConvertRulesDependencies = {
converters: rulesConverters,
mergers,
};

const convertEditorSettingsDependencies: ConvertEditorSettingsDependencies = {
converters: editorSettingsConverters,
};

const nativeImporterDependencies: ImporterDependencies = {
fileSystem: fsFileSystem,
getCwd: () => process.cwd(),
Expand All @@ -56,6 +73,10 @@ const findConfigurationDependencies = {
importer: boundImporter,
};

const findEditorConfigurationDependencies: FindEditorConfigurationDependencies = {
importer: boundImporter,
};

const findOriginalConfigurationsDependencies: FindOriginalConfigurationsDependencies = {
findESLintConfiguration: bind(findESLintConfiguration, findConfigurationDependencies),
findPackagesConfiguration: bind(findPackagesConfiguration, findConfigurationDependencies),
Expand All @@ -81,6 +102,19 @@ const writeConversionResultsDependencies: WriteConversionResultsDependencies = {
fileSystem: fsFileSystem,
};

const convertEditorConfigDependencies: ConvertEditorConfigDependencies = {
findEditorConfiguration: bind(findEditorConfiguration, findEditorConfigurationDependencies),
convertEditorSettings: bind(convertEditorSettings, convertEditorSettingsDependencies),
reportConversionResults: bind(
reportEditorSettingConversionResults,
reportConversionResultsDependencies,
),
writeConversionResults: bind(
writeEditorConfigConversionResults,
writeConversionResultsDependencies,
),
};

const convertConfigDependencies: ConvertConfigDependencies = {
convertRules: bind(convertRules, convertRulesDependencies),
findOriginalConfigurations: bind(
Expand All @@ -93,7 +127,10 @@ const convertConfigDependencies: ConvertConfigDependencies = {
};

const runCliDependencies: RunCliDependencies = {
convertConfig: bind(convertConfig, convertConfigDependencies),
convertConfigs: [
bind(convertConfig, convertConfigDependencies),
bind(convertEditorConfig, convertEditorConfigDependencies),
],
logger: processLogger,
};

Expand Down
58 changes: 34 additions & 24 deletions src/cli/runCli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import { runCli, RunCliDependencies } from "./runCli";
const createStubArgv = (argv: string[] = []) => ["node", "some/path/bin/file", ...argv];

const createStubRunCliDependencies = (
overrides: Partial<Pick<RunCliDependencies, "convertConfig">> = {},
overrides: Partial<Pick<RunCliDependencies, "convertConfigs">> = {},
) => ({
convertConfig: async (): Promise<TSLintToESLintResult> => ({ status: ResultStatus.Succeeded }),
convertConfigs: [
async (): Promise<TSLintToESLintResult> => ({ status: ResultStatus.Succeeded }),
],
logger: createStubLogger(),
...overrides,
});
Expand All @@ -32,7 +34,7 @@ describe("runCli", () => {
// Arrange
const message = "Oh no";
const dependencies = createStubRunCliDependencies({
convertConfig: () => Promise.reject(new Error(message)),
convertConfigs: [() => Promise.reject(new Error(message))],
});

// Act
Expand All @@ -49,11 +51,13 @@ describe("runCli", () => {
// Arrange
const complaint = "too much unit testing coverage";
const dependencies = createStubRunCliDependencies({
convertConfig: () =>
Promise.resolve({
complaints: [complaint],
status: ResultStatus.ConfigurationError,
}),
convertConfigs: [
() =>
Promise.resolve({
complaints: [complaint],
status: ResultStatus.ConfigurationError,
}),
],
});

// Act
Expand All @@ -72,11 +76,13 @@ describe("runCli", () => {
// Arrange
const error = new Error("too much unit testing coverage");
const dependencies = createStubRunCliDependencies({
convertConfig: () =>
Promise.resolve({
errors: [error],
status: ResultStatus.Failed,
}),
convertConfigs: [
() =>
Promise.resolve({
errors: [error],
status: ResultStatus.Failed,
}),
],
});

// Act
Expand All @@ -98,11 +104,13 @@ describe("runCli", () => {
new Error("too much branch coverage"),
];
const dependencies = createStubRunCliDependencies({
convertConfig: () =>
Promise.resolve({
errors,
status: ResultStatus.Failed,
}),
convertConfigs: [
() =>
Promise.resolve({
errors,
status: ResultStatus.Failed,
}),
],
});

// Act
Expand Down Expand Up @@ -133,12 +141,14 @@ describe("runCli", () => {
it("default output should be .eslintrc.js", async () => {
let defaultConfig;
const dependencies = createStubRunCliDependencies({
convertConfig: parsedArgs => {
defaultConfig = parsedArgs.config;
return Promise.resolve({
status: ResultStatus.Succeeded,
});
},
convertConfigs: [
parsedArgs => {
defaultConfig = parsedArgs.config;
return Promise.resolve({
status: ResultStatus.Succeeded,
});
},
],
});

const status = await runCli(dependencies, createStubArgv());
Expand Down
42 changes: 31 additions & 11 deletions src/cli/runCli.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import chalk from "chalk";
import { EOL } from "os";
import { Command } from "commander";
import { EOL } from "os";

import { version } from "../../package.json";
import { Logger } from "../adapters/logger";
import { SansDependencies } from "../binding";
import { convertConfig } from "../conversion/convertConfig";
import { TSLintToESLintSettings, TSLintToESLintResult, ResultStatus } from "../types";
import { DEFAULT_VSCODE_SETTINGS_PATH } from "../input/vsCodeSettings";
import { ResultStatus, ResultWithStatus, TSLintToESLintSettings } from "../types";

export type RunCliDependencies = {
convertConfig: SansDependencies<typeof convertConfig>;
convertConfigs: SansDependencies<typeof convertConfig>[];
logger: Logger;
};

Expand All @@ -24,6 +25,11 @@ export const runCli = async (
.option("--package [package]", "package configuration file to convert using")
.option("--tslint [tslint]", "tslint configuration file to convert using")
.option("--typescript [typescript]", "typescript configuration file to convert using")
.option(
"--editor [editor]",
"editor configuration file to convert using",
DEFAULT_VSCODE_SETTINGS_PATH,
)
.option("-V --version", "output the package version");

const parsedArgv = {
Expand All @@ -36,22 +42,38 @@ export const runCli = async (
return ResultStatus.Succeeded;
}

let result: TSLintToESLintResult;
for (const convertConfig of dependencies.convertConfigs) {
const result = await tryConvertConfig(convertConfig, parsedArgv);
if (result.status !== ResultStatus.Succeeded) {
logErrorResult(result, dependencies);
return result.status;
}
}

dependencies.logger.stdout.write(chalk.greenBright("✅ All is well! ✅\n"));
return ResultStatus.Succeeded;
};

const tryConvertConfig = async (
config: SansDependencies<typeof convertConfig>,
argv: Partial<TSLintToESLintSettings>,
): Promise<ResultWithStatus> => {
let result: ResultWithStatus;

try {
result = await dependencies.convertConfig(parsedArgv);
result = await config(argv as TSLintToESLintSettings);
} catch (error) {
result = {
errors: [error as Error],
status: ResultStatus.Failed,
};
}

switch (result.status) {
case ResultStatus.Succeeded:
dependencies.logger.stdout.write(chalk.greenBright("✅ All is well! ✅\n"));
break;
return result;
};

const logErrorResult = (result: ResultWithStatus, dependencies: RunCliDependencies) => {
switch (result.status) {
case ResultStatus.ConfigurationError:
dependencies.logger.stderr.write(chalk.redBright("❌ "));
dependencies.logger.stderr.write(chalk.red("Could not start tslint-to-eslint:"));
Expand All @@ -72,6 +94,4 @@ export const runCli = async (
}
break;
}

return result.status;
};
10 changes: 10 additions & 0 deletions src/conversion/conversionResults.stubs.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { EditorSettingConversionResults } from "../editorSettings/convertEditorSettings";
import { RuleConversionResults } from "../rules/convertRules";

export const createEmptyConversionResults = (
Expand All @@ -9,3 +10,12 @@ export const createEmptyConversionResults = (
plugins: new Set(),
...overrides,
});

export const createEmptySettingConversionResults = (
overrides: Partial<EditorSettingConversionResults> = {},
): EditorSettingConversionResults => ({
converted: new Map(),
failed: [],
missing: [],
...overrides,
});
Loading