From a961e6afffc42da1b4af2beba74f6db08bd5035a Mon Sep 17 00:00:00 2001 From: Martin Iwanowski Date: Mon, 25 Apr 2016 15:21:35 +0200 Subject: [PATCH 1/4] wrap mw w/ all provided wrappers from mw._wrappers --- index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 16537e4..8a63932 100644 --- a/index.js +++ b/index.js @@ -37,8 +37,10 @@ function compose (middleware) { function dispatch (i) { if (i <= index) return Promise.reject(new Error('next() called multiple times')) index = i - const fn = middleware[i] || next + let fn = middleware[i] || next if (!fn) return Promise.resolve() + if (fn._wrapper && Array.isArray(fn._wrapper) && fn._wrapper.length) + fn = fn._wrappers.foreach((wrapper) => { fn = wrapper(fn) }) try { return Promise.resolve(fn(context, function next () { return dispatch(i + 1) From e29fe2ca785b6fe34dbb49186ec624dcdbbb4d29 Mon Sep 17 00:00:00 2001 From: Martin Iwanowski Date: Mon, 25 Apr 2016 15:40:19 +0200 Subject: [PATCH 2/4] fixes linting errors --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 8a63932..8564003 100644 --- a/index.js +++ b/index.js @@ -39,8 +39,9 @@ function compose (middleware) { index = i let fn = middleware[i] || next if (!fn) return Promise.resolve() - if (fn._wrapper && Array.isArray(fn._wrapper) && fn._wrapper.length) + if (fn._wrapper && Array.isArray(fn._wrapper) && fn._wrapper.length) { fn = fn._wrappers.foreach((wrapper) => { fn = wrapper(fn) }) + } try { return Promise.resolve(fn(context, function next () { return dispatch(i + 1) From 39a2ad95336d0063e69ae3078852b7663b491be6 Mon Sep 17 00:00:00 2001 From: Martin Iwanowski Date: Mon, 25 Apr 2016 15:51:13 +0200 Subject: [PATCH 3/4] typo - because I dont test these prototype PRs --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 8564003..c6d9a34 100644 --- a/index.js +++ b/index.js @@ -39,7 +39,7 @@ function compose (middleware) { index = i let fn = middleware[i] || next if (!fn) return Promise.resolve() - if (fn._wrapper && Array.isArray(fn._wrapper) && fn._wrapper.length) { + if (fn._wrappers && Array.isArray(fn._wrappers) && fn._wrappers.length) { fn = fn._wrappers.foreach((wrapper) => { fn = wrapper(fn) }) } try { From de8038cc50a9961760b022eea32a58e64e5d835d Mon Sep 17 00:00:00 2001 From: Martin Iwanowski Date: Mon, 2 May 2016 11:20:22 +0200 Subject: [PATCH 4/4] extract, and solidify wrapping --- index.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index c6d9a34..a8ea24b 100644 --- a/index.js +++ b/index.js @@ -37,11 +37,8 @@ function compose (middleware) { function dispatch (i) { if (i <= index) return Promise.reject(new Error('next() called multiple times')) index = i - let fn = middleware[i] || next + const fn = wrap(middleware[i]) || next if (!fn) return Promise.resolve() - if (fn._wrappers && Array.isArray(fn._wrappers) && fn._wrappers.length) { - fn = fn._wrappers.foreach((wrapper) => { fn = wrapper(fn) }) - } try { return Promise.resolve(fn(context, function next () { return dispatch(i + 1) @@ -52,3 +49,21 @@ function compose (middleware) { } } } + +/** + * composes a wrapped middleware using middleware._wrappers + * + * @param {Function} middleware + * @return {Function} composed + * @api public + */ + +function wrap (middleware) { + if (!middleware) return false + if (!middleware._wrappers) return middleware + if (!Array.isArray(middleware._wrappers)) throw new TypeError('._wrappers must be an array') + if (!middleware._wrappers.length) return middleware + const wrappers = middleware._wrappers + delete middleware._wrappers + return compose([...wrappers, middleware]) +}