gulp-custom-filter
Advanced tools
Comparing version 0.1.1 to 0.2.0
@@ -0,7 +1,22 @@ | ||
var coveralls = require('gulp-coveralls'); | ||
var gulp = require('gulp'); | ||
var jasmine = require('gulp-jasmine'); | ||
var istanbul = require('gulp-istanbul'); | ||
gulp.task('test', function() { | ||
gulp.task('test', ['test:pre'], function() { | ||
return gulp.src('./test/**/*_spec.js') | ||
.pipe(jasmine()); | ||
.pipe(jasmine()) | ||
.pipe(istanbul.writeReports()) | ||
.pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } })); | ||
}); | ||
gulp.task('test:pre', function() { | ||
return gulp.src(['./index.js', './lib/**/*.js']) | ||
.pipe(istanbul()) | ||
.pipe(istanbul.hookRequire()); | ||
}); | ||
gulp.task('coveralls', function() { | ||
return gulp.src('./coverage/**/lcov.info') | ||
.pipe(coveralls()); | ||
}); |
'use strict'; | ||
var assertFunction = require('./assert-function'); | ||
var Promise = Promise || require('promise'); | ||
var assertIsFunction = require('./assertions').isFunction; | ||
var promisenize = require('./promisenize'); | ||
function not(fn) { | ||
assertFunction(fn, 'not'); | ||
assertIsFunction(fn, 'not', 'fn'); | ||
return function(file, encode) { | ||
return !fn(file, encode); | ||
return promisenize(fn)(file, encode) | ||
.then(function(isTarget) { | ||
return !isTarget; | ||
}); | ||
}; | ||
@@ -13,7 +18,10 @@ } | ||
function and() { | ||
var filters = arguments; | ||
var filters = Array.prototype.slice.call(arguments); | ||
return function(file, encode) { | ||
return Array.prototype.every.call(filters, function (fn) { | ||
assertFunction(fn, 'and'); | ||
return fn(file, encode); | ||
return Promise.all(filters.map(function(filter) { | ||
assertIsFunction(filter, 'and', 'filters'); | ||
return promisenize(filter)(file, encode); | ||
})) | ||
.then(function(results) { | ||
return results.every(function(result) { return result; }); | ||
}); | ||
@@ -24,7 +32,10 @@ }; | ||
function or() { | ||
var filters = arguments; | ||
var filters = Array.prototype.slice.call(arguments); | ||
return function(file, encode) { | ||
return Array.prototype.some.call(filters, function (fn) { | ||
assertFunction(fn, 'or'); | ||
return fn(file, encode); | ||
return Promise.all(filters.map(function(filter) { | ||
assertIsFunction(filter, 'and', 'filters'); | ||
return promisenize(filter)(file, encode); | ||
})) | ||
.then(function(results) { | ||
return results.some(function(result) { return result; }); | ||
}); | ||
@@ -31,0 +42,0 @@ }; |
'use strict'; | ||
var assertFunction = require('./assert-function'); | ||
var assertIsFunction = require('./assertions').isFunction; | ||
var promisenize = require('./promisenize'); | ||
var through = require('through2'); | ||
function filter(fn) { | ||
assertFunction(fn); | ||
assertIsFunction(fn); | ||
return through.obj(function(file, encode, done) { | ||
if (fn.length < 3) { | ||
if (fn(file, encode)) { | ||
this.push(file); | ||
} | ||
done(); | ||
} else { | ||
var self = this; | ||
fn(file, encode, function(err, accepted) { | ||
if (accepted) { | ||
self.push(file); | ||
} | ||
done(err); | ||
}); | ||
} | ||
promisenize(fn)(file, encode) | ||
.then(function(isTarget) { | ||
if (isTarget) { | ||
this.push(file); | ||
} | ||
done(); | ||
}.bind(this), function(err) { | ||
done(err); | ||
}); | ||
}); | ||
@@ -24,0 +20,0 @@ } |
'use strict'; | ||
var Set = require('es6-set'); | ||
var assertIsString = require('./assertions').isString; | ||
var assertIsStringOrArray = require('./assertions').isStringOrArray; | ||
var fs = require('fs'); | ||
var gutil = require('gulp-util'); | ||
var ig = require('ignore'); | ||
var minimatch = require('minimatch'); | ||
var path = require('path'); | ||
function glob(pattern, options) { | ||
if (typeof pattern !== 'string' && typeof pattern !== 'array') { | ||
throw new gutil.PluginError('gulp-custom-filter.glob', '`pattern` should be a string or an array'); | ||
} | ||
assertIsStringOrArray(pattern, 'glob', 'pattern'); | ||
return function(file, encode) { | ||
@@ -15,4 +19,52 @@ return minimatch(file.relative, pattern, options); | ||
function ignore(filename) { | ||
assertIsString(filename, 'ignore', 'filename'); | ||
var ignoreFilter = null; | ||
var error = null; | ||
var queue = []; | ||
fs.readFile(filename, function(err, data) { | ||
if (err) { | ||
gutil.log(gutil.colors.red('gulp-custom-filter.ignore: ' + err)); | ||
error = err; | ||
} else { | ||
ignoreFilter = ig().addPattern( | ||
data.toString('utf-8') | ||
.replace(/\r/g, '\n').trim().split('\n') | ||
.filter(function (str) { | ||
return str.length > 0; | ||
}) | ||
.map(normalize) | ||
).createFilter(); | ||
} | ||
queue.forEach(function(entry) { | ||
if (error) { | ||
entry.callback(error); | ||
} else { | ||
entry.callback(null, ignoreFilter(normalize(entry.filename))); | ||
} | ||
}); | ||
}); | ||
return function(file, encode, callback) { | ||
if (error) { | ||
callback(error); | ||
} else if (ignoreFilter !== null) { | ||
callback(null, ignoreFilter(normalize(file.relative))); | ||
} else { | ||
queue.push({ | ||
callback: callback, | ||
filename: file.relative | ||
}); | ||
} | ||
}; | ||
} | ||
function normalize(filename) { | ||
return path.normalize(filename).replace(/\\/g, '/'); | ||
} | ||
module.exports = { | ||
glob: glob | ||
glob: glob, | ||
ignore: ignore | ||
}; |
{ | ||
"name": "gulp-custom-filter", | ||
"version": "0.1.1", | ||
"version": "0.2.0", | ||
"description": "A gulp plugin to filter files by customized filters", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "gulp test" | ||
"test": "gulp test", | ||
"coveralls": "gulp coveralls" | ||
}, | ||
@@ -27,9 +28,15 @@ "repository": { | ||
"gulp": "~3.9.0", | ||
"gulp-jasmine": "~2.1.0" | ||
"gulp-coveralls": "^0.1.4", | ||
"gulp-istanbul": "^0.10.2", | ||
"gulp-jasmine": "~2.1.0", | ||
"mock-fs": "^3.4.0" | ||
}, | ||
"dependencies": { | ||
"es6-set": "^0.1.2", | ||
"gulp-util": "~3.0.7", | ||
"ignore": "^2.2.19", | ||
"minimatch": "^3.0.0", | ||
"promise": "^7.0.4", | ||
"through2": "~2.0.0" | ||
} | ||
} |
# gulp-custom-filter | ||
[![Build Status](https://secure.travis-ci.org/a-miyashita/gulp-custom-filter.png?branch=master)](http://travis-ci.org/a-miyashita/gulp-custom-filter) | ||
[![Coverage Status](https://coveralls.io/repos/a-miyashita/gulp-custom-filter/badge.svg?branch=master&service=github)](https://coveralls.io/github/a-miyashita/gulp-custom-filter?branch=master) | ||
@@ -122,2 +123,15 @@ A gulp plugin to filter files by customized filters. | ||
#### filter.ignore(filename) | ||
Ignore list filter. | ||
```javascript | ||
var ignore = filter.ignore; | ||
gulp.src('./**/*.*') | ||
.pipe(filter(ignore('.gitignore'))) | ||
``` | ||
* `filename`: filename to ignore file. | ||
## License | ||
@@ -124,0 +138,0 @@ |
'use strict'; | ||
var check = require('./util').checkFilter; | ||
var check = require('./test-util').checkFilter; | ||
var filters = require('../lib/basic-filters'); | ||
@@ -5,0 +5,0 @@ var fixture = require('./fixture.js'); |
'use strict'; | ||
var check = require('./util').checkFilter; | ||
var check = require('./test-util').checkFilter; | ||
var fixture = require('./fixture.js'); | ||
describe('filter()', function() { | ||
it('should filter files', function(done) { | ||
it('should filter files with a sync filter', function(done) { | ||
check(fixture.files, fixture.filters.javascript, function(filenames) { | ||
@@ -13,2 +13,27 @@ expect(filenames).toEqual(['a.js', 'b.js']); | ||
}); | ||
it('should filter files with an async filter', function(done) { | ||
check(fixture.files, fixture.filters.asyncJavascript, function(filenames) { | ||
expect(filenames).toEqual(['a.js', 'b.js']); | ||
done(); | ||
}); | ||
}); | ||
it('should fail if an filter throws an error', function(done) { | ||
check(fixture.files, fixture.filters.throwError, function(_) { | ||
fail(); | ||
done(); | ||
}, function() { | ||
done(); | ||
}); | ||
}); | ||
it('should fail if an async filter returns a rejected promise', function(done) { | ||
check(fixture.files, fixture.filters.asyncThrowError, function(_) { | ||
fail(); | ||
done(); | ||
}, function() { | ||
done(); | ||
}); | ||
}); | ||
}); |
@@ -36,4 +36,15 @@ 'use strict'; | ||
return filename.length > 3 && filename.indexOf('.js') >= 0; | ||
}, | ||
asyncJavascript: function(file, _, done) { | ||
var filename = file.basename; | ||
var result = filename.length > 3 && filename.indexOf('.js') >= 0; | ||
setTimeout(function() { done(null, result); }, 0); | ||
}, | ||
throwError: function(file) { | ||
throw Error('error'); | ||
}, | ||
asyncThrowError: function(file, _, done) { | ||
setTimeout(function() { done('error'); }, 0); | ||
} | ||
} | ||
}; |
'use strict'; | ||
var check = require('./util').checkFilter; | ||
var check = require('./test-util').checkFilter; | ||
var filters = require('../lib/pattern-filters'); | ||
var fixture = require('./fixture.js'); | ||
var mock = require('mock-fs'); | ||
@@ -15,3 +16,41 @@ describe('pattern filters', function() { | ||
}); | ||
it('should throw an error if the pattern is invalid', function() { | ||
expect(function() { | ||
filters.glob(null); | ||
}).toThrow(); | ||
}); | ||
}); | ||
describe('ignore()', function() { | ||
beforeEach(function () { | ||
mock({ | ||
'.myignore': '*.js\n!b.js' | ||
}); | ||
}); | ||
it('should pass files which equals to ignore file, if file is succesfully loaded', function (done) { | ||
check(fixture.files, filters.ignore('.myignore'), function (filenames) { | ||
expect(filenames).toEqual(['b.js', 'x.less', 'y.less']); | ||
done(); | ||
}); | ||
}); | ||
it('should result in an error, if file is failed to be loaded', function (done) { | ||
var ignore; | ||
check(fixture.files, ignore = filters.ignore('<<enoent>>'), function (_) { | ||
fail(); | ||
done(); | ||
}, function() { | ||
ignore('A', undefined, function(err, result) { | ||
expect(err).toBeTruthy(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
afterEach(function() { | ||
mock.restore(); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
82117
29
480
140
6
5
1
+ Addedes6-set@^0.1.2
+ Addedignore@^2.2.19
+ Addedpromise@^7.0.4
+ Addedasap@2.0.6(transitive)
+ Addedd@1.0.2(transitive)
+ Addedes5-ext@0.10.64(transitive)
+ Addedes6-iterator@2.0.3(transitive)
+ Addedes6-set@0.1.6(transitive)
+ Addedes6-symbol@3.1.4(transitive)
+ Addedesniff@2.0.1(transitive)
+ Addedevent-emitter@0.3.5(transitive)
+ Addedext@1.7.0(transitive)
+ Addedignore@2.2.19(transitive)
+ Addednext-tick@1.1.0(transitive)
+ Addedpromise@7.3.1(transitive)
+ Addedtype@2.7.2(transitive)