Skip to content

Commit b0b955d

Browse files
author
Josh Goldberg
authored
Standardized outputs: CLI summaries, log details (#408)
* Standardized outputs: CLI summaries, log details * Some unused imports
1 parent a39ae6c commit b0b955d

9 files changed

+141
-99
lines changed

src/cli/runCli.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const runCli = async (
4545
}
4646
}
4747

48-
dependencies.logger.stdout.write(chalk.greenBright("✅ All is well! ✅\n"));
48+
dependencies.logger.stdout.write(chalk.greenBright(`${EOL}✅ All is well! ✅\n`));
4949
return ResultStatus.Succeeded;
5050
};
5151

src/conversion/convertConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export const convertConfig = async (
5757
}
5858

5959
// 5. A summary of the results is printed to the user's console
60-
await dependencies.reportConversionResults(simplifiedConfiguration);
60+
await dependencies.reportConversionResults(settings.config, simplifiedConfiguration);
6161

6262
return {
6363
status: ResultStatus.Succeeded,

src/errors/conversionError.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe(ConversionError, () => {
3333

3434
// Assert
3535
expect(summary).toEqual(
36-
`Error: multiple output eslint-rule ESLint rule options were generated, but tslint-to-eslint-config doesn't have "merger" logic to deal with this.${EOL}Please file an issue at https://github.com/typescript-eslint/tslint-to-eslint-config/issues/new?template=missing_merger.md 🙏`,
36+
`Error: multiple output eslint-rule ESLint rule options were generated, but tslint-to-eslint-config doesn't have "merger" logic to deal with this.${EOL}Please file an issue at https://github.com/typescript-eslint/tslint-to-eslint-config/issues/new?template=missing_merger.md. Thanks!`,
3737
);
3838
});
3939
});

src/errors/conversionError.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class ConversionError implements ErrorSummary {
1111
return new ConversionError(
1212
[
1313
`Error: multiple output ${eslintRule} ESLint rule options were generated, but tslint-to-eslint-config doesn't have "merger" logic to deal with this.`,
14-
`Please file an issue at https://github.com/typescript-eslint/tslint-to-eslint-config/issues/new?template=missing_merger.md 🙏`,
14+
`Please file an issue at https://github.com/typescript-eslint/tslint-to-eslint-config/issues/new?template=missing_merger.md. Thanks!`,
1515
].join(EOL),
1616
);
1717
}

src/reporting/reportConversionResults.test.ts

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe("reportConversionResults", () => {
1919
const conversionResults = createEmptyConversionResults({
2020
converted: new Map<string, ESLintRuleOptions>([
2121
[
22-
"tslint-rule-one",
22+
`tslint-rule-one`,
2323
{
2424
ruleArguments: ["a", "b"],
2525
ruleName: "tslint-rule-one",
@@ -32,7 +32,11 @@ describe("reportConversionResults", () => {
3232
const { choosePackageManager, logger } = createStubDependencies();
3333

3434
// Act
35-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
35+
await reportConversionResults(
36+
{ choosePackageManager, logger },
37+
".eslintrc.js",
38+
conversionResults,
39+
);
3640

3741
// Assert
3842
expectEqualWrites(
@@ -49,7 +53,7 @@ describe("reportConversionResults", () => {
4953
const conversionResults = createEmptyConversionResults({
5054
converted: new Map<string, ESLintRuleOptions>([
5155
[
52-
"tslint-rule-one",
56+
`tslint-rule-one`,
5357
{
5458
notices: ["1", "2"],
5559
ruleArguments: ["a", "b"],
@@ -63,28 +67,37 @@ describe("reportConversionResults", () => {
6367
const { choosePackageManager, logger } = createStubDependencies();
6468

6569
// Act
66-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
70+
await reportConversionResults(
71+
{ choosePackageManager, logger },
72+
".eslintrc.js",
73+
conversionResults,
74+
);
6775

6876
// Assert
6977
expectEqualWrites(
7078
logger.stdout.write,
7179
`✨ 1 rule replaced with its ESLint equivalent. ✨${EOL}`,
7280
`❗ 1 ESLint rule behaves differently from its TSLint counterpart ❗`,
73-
` * tslint-rule-one:`,
74-
` - 1`,
75-
` - 2`,
81+
` Check ${logger.debugFileName} for details.`,
7682
``,
7783
`⚡ 3 packages are required for running with ESLint. ⚡`,
7884
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev`,
7985
);
86+
expectEqualWrites(
87+
logger.info.write,
88+
`1 ESLint rule behaves differently from its TSLint counterpart:`,
89+
` * tslint-rule-one:`,
90+
` - 1`,
91+
` - 2`,
92+
);
8093
});
8194

8295
it("logs successful conversions when there are multiple converted rules", async () => {
8396
// Arrange
8497
const conversionResults = createEmptyConversionResults({
8598
converted: new Map<string, ESLintRuleOptions>([
8699
[
87-
"tslint-rule-one",
100+
`tslint-rule-one`,
88101
{
89102
notices: ["1", "2"],
90103
ruleArguments: ["a", "b"],
@@ -93,7 +106,7 @@ describe("reportConversionResults", () => {
93106
},
94107
],
95108
[
96-
"tslint-rule-two",
109+
`tslint-rule-two`,
97110
{
98111
notices: ["3", "4"],
99112
ruleArguments: ["c", "d"],
@@ -107,23 +120,32 @@ describe("reportConversionResults", () => {
107120
const { choosePackageManager, logger } = createStubDependencies();
108121

109122
// Act
110-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
123+
await reportConversionResults(
124+
{ choosePackageManager, logger },
125+
".eslintrc.js",
126+
conversionResults,
127+
);
111128

112129
// Assert
113130
expectEqualWrites(
114131
logger.stdout.write,
115132
`✨ 2 rules replaced with their ESLint equivalents. ✨`,
116133
``,
117134
`❗ 2 ESLint rules behave differently from their TSLint counterparts ❗`,
135+
` Check ${logger.debugFileName} for details.`,
136+
``,
137+
`⚡ 3 packages are required for running with ESLint. ⚡`,
138+
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev`,
139+
);
140+
expectEqualWrites(
141+
logger.info.write,
142+
`2 ESLint rules behave differently from their TSLint counterparts:`,
118143
` * tslint-rule-one:`,
119144
` - 1`,
120145
` - 2`,
121146
` * tslint-rule-two:`,
122147
` - 3`,
123148
` - 4`,
124-
``,
125-
`⚡ 3 packages are required for running with ESLint. ⚡`,
126-
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev`,
127149
);
128150
});
129151

@@ -136,12 +158,16 @@ describe("reportConversionResults", () => {
136158
const { choosePackageManager, logger } = createStubDependencies();
137159

138160
// Act
139-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
161+
await reportConversionResults(
162+
{ choosePackageManager, logger },
163+
".eslintrc.js",
164+
conversionResults,
165+
);
140166

141167
// Assert
142168
expectEqualWrites(
143169
logger.stderr.write,
144-
"❌ 1 error thrown. ❌",
170+
`❌ 1 error thrown. ❌`,
145171
` Check ${logger.debugFileName} for details.`,
146172
);
147173
});
@@ -155,12 +181,16 @@ describe("reportConversionResults", () => {
155181
const { choosePackageManager, logger } = createStubDependencies();
156182

157183
// Act
158-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
184+
await reportConversionResults(
185+
{ choosePackageManager, logger },
186+
".eslintrc.js",
187+
conversionResults,
188+
);
159189

160190
// Assert
161191
expectEqualWrites(
162192
logger.stderr.write,
163-
"❌ 2 errors thrown. ❌",
193+
`❌ 2 errors thrown. ❌`,
164194
` Check ${logger.debugFileName} for details.`,
165195
);
166196
});
@@ -180,20 +210,26 @@ describe("reportConversionResults", () => {
180210
const { choosePackageManager, logger } = createStubDependencies();
181211

182212
// Act
183-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
213+
await reportConversionResults(
214+
{ choosePackageManager, logger },
215+
".eslintrc.js",
216+
conversionResults,
217+
);
184218

185219
// Assert
186220
expectEqualWrites(
187221
logger.stdout.write,
188-
"❓ 1 rule does not yet have an ESLint equivalent ❓",
189-
` See generated log file; defaulting to eslint-plugin-tslint for it.`,
190-
"",
191-
"⚡ 3 packages are required for running with ESLint. ⚡",
192-
" yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev",
222+
`❓ 1 rule is not known by tslint-to-eslint-config to have an ESLint equivalent. ❓`,
223+
` The "@typescript-eslint/tslint/config" section of .eslintrc.js configures eslint-plugin-tslint to run it in TSLint within ESLint.`,
224+
` Check ${logger.debugFileName} for details.`,
225+
``,
226+
`⚡ 3 packages are required for running with ESLint. ⚡`,
227+
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev`,
193228
);
194229
expectEqualWrites(
195230
logger.info.write,
196-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one"',
231+
`1 rule is not known by tslint-to-eslint-config to have an ESLint equivalent:`,
232+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one".',
197233
);
198234
});
199235

@@ -217,21 +253,27 @@ describe("reportConversionResults", () => {
217253
const { choosePackageManager, logger } = createStubDependencies();
218254

219255
// Act
220-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
256+
await reportConversionResults(
257+
{ choosePackageManager, logger },
258+
".eslintrc.js",
259+
conversionResults,
260+
);
221261

222262
// Assert
223263
expectEqualWrites(
224264
logger.stdout.write,
225-
"❓ 2 rules do not yet have ESLint equivalents ❓",
226-
` See generated log file; defaulting to eslint-plugin-tslint for these rules.`,
227-
"",
228-
"⚡ 3 packages are required for running with ESLint. ⚡",
229-
" yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev",
265+
`❓ 2 rules are not known by tslint-to-eslint-config to have ESLint equivalents. ❓`,
266+
` The "@typescript-eslint/tslint/config" section of .eslintrc.js configures eslint-plugin-tslint to run them in TSLint within ESLint.`,
267+
` Check ${logger.debugFileName} for details.`,
268+
``,
269+
`⚡ 3 packages are required for running with ESLint. ⚡`,
270+
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint --dev`,
230271
);
231272
expectEqualWrites(
232273
logger.info.write,
233-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one"',
234-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-two"',
274+
`2 rules are not known by tslint-to-eslint-config to have ESLint equivalents:`,
275+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-one".',
276+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-rule-two".',
235277
);
236278
});
237279

@@ -244,13 +286,17 @@ describe("reportConversionResults", () => {
244286
const { choosePackageManager, logger } = createStubDependencies();
245287

246288
// Act
247-
await reportConversionResults({ choosePackageManager, logger }, conversionResults);
289+
await reportConversionResults(
290+
{ choosePackageManager, logger },
291+
".eslintrc.js",
292+
conversionResults,
293+
);
248294

249295
// Assert
250296
expectEqualWrites(
251297
logger.stdout.write,
252-
"⚡ 5 packages are required for running with ESLint. ⚡",
253-
" yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint plugin-one plugin-two --dev",
298+
`⚡ 5 packages are required for running with ESLint. ⚡`,
299+
` yarn add @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint plugin-one plugin-two --dev`,
254300
);
255301
});
256302
});

src/reporting/reportConversionResults.ts

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type ReportConversionResultsDependencies = {
2020

2121
export const reportConversionResults = async (
2222
dependencies: ReportConversionResultsDependencies,
23+
outputPath: string,
2324
ruleConversionResults: RuleConversionResults,
2425
) => {
2526
const packageManager = await dependencies.choosePackageManager();
@@ -36,14 +37,13 @@ export const reportConversionResults = async (
3637
if (ruleConversionResults.missing.length !== 0) {
3738
logMissingConversionTarget(
3839
"rule",
39-
(setting: TSLintRuleOptions) =>
40-
`tslint-to-eslint-config does not know the ESLint equivalent for TSLint's "${setting.ruleName}"${EOL}`,
40+
(setting: TSLintRuleOptions) => setting.ruleName,
4141
ruleConversionResults.missing,
4242
dependencies.logger,
4343
[
44-
ruleConversionResults.missing.length === 1
45-
? "defaulting to eslint-plugin-tslint for it."
46-
: "defaulting to eslint-plugin-tslint for these rules.",
44+
`The "@typescript-eslint/tslint/config" section of ${outputPath} configures eslint-plugin-tslint to run ${
45+
ruleConversionResults.missing.length === 1 ? "it" : "them"
46+
} in TSLint within ESLint.`,
4747
],
4848
);
4949
}
@@ -61,29 +61,28 @@ const logNotices = (converted: Map<string, ESLintRuleOptions>, logger: Logger) =
6161
(ruleOptions) => ruleOptions.notices && ruleOptions.notices.length >= 1,
6262
) as RuleWithNotices[];
6363

64-
if (rulesWithNotices.length !== 0) {
65-
logger.stdout.write(chalk.yellowBright(`${EOL}${rulesWithNotices.length} ESLint`));
64+
if (rulesWithNotices.length === 0) {
65+
return;
66+
}
6667

67-
if (rulesWithNotices.length === 1) {
68-
logger.stdout.write(
69-
chalk.yellowBright(
70-
` rule behaves differently from its TSLint counterpart ❗${EOL}`,
71-
),
72-
);
73-
} else {
74-
logger.stdout.write(
75-
chalk.yellowBright(
76-
` rules behave differently from their TSLint counterparts ❗${EOL}`,
77-
),
78-
);
79-
}
68+
const behavior =
69+
rulesWithNotices.length === 1
70+
? " behaves differently from its TSLint counterpart"
71+
: "s behave differently from their TSLint counterparts";
8072

81-
for (const rule of rulesWithNotices) {
82-
logger.stdout.write(chalk.yellow(` * ${rule.ruleName}:${EOL}`));
73+
logger.stdout.write(
74+
chalk.blueBright(`${EOL}${rulesWithNotices.length} ESLint rule${behavior}${EOL}`),
75+
);
76+
logger.stdout.write(chalk.blue(` Check ${logger.debugFileName} for details.${EOL}`));
77+
logger.info.write(`${rulesWithNotices.length} ESLint rule${behavior}:${EOL}`);
8378

84-
for (const notice of rule.notices) {
85-
logger.stdout.write(chalk.yellow(` - ${notice}${EOL}`));
86-
}
79+
for (const rule of rulesWithNotices) {
80+
logger.info.write(` * ${rule.ruleName}:${EOL}`);
81+
82+
for (const notice of rule.notices) {
83+
logger.info.write(` - ${notice}${EOL}`);
8784
}
8885
}
86+
87+
logger.info.write(EOL);
8988
};

src/reporting/reportEditorSettingConversionResults.test.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,13 @@ describe("reportEditorSettingConversionResults", () => {
121121
// Assert
122122
expectEqualWrites(
123123
logger.stdout.write,
124-
`❓ 1 editor setting does not yet have an ESLint equivalent ❓`,
125-
` See generated log file.`,
124+
`❓ 1 editor setting is not known by tslint-to-eslint-config to have an ESLint equivalent. ❓`,
125+
` Check ${logger.debugFileName} for details.`,
126126
);
127127
expectEqualWrites(
128128
logger.info.write,
129-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one"',
129+
`1 editor setting is not known by tslint-to-eslint-config to have an ESLint equivalent:`,
130+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one".',
130131
);
131132
});
132133

@@ -151,13 +152,14 @@ describe("reportEditorSettingConversionResults", () => {
151152
// Assert
152153
expectEqualWrites(
153154
logger.stdout.write,
154-
`❓ 2 editor settings do not yet have ESLint equivalents ❓`,
155-
` See generated log file.`,
155+
`❓ 2 editor settings are not known by tslint-to-eslint-config to have ESLint equivalents. ❓`,
156+
` Check ${logger.debugFileName} for details.`,
156157
);
157158
expectEqualWrites(
158159
logger.info.write,
159-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one"',
160-
'tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-two"',
160+
`2 editor settings are not known by tslint-to-eslint-config to have ESLint equivalents:`,
161+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-one".',
162+
' * tslint-to-eslint-config does not know the ESLint equivalent for TSLint\'s "tslint-editor-setting-two".',
161163
);
162164
});
163165
});

0 commit comments

Comments
 (0)