Skip to content

Commit ba183c9

Browse files
author
Josh Goldberg
authored
Added editor settings converter for tslint.configFile, with full settings access (#652)
* Ignore all unknown editor settings in conversion * Added editor settings converter for tslint.configFile, with full settings access * Unit test fix * unused variable
1 parent ed90d94 commit ba183c9

12 files changed

+129
-25
lines changed

src/conversion/convertEditorConfig.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ describe("convertEditorConfig", () => {
8989
await convertEditorConfig(dependencies, stubSettings);
9090

9191
// Assert
92-
expect(dependencies.convertEditorSettings).toHaveBeenCalledWith(originalConfig);
92+
expect(dependencies.convertEditorSettings).toHaveBeenCalledWith(
93+
originalConfig,
94+
stubSettings,
95+
);
9396
});
9497

9598
it("reports conversion results when settings are converted successfully", async () => {

src/conversion/convertEditorConfig.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ export const convertEditorConfig = async (
3333
};
3434
}
3535

36-
const settingConversionResults = dependencies.convertEditorSettings(conversion.result);
36+
const settingConversionResults = dependencies.convertEditorSettings(
37+
conversion.result,
38+
settings,
39+
);
3740

3841
const fileWriteError = await dependencies.writeConversionResults(
3942
conversion.configPath,

src/editorSettings/convertEditorSetting.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ConversionError } from "../errors/conversionError";
22
import { convertEditorSetting } from "./convertEditorSetting";
33
import { EditorSettingConverter } from "./converter";
44
import { EditorSetting } from "./types";
5+
import { createStubTSLintToESLintSettings } from "../settings.stubs";
56

67
describe("convertEditorSetting", () => {
78
it("returns undefined when no converter exists for a setting", () => {
@@ -15,6 +16,7 @@ describe("convertEditorSetting", () => {
1516
value: "any value",
1617
},
1718
converters,
19+
createStubTSLintToESLintSettings(),
1820
);
1921

2022
// Assert
@@ -42,6 +44,7 @@ describe("convertEditorSetting", () => {
4244
value: "existing value",
4345
},
4446
converters,
47+
createStubTSLintToESLintSettings(),
4548
);
4649

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

6770
// Act
68-
const result = convertEditorSetting(tsLintSetting, converters);
71+
const result = convertEditorSetting(
72+
tsLintSetting,
73+
converters,
74+
createStubTSLintToESLintSettings(),
75+
);
6976

7077
// Assert
7178
expect(result).toEqual(ConversionError.forSettingError(error, tsLintSetting));

src/editorSettings/convertEditorSetting.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { ConversionError } from "../errors/conversionError";
2+
import { TSLintToESLintSettings } from "../types";
23
import { EditorSettingConverter } from "./converter";
34
import { EditorSetting } from "./types";
45

56
export const convertEditorSetting = (
67
editorSetting: EditorSetting,
78
converters: Map<string, EditorSettingConverter>,
9+
settings: TSLintToESLintSettings,
810
) => {
911
const converter = converters.get(editorSetting.editorSettingName);
1012
if (converter === undefined) {
1113
return undefined;
1214
}
1315

1416
try {
15-
return converter(editorSetting);
17+
return converter(editorSetting, settings);
1618
} catch (error) {
1719
return ConversionError.forSettingError(error, editorSetting);
1820
}

src/editorSettings/convertEditorSettings.test.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ConversionError } from "../errors/conversionError";
2+
import { createStubTSLintToESLintSettings } from "../settings.stubs";
23
import { convertEditorSettings } from "./convertEditorSettings";
34
import { EditorSettingConversionResult, EditorSettingConverter } from "./converter";
45
import { EditorSetting } from "./types";
@@ -13,7 +14,11 @@ describe("convertEditorSettings", () => {
1314
};
1415

1516
// Act
16-
const result = convertEditorSettings({ converters }, editorConfiguration);
17+
const result = convertEditorSettings(
18+
{ converters },
19+
editorConfiguration,
20+
createStubTSLintToESLintSettings(),
21+
);
1722

1823
// Assert
1924
expect(result).toEqual({
@@ -41,7 +46,11 @@ describe("convertEditorSettings", () => {
4146
};
4247

4348
// Act
44-
const result = convertEditorSettings({ converters }, editorConfiguration);
49+
const result = convertEditorSettings(
50+
{ converters },
51+
editorConfiguration,
52+
createStubTSLintToESLintSettings(),
53+
);
4554

4655
// Assert
4756
expect(result).toEqual({
@@ -67,6 +76,7 @@ describe("convertEditorSettings", () => {
6776
const result = convertEditorSettings(
6877
{ converters },
6978
{ [editorSetting.editorSettingName]: editorSetting },
79+
createStubTSLintToESLintSettings(),
7080
);
7181

7282
// Assert
@@ -87,6 +97,7 @@ describe("convertEditorSettings", () => {
8797
const result = convertEditorSettings(
8898
{ converters },
8999
{ [editorSetting.editorSettingName]: editorSetting },
100+
createStubTSLintToESLintSettings(),
90101
);
91102

92103
// Assert
@@ -112,6 +123,7 @@ describe("convertEditorSettings", () => {
112123
const result = convertEditorSettings(
113124
{ converters },
114125
{ [editorSetting.editorSettingName]: editorSetting.value },
126+
createStubTSLintToESLintSettings(),
115127
);
116128

117129
// Assert

src/editorSettings/convertEditorSettings.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ConversionError } from "../errors/conversionError";
22
import { ErrorSummary } from "../errors/errorSummary";
3+
import { TSLintToESLintSettings } from "../types";
34
import { convertEditorSetting } from "./convertEditorSetting";
45
import { EditorSettingConverter } from "./converter";
56
import { EditorSetting } from "./types";
@@ -29,6 +30,7 @@ export type EditorConfiguration = Record<string, any>;
2930
export const convertEditorSettings = (
3031
dependencies: ConvertEditorSettingsDependencies,
3132
rawEditorConfiguration: EditorConfiguration,
33+
settings: TSLintToESLintSettings,
3234
): EditorSettingConversionResults => {
3335
const converted = new Map<string, EditorSetting>();
3436
const failed: ConversionError[] = [];
@@ -42,7 +44,7 @@ export const convertEditorSettings = (
4244
}
4345

4446
const editorSetting = { editorSettingName: configurationName, value };
45-
const conversion = convertEditorSetting(editorSetting, dependencies.converters);
47+
const conversion = convertEditorSetting(editorSetting, dependencies.converters, settings);
4648

4749
if (conversion === undefined) {
4850
const { editorSettingName } = editorSetting;

src/editorSettings/converter.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { ConversionError } from "../errors/conversionError";
2+
import { TSLintToESLintSettings } from "../types";
23
import { EditorSetting } from "./types";
34

45
/**
56
* Attempts to convert a TSLint editor setting into the ESLint equivalents.
67
*/
78
export type EditorSettingConverter = (
89
tslintEditorSetting: EditorSetting,
9-
) => ConversionError | EditorSettingConversionResult;
10+
settings: TSLintToESLintSettings,
11+
) => ConversionError | EditorSettingConversionResult | undefined;
1012

1113
/**
1214
* Successful result from converting a TSLint editor setting to its ESLint equivalents.

src/editorSettings/converters/tests/editor-code-actions-on-save.test.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
import { createStubTSLintToESLintSettings } from "../../../settings.stubs";
12
import { convertEditorCodeActionsOnSave } from "../editor-code-actions-on-save";
23

34
describe(convertEditorCodeActionsOnSave, () => {
45
test("conversion of 'source.fixAll.tslint' when value is true", () => {
5-
const result = convertEditorCodeActionsOnSave({
6-
editorSettingName: "editor.codeActionsOnSave",
7-
value: {
8-
"source.fixAll.tslint": true,
6+
const result = convertEditorCodeActionsOnSave(
7+
{
8+
editorSettingName: "editor.codeActionsOnSave",
9+
value: {
10+
"source.fixAll.tslint": true,
11+
},
912
},
10-
});
13+
createStubTSLintToESLintSettings(),
14+
);
1115

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

2630
test("conversion of 'source.fixAll.tslint' when value is false", () => {
27-
const result = convertEditorCodeActionsOnSave({
28-
editorSettingName: "editor.codeActionsOnSave",
29-
value: {
30-
"source.fixAll.tslint": false,
31+
const result = convertEditorCodeActionsOnSave(
32+
{
33+
editorSettingName: "editor.codeActionsOnSave",
34+
value: {
35+
"source.fixAll.tslint": false,
36+
},
3137
},
32-
});
38+
createStubTSLintToESLintSettings(),
39+
);
3340

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

4855
test("conversion of 'source.fixAll.tslint' without touching any other 'editor.codeActionsOnSave'", () => {
49-
const result = convertEditorCodeActionsOnSave({
50-
editorSettingName: "editor.codeActionsOnSave",
51-
value: {
52-
"one-property": 42,
53-
"source.fixAll.tslint": true,
54-
"another-property": "foo",
56+
const result = convertEditorCodeActionsOnSave(
57+
{
58+
editorSettingName: "editor.codeActionsOnSave",
59+
value: {
60+
"one-property": 42,
61+
"source.fixAll.tslint": true,
62+
"another-property": "foo",
63+
},
5564
},
56-
});
65+
createStubTSLintToESLintSettings(),
66+
);
5767

5868
expect(result).toEqual({
5969
settings: [
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { convertTSLintConfigFile } from "../tslint-config-file";
2+
3+
describe(convertTSLintConfigFile, () => {
4+
test("conversion of 'tslint.configFile' when it roughly equals the ESLint file", () => {
5+
const result = convertTSLintConfigFile(
6+
{
7+
editorSettingName: "tslint.configFile",
8+
value: "./custom/tslint.json",
9+
},
10+
{ config: "./custom/eslintrc.js" },
11+
);
12+
13+
expect(result).toEqual({
14+
settings: [
15+
{
16+
editorSettingName: "eslint.options",
17+
value: { configFile: "./custom/eslintrc.js" },
18+
},
19+
],
20+
});
21+
});
22+
23+
test("conversion of 'tslint.configFile' when it does not roughly equal the ESLint file", () => {
24+
const result = convertTSLintConfigFile(
25+
{
26+
editorSettingName: "tslint.configFile",
27+
value: "./custom/tslint.json",
28+
},
29+
{ config: "./eslintrc.js" },
30+
);
31+
32+
expect(result).toEqual(undefined);
33+
});
34+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as path from "path";
2+
3+
import { EditorSettingConverter } from "../converter";
4+
5+
export const convertTSLintConfigFile: EditorSettingConverter = (
6+
originalTSLintConfigFile,
7+
settings,
8+
) => {
9+
// If the output ESLint config path doesn't roughly match the original TSLint path, skip this.
10+
const tslintPath = originalTSLintConfigFile.value;
11+
const eslintPath = settings.config;
12+
if (path.relative(path.dirname(tslintPath), path.dirname(eslintPath))) {
13+
return undefined;
14+
}
15+
16+
return {
17+
settings: [
18+
{
19+
editorSettingName: "eslint.options",
20+
value: { configFile: settings.config },
21+
},
22+
],
23+
};
24+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { convertEditorCodeActionsOnSave } from "./converters/editor-code-actions-on-save";
2+
import { convertTSLintConfigFile } from "./converters/tslint-config-file";
23

34
/**
45
* Keys TSLint property names in editor settings to their ESLint editor settings converters.
56
*/
67
export const editorSettingsConverters = new Map([
78
["editor.codeActionsOnSave", convertEditorCodeActionsOnSave],
9+
["tslint.configFile", convertTSLintConfigFile],
810
]);

src/settings.stubs.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const createStubTSLintToESLintSettings = () => ({
2+
config: "./eslintrc.js",
3+
});

0 commit comments

Comments
 (0)