Source: apc-static/task/worker/install_bower_components.js

/**
 * Install bower components.
 * @function task.worker.installBowerComponents
 * @param {object} config - Task configuration.s
 * @param {string} config.destDir - Destination directory.
 * @param {object} config.packages - Packages to install. Keys are package names, values are package versions.
 * @example
 *      installBowerComponents({
 *          jquery: '~2.1.0'
 *      });
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 */
var path = require('path'),
    debug = require('./_debug');
exports = module.exports = function (config, callback) {
    var bower = require('bower'),
        destDir = path.resolve(config.destDir),
        cwd = process.cwd();
    try {

        bower
            .commands
            .install(
            exports._packagesSeries(config.packages), {},
            {
                cwd: cwd,
                directory: path.relative(cwd, destDir)
            }
        )
            .on('log', function (data) {
                console.log([data.id, data.message].join(' '));
            })
            .on('end', function (results) {
                Object.keys(results).forEach(function (packageName) {
                    debug.didInstall(packageName, destDir);
                });
                callback(null);
            });
    } catch (e) {
        callback(e);
    }
};

exports._packagesSeries = function (data) {
    return Object.keys(data).map(function (name) {
        var version = data[name];
        return [name, version].join('#');
    });
};