From 55d7c533ed965de6ce32e0f2381118be0b67a348 Mon Sep 17 00:00:00 2001 From: Steven Soloff Date: Tue, 13 Dec 2016 12:22:15 -0500 Subject: [PATCH 1/5] Add failOnError() to public API Piping the validation results to the stream returned from this method will stop the task and report an error if the validation failed for any reason. --- index.js | 28 ++++++++++++++++++++++++++-- test/validation.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 966f39b..f425dd6 100644 --- a/index.js +++ b/index.js @@ -45,7 +45,7 @@ function printErrors(results) { } } -module.exports = function (spec, options) { +var nicePackagePlugin = function (spec, options) { function validate(file, enc, cb) { @@ -70,4 +70,28 @@ module.exports = function (spec, options) { } return through.obj(validate); -}; \ No newline at end of file +}; + +nicePackagePlugin.failOnError = function () { + return through.obj(function (file, enc, cb) { + var error = null; + + function size(arr) { + return arr ? arr.length : 0; + } + + if (file.nicePackage.valid === false) { + error = new gutil.PluginError( + 'gulp-nice-package', + 'Failed with ' + + size(file.nicePackage.errors) + ' error(s), ' + + size(file.nicePackage.warnings) + ' warning(s), ' + + size(file.nicePackage.recommendations) + ' recommendation(s)' + ); + } + + return cb(error, file); + }); +}; + +module.exports = nicePackagePlugin; diff --git a/test/validation.js b/test/validation.js index f44e5e9..b66fa67 100644 --- a/test/validation.js +++ b/test/validation.js @@ -29,3 +29,46 @@ it('should have valid json file', function (cb) { contents: new Buffer(JSON.stringify(require('./fixtures/package-valid.json'))) })); }); + +describe('failOnError', function () { + it('should report an error when the json file is invalid', function (cb) { + var errorReported = false; + var stream = validator() + .on('end', function () { + assert.ok(errorReported); + cb(); + }); + + stream + .pipe(validator.failOnError()) + .on('error', function (error) { + errorReported = true; + assert.strictEqual(error.message, 'Failed with 1 error(s), 3 warning(s), 2 recommendation(s)'); + }); + + stream.write(new gutil.File({ + contents: new Buffer(JSON.stringify(require('./fixtures/package-with-errors.json'))) + })); + stream.end(); + }); + + it('should not report an error when the json file is valid', function (cb) { + var errorReported = false; + var stream = validator() + .on('end', function () { + assert.ok(!errorReported); + cb(); + }); + + stream + .pipe(validator.failOnError()) + .on('error', function () { + errorReported = true; + }); + + stream.write(new gutil.File({ + contents: new Buffer(JSON.stringify(require('./fixtures/package-valid.json'))) + })); + stream.end(); + }); +}); From e8381d72ff142cb5f65b26fb62be4bf143ceba54 Mon Sep 17 00:00:00 2001 From: Steven Soloff Date: Tue, 13 Dec 2016 12:55:11 -0500 Subject: [PATCH 2/5] Extract constant for plugin name --- index.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index f425dd6..ba146bf 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,8 @@ var gutil = require('gulp-util'), PJV = require('package-json-validator').PJV, through = require('through2'); +var PLUGIN_NAME = require('./package').name; + function printErrors(results) { if (results) { @@ -41,7 +43,7 @@ function printErrors(results) { } } else { - throw new gutil.PluginError('gulp-nice-package', 'Failed to get results from validator'); + throw new gutil.PluginError(PLUGIN_NAME, 'Failed to get results from validator'); } } @@ -55,7 +57,7 @@ var nicePackagePlugin = function (spec, options) { } if (file.isStream()) { - this.emit('error', new gutil.PluginError('gulp-nice-package', 'Streaming not supported')); + this.emit('error', new gutil.PluginError(PLUGIN_NAME, 'Streaming not supported')); return cb(); } @@ -82,7 +84,7 @@ nicePackagePlugin.failOnError = function () { if (file.nicePackage.valid === false) { error = new gutil.PluginError( - 'gulp-nice-package', + PLUGIN_NAME, 'Failed with ' + size(file.nicePackage.errors) + ' error(s), ' + size(file.nicePackage.warnings) + ' warning(s), ' + From b94a964a4147c56bb87a002854c878314f6161c6 Mon Sep 17 00:00:00 2001 From: Steven Soloff Date: Tue, 13 Dec 2016 13:02:33 -0500 Subject: [PATCH 3/5] Extract functions for creating test buffers --- test/validation.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/validation.js b/test/validation.js index b66fa67..29eca41 100644 --- a/test/validation.js +++ b/test/validation.js @@ -3,6 +3,18 @@ var gutil = require('gulp-util'), validator = require('./../index.js'), assert = require('assert'); +function createBufferFromJson(path) { + return new Buffer(JSON.stringify(require(path))); +} + +function createBufferForInvalidPackage() { + return createBufferFromJson('./fixtures/package-with-errors.json'); +} + +function createBufferForValidPackage() { + return createBufferFromJson('./fixtures/package-valid.json'); +} + it('should have invalid json file', function (cb) { var stream = validator(); @@ -13,7 +25,7 @@ it('should have invalid json file', function (cb) { }); stream.write(new gutil.File({ - contents: new Buffer(JSON.stringify(require('./fixtures/package-with-errors.json'))) + contents: createBufferForInvalidPackage() })); }); @@ -26,7 +38,7 @@ it('should have valid json file', function (cb) { }); stream.write(new gutil.File({ - contents: new Buffer(JSON.stringify(require('./fixtures/package-valid.json'))) + contents: createBufferForValidPackage() })); }); @@ -47,7 +59,7 @@ describe('failOnError', function () { }); stream.write(new gutil.File({ - contents: new Buffer(JSON.stringify(require('./fixtures/package-with-errors.json'))) + contents: createBufferForInvalidPackage() })); stream.end(); }); @@ -67,7 +79,7 @@ describe('failOnError', function () { }); stream.write(new gutil.File({ - contents: new Buffer(JSON.stringify(require('./fixtures/package-valid.json'))) + contents: createBufferForValidPackage() })); stream.end(); }); From dd4b90c5edea05c292f23606d75d26a2318efc8c Mon Sep 17 00:00:00 2001 From: Steven Soloff Date: Tue, 13 Dec 2016 13:25:33 -0500 Subject: [PATCH 4/5] Add documentation for failOnError() --- readme.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/readme.md b/readme.md index 35c9d1f..b33576b 100644 --- a/readme.md +++ b/readme.md @@ -78,6 +78,21 @@ I know, it seems a bit terse. The reasoning is, you may want to pipe other trans error is thrown, the pipe will cease and you have no way to continue. A valid use case may be to actually fix the the package.json file programmatically if it's invalid, e.g. with [gulp-shrinkwrap](https://github.com/chmontgomery/gulp-shrinkwrap). +If you have no need to further process the stream after validation, you can pipe the stream to `validate.failOnError()` +to fail the build in the event one or more errors are raised during validation. + +```js +// gulpfile.js +var gulp = require('gulp'); +var validate = require('gulp-nice-package'); + +gulp.task('validate-json', function () { + return gulp.src('package.json') + .pipe(validate()) + .pipe(validate.failOnError()); +}); +``` + ## License [MIT](http://opensource.org/licenses/MIT) © [Chris Montgomery](http://www.chrismontgomery.info/) From 266a128c143c38908ae00fb71302d69d34afa993 Mon Sep 17 00:00:00 2001 From: Steven Soloff Date: Tue, 13 Dec 2016 14:37:54 -0500 Subject: [PATCH 5/5] Extract functions for creating test files --- test/validation.js | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/test/validation.js b/test/validation.js index 29eca41..a746092 100644 --- a/test/validation.js +++ b/test/validation.js @@ -3,16 +3,18 @@ var gutil = require('gulp-util'), validator = require('./../index.js'), assert = require('assert'); -function createBufferFromJson(path) { - return new Buffer(JSON.stringify(require(path))); +function createPackageFile(path) { + return new gutil.File({ + contents: new Buffer(JSON.stringify(require(path))) + }); } -function createBufferForInvalidPackage() { - return createBufferFromJson('./fixtures/package-with-errors.json'); +function createInvalidPackageFile() { + return createPackageFile('./fixtures/package-with-errors.json'); } -function createBufferForValidPackage() { - return createBufferFromJson('./fixtures/package-valid.json'); +function createValidPackageFile() { + return createPackageFile('./fixtures/package-valid.json'); } it('should have invalid json file', function (cb) { @@ -24,9 +26,7 @@ it('should have invalid json file', function (cb) { cb(); }); - stream.write(new gutil.File({ - contents: createBufferForInvalidPackage() - })); + stream.write(createInvalidPackageFile()); }); it('should have valid json file', function (cb) { @@ -37,9 +37,7 @@ it('should have valid json file', function (cb) { cb(); }); - stream.write(new gutil.File({ - contents: createBufferForValidPackage() - })); + stream.write(createValidPackageFile()); }); describe('failOnError', function () { @@ -58,9 +56,7 @@ describe('failOnError', function () { assert.strictEqual(error.message, 'Failed with 1 error(s), 3 warning(s), 2 recommendation(s)'); }); - stream.write(new gutil.File({ - contents: createBufferForInvalidPackage() - })); + stream.write(createInvalidPackageFile()); stream.end(); }); @@ -78,9 +74,7 @@ describe('failOnError', function () { errorReported = true; }); - stream.write(new gutil.File({ - contents: createBufferForValidPackage() - })); + stream.write(createValidPackageFile()); stream.end(); }); });