Skip to content

Added editor settings converter for tslint.configFile, with full settings access #652

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
merged 5 commits into from
Aug 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 4 additions & 1 deletion src/conversion/convertEditorConfig.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@ describe("convertEditorConfig", () => {
await convertEditorConfig(dependencies, stubSettings);

// Assert
expect(dependencies.convertEditorSettings).toHaveBeenCalledWith(originalConfig);
expect(dependencies.convertEditorSettings).toHaveBeenCalledWith(
originalConfig,
stubSettings,
);
});

it("reports conversion results when settings are converted successfully", async () => {
Expand Down
5 changes: 4 additions & 1 deletion src/conversion/convertEditorConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ export const convertEditorConfig = async (
};
}

const settingConversionResults = dependencies.convertEditorSettings(conversion.result);
const settingConversionResults = dependencies.convertEditorSettings(
conversion.result,
settings,
);

const fileWriteError = await dependencies.writeConversionResults(
conversion.configPath,
Expand Down
9 changes: 8 additions & 1 deletion src/editorSettings/convertEditorSetting.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ConversionError } from "../errors/conversionError";
import { convertEditorSetting } from "./convertEditorSetting";
import { EditorSettingConverter } from "./converter";
import { EditorSetting } from "./types";
import { createStubTSLintToESLintSettings } from "../settings.stubs";

describe("convertEditorSetting", () => {
it("returns undefined when no converter exists for a setting", () => {
Expand All @@ -15,6 +16,7 @@ describe("convertEditorSetting", () => {
value: "any value",
},
converters,
createStubTSLintToESLintSettings(),
);

// Assert
Expand Down Expand Up @@ -42,6 +44,7 @@ describe("convertEditorSetting", () => {
value: "existing value",
},
converters,
createStubTSLintToESLintSettings(),
);

// Assert
Expand All @@ -65,7 +68,11 @@ describe("convertEditorSetting", () => {
};

// Act
const result = convertEditorSetting(tsLintSetting, converters);
const result = convertEditorSetting(
tsLintSetting,
converters,
createStubTSLintToESLintSettings(),
);

// Assert
expect(result).toEqual(ConversionError.forSettingError(error, tsLintSetting));
Expand Down
4 changes: 3 additions & 1 deletion src/editorSettings/convertEditorSetting.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import { ConversionError } from "../errors/conversionError";
import { TSLintToESLintSettings } from "../types";
import { EditorSettingConverter } from "./converter";
import { EditorSetting } from "./types";

export const convertEditorSetting = (
editorSetting: EditorSetting,
converters: Map<string, EditorSettingConverter>,
settings: TSLintToESLintSettings,
) => {
const converter = converters.get(editorSetting.editorSettingName);
if (converter === undefined) {
return undefined;
}

try {
return converter(editorSetting);
return converter(editorSetting, settings);
} catch (error) {
return ConversionError.forSettingError(error, editorSetting);
}
Expand Down
16 changes: 14 additions & 2 deletions src/editorSettings/convertEditorSettings.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ConversionError } from "../errors/conversionError";
import { createStubTSLintToESLintSettings } from "../settings.stubs";
import { convertEditorSettings } from "./convertEditorSettings";
import { EditorSettingConversionResult, EditorSettingConverter } from "./converter";
import { EditorSetting } from "./types";
Expand All @@ -13,7 +14,11 @@ describe("convertEditorSettings", () => {
};

// Act
const result = convertEditorSettings({ converters }, editorConfiguration);
const result = convertEditorSettings(
{ converters },
editorConfiguration,
createStubTSLintToESLintSettings(),
);

// Assert
expect(result).toEqual({
Expand Down Expand Up @@ -41,7 +46,11 @@ describe("convertEditorSettings", () => {
};

// Act
const result = convertEditorSettings({ converters }, editorConfiguration);
const result = convertEditorSettings(
{ converters },
editorConfiguration,
createStubTSLintToESLintSettings(),
);

// Assert
expect(result).toEqual({
Expand All @@ -67,6 +76,7 @@ describe("convertEditorSettings", () => {
const result = convertEditorSettings(
{ converters },
{ [editorSetting.editorSettingName]: editorSetting },
createStubTSLintToESLintSettings(),
);

// Assert
Expand All @@ -87,6 +97,7 @@ describe("convertEditorSettings", () => {
const result = convertEditorSettings(
{ converters },
{ [editorSetting.editorSettingName]: editorSetting },
createStubTSLintToESLintSettings(),
);

// Assert
Expand All @@ -112,6 +123,7 @@ describe("convertEditorSettings", () => {
const result = convertEditorSettings(
{ converters },
{ [editorSetting.editorSettingName]: editorSetting.value },
createStubTSLintToESLintSettings(),
);

// Assert
Expand Down
4 changes: 3 additions & 1 deletion src/editorSettings/convertEditorSettings.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { ConversionError } from "../errors/conversionError";
import { ErrorSummary } from "../errors/errorSummary";
import { TSLintToESLintSettings } from "../types";
import { convertEditorSetting } from "./convertEditorSetting";
import { EditorSettingConverter } from "./converter";
import { EditorSetting } from "./types";
Expand Down Expand Up @@ -29,6 +30,7 @@ export type EditorConfiguration = Record<string, any>;
export const convertEditorSettings = (
dependencies: ConvertEditorSettingsDependencies,
rawEditorConfiguration: EditorConfiguration,
settings: TSLintToESLintSettings,
): EditorSettingConversionResults => {
const converted = new Map<string, EditorSetting>();
const failed: ConversionError[] = [];
Expand All @@ -42,7 +44,7 @@ export const convertEditorSettings = (
}

const editorSetting = { editorSettingName: configurationName, value };
const conversion = convertEditorSetting(editorSetting, dependencies.converters);
const conversion = convertEditorSetting(editorSetting, dependencies.converters, settings);

if (conversion === undefined) {
const { editorSettingName } = editorSetting;
Expand Down
4 changes: 3 additions & 1 deletion src/editorSettings/converter.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { ConversionError } from "../errors/conversionError";
import { TSLintToESLintSettings } from "../types";
import { EditorSetting } from "./types";

/**
* Attempts to convert a TSLint editor setting into the ESLint equivalents.
*/
export type EditorSettingConverter = (
tslintEditorSetting: EditorSetting,
) => ConversionError | EditorSettingConversionResult;
settings: TSLintToESLintSettings,
) => ConversionError | EditorSettingConversionResult | undefined;

/**
* Successful result from converting a TSLint editor setting to its ESLint equivalents.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { createStubTSLintToESLintSettings } from "../../../settings.stubs";
import { convertEditorCodeActionsOnSave } from "../editor-code-actions-on-save";

describe(convertEditorCodeActionsOnSave, () => {
test("conversion of 'source.fixAll.tslint' when value is true", () => {
const result = convertEditorCodeActionsOnSave({
editorSettingName: "editor.codeActionsOnSave",
value: {
"source.fixAll.tslint": true,
const result = convertEditorCodeActionsOnSave(
{
editorSettingName: "editor.codeActionsOnSave",
value: {
"source.fixAll.tslint": true,
},
},
});
createStubTSLintToESLintSettings(),
);

expect(result).toEqual({
settings: [
Expand All @@ -24,12 +28,15 @@ describe(convertEditorCodeActionsOnSave, () => {
});

test("conversion of 'source.fixAll.tslint' when value is false", () => {
const result = convertEditorCodeActionsOnSave({
editorSettingName: "editor.codeActionsOnSave",
value: {
"source.fixAll.tslint": false,
const result = convertEditorCodeActionsOnSave(
{
editorSettingName: "editor.codeActionsOnSave",
value: {
"source.fixAll.tslint": false,
},
},
});
createStubTSLintToESLintSettings(),
);

expect(result).toEqual({
settings: [
Expand All @@ -46,14 +53,17 @@ describe(convertEditorCodeActionsOnSave, () => {
});

test("conversion of 'source.fixAll.tslint' without touching any other 'editor.codeActionsOnSave'", () => {
const result = convertEditorCodeActionsOnSave({
editorSettingName: "editor.codeActionsOnSave",
value: {
"one-property": 42,
"source.fixAll.tslint": true,
"another-property": "foo",
const result = convertEditorCodeActionsOnSave(
{
editorSettingName: "editor.codeActionsOnSave",
value: {
"one-property": 42,
"source.fixAll.tslint": true,
"another-property": "foo",
},
},
});
createStubTSLintToESLintSettings(),
);

expect(result).toEqual({
settings: [
Expand Down
34 changes: 34 additions & 0 deletions src/editorSettings/converters/tests/tslint-config-file.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { convertTSLintConfigFile } from "../tslint-config-file";

describe(convertTSLintConfigFile, () => {
test("conversion of 'tslint.configFile' when it roughly equals the ESLint file", () => {
const result = convertTSLintConfigFile(
{
editorSettingName: "tslint.configFile",
value: "./custom/tslint.json",
},
{ config: "./custom/eslintrc.js" },
);

expect(result).toEqual({
settings: [
{
editorSettingName: "eslint.options",
value: { configFile: "./custom/eslintrc.js" },
},
],
});
});

test("conversion of 'tslint.configFile' when it does not roughly equal the ESLint file", () => {
const result = convertTSLintConfigFile(
{
editorSettingName: "tslint.configFile",
value: "./custom/tslint.json",
},
{ config: "./eslintrc.js" },
);

expect(result).toEqual(undefined);
});
});
24 changes: 24 additions & 0 deletions src/editorSettings/converters/tslint-config-file.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as path from "path";

import { EditorSettingConverter } from "../converter";

export const convertTSLintConfigFile: EditorSettingConverter = (
originalTSLintConfigFile,
settings,
) => {
// If the output ESLint config path doesn't roughly match the original TSLint path, skip this.
const tslintPath = originalTSLintConfigFile.value;
const eslintPath = settings.config;
if (path.relative(path.dirname(tslintPath), path.dirname(eslintPath))) {
return undefined;
}

return {
settings: [
{
editorSettingName: "eslint.options",
value: { configFile: settings.config },
},
],
};
};
2 changes: 2 additions & 0 deletions src/editorSettings/editorSettingsConverters.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { convertEditorCodeActionsOnSave } from "./converters/editor-code-actions-on-save";
import { convertTSLintConfigFile } from "./converters/tslint-config-file";

/**
* Keys TSLint property names in editor settings to their ESLint editor settings converters.
*/
export const editorSettingsConverters = new Map([
["editor.codeActionsOnSave", convertEditorCodeActionsOnSave],
["tslint.configFile", convertTSLintConfigFile],
]);
3 changes: 3 additions & 0 deletions src/settings.stubs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const createStubTSLintToESLintSettings = () => ({
config: "./eslintrc.js",
});