Skip to content

Commit

Permalink
Merge pull request #93 from fwdcp/bundle-bower
Browse files Browse the repository at this point in the history
Bundle Bower Dependencies
  • Loading branch information
MattMcNam committed Feb 18, 2015
2 parents 881e58d + dc51002 commit c056fa2
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 12 deletions.
23 changes: 23 additions & 0 deletions lib/bundle_views/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,27 @@ app.get('/view/:bundleName*', function(req, res, next) {
}
});

app.get('/view/:bundle/components/*', function(req, res, next) {
var bundleName = req.params.bundle;

var bundle = Bundles.find(bundleName);

if (!bundle) {
next();
return;
}

var resName = req.params[0];

var fileLocation = path.join(bundle.dir, 'bower_components', resName);

// Check if the file exists
if (!fs.existsSync(fileLocation)) {
next();
return;
}

res.sendFile(fileLocation);
});

module.exports = app;
33 changes: 30 additions & 3 deletions lib/bundles/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ var jade = require('jade');
var util = require('util');
var Q = require('q');
var exec = require('child_process').exec;
var bower = require('bower');

var pjson = require('../../package.json');

Expand Down Expand Up @@ -54,7 +55,8 @@ module.exports = function parse(bundleName) {

// The following operation(s) are async, so we make a collective promise for them
return Q.all([
installNpmPackages(bundle)
installNpmPackages(bundle),
installBowerPackages(bundle)
])
.then(function() {
return bundle;
Expand Down Expand Up @@ -96,7 +98,7 @@ function installNpmPackages(bundle) {
// Do nothing if package.json does not exist
var packagejsonPath = path.join(bundle.dir, 'package.json');
if (!fs.existsSync(packagejsonPath)) {
log.trace('Nothing to install for bundle', bundle.name);
log.trace('No npm dependencies to install for bundle', bundle.name);
deferred.resolve();
return deferred.promise;
}
Expand All @@ -108,13 +110,38 @@ function installNpmPackages(bundle) {
));
return;
}
log.trace('Successfully installed dependencies for bundle', bundle.name);
log.trace('Successfully installed npm dependencies for bundle', bundle.name);
deferred.resolve();
});

return deferred.promise;
}

function installBowerPackages(bundle) {
var deferred = Q.defer();

// Do nothing if bower.json does not exist
var packagejsonPath = path.join(bundle.dir, 'bower.json');
if (!fs.existsSync(packagejsonPath)) {
log.trace('No Bower dependencies to install for bundle', bundle.name);
deferred.resolve();
return deferred.promise;
}

bower.commands.install(undefined, undefined, { cwd: bundle.dir })
.on('end', function(installed) {
log.trace('Successfully installed Bower dependencies for bundle', bundle.name);
deferred.resolve();
})
.on('error', function(error) {
deferred.reject(new Error(
util.format('[%s] Failed to install Bower dependencies:', bundle.name, error.message)
));
});

return deferred.promise;
}

function readDashboardPanels(bundle) {
bundle.dashboard.panels = [];
var manifestPath = path.join(bundle.dashboard.dir, 'panels.json');
Expand Down
24 changes: 24 additions & 0 deletions lib/dashboard/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ var express = require('express'),
clientIncludes = require('../client_includes'),
favicon = require('express-favicon'),
path = require('path'),
fs = require('fs'),
utils = require('../util');

log.trace('Adding Express routes');
Expand All @@ -28,6 +29,29 @@ app.get('/dashboard', utils.authCheck, function(req, res) {
res.render('dashboard.jade', {bundles: Bundles.all(), ncgConfig: filteredConfig});
});

app.get('/dashboard/:bundle/components/*', function(req, res, next) {
var bundleName = req.params.bundle;

var bundle = Bundles.find(bundleName);

if (!bundle) {
next();
return;
}

var resName = req.params[0];

var fileLocation = path.join(bundle.dir, 'bower_components', resName);

// Check if the file exists
if (!fs.existsSync(fileLocation)) {
next();
return;
}

res.sendFile(fileLocation);
});

app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
Expand Down
22 changes: 22 additions & 0 deletions test/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// Modules used to run tests
var chai = require('chai');
var expect = chai.expect;
var request = require('request');

var path = require('path');
var fs = require('fs');
Expand All @@ -14,3 +15,24 @@ describe('per-bundle npm packages', function() {
expect(fs.existsSync(dir)).to.be.true();
});
});

describe('per-bundle bower packages', function() {
it('get installed', function () {
var dir = path.join(C.BUNDLE_DIR, 'bower_components/webcomponentsjs');
expect(fs.existsSync(dir)).to.be.true();
});

it('are accessible via /dashboard', function() {
request(C.DASHBOARD_BUNDLE_URL + '/components/webcomponentsjs/webcomponents.js', function (error, response, body) {
expect(error).to.be.null();
expect(response.statusCode).to.equal(200);
})
})

it('are accessible via /view', function() {
request(C.VIEW_URL + '/components/webcomponentsjs/webcomponents.js', function (error, response, body) {
expect(error).to.be.null();
expect(response.statusCode).to.equal(200);
})
})
});
15 changes: 15 additions & 0 deletions test/setup/test-bundle/bower.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "test-bundle",
"version": "0.0.1",
"homepage": "http://github.com/nodecg",
"authors": [
"Alex Van Camp <email@alexvan.camp>",
"Matt McNamara"
],
"description": "A test bundle",
"license": "MIT",
"private": true,
"dependencies": {
"webcomponentsjs": "~0.5.5"
}
}
18 changes: 9 additions & 9 deletions test/setup/test-constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@ var util = require('util');
var rootDir = path.resolve(__dirname, '../..');
var config = require(path.join(rootDir, '/lib/config')).getConfig();

var bundleName = 'test-bundle';
var testBundleSrcPath = path.resolve(rootDir, 'test/setup/', bundleName);
var bundleDir = path.resolve(rootDir, 'bundles', bundleName);
var cfgDir = path.resolve(rootDir, 'cfg');
var bundleCfgPath = path.resolve(cfgDir, bundleName + '.json');
var dashboardUrl = util.format('http://%s:%d/', config.host, config.port);
var viewUrl = dashboardUrl + 'view/' + bundleName;
var bundleName = 'test-bundle';
var testBundleSrcPath = path.resolve(rootDir, 'test/setup/', bundleName);
var bundleDir = path.resolve(rootDir, 'bundles', bundleName);
var cfgDir = path.resolve(rootDir, 'cfg');
var bundleCfgPath = path.resolve(cfgDir, bundleName + '.json');
var dashboardUrl = util.format('http://%s:%d/', config.host, config.port);
var dashboardBundleUrl = dashboardUrl + 'dashboard/' + bundleName;
var viewUrl = dashboardUrl + 'view/' + bundleName;

module.exports = {
BUNDLE_NAME: bundleName,
Expand All @@ -21,8 +22,7 @@ module.exports = {
CFG_DIR: cfgDir,
BUNDLE_CFG_PATH: bundleCfgPath,
DASHBOARD_URL: dashboardUrl,
DASHBOARD_BUNDLE_URL: dashboardBundleUrl,
VIEW_URL: viewUrl,
CONFIG: config
};


0 comments on commit c056fa2

Please sign in to comment.