Skip to content

Stopped erroring when .vscode/settings.json doesn't exist #304

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 2 commits into from
Dec 24, 2019
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
1 change: 1 addition & 0 deletions src/cli/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ const findConfigurationDependencies = {
};

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

Expand Down
7 changes: 1 addition & 6 deletions src/cli/runCli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { version } from "../../package.json";
import { Logger } from "../adapters/logger";
import { SansDependencies } from "../binding";
import { convertConfig } from "../conversion/convertConfig";
import { DEFAULT_VSCODE_SETTINGS_PATH } from "../input/vsCodeSettings";
import { ResultStatus, ResultWithStatus, TSLintToESLintSettings } from "../types";

export type RunCliDependencies = {
Expand All @@ -25,11 +24,7 @@ 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("--editor [editor]", "editor configuration file to convert")
.option("-V --version", "output the package version");

const parsedArgv = {
Expand Down
44 changes: 22 additions & 22 deletions src/conversion/convertEditorConfig.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,21 @@ const createStubDependencies = (
});

describe("convertEditorConfig", () => {
it("returns a success result when there is no original configuration", async () => {
// Arrange
const dependencies = createStubDependencies({
findEditorConfiguration: async () => undefined,
});

// Act
const result = await convertEditorConfig(dependencies, stubSettings);

// Assert
expect(result).toEqual({
status: ResultStatus.Succeeded,
});
});

it("returns the failure result when finding the original configurations fails", async () => {
// Arrange
const error = new Error();
Expand All @@ -28,7 +43,10 @@ describe("convertEditorConfig", () => {
};

const dependencies = createStubDependencies({
findEditorConfiguration: async () => error,
findEditorConfiguration: async () => ({
configPath: "",
result: error,
}),
});

// Act
Expand Down Expand Up @@ -59,14 +77,12 @@ describe("convertEditorConfig", () => {
// Arrange
const originalConfig = {
"typescript.tsdk": "node_modules/typescript/lib",
"editor.tabSize": 4,
"editor.codeActionsOnSave": {
"source.organizeImports": false,
},
};

const dependencies = createStubDependencies({
findEditorConfiguration: jest.fn().mockResolvedValue(originalConfig),
findEditorConfiguration: jest.fn().mockResolvedValue({
result: originalConfig,
}),
});

// Act
Expand Down Expand Up @@ -113,20 +129,4 @@ describe("convertEditorConfig", () => {
status: ResultStatus.Succeeded,
});
});

it("uses VS Code default settings path if editor config parameter is undefined", async () => {
// Arrange
const expectedEditorPath = ".vscode/settings.json";
const settings = {
config: "./eslintrc.js",
};

const dependencies = createStubDependencies();

// Act
await convertEditorConfig(dependencies, settings);

// Assert
expect(dependencies.findEditorConfiguration).toHaveBeenCalledWith(expectedEditorPath);
});
});
25 changes: 12 additions & 13 deletions src/conversion/convertEditorConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { SansDependencies } from "../binding";
import { writeConversionResults } from "../creation/writeEditorConfigConversionResults";
import { convertEditorSettings } from "../editorSettings/convertEditorSettings";
import { findEditorConfiguration } from "../input/findEditorConfiguration";
import { DEFAULT_VSCODE_SETTINGS_PATH } from "../input/vsCodeSettings";
import { reportEditorSettingConversionResults } from "../reporting/reportEditorSettingConversionResults";
import { ResultStatus, ResultWithStatus, TSLintToESLintSettings } from "../types";

Expand All @@ -20,26 +19,26 @@ export const convertEditorConfig = async (
dependencies: ConvertEditorConfigDependencies,
settings: TSLintToESLintSettings,
): Promise<ResultWithStatus> => {
const editorConfigPath = settings.editor ? settings.editor : DEFAULT_VSCODE_SETTINGS_PATH;
const originalEditorConfiguration = await dependencies.findEditorConfiguration(
editorConfigPath,
);
if (originalEditorConfiguration instanceof Error) {
const conversion = await dependencies.findEditorConfiguration(settings.editor);
if (conversion === undefined) {
return {
status: ResultStatus.Succeeded,
};
}

if (conversion.result instanceof Error) {
return {
errors: [originalEditorConfiguration],
errors: [conversion.result],
status: ResultStatus.Failed,
};
}

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

const outputPath = editorConfigPath;
const fileWriteError = await dependencies.writeConversionResults(
outputPath,
conversion.configPath,
settingConversionResults,
originalEditorConfiguration,
conversion.result,
);
if (fileWriteError !== undefined) {
return {
Expand Down
73 changes: 60 additions & 13 deletions src/input/findEditorConfiguration.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { createStubFileSystem } from "../adapters/fileSystem.stub";
import {
findEditorConfiguration,
FindEditorConfigurationDependencies,
} from "./findEditorConfiguration";
import { DEFAULT_VSCODE_SETTINGS_PATH } from "./vsCodeSettings";

const stubConfigPath = "temp/";

Expand All @@ -10,10 +12,46 @@ export const createStubImporter = (filePath = "") =>

const createStubDependencies = (overrides: Partial<FindEditorConfigurationDependencies> = {}) => ({
importer: createStubImporter(stubConfigPath),
fileSystem: createStubFileSystem(),
...overrides,
});

describe("findEditorConfiguration", () => {
it("returns undefined when the file is not specified and does not exist", async () => {
// Arrange
const dependencies = createStubDependencies({
fileSystem: {
fileExists: async () => false,
},
});

// Act
const result = await findEditorConfiguration(dependencies, undefined);

// Assert
expect(result).toEqual(undefined);
});

it("returns an error when the file is specified and does not exist", async () => {
// Arrange
const dependencies = createStubDependencies({
fileSystem: {
fileExists: async () => false,
},
});

// Act
const result = await findEditorConfiguration(dependencies, stubConfigPath);

// Assert
expect(result).toEqual({
configPath: stubConfigPath,
result: expect.objectContaining({
message: `Could not find editor configuration under '${stubConfigPath}'.`,
}),
});
});

it("returns an error when importer returns one", async () => {
// Arrange
const message = "error";
Expand All @@ -27,11 +65,12 @@ describe("findEditorConfiguration", () => {
const result = await findEditorConfiguration(dependencies, stubConfigPath);

// Assert
expect(result).toEqual(
expect.objectContaining({
expect(result).toEqual({
configPath: stubConfigPath,
result: expect.objectContaining({
message,
}),
);
});
});

it("reads from the given configuration path when one is provided", async () => {
Expand All @@ -46,25 +85,30 @@ describe("findEditorConfiguration", () => {
expect(dependencies.importer).toHaveBeenLastCalledWith(configPath);
});

it("defaults to VS Code editor settings path when config path isn't provided", async () => {
it("parses object from the default VS Code configuration path when the file is not specified and read successfully", async () => {
// Arrange
const dependencies = createStubDependencies();
const originalConfig = {
"typescript.tsdk": "node_modules/typescript/lib",
};

const dependencies = createStubDependencies({
importer: async () => originalConfig,
});

// Act
await findEditorConfiguration(dependencies, undefined);
const result = await findEditorConfiguration(dependencies, undefined);

// Assert
expect(dependencies.importer).toHaveBeenLastCalledWith(".vscode/settings.json");
expect(result).toEqual({
configPath: DEFAULT_VSCODE_SETTINGS_PATH,
result: originalConfig,
});
});

it("parses object from configuration path when read successfully", async () => {
it("parses object from configuration path when the file is specified and read successfully", async () => {
// Arrange
const originalConfig = {
"typescript.tsdk": "node_modules/typescript/lib",
"editor.tabSize": 4,
"editor.codeActionsOnSave": {
"source.organizeImports": false,
},
};

const dependencies = createStubDependencies({
Expand All @@ -75,6 +119,9 @@ describe("findEditorConfiguration", () => {
const result = await findEditorConfiguration(dependencies, stubConfigPath);

// Assert
expect(result).toEqual(originalConfig);
expect(result).toEqual({
configPath: stubConfigPath,
result: originalConfig,
});
});
});
29 changes: 23 additions & 6 deletions src/input/findEditorConfiguration.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { FileSystem } from "../adapters/fileSystem";
import { SansDependencies } from "../binding";
import { EditorConfiguration } from "./editorConfiguration";
import { findRawConfiguration } from "./findRawConfiguration";
Expand All @@ -6,18 +7,34 @@ import { importer } from "./importer";
import { DEFAULT_VSCODE_SETTINGS_PATH } from "./vsCodeSettings";

export type FindEditorConfigurationDependencies = {
fileSystem: Pick<FileSystem, "fileExists">;
importer: SansDependencies<typeof importer>;
};

export const findEditorConfiguration = async (
dependencies: FindEditorConfigurationDependencies,
config: string | undefined,
): Promise<DeepPartial<EditorConfiguration> | Error> => {
const filePath = config ?? DEFAULT_VSCODE_SETTINGS_PATH;
const rawConfiguration = await findRawConfiguration<DeepPartial<EditorConfiguration>>(
specifiedConfigPath: string | undefined,
) => {
const attemptingConfigPath = specifiedConfigPath ?? DEFAULT_VSCODE_SETTINGS_PATH;

if (!(await dependencies.fileSystem.fileExists(attemptingConfigPath))) {
return specifiedConfigPath === undefined
? undefined
: {
configPath: attemptingConfigPath,
result: new Error(
`Could not find editor configuration under '${attemptingConfigPath}'.`,
),
};
}

const result = await findRawConfiguration<DeepPartial<EditorConfiguration>>(
dependencies.importer,
filePath,
attemptingConfigPath,
);

return rawConfiguration;
return {
configPath: attemptingConfigPath,
result,
};
};