/* * grunt-bower-task * https://github.com/yatskevich/grunt-bower-task * * Copyright (c) 2012 Ivan Yatskevich * Licensed under the MIT license. */ 'use strict'; module.exports = function(grunt) { var bower = require('bower'), path = require('path'), async = require('async'), colors = require('colors'), rimraf = require('rimraf').sync, BowerAssets = require('./lib/bower_assets'), AssetCopier = require('./lib/asset_copier'), LayoutsManager = require('./lib/layouts_manager'); function log(message) { log.logger.writeln(message); } function fail(error) { grunt.fail.fatal(error); } function clean(dir, callback) { rimraf(dir); callback(); } function install(callback) { bower.commands.install() .on('data', log) .on('error', fail) .on('end', callback); } function copy(options, callback) { var bowerAssets = new BowerAssets(bower, options.cwd); bowerAssets.once('data', function(assets) { var copier = new AssetCopier(assets, options, function(source, destination, isFile) { log('grunt-bower ' + 'copying '.cyan + ((isFile ? '' : ' dir ') + source + ' -> ' + destination).grey); }); copier.once('copied', callback); copier.copy(); }).get(); } grunt.registerMultiTask('bower', 'Install Bower packages.', function() { var tasks = [], done = this.async(), options = this.options({ cleanTargetDir: false, cleanBowerDir: false, targetDir: './lib', layout: 'byType', install: true, verbose: false, copy: true }), add = function(name, fn) { tasks.push(function(callback) { fn(function() { grunt.log.ok(name); callback(); }); }); }, bowerDir = path.resolve(bower.config.directory), targetDir = path.resolve(options.targetDir); log.logger = options.verbose ? grunt.log : grunt.verbose; options.layout = LayoutsManager.getLayout(options.layout, fail); options.cwd = grunt.option('base') || process.cwd(); if (options.cleanup !== undefined) { options.cleanTargetDir = options.cleanBowerDir = options.cleanup; } if (options.cleanTargetDir) { add('Cleaned target dir ' + targetDir.grey, function(callback) { clean(targetDir, callback); }); } if (options.install) { add('Installed bower packages', install); } if (options.copy) { add('Copied packages to ' + targetDir.grey, function(callback) { copy(options, callback); }); } if (options.cleanBowerDir) { add('Cleaned bower dir ' + bowerDir.grey, function(callback) { clean(bowerDir, callback); }); } async.series(tasks, done); }); };