--- /dev/null
+var path = require('path');
+var rimraf = require('../util/rimraf');
+var fstreamIgnore = require('fstream-ignore');
+var mout = require('mout');
+var Q = require('q');
+
+function removeIgnores(dir, meta) {
+ var reader;
+ var applyIgnores;
+ var deferred = Q.defer();
+ var ignored = [];
+ var nonIgnored = ['bower.json'];
+
+ // Don't ignore main files
+ nonIgnored = nonIgnored.concat(meta.main || []);
+
+ nonIgnored = nonIgnored.map(function (file) {
+ return path.join(dir, file);
+ });
+
+ reader = fstreamIgnore({
+ path: dir,
+ type: 'Directory'
+ });
+
+ reader.addIgnoreRules(meta.ignore || []);
+
+ // Monkey patch applyIgnores such that we get hold of all ignored files
+ applyIgnores = reader.applyIgnores;
+ reader.applyIgnores = function (entry) {
+ var ret = applyIgnores.apply(this, arguments);
+
+ if (!ret) {
+ ignored.push(path.join(dir, entry));
+ }
+
+ return ret;
+ };
+
+ reader
+ .on('child', function (entry) {
+ nonIgnored.push(entry.path);
+ })
+ .on('error', deferred.reject)
+ .on('end', function () {
+ var promises;
+
+ // Ensure that we are not ignoring files that should not be ignored!
+ ignored = mout.array.unique(ignored);
+ ignored = ignored.filter(function (file) {
+ return nonIgnored.indexOf(file) === -1;
+ });
+
+ // Delete all the ignored files
+ promises = ignored.map(function (file) {
+ return Q.nfcall(rimraf, file);
+ });
+
+ return Q.all(promises)
+ .then(deferred.resolve, deferred.reject);
+ });
+
+ return deferred.promise;
+}
+
+module.exports = removeIgnores;