Skip to content

Commit

Permalink
Merge pull request #1446 from bcardarella/bc-middleware-addons
Browse files Browse the repository at this point in the history
Extracted middleware to addons
  • Loading branch information
rwjblue committed Jul 23, 2014
2 parents bec9423 + ae75f60 commit b4c66bf
Show file tree
Hide file tree
Showing 17 changed files with 128 additions and 54 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
* [ENHANCEMENT] Update `broccoli-asset-rev`to `0.0.17`
* [ENHANCEMENT] Upgrade `ember-qunit` to `0.1.8`. [#1427](https://github.com/stefanpenner/ember-cli/pull/1427)
* [BUGFIX] Fix pod based templates (was broken with the advent of the `templates` tree). [#4138](https://github.com/stefanpenner/ember-cli/pull/1438)
* [ENHANCEMENT] ExpressServer middleware extracted to addons that are always pulled into every Project first [#1446](https://github.com/stefanpenner/ember-cli/pull/1446)

### 0.0.39

Expand Down
5 changes: 5 additions & 0 deletions lib/models/project.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ Project.prototype.dependencies = function() {

Project.prototype.availableAddons = function() {
var addonPackages = {};
var internalMiddlewarePath = path.relative(this.root, path.join(__dirname, '../tasks/server/middleware'));
this.addIfAddon(path.join(internalMiddlewarePath, 'live-reload'), addonPackages);
this.addIfAddon(path.join(internalMiddlewarePath, 'serve-files'), addonPackages);
this.addIfAddon(path.join(internalMiddlewarePath, 'proxy-server'), addonPackages);

Object.keys(this.dependencies()).forEach(function(name) {
if (name !== 'ember-cli') {
var addonPath = path.join('node_modules', name);
Expand Down
32 changes: 4 additions & 28 deletions lib/tasks/server/express-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ var Promise = require('../../ext/promise');
var Task = require('../../models/task');
var SilentError = require('../../errors/silent');

// Middleware
var serveFilesMiddleware = require('./middleware/serve-files');

module.exports = Task.extend({
init: function() {
this.chain = this.chain || require('connect-chain');
Expand Down Expand Up @@ -43,34 +40,13 @@ module.exports = Task.extend({
}
},

proxyMiddleware: function(url) {
var urlOpts = require('url').parse(url);
var proxy = require('proxy-middleware');
return proxy(urlOpts);
},

start: function(options) {
var ui = this.ui;
var watcher = this.watcher;
var middleware = this.chain();
var ui = this.ui;
var middleware = this.chain();
var app = this.app = require('express')();

if (options.liveReload === true) {
var livereloadMiddleware = require('connect-livereload');
middleware = this.chain(middleware, livereloadMiddleware({
port: options.liveReloadPort
}));
}

middleware = this.chain(middleware, serveFilesMiddleware({
watcher: watcher,
baseURL: options.baseURL
}));

if (options.proxy) {
ui.write('Proxying to ' + options.proxy + '\n');
middleware = this.chain(middleware, this.proxyMiddleware(options.proxy));
}
options.watcher = this.watcher;
options.ui = this.ui;

this.processAddonMiddlewares(options);
this.processAppMiddlewares();
Expand Down
20 changes: 20 additions & 0 deletions lib/tasks/server/middleware/live-reload/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';

function LiveReloadAddon(project) {
this.project = project;
this.name = 'live-reload-middleware';
}

LiveReloadAddon.prototype.serverMiddleware = function(options) {
var app = options.app;
options = options.options;

if (options.liveReload === true) {
var livereloadMiddleware = require('connect-livereload');
app.use(livereloadMiddleware({
port: options.loveReloadPort
}));
}
};

module.exports = LiveReloadAddon;
6 changes: 6 additions & 0 deletions lib/tasks/server/middleware/live-reload/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "live-reload-middleware",
"keywords": [
"ember-addon"
]
}
21 changes: 21 additions & 0 deletions lib/tasks/server/middleware/proxy-server/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
'use strict';

function ProxyServerAddon(project) {
this.project = project;
this.name = 'proxy-server-middleware';
}

ProxyServerAddon.prototype.serverMiddleware = function(options) {
var app = options.app;
options = options.options;

if (options.proxy) {
var urlOpts = require('url').parse(options.proxy);
var proxy = require('proxy-middleware');

options.ui.write('Proxying to ' + options.proxy + '\n');
app.use(proxy(urlOpts));
}
};

module.exports = ProxyServerAddon;
6 changes: 6 additions & 0 deletions lib/tasks/server/middleware/proxy-server/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "proxy-server-middleware",
"keywords": [
"ember-addon"
]
}
19 changes: 19 additions & 0 deletions lib/tasks/server/middleware/serve-files/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';

function ServeFilesAddon(project) {
this.project = project;
this.name = 'serve-files-middleware';
}

ServeFilesAddon.prototype.serverMiddleware = function(options) {
var app = options.app;
options = options.options;

var serveFilesMiddleware = require('./serve-files');
app.use(serveFilesMiddleware({
watcher: options.watcher,
baseURL: options.baseURL
}));
};

module.exports = ServeFilesAddon;
6 changes: 6 additions & 0 deletions lib/tasks/server/middleware/serve-files/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "serve-files-middleware",
"keywords": [
"ember-addon"
]
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use strict';

var historySupportMiddlware = require('./history-support');
var cleanBaseURL = require('../../../utilities/clean-base-url');
var cleanBaseURL = require('../../../../utilities/clean-base-url');

module.exports = function(options) {
var chain = options.chain || require('connect-chain');
Expand Down
9 changes: 7 additions & 2 deletions tests/helpers/mock-project.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ var Project = require('../../lib/models/project');

function MockProject() {
Project.apply(this, arguments);
this.root = process.cwd();
this.pkg = {};
}

MockProject.prototype.require = function(file) {
Expand All @@ -30,8 +32,11 @@ MockProject.prototype.name = function() {
return 'mock-project';
};

MockProject.prototype.initializeAddons = function() {
this.addons = [];
MockProject.prototype.initializeAddons = Project.prototype.initializeAddons;
MockProject.prototype.availableAddons = Project.prototype.availableAddons;
MockProject.prototype.addIfAddon = Project.prototype.addIfAddon;
MockProject.prototype.dependencies = function() {
return [];
};

module.exports = MockProject;
13 changes: 0 additions & 13 deletions tests/helpers/mock-proxy.js

This file was deleted.

18 changes: 18 additions & 0 deletions tests/helpers/proxy-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict';

var http = require('http');

var ProxyServer = function() {
var _this = this;
this.called = false;
this.lastReq = null;
this.httpServer = http.createServer(function(req, res) {
_this.called = true;
_this.lastReq = req;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('okay');
});
this.httpServer.listen(3001);
};

module.exports = ProxyServer;
4 changes: 2 additions & 2 deletions tests/unit/models/addon-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('models/addon.js', function() {

describe('generated addon no-export', function() {
before(function() {
addon = project.addons[3];
addon = project.addons[6];
});

it('sets it\'s project', function() {
Expand Down Expand Up @@ -86,7 +86,7 @@ describe('models/addon.js', function() {

describe('generated addon with-export', function() {
before(function() {
addon = project.addons[2];
addon = project.addons[5];
});

it('sets it\'s project', function() {
Expand Down
13 changes: 7 additions & 6 deletions tests/unit/models/project-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ describe('models/project.js', function() {

it('returns a listing of all ember-cli-addons', function() {
var expected = [
'live-reload-middleware', 'serve-files-middleware', 'proxy-server-middleware',
'ember-random-addon', 'ember-non-root-addon',
'ember-generated-with-export-addon', 'ember-generated-no-export-addon',
'ember-super-button'
Expand All @@ -77,7 +78,7 @@ describe('models/project.js', function() {
it('returns an instance of the addon', function() {
var addons = project.addons;

assert.equal(addons[0].name, 'Ember Non Root Addon');
assert.equal(addons[3].name, 'Ember Non Root Addon');
});

it('addons get passed the project instance', function() {
Expand All @@ -89,7 +90,7 @@ describe('models/project.js', function() {
it('returns an instance of an addon that uses `ember-addon-main`', function() {
var addons = project.addons;

assert.equal(addons[1].name, 'Ember Random Addon');
assert.equal(addons[4].name, 'Ember Random Addon');
});

it('returns the default blueprints path', function() {
Expand All @@ -116,15 +117,15 @@ describe('models/project.js', function() {
it('returns an instance of an addon with an object export', function() {
var addons = project.addons;

assert.ok(addons[2] instanceof Addon);
assert.equal(addons[2].name, 'Ember CLI Generated with export');
assert.ok(addons[5] instanceof Addon);
assert.equal(addons[5].name, 'Ember CLI Generated with export');
});

it('returns an instance of a generated addon with no export', function() {
var addons = project.addons;

assert.ok(addons[3] instanceof Addon);
assert.equal(addons[3].name, '(generated ember-generated-no-export-addon addon)');
assert.ok(addons[6] instanceof Addon);
assert.equal(addons[6].name, '(generated ember-generated-no-export-addon addon)');
});
});

Expand Down
7 changes: 5 additions & 2 deletions tests/unit/tasks/server/express-server-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var ExpressServer = require('../../../../lib/tasks/server/express-server');
var MockUI = require('../../../helpers/mock-ui');
var MockProject = require('../../../helpers/mock-project');
var MockWatcher = require('../../../helpers/mock-watcher');
var MockProxy = require('../../../helpers/mock-proxy');
var ProxyServer = require('../../../helpers/proxy-server');
var request = require('supertest');
var net = require('net');

Expand All @@ -15,7 +15,7 @@ describe('express-server', function() {
beforeEach(function() {
ui = new MockUI();
project = new MockProject();
proxy = new MockProxy();
proxy = new ProxyServer();
subject = new ExpressServer({
ui: ui,
project: project,
Expand All @@ -30,6 +30,9 @@ describe('express-server', function() {
try {
subject.httpServer.close();
} catch(err) { }
try {
proxy.httpServer.close();
} catch(err) { }
});

describe('output', function() {
Expand Down

0 comments on commit b4c66bf

Please sign in to comment.