From 2cc7d14c0bddfb6401b27e6a894ec664d6093da9 Mon Sep 17 00:00:00 2001 From: Aaron Zhang Date: Tue, 13 May 2014 14:18:36 -0400 Subject: [PATCH] Add express4 support to rearrangeMiddleware. Make sorting stable. --- README.md | 3 +++ lib/util.js | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 508e1a1..e1ebffe 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,9 @@ exports = module.exports = server; exports.use = function() { app.use.apply(app, arguments); }; + +// For Express 4, for grunt-express to access middleware stack +exports._router = app._router; ``` When `server` option is not set, `express` task will generate a plain `connect` object for you. diff --git a/lib/util.js b/lib/util.js index f324ffa..3c7351e 100644 --- a/lib/util.js +++ b/lib/util.js @@ -14,10 +14,25 @@ exports.makeServerTaskName = function makeServerTaskName(serverName, kind) { return 'express_' + serverName + '_' + kind; } +// Sort middlewares by priority without changing order of middlewares +// without specified priority. exports.rearrangeMiddleware = function rearrangeMiddleware(server) { - server.stack = (server.stack || []).sortBy(function(mw) { - return mw.handle.middlewarePriority || 99; + // middleware stack located at server._router for Express4 + if (server._router) server = server._router; + + var prioritySpecified = (server.stack || []).filter(function(mw) { + return (typeof mw.handle.middlewarePriority !== "undefined"); + }); + + var priorityUnspecified = (server.stack || []).filter(function(mw) { + return (typeof mw.handle.middlewarePriority === "undefined"); }); + + prioritySpecified = prioritySpecified.sortBy(function(mw) { + return mw.handle.middlewarePriority; + }); + + server.stack = prioritySpecified.concat(priorityUnspecified); } exports.watchModule = function watchModule(watcher) {