diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 00000000..25695874 Binary files /dev/null and b/favicon.ico differ diff --git a/lib/express-middleware.js b/lib/express-middleware.js new file mode 100644 index 00000000..4da2e598 --- /dev/null +++ b/lib/express-middleware.js @@ -0,0 +1,56 @@ +var express = require('express'); +var path = require('path'); + +var middlewares = express.middlewares = {}; + +function safeRequire(m) { + try { + return require(m); + } catch (err) { + return undefined; + } +} + +function createMiddlewareNotInstalled(memberName, moduleName) { + return function () { + throw new Error('The middleware loopback.' + memberName + ' is not installed.\n' + + 'Please run `npm install ' + moduleName + '` to fix the problem.'); + }; +} + +var middlewareModules = { + "compress": "compression", + "timeout": "connect-timeout", + "cookieParser": "cookie-parser", + "cookieSession": "cookie-session", + "csrf": "csurf", + "errorHandler": "errorhandler", + "session": "express-session", + "methodOverride": "method-override", + "logger": "morgan", + "responseTime": "response-time", + "favicon": "serve-favicon", + "directory": "serve-index", + // "static": "serve-static", + "vhost": "vhost" +}; + +middlewares.bodyParser = safeRequire('body-parser'); +middlewares.json = middlewares.bodyParser && middlewares.bodyParser.json; +middlewares.urlencoded = middlewares.bodyParser && middlewares.bodyParser.urlencoded; + +for (var m in middlewareModules) { + var moduleName = middlewareModules[m]; + middlewares[m] = safeRequire(moduleName) || createMiddlewareNotInstalled(m, moduleName); +} + +// serve-favicon requires a path +var favicon = middlewares.favicon; +middlewares.favicon = function (icon, options) { + icon = icon || path.join(__dirname, '../favicon.ico'); + return favicon(icon, options); +}; + +module.exports = express; + + diff --git a/lib/loopback.js b/lib/loopback.js index a7a4c5da..47a575e9 100644 --- a/lib/loopback.js +++ b/lib/loopback.js @@ -2,15 +2,12 @@ * Module dependencies. */ -var express = require('express') +var express = require('./express-middleware') , fs = require('fs') , ejs = require('ejs') - , EventEmitter = require('events').EventEmitter , path = require('path') , proto = require('./application') , DataSource = require('loopback-datasource-juggler').DataSource - , ModelBuilder = require('loopback-datasource-juggler').ModelBuilder - , i8n = require('inflection') , merge = require('util')._extend , assert = require('assert'); @@ -103,6 +100,13 @@ for (var key in express) { , Object.getOwnPropertyDescriptor(express, key)); } +for (var key in express.middlewares) { + Object.defineProperty( + loopback + , key + , Object.getOwnPropertyDescriptor(express.middlewares, key)); +} + /*! * Expose additional loopback middleware * for example `loopback.configure` etc. diff --git a/package.json b/package.json index 0fd3d3d2..24be7f55 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,9 @@ }, "dependencies": { "debug": "~0.8.1", - "express": "~3.5.0", - "strong-remoting": "~1.4.0", + "express": "4.x", + "body-parser": "~1.2.2", + "strong-remoting": "2.0.0-beta2", "inflection": "~1.3.5", "passport": "~0.2.0", "passport-local": "~1.0.0", @@ -44,34 +45,37 @@ "underscore": "~1.6.0", "uid2": "0.0.3", "async": "~0.9.0", - "canonical-json": "0.0.3" + "canonical-json": "0.0.4" }, "peerDependencies": { "loopback-datasource-juggler": "2.0.0-beta1" }, "devDependencies": { + "cookie-parser": "~1.1.0", + "errorhandler": "~1.0.1", + "serve-favicon": "~2.0.0", "loopback-datasource-juggler": "2.0.0-beta1", "mocha": "~1.18.0", "strong-task-emitter": "0.0.x", - "supertest": "~0.12.1", + "supertest": "~0.13.0", "chai": "~1.9.1", - "loopback-testing": "~0.1.2", - "browserify": "~4.1.5", + "loopback-testing": "~0.1.3", + "browserify": "~4.1.6", "grunt": "~0.4.5", "grunt-browserify": "~2.1.0", "grunt-contrib-uglify": "~0.4.0", "grunt-contrib-jshint": "~0.10.0", "grunt-contrib-watch": "~0.6.1", "karma-script-launcher": "~0.1.0", - "karma-chrome-launcher": "~0.1.3", + "karma-chrome-launcher": "~0.1.4", "karma-firefox-launcher": "~0.1.3", "karma-html2js-preprocessor": "~0.1.0", "karma-phantomjs-launcher": "~0.1.4", "karma": "~0.12.16", - "karma-browserify": "~0.2.0", + "karma-browserify": "~0.2.1", "karma-mocha": "~0.1.3", "grunt-karma": "~0.8.3", - "loopback-explorer": "~1.1.0" + "loopback-explorer": "~1.1.1" }, "repository": { "type": "git", diff --git a/test/app.test.js b/test/app.test.js index b7fbd6eb..0d38ff2f 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -327,102 +327,6 @@ describe('app', function() { }); }); - describe('installMiddleware()', function() { - var app; - beforeEach(function() { app = loopback(); }); - - it('installs loopback.token', function(done) { - app.models.accessToken = loopback.AccessToken; - - app.installMiddleware(); - - app.get('/', function(req, res) { - res.send({ accessTokenId: req.accessToken && req.accessToken.id }); - }); - - app.models.accessToken.create({}, function(err, token) { - if (err) done(err); - request(app).get('/') - .set('Authorization', token.id) - .expect(200, { accessTokenId: token.id }) - .end(done); - }); - }); - - it('emits "middleware:preprocessors" before handlers are installed', - function(done) { - app.on('middleware:preprocessors', function() { - this.use(function(req, res, next) { - req.preprocessed = true; - next(); - }); - }); - - app.installMiddleware(); - - app.get('/', function(req, res) { - res.send({ preprocessed: req.preprocessed }); - }); - - request(app).get('/') - .expect(200, { preprocessed: true}) - .end(done); - } - ); - - it('emits "middleware:handlers before installing express router', - function(done) { - app.on('middleware:handlers', function() { - this.use(function(req, res, next) { - res.send({ handler: 'middleware' }); - }); - }); - - app.installMiddleware(); - - app.get('/', function(req, res) { - res.send({ handler: 'router' }); - }); - - request(app).get('/') - .expect(200, { handler: 'middleware' }) - .end(done); - } - ); - - it('emits "middleware:error-handlers" after all request handlers', - function(done) { - var logs = []; - app.on('middleware:error-handlers', function() { - app.use(function(err, req, res, next) { - logs.push(req.url); - next(err); - }); - }); - - app.installMiddleware(); - - request(app).get('/not-found') - .expect(404) - .end(function(err, res) { - if (err) done(err); - expect(logs).to.eql(['/not-found']); - done(); - }); - } - ); - - it('installs REST transport', function(done) { - app.model(loopback.Application); - app.set('restApiRoot', '/api'); - app.installMiddleware(); - - request(app).get('/api/applications') - .expect(200, []) - .end(done); - }); - }); - describe('listen()', function() { it('starts http server', function(done) { var app = loopback(); diff --git a/test/fixtures/access-control/app.js b/test/fixtures/access-control/app.js index e4c21056..fb01c3da 100644 --- a/test/fixtures/access-control/app.js +++ b/test/fixtures/access-control/app.js @@ -8,7 +8,7 @@ var apiPath = '/api'; app.use(loopback.cookieParser('secret')); app.use(loopback.token({model: app.models.accessToken})); app.use(apiPath, loopback.rest()); -app.use(app.router); + app.use(loopback.urlNotFound()); app.use(loopback.errorHandler()); app.enableAuth();