Skip to content

Factor in 'raw' configurations on top of 'reported' ones #245

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
Oct 20, 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
3 changes: 1 addition & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"dependencies": {
"chalk": "2.4.2",
"commander": "3.0.2",
"strip-json-comments": "^3.0.1",
"tslint": "5.20.0",
"typescript": "3.6.3"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export type Importer = (moduleName: string) => unknown | Error;
export type NativeImporter = (moduleName: string) => unknown | Error;

export const nativeImporter = async (moduleName: string) => {
try {
Expand Down
16 changes: 13 additions & 3 deletions src/cli/main.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { EOL } from "os";

import { nativeImporter } from "../adapters/importer";
import { processLogger } from "../adapters/processLogger";
import { childProcessExec } from "../adapters/childProcessExec";
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 { removeExtendsDuplicatedRules } from "../creation/simplification/removeExtendsDuplicatedRules";
Expand All @@ -27,6 +27,7 @@ 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,
Expand All @@ -42,8 +43,17 @@ const convertRulesDependencies = {
mergers,
};

const nativeImporterDependencies: ImporterDependencies = {
fileSystem: fsFileSystem,
getCwd: () => process.cwd(),
nativeImporter: nativeImporter,
};

const boundImporter = bind(importer, nativeImporterDependencies);

const findConfigurationDependencies = {
exec: childProcessExec,
importer: boundImporter,
};

const findOriginalConfigurationsDependencies: FindOriginalConfigurationsDependencies = {
Expand All @@ -59,7 +69,7 @@ const reportConversionResultsDependencies: ReportConversionResultsDependencies =
};

const retrieveExtendsValuesDependencies: RetrieveExtendsValuesDependencies = {
importer: nativeImporter,
importer: boundImporter,
};

const simplifyPackageRulesDependencies: SimplifyPackageRulesDependencies = {
Expand Down
7 changes: 5 additions & 2 deletions src/conversion/convertConfig.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@ const createStubDependencies = (

const createStubOriginalConfigurationsData = () => ({
tslint: {
rules: [],
rulesDirectory: [],
full: {
rules: [],
rulesDirectory: [],
},
raw: {},
},
});

Expand Down
2 changes: 1 addition & 1 deletion src/conversion/convertConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export const convertConfig = async (

// 2. TSLint rules are converted into their ESLint configurations
const ruleConversionResults = dependencies.convertRules(
originalConfigurations.data.tslint.rules,
originalConfigurations.data.tslint.full.rules,
);

// 3. ESLint configurations are simplified based on extended ESLint presets
Expand Down
4 changes: 2 additions & 2 deletions src/creation/eslint/createEnv.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { OriginalConfigurations } from "../../input/findOriginalConfigurations";
import { AllOriginalConfigurations } from "../../input/findOriginalConfigurations";

export const createEnv = ({
packages,
typescript,
}: Pick<OriginalConfigurations, "packages" | "typescript">) => {
}: Pick<AllOriginalConfigurations, "packages" | "typescript">) => {
const browser =
typescript === undefined ||
typescript.compilerOptions.lib === undefined ||
Expand Down
7 changes: 5 additions & 2 deletions src/creation/formatting/formatters/formatJsOutput.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { EOL } from "os";

export const formatJsOutput = (configuration: unknown) =>
`module.exports = ${JSON.stringify(configuration, undefined, 4)};${EOL}`;
import { withKeysSorted } from "./withKeysSorted";

export const formatJsOutput = (configuration: any) => {
return `module.exports = ${JSON.stringify(withKeysSorted(configuration), undefined, 4)};${EOL}`;
};
7 changes: 5 additions & 2 deletions src/creation/formatting/formatters/formatJsonOutput.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { EOL } from "os";

export const formatJsonOutput = (configuration: unknown) =>
`${JSON.stringify(configuration, undefined, 4)}${EOL}`;
import { withKeysSorted } from "./withKeysSorted";

export const formatJsonOutput = (configuration: any) => {
return `${JSON.stringify(withKeysSorted(configuration), undefined, 4)}${EOL}`;
};
7 changes: 7 additions & 0 deletions src/creation/formatting/formatters/withKeysSorted.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export const withKeysSorted = (input: any) => {
return Object.fromEntries(
Object.keys(input)
.sort((a, b) => a.localeCompare(b))
.map(key => [key, input[key]]),
);
};
36 changes: 19 additions & 17 deletions src/creation/simplification/retrieveExtendsValues.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,18 @@
import { Importer } from "../../adapters/importer";
import { SansDependencies } from "../../binding";
import { ConfigurationError } from "../../errors/configurationError";
import { ESLintConfiguration } from "../../input/findESLintConfiguration";
import { importer } from "../../input/importer";
import { resolveExtensionNames } from "./resolveExtensionNames";

export type RetrieveExtendsValuesDependencies = {
importer: Importer;
importer: SansDependencies<typeof importer>;
};

export type RetrievedExtensionValues = {
configurationErrors: ConfigurationError[];
importedExtensions: Partial<ESLintConfiguration>[];
};

const builtInExtensionGetters = new Map<
string,
(importer: Importer) => Promise<ESLintConfiguration>
>([
[
"eslint:all",
async importer => (await importer("eslint/conf/eslint-all")) as ESLintConfiguration,
],
[
"eslint:recommended",
async importer => (await importer("eslint/conf/eslint-recommended")) as ESLintConfiguration,
],
]);

export const retrieveExtendsValues = async (
dependencies: RetrieveExtendsValuesDependencies,
rawExtensionNames: string | string[],
Expand All @@ -34,11 +21,26 @@ export const retrieveExtendsValues = async (
const configurationErrors: ConfigurationError[] = [];
const extensionNames = resolveExtensionNames(rawExtensionNames);

const builtInExtensionGetters = new Map<string, () => Promise<ESLintConfiguration>>([
[
"eslint:all",
async () =>
(await dependencies.importer("eslint/conf/eslint-all")) as ESLintConfiguration,
],
[
"eslint:recommended",
async () =>
(await dependencies.importer(
"eslint/conf/eslint-recommended",
)) as ESLintConfiguration,
],
]);

await Promise.all(
extensionNames.map(async extensionName => {
const getBuiltInExtension = builtInExtensionGetters.get(extensionName);
if (getBuiltInExtension !== undefined) {
importedExtensions.push(await getBuiltInExtension(dependencies.importer));
importedExtensions.push(await getBuiltInExtension());
return;
}

Expand Down
33 changes: 10 additions & 23 deletions src/creation/simplification/simplifyPackageRules.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ const createStubDependencies = () => ({
retrieveExtendsValues: jest.fn(),
});

const createStubESLintConfiguration = (fullExtends: string | string[]) => ({
full: {
env: {},
extends: fullExtends,
rules: {},
},
});

describe("simplifyPackageRules", () => {
it("returns the conversion results directly when there is no loaded eslint configuration", async () => {
// Arrange
Expand All @@ -26,29 +34,10 @@ describe("simplifyPackageRules", () => {
expect(simplifiedResults).toBe(ruleConversionResults);
});

it("returns the conversion results directly when the eslint configuration doesn't extend", async () => {
// Arrange
const dependencies = createStubDependencies();
const eslint = {};
const ruleConversionResults = createEmptyConversionResults();

// Act
const simplifiedResults = await simplifyPackageRules(
dependencies,
eslint,
ruleConversionResults,
);

// Assert
expect(simplifiedResults).toBe(ruleConversionResults);
});

it("returns the conversion results directly when the eslint configuration has an empty extends", async () => {
// Arrange
const dependencies = createStubDependencies();
const eslint = {
extends: [],
};
const eslint = createStubESLintConfiguration([]);
const ruleConversionResults = createEmptyConversionResults();

// Act
Expand Down Expand Up @@ -82,9 +71,7 @@ describe("simplifyPackageRules", () => {
importedExtensions: [],
}),
};
const eslint = {
extends: ["extension-name"],
};
const eslint = createStubESLintConfiguration(["extension-name"]);
const ruleConversionResults = createEmptyConversionResults();

// Act
Expand Down
7 changes: 4 additions & 3 deletions src/creation/simplification/simplifyPackageRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { RuleConversionResults } from "../../rules/convertRules";
import { removeExtendsDuplicatedRules } from "./removeExtendsDuplicatedRules";
import { retrieveExtendsValues } from "./retrieveExtendsValues";
import { ESLintConfiguration } from "../../input/findESLintConfiguration";
import { OriginalConfigurations } from "../../input/findOriginalConfigurations";

export type SimplifyPackageRulesDependencies = {
removeExtendsDuplicatedRules: typeof removeExtendsDuplicatedRules;
Expand All @@ -13,15 +14,15 @@ export type SimplifiedRuleConversionResults = Pick<RuleConversionResults, "conve

export const simplifyPackageRules = async (
dependencies: SimplifyPackageRulesDependencies,
eslint: Partial<ESLintConfiguration> | undefined,
eslint: Pick<OriginalConfigurations<ESLintConfiguration>, "full"> | undefined,
ruleConversionResults: SimplifiedRuleConversionResults,
): Promise<SimplifiedRuleConversionResults> => {
if (eslint === undefined || eslint.extends === undefined || eslint.extends.length === 0) {
if (eslint === undefined || eslint.full.extends.length === 0) {
return ruleConversionResults;
}

const { configurationErrors, importedExtensions } = await dependencies.retrieveExtendsValues(
eslint.extends,
eslint.full.extends,
);

const converted = dependencies.removeExtendsDuplicatedRules(
Expand Down
Loading