mimosa-bower
Version:
A Bower integration module for Mimosa
159 lines (142 loc) • 4.78 kB
JavaScript
;
var bower, cleanTempDir, fs, logger, path, utils, wrench, _, _cleanCache, _cleanEmptyDirs, _cleanFilesViaBower, _cleanFilesViaTrackingInfo, _cleanInstalledLibs, _removeDirs, _removeFile;
fs = require('fs');
path = require('path');
_ = require('lodash');
wrench = require("wrench");
utils = require('./utils');
logger = null;
bower = null;
_removeFile = function(fileName) {
var err;
try {
fs.unlinkSync(fileName);
return logger.info("Removed file [[ " + fileName + " ]]");
} catch (_error) {
err = _error;
return logger.warn("Unable to clean file [[ " + fileName + " ]], was it moved from this location or already cleaned?");
}
};
_cleanInstalledLibs = function(copyConfigs) {
var copyConfig, _i, _len, _results;
_results = [];
for (_i = 0, _len = copyConfigs.length; _i < _len; _i++) {
copyConfig = copyConfigs[_i];
_results.push(copyConfig.out.forEach(_removeFile));
}
return _results;
};
_removeDirs = function(dirs) {
var dir, err, _i, _len, _results;
_results = [];
for (_i = 0, _len = dirs.length; _i < _len; _i++) {
dir = dirs[_i];
try {
fs.rmdirSync(dir);
_results.push(logger.info("Cleaned up empty bower package directory [[ " + dir + " ]]"));
} catch (_error) {
err = _error;
if (err.code !== 'ENOTEMPTY') {
_results.push(logger.error("Unable to delete directory, [[ " + dir + " ]] :", err));
} else {
_results.push(void 0);
}
}
}
return _results;
};
exports.cleanTempDir = cleanTempDir = function(mimosaConfig, force) {
if ((force || mimosaConfig.bower.bowerDir.clean) && fs.existsSync(mimosaConfig.bower.bowerDir.pathFull)) {
wrench.rmdirSyncRecursive(mimosaConfig.bower.bowerDir.pathFull);
return mimosaConfig.log.info("Cleaned temp bower output directory [[ " + mimosaConfig.bower.bowerDir.pathFull + " ]]");
}
};
_cleanEmptyDirs = function(mimosaConfig, packages) {
var allDirs, cssDirs, jsDirs;
jsDirs = [];
if (fs.existsSync(mimosaConfig.vendor.javascripts)) {
jsDirs = wrench.readdirSyncRecursive(mimosaConfig.vendor.javascripts).map(function(dir) {
return path.join(mimosaConfig.vendor.javascripts, dir);
});
}
cssDirs = [];
if (fs.existsSync(mimosaConfig.vendor.stylesheets)) {
cssDirs = wrench.readdirSyncRecursive(mimosaConfig.vendor.stylesheets).map(function(dir) {
return path.join(mimosaConfig.vendor.stylesheets, dir);
});
}
allDirs = _.uniq(jsDirs.concat(cssDirs));
if (mimosaConfig.bower.copy.outRoot) {
packages.push(mimosaConfig.bower.copy.outRoot);
}
allDirs = allDirs.filter(function(dir) {
return _.intersection(dir.split(path.sep), packages).length > 0;
});
allDirs = _.sortBy(allDirs, function(dir) {
return dir.length;
}).reverse();
return _removeDirs(allDirs);
};
_cleanCache = function() {
var error;
logger.info("Cleaning Bower cache...");
error = false;
return bower.commands.cache.clean().on('log', function(log) {}).on('error', function(message) {
logger.error("Error cleaning cache", message);
return error = true;
}).on('end', function() {
if (!error) {
return logger.success("Bower cache cleaned.");
}
});
};
_cleanFilesViaBower = function(mimosaConfig) {
return bower.commands.list({
paths: true
}).on('end', function(paths) {
var packages;
packages = Object.keys(paths);
return utils.gatherPathConfigs(mimosaConfig, packages, function(copyConfigs) {
_cleanInstalledLibs(copyConfigs);
cleanTempDir(mimosaConfig, true);
if (mimosaConfig.bower.copy.strategy !== "vendorRoot") {
_cleanEmptyDirs(mimosaConfig, packages);
}
return logger.success("Bower files cleaned.");
});
});
};
_cleanFilesViaTrackingInfo = function(mimosaConfig) {
var installedFiles, track;
track = require('./track');
installedFiles = track.getPreviousInstalledFileList(mimosaConfig);
if (installedFiles.length === 0) {
logger.info("No files to clean.");
} else {
installedFiles.map(function(installedFile) {
return path.join(mimosaConfig.root, installedFile);
}).forEach(_removeFile);
}
track.removeTrackFiles(mimosaConfig);
return logger.success("Bower files cleaned.");
};
exports.bowerClean = function(mimosaConfig, opts) {
var hasBowerConfig;
logger = mimosaConfig.log;
if (!bower) {
bower = require("bower");
}
hasBowerConfig = utils.ensureBowerConfig(mimosaConfig);
if (!hasBowerConfig) {
return;
}
bower.config.directory = mimosaConfig.bower.bowerDir.path;
if (opts.cache) {
_cleanCache();
}
if (mimosaConfig.bower.copy.trackChanges === true) {
return _cleanFilesViaTrackingInfo(mimosaConfig);
} else {
return _cleanFilesViaBower(mimosaConfig);
}
};