Skip to content

Commit f77f533

Browse files
author
Josh Goldberg
authored
Opt-in Atom editor conversion (#728)
* WIP: Atom editor conversion * Continue refactor: merging, and reporting updates * Added back missing reporting * Use a more tolerant endsWith
1 parent 1401580 commit f77f533

35 files changed

+737
-1157
lines changed

package-lock.json

Lines changed: 22 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
"dependencies": {
1313
"chalk": "4.1.0",
1414
"commander": "6.1.0",
15+
"cson-parser": "^4.0.5",
1516
"eslint-config-prettier": "6.13.0",
1617
"glob": "7.1.6",
18+
"lodash": "^4.17.20",
1719
"minimatch": "3.0.4",
1820
"strip-json-comments": "3.1.1",
1921
"tslint": "6.1.3",
@@ -28,6 +30,7 @@
2830
"@types/eslint-config-prettier": "6.11.0",
2931
"@types/glob": "7.1.3",
3032
"@types/jest": "26.0.14",
33+
"@types/lodash": "^4.14.162",
3134
"@types/minimatch": "3.0.3",
3235
"@types/node": "12.12.21",
3336
"@typescript-eslint/eslint-plugin": "4.4.1",

src/cli/main.ts

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,7 @@ import {
1414
ReportCommentResultsDependencies,
1515
reportCommentResults,
1616
} from "../converters/comments/reporting/reportCommentResults";
17-
import {
18-
ConvertEditorConfigDependencies,
19-
convertEditorConfig,
20-
} from "../converters/editorConfigs/convertEditorConfig";
21-
import {
22-
ConvertEditorSettingsDependencies,
23-
convertEditorSettings,
24-
} from "../converters/editorConfigs/convertEditorSettings";
25-
import { editorSettingsConverters } from "../converters/editorConfigs/editorSettingsConverters";
26-
import { reportEditorSettingConversionResults } from "../converters/editorConfigs/reporting/reportEditorSettingConversionResults";
17+
import { convertEditorConfig } from "../converters/editorConfigs/convertEditorConfig";
2718
import {
2819
ConvertLintConfigDependencies,
2920
convertLintConfig,
@@ -44,6 +35,14 @@ import {
4435
ConvertFileCommentsDependencies,
4536
convertFileComments,
4637
} from "../converters/comments/convertFileComments";
38+
import {
39+
convertEditorConfigs,
40+
ConvertEditorConfigsDependencies,
41+
} from "../converters/editorConfigs/convertEditorConfigs";
42+
import { convertAtomConfig } from "../converters/editorConfigs/converters/convertAtomConfig";
43+
import { convertVSCodeConfig } from "../converters/editorConfigs/converters/convertVSCodeConfig";
44+
import { reportEditorConfigConversionResults } from "../converters/editorConfigs/reporting/reportEditorConfigConversionResults";
45+
import { EditorConfigDescriptor } from "../converters/editorConfigs/types";
4746
import {
4847
ConvertRulesDependencies,
4948
convertRules,
@@ -67,17 +66,12 @@ import {
6766
} from "../converters/lintConfigs/reporting/packages/logMissingPackages";
6867
import { runCli, RunCliDependencies } from "./runCli";
6968
import { ruleMergers } from "../converters/lintConfigs/rules/ruleMergers";
70-
import { writeEditorConfigConversionResults } from "../converters/lintConfigs/writeEditorConfigConversionResults";
7169
import { checkPrettierExtension } from "../converters/lintConfigs/summarization/prettier/checkPrettierExtension";
7270
import { removeExtendsDuplicatedRules } from "../converters/lintConfigs/pruning/removeExtendsDuplicatedRules";
7371
import {
7472
ExtractGlobPathsDependencies,
7573
extractGlobPaths,
7674
} from "../converters/comments/extractGlobPaths";
77-
import {
78-
findEditorConfiguration,
79-
FindEditorConfigurationDependencies,
80-
} from "../input/findEditorConfiguration";
8175
import { findESLintConfiguration } from "../input/findESLintConfiguration";
8276
import {
8377
findOriginalConfigurations,
@@ -103,10 +97,6 @@ const convertRulesDependencies: ConvertRulesDependencies = {
10397
ruleMergers,
10498
};
10599

106-
const convertEditorSettingsDependencies: ConvertEditorSettingsDependencies = {
107-
converters: editorSettingsConverters,
108-
};
109-
110100
const nativeImporterDependencies: ImporterDependencies = {
111101
fileSystem: fsFileSystem,
112102
getCwd: () => process.cwd(),
@@ -120,11 +110,6 @@ const findConfigurationDependencies = {
120110
importer: boundImporter,
121111
};
122112

123-
const findEditorConfigurationDependencies: FindEditorConfigurationDependencies = {
124-
fileSystem: fsFileSystem,
125-
importer: boundImporter,
126-
};
127-
128113
const findOriginalConfigurationsDependencies: FindOriginalConfigurationsDependencies = {
129114
findESLintConfiguration: bind(findESLintConfiguration, findConfigurationDependencies),
130115
findPackagesConfiguration: bind(findPackagesConfiguration, findConfigurationDependencies),
@@ -175,20 +160,26 @@ const writeConversionResultsDependencies: WriteConversionResultsDependencies = {
175160
fileSystem: fsFileSystem,
176161
};
177162

178-
const reportEditorSettingConversionResultsDependencies = {
163+
const editorConfigDescriptors: EditorConfigDescriptor[] = [
164+
[".atom/config.cson", convertAtomConfig],
165+
[".vscode/settings.json", convertVSCodeConfig],
166+
];
167+
168+
const convertEditorConfigDependencies = {
169+
editorConfigDescriptors,
170+
fileSystem: fsFileSystem,
171+
};
172+
173+
const reportEditorConfigConversionResultsDependencies = {
179174
logger: processLogger,
180175
};
181176

182-
const convertEditorConfigDependencies: ConvertEditorConfigDependencies = {
183-
findEditorConfiguration: bind(findEditorConfiguration, findEditorConfigurationDependencies),
184-
convertEditorSettings: bind(convertEditorSettings, convertEditorSettingsDependencies),
185-
reportEditorSettingConversionResults: bind(
186-
reportEditorSettingConversionResults,
187-
reportEditorSettingConversionResultsDependencies,
188-
),
189-
writeEditorConfigConversionResults: bind(
190-
writeEditorConfigConversionResults,
191-
writeConversionResultsDependencies,
177+
const convertEditorConfigsDependencies: ConvertEditorConfigsDependencies = {
178+
convertEditorConfig: bind(convertEditorConfig, convertEditorConfigDependencies),
179+
editorConfigDescriptors,
180+
reportEditorConfigConversionResults: bind(
181+
reportEditorConfigConversionResults,
182+
reportEditorConfigConversionResultsDependencies,
192183
),
193184
};
194185

@@ -209,7 +200,7 @@ const convertLintConfigDependencies: ConvertLintConfigDependencies = {
209200
const runCliDependencies: RunCliDependencies = {
210201
converters: [
211202
bind(convertLintConfig, convertLintConfigDependencies),
212-
bind(convertEditorConfig, convertEditorConfigDependencies),
203+
bind(convertEditorConfigs, convertEditorConfigsDependencies),
213204
bind(convertComments, convertCommentsDependencies),
214205
],
215206
findOriginalConfigurations: bind(
Lines changed: 39 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,137 +1,69 @@
1-
import { ResultStatus, FailedResult } from "../../types";
2-
import { convertEditorConfig, ConvertEditorConfigDependencies } from "./convertEditorConfig";
3-
import { createEmptyEditorSettingConversionResults } from "./editorConversionResults.stubs";
4-
import { EditorSetting } from "./types";
1+
import { convertEditorConfig } from "./convertEditorConfig";
2+
3+
const stubPath = "./vscode/settings.json";
54

65
const stubSettings = {
7-
config: "./eslintrc.js",
8-
editor: "./my-editor/settings.json",
6+
config: ".eslintrc.js",
97
};
108

11-
const createStubDependencies = (
12-
overrides: Partial<ConvertEditorConfigDependencies> = {},
13-
): ConvertEditorConfigDependencies => ({
14-
convertEditorSettings: jest.fn(),
15-
findEditorConfiguration: jest.fn().mockResolvedValue({}),
16-
reportEditorSettingConversionResults: jest.fn(),
17-
writeEditorConfigConversionResults: jest.fn().mockReturnValue(Promise.resolve()),
18-
...overrides,
19-
});
20-
219
describe("convertEditorConfig", () => {
22-
it("returns a success result when there is no original configuration", async () => {
23-
// Arrange
24-
const dependencies = createStubDependencies({
25-
findEditorConfiguration: async () => undefined,
26-
});
27-
28-
// Act
29-
const result = await convertEditorConfig(dependencies, stubSettings);
30-
31-
// Assert
32-
expect(result).toEqual({
33-
status: ResultStatus.Succeeded,
34-
});
35-
});
36-
37-
it("returns the failure result when finding the original configurations fails", async () => {
10+
it("returns an error when reading the file fails", async () => {
3811
// Arrange
39-
const error = new Error();
40-
const findError: FailedResult = {
41-
errors: [error],
42-
status: ResultStatus.Failed,
12+
const error = new Error("Oh no");
13+
const dependencies = {
14+
fileSystem: {
15+
readFile: jest.fn().mockResolvedValue(error),
16+
writeFile: jest.fn(),
17+
},
4318
};
4419

45-
const dependencies = createStubDependencies({
46-
findEditorConfiguration: async () => ({
47-
configPath: "",
48-
result: error,
49-
}),
50-
});
51-
5220
// Act
53-
const result = await convertEditorConfig(dependencies, stubSettings);
21+
const result = await convertEditorConfig(dependencies, jest.fn(), stubPath, stubSettings);
5422

5523
// Assert
56-
expect(result).toEqual(findError);
24+
expect(result).toEqual(error);
5725
});
5826

59-
it("returns the failure result when writing to the configuration file fails", async () => {
27+
it("returns an error when writing to a file fails", async () => {
6028
// Arrange
61-
const fileWriteError = new Error();
62-
const dependencies = createStubDependencies({
63-
writeEditorConfigConversionResults: jest.fn().mockResolvedValueOnce(fileWriteError),
29+
const originalFileContents = "Hello";
30+
const error = new Error("Oh no!");
31+
const converter = (input: string) => ({
32+
contents: `${input} world!`,
33+
missing: [],
6434
});
65-
66-
// Act
67-
const result = await convertEditorConfig(dependencies, stubSettings);
68-
69-
// Assert
70-
expect(result).toEqual({
71-
errors: [fileWriteError],
72-
status: ResultStatus.Failed,
73-
});
74-
});
75-
76-
it("converts conversion results when finding the original configurations succeeds", async () => {
77-
// Arrange
78-
const originalConfig = {
79-
"typescript.tsdk": "node_modules/typescript/lib",
35+
const dependencies = {
36+
fileSystem: {
37+
readFile: jest.fn().mockResolvedValue(originalFileContents),
38+
writeFile: jest.fn().mockResolvedValue(error),
39+
},
8040
};
8141

82-
const dependencies = createStubDependencies({
83-
findEditorConfiguration: jest.fn().mockResolvedValue({
84-
result: originalConfig,
85-
}),
86-
});
87-
8842
// Act
89-
await convertEditorConfig(dependencies, stubSettings);
43+
const result = await convertEditorConfig(dependencies, converter, stubPath, stubSettings);
9044

9145
// Assert
92-
expect(dependencies.convertEditorSettings).toHaveBeenCalledWith(
93-
originalConfig,
94-
stubSettings,
95-
);
46+
expect(result).toEqual(error);
9647
});
9748

98-
it("reports conversion results when settings are converted successfully", async () => {
49+
it("returns the conversion data when writing to a file succeeds", async () => {
9950
// Arrange
100-
const conversionResults = createEmptyEditorSettingConversionResults({
101-
converted: new Map<string, EditorSetting>([
102-
[
103-
"tslint-editor-setting-one",
104-
{
105-
editorSettingName: "tslint-editor-setting-one",
106-
value: 42,
107-
},
108-
],
109-
]),
110-
});
111-
112-
const dependencies = createStubDependencies({
113-
convertEditorSettings: jest.fn().mockReturnValue(conversionResults),
51+
const originalFileContents = "Hello";
52+
const converter = (input: string) => ({
53+
contents: `${input} world!`,
54+
missing: [],
11455
});
56+
const dependencies = {
57+
fileSystem: {
58+
readFile: jest.fn().mockResolvedValue(originalFileContents),
59+
writeFile: jest.fn().mockResolvedValue(undefined),
60+
},
61+
};
11562

11663
// Act
117-
await convertEditorConfig(dependencies, stubSettings);
118-
119-
// Assert
120-
expect(dependencies.reportEditorSettingConversionResults).toHaveBeenCalledWith(
121-
conversionResults,
122-
);
123-
});
124-
125-
it("returns a successful result when finding the original configurations succeeds", async () => {
126-
// Arrange
127-
const dependencies = createStubDependencies();
128-
129-
// Act
130-
const result = await convertEditorConfig(dependencies, stubSettings);
64+
const result = await convertEditorConfig(dependencies, converter, stubPath, stubSettings);
13165

13266
// Assert
133-
expect(result).toEqual({
134-
status: ResultStatus.Succeeded,
135-
});
67+
expect(result).toEqual(converter(originalFileContents));
13668
});
13769
});

0 commit comments

Comments
 (0)