Skip to content

Commit b7945eb

Browse files
author
Josh Goldberg
authored
Factor in 'raw' configurations on top of 'reported' ones (#245)
* WIP: Factor in 'raw' configurations on top of 'reported' ones * Added test coverage and finished sorting output keys * Added a bit of JSDoc documentation * Undid annoying src/rules/converters/no-implicit-dependencies.ts Prettier mismatch
1 parent 3351415 commit b7945eb

33 files changed

+773
-209
lines changed

package-lock.json

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"dependencies": {
1010
"chalk": "2.4.2",
1111
"commander": "3.0.2",
12+
"strip-json-comments": "^3.0.1",
1213
"tslint": "5.20.0",
1314
"typescript": "3.6.3"
1415
},

src/adapters/importer.ts renamed to src/adapters/nativeImporter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type Importer = (moduleName: string) => unknown | Error;
1+
export type NativeImporter = (moduleName: string) => unknown | Error;
22

33
export const nativeImporter = async (moduleName: string) => {
44
try {

src/cli/main.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { EOL } from "os";
22

3-
import { nativeImporter } from "../adapters/importer";
4-
import { processLogger } from "../adapters/processLogger";
53
import { childProcessExec } from "../adapters/childProcessExec";
64
import { fsFileSystem } from "../adapters/fsFileSystem";
5+
import { nativeImporter } from "../adapters/nativeImporter";
6+
import { processLogger } from "../adapters/processLogger";
77
import { bind } from "../binding";
88
import { ConvertConfigDependencies, convertConfig } from "../conversion/convertConfig";
99
import { removeExtendsDuplicatedRules } from "../creation/simplification/removeExtendsDuplicatedRules";
@@ -27,6 +27,7 @@ import { findPackagesConfiguration } from "../input/findPackagesConfiguration";
2727
import { findESLintConfiguration } from "../input/findESLintConfiguration";
2828
import { findTSLintConfiguration } from "../input/findTSLintConfiguration";
2929
import { findTypeScriptConfiguration } from "../input/findTypeScriptConfiguration";
30+
import { importer, ImporterDependencies } from "../input/importer";
3031
import { mergeLintConfigurations } from "../input/mergeLintConfigurations";
3132
import {
3233
reportConversionResults,
@@ -42,8 +43,17 @@ const convertRulesDependencies = {
4243
mergers,
4344
};
4445

46+
const nativeImporterDependencies: ImporterDependencies = {
47+
fileSystem: fsFileSystem,
48+
getCwd: () => process.cwd(),
49+
nativeImporter: nativeImporter,
50+
};
51+
52+
const boundImporter = bind(importer, nativeImporterDependencies);
53+
4554
const findConfigurationDependencies = {
4655
exec: childProcessExec,
56+
importer: boundImporter,
4757
};
4858

4959
const findOriginalConfigurationsDependencies: FindOriginalConfigurationsDependencies = {
@@ -59,7 +69,7 @@ const reportConversionResultsDependencies: ReportConversionResultsDependencies =
5969
};
6070

6171
const retrieveExtendsValuesDependencies: RetrieveExtendsValuesDependencies = {
62-
importer: nativeImporter,
72+
importer: boundImporter,
6373
};
6474

6575
const simplifyPackageRulesDependencies: SimplifyPackageRulesDependencies = {

src/conversion/convertConfig.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ const createStubDependencies = (
2121

2222
const createStubOriginalConfigurationsData = () => ({
2323
tslint: {
24-
rules: [],
25-
rulesDirectory: [],
24+
full: {
25+
rules: [],
26+
rulesDirectory: [],
27+
},
28+
raw: {},
2629
},
2730
});
2831

src/conversion/convertConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const convertConfig = async (
3030

3131
// 2. TSLint rules are converted into their ESLint configurations
3232
const ruleConversionResults = dependencies.convertRules(
33-
originalConfigurations.data.tslint.rules,
33+
originalConfigurations.data.tslint.full.rules,
3434
);
3535

3636
// 3. ESLint configurations are simplified based on extended ESLint presets

src/creation/eslint/createEnv.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { OriginalConfigurations } from "../../input/findOriginalConfigurations";
1+
import { AllOriginalConfigurations } from "../../input/findOriginalConfigurations";
22

33
export const createEnv = ({
44
packages,
55
typescript,
6-
}: Pick<OriginalConfigurations, "packages" | "typescript">) => {
6+
}: Pick<AllOriginalConfigurations, "packages" | "typescript">) => {
77
const browser =
88
typescript === undefined ||
99
typescript.compilerOptions.lib === undefined ||
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import { EOL } from "os";
22

3-
export const formatJsOutput = (configuration: unknown) =>
4-
`module.exports = ${JSON.stringify(configuration, undefined, 4)};${EOL}`;
3+
import { withKeysSorted } from "./withKeysSorted";
4+
5+
export const formatJsOutput = (configuration: any) => {
6+
return `module.exports = ${JSON.stringify(withKeysSorted(configuration), undefined, 4)};${EOL}`;
7+
};
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import { EOL } from "os";
22

3-
export const formatJsonOutput = (configuration: unknown) =>
4-
`${JSON.stringify(configuration, undefined, 4)}${EOL}`;
3+
import { withKeysSorted } from "./withKeysSorted";
4+
5+
export const formatJsonOutput = (configuration: any) => {
6+
return `${JSON.stringify(withKeysSorted(configuration), undefined, 4)}${EOL}`;
7+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const withKeysSorted = (input: any) => {
2+
return Object.fromEntries(
3+
Object.keys(input)
4+
.sort((a, b) => a.localeCompare(b))
5+
.map(key => [key, input[key]]),
6+
);
7+
};

src/creation/simplification/retrieveExtendsValues.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,18 @@
1-
import { Importer } from "../../adapters/importer";
1+
import { SansDependencies } from "../../binding";
22
import { ConfigurationError } from "../../errors/configurationError";
33
import { ESLintConfiguration } from "../../input/findESLintConfiguration";
4+
import { importer } from "../../input/importer";
45
import { resolveExtensionNames } from "./resolveExtensionNames";
56

67
export type RetrieveExtendsValuesDependencies = {
7-
importer: Importer;
8+
importer: SansDependencies<typeof importer>;
89
};
910

1011
export type RetrievedExtensionValues = {
1112
configurationErrors: ConfigurationError[];
1213
importedExtensions: Partial<ESLintConfiguration>[];
1314
};
1415

15-
const builtInExtensionGetters = new Map<
16-
string,
17-
(importer: Importer) => Promise<ESLintConfiguration>
18-
>([
19-
[
20-
"eslint:all",
21-
async importer => (await importer("eslint/conf/eslint-all")) as ESLintConfiguration,
22-
],
23-
[
24-
"eslint:recommended",
25-
async importer => (await importer("eslint/conf/eslint-recommended")) as ESLintConfiguration,
26-
],
27-
]);
28-
2916
export const retrieveExtendsValues = async (
3017
dependencies: RetrieveExtendsValuesDependencies,
3118
rawExtensionNames: string | string[],
@@ -34,11 +21,26 @@ export const retrieveExtendsValues = async (
3421
const configurationErrors: ConfigurationError[] = [];
3522
const extensionNames = resolveExtensionNames(rawExtensionNames);
3623

24+
const builtInExtensionGetters = new Map<string, () => Promise<ESLintConfiguration>>([
25+
[
26+
"eslint:all",
27+
async () =>
28+
(await dependencies.importer("eslint/conf/eslint-all")) as ESLintConfiguration,
29+
],
30+
[
31+
"eslint:recommended",
32+
async () =>
33+
(await dependencies.importer(
34+
"eslint/conf/eslint-recommended",
35+
)) as ESLintConfiguration,
36+
],
37+
]);
38+
3739
await Promise.all(
3840
extensionNames.map(async extensionName => {
3941
const getBuiltInExtension = builtInExtensionGetters.get(extensionName);
4042
if (getBuiltInExtension !== undefined) {
41-
importedExtensions.push(await getBuiltInExtension(dependencies.importer));
43+
importedExtensions.push(await getBuiltInExtension());
4244
return;
4345
}
4446

src/creation/simplification/simplifyPackageRules.test.ts

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ const createStubDependencies = () => ({
88
retrieveExtendsValues: jest.fn(),
99
});
1010

11+
const createStubESLintConfiguration = (fullExtends: string | string[]) => ({
12+
full: {
13+
env: {},
14+
extends: fullExtends,
15+
rules: {},
16+
},
17+
});
18+
1119
describe("simplifyPackageRules", () => {
1220
it("returns the conversion results directly when there is no loaded eslint configuration", async () => {
1321
// Arrange
@@ -26,29 +34,10 @@ describe("simplifyPackageRules", () => {
2634
expect(simplifiedResults).toBe(ruleConversionResults);
2735
});
2836

29-
it("returns the conversion results directly when the eslint configuration doesn't extend", async () => {
30-
// Arrange
31-
const dependencies = createStubDependencies();
32-
const eslint = {};
33-
const ruleConversionResults = createEmptyConversionResults();
34-
35-
// Act
36-
const simplifiedResults = await simplifyPackageRules(
37-
dependencies,
38-
eslint,
39-
ruleConversionResults,
40-
);
41-
42-
// Assert
43-
expect(simplifiedResults).toBe(ruleConversionResults);
44-
});
45-
4637
it("returns the conversion results directly when the eslint configuration has an empty extends", async () => {
4738
// Arrange
4839
const dependencies = createStubDependencies();
49-
const eslint = {
50-
extends: [],
51-
};
40+
const eslint = createStubESLintConfiguration([]);
5241
const ruleConversionResults = createEmptyConversionResults();
5342

5443
// Act
@@ -82,9 +71,7 @@ describe("simplifyPackageRules", () => {
8271
importedExtensions: [],
8372
}),
8473
};
85-
const eslint = {
86-
extends: ["extension-name"],
87-
};
74+
const eslint = createStubESLintConfiguration(["extension-name"]);
8875
const ruleConversionResults = createEmptyConversionResults();
8976

9077
// Act

src/creation/simplification/simplifyPackageRules.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { RuleConversionResults } from "../../rules/convertRules";
33
import { removeExtendsDuplicatedRules } from "./removeExtendsDuplicatedRules";
44
import { retrieveExtendsValues } from "./retrieveExtendsValues";
55
import { ESLintConfiguration } from "../../input/findESLintConfiguration";
6+
import { OriginalConfigurations } from "../../input/findOriginalConfigurations";
67

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

1415
export const simplifyPackageRules = async (
1516
dependencies: SimplifyPackageRulesDependencies,
16-
eslint: Partial<ESLintConfiguration> | undefined,
17+
eslint: Pick<OriginalConfigurations<ESLintConfiguration>, "full"> | undefined,
1718
ruleConversionResults: SimplifiedRuleConversionResults,
1819
): Promise<SimplifiedRuleConversionResults> => {
19-
if (eslint === undefined || eslint.extends === undefined || eslint.extends.length === 0) {
20+
if (eslint === undefined || eslint.full.extends.length === 0) {
2021
return ruleConversionResults;
2122
}
2223

2324
const { configurationErrors, importedExtensions } = await dependencies.retrieveExtendsValues(
24-
eslint.extends,
25+
eslint.full.extends,
2526
);
2627

2728
const converted = dependencies.removeExtendsDuplicatedRules(

0 commit comments

Comments
 (0)