Skip to content

Commit c99cf96

Browse files
Charles Lydingfilipesilva
Charles Lyding
authored andcommitted
fix(@angular/cli): ensure lint generates well-formed machine output
For machine readable output formats, ng lint was concatenating multiple documents into a single file. This resulted in invalid JSON, XML, etc. The lint results are now aggregated and one full output is generated. Fix angular#5259 Close angular#5224
1 parent a54115c commit c99cf96

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

packages/@angular/cli/tasks/lint.ts

+27-12
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ export default Task.extend({
3333
const Linter = tslint.Linter;
3434
const Configuration = tslint.Configuration;
3535

36-
let errors = 0;
37-
let results = '';
38-
39-
lintConfigs
40-
.forEach((config) => {
36+
const result = lintConfigs
37+
.map((config) => {
4138
const program: ts.Program = Linter.createProgram(config.project);
4239
const files = getFilesToLint(program, config, Linter);
4340

@@ -56,19 +53,37 @@ export default Task.extend({
5653
linter.lint(file, fileContents, configLoad.results);
5754
});
5855

59-
const result = linter.getResult();
60-
errors += result.failureCount;
61-
results = results.concat(result.output.trim().concat('\n'));
56+
return linter.getResult();
57+
})
58+
.reduce((total, current) => {
59+
const failures = current.failures
60+
.filter((cf: any) => !total.failures.some((ef: any) => ef.equals(cf)));
61+
total.failures = total.failures.concat(...failures);
62+
63+
if (current.fixes) {
64+
total.fixes = (total.fixes || []).concat(...current.fixes);
65+
}
66+
return total;
67+
}, {
68+
failures: [],
69+
fixes: undefined
6270
});
6371

72+
const Formatter = tslint.findFormatter(commandOptions.format);
73+
const formatter = new Formatter();
74+
75+
const output = formatter.format(result.failures, result.fixes);
76+
if (output) {
77+
ui.writeLine(output);
78+
}
79+
6480
// print formatter output directly for non human-readable formats
6581
if (['prose', 'verbose', 'stylish'].indexOf(commandOptions.format) == -1) {
66-
ui.writeLine(results.trim());
67-
return (errors == 0 || commandOptions.force) ? Promise.resolve(0) : Promise.resolve(2);
82+
return (result.failures.length == 0 || commandOptions.force)
83+
? Promise.resolve(0) : Promise.resolve(2);
6884
}
6985

70-
if (errors > 0) {
71-
ui.writeLine(results.trim());
86+
if (result.failures.length > 0) {
7287
ui.writeLine(chalk.red('Lint errors found in the listed files.'));
7388
return commandOptions.force ? Promise.resolve(0) : Promise.resolve(2);
7489
}

0 commit comments

Comments
 (0)