UNPKG

3.07 kBJavaScriptView Raw
1'use strict';
2
3var map = require('map-stream'),
4 PluginError = require('gulp-util').PluginError,
5 eslint = require('eslint').linter,
6 util = require('./util');
7
8/**
9 * Append eslint result to each file
10 */
11function gulpEslint(options) {
12 var configHelper = util.readOptions(options);
13
14 function verify(filePath, contents) {
15 var config = configHelper.getConfig(filePath);
16
17 // eslint.cli result structure (+config)
18 // remove shebangs (https://github.com/eslint/eslint/commit/109a57b2ca60bf7c195f935cddda9a90311860f3)
19 return {
20 config: config,
21 filePath: filePath,
22 messages: gulpEslint.linter.verify(contents.replace(/^#![^\r\n]+[\r\n]/, ""), config, false)
23 };
24 }
25
26 return map(function (file, output) {
27
28 if (util.checkForExclusion(file, configHelper)) {
29 output(null, file);
30
31 } else if (file.isStream()) {
32 // eslint is synchronous, so wait for the complete contents
33 // replace content stream with new readable content stream
34 file.contents = file.contents.pipe(util.wait(function (contents) {
35 file.eslint = verify(file.path, contents);
36 output(null, file);
37 }));
38
39 } else {
40 file.eslint = verify(file.path, file.contents.toString('utf8'));
41 output(null, file);
42
43 }
44 });
45
46}
47
48/**
49 * Fail when an eslint error is found in eslint results.
50 */
51gulpEslint.failOnError = function () {
52
53 return map(function (file, output) {
54 var messages = file.eslint && file.eslint.messages || [],
55 config = file.eslint && file.eslint.config || {},
56 error = null;
57
58 messages.some(function (message) {
59 var level = message.fatal ? 2 : config.rules[message.ruleId];
60 if (Array.isArray(level)) {
61 level = level[0];
62 }
63 if (level > 1) {
64 error = new PluginError(
65 'gulp-eslint',
66 {
67 name:'ESLintError',
68 fileName:file.path,
69 message: message.message,
70 lineNumber: message.line
71 }
72 );
73 return true;
74 }
75 });
76
77 return output(error, file);
78 });
79};
80
81/**
82 * Wait until all files have been linted and format all results at once.
83 */
84gulpEslint.format = function (formatter, writable) {
85 var results = [];
86 formatter = util.resolveFormatter(formatter);
87 writable = util.resolveWritable(writable);
88
89 return map(function (file, output) {
90 if (file.eslint) {
91 results.push(file.eslint);
92 }
93 output(null, file);
94
95 }).once('end', function () {
96 // Only format results if files has been lint'd
97 if (results.length) {
98 util.writeResults(results, formatter, writable);
99 }
100 // reset buffered results
101 results = [];
102 });
103};
104
105/**
106 * Format the results of each file individually.
107 */
108gulpEslint.formatEach = function (formatter, writable) {
109 formatter = util.resolveFormatter(formatter);
110 writable = util.resolveWritable(writable);
111
112 return map(function (file, output) {
113 var error = null;
114 if (file.eslint) {
115 try {
116 util.writeResults([file.eslint], formatter, writable);
117 } catch (err) {
118 error = new PluginError('gulp-eslint', err);
119 }
120 }
121 output(error, file);
122 });
123};
124
125// pass linter through to simplify customization
126gulpEslint.linter = eslint;
127
128module.exports = gulpEslint;