Skip to content

Commit

Permalink
log and bail if express version > 4
Browse files Browse the repository at this point in the history
  • Loading branch information
jonchurch committed Apr 19, 2020
1 parent 74e682a commit 822f628
Showing 1 changed file with 49 additions and 41 deletions.
90 changes: 49 additions & 41 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,55 @@
const Layer = require('express/lib/router/layer');
const Router = require('express/lib/router');
/* eslint-disable global-require,no-inner-declarations */
const { version: expressVersion } = require('express/package.json');

const last = (arr = []) => arr[arr.length - 1];
const noop = Function.prototype;
if (expressVersion[0] > 4) {
// eslint-disable-next-line no-console
console.log(`DEPRECATED: Package express-async-errors works with version 4.x.x of Express, you are using ${expressVersion} which supports async route handlers natively`);
} else {
const Layer = require('express/lib/router/layer');
const Router = require('express/lib/router');

function copyFnProps(oldFn, newFn) {
Object.keys(oldFn).forEach((key) => {
newFn[key] = oldFn[key];
});
return newFn;
}
const last = (arr = []) => arr[arr.length - 1];
const noop = Function.prototype;

function wrap(fn) {
const newFn = function newFn(...args) {
const ret = fn.apply(this, args);
const next = (args.length === 5 ? args[2] : last(args)) || noop;
if (ret && ret.catch) ret.catch(err => next(err));
return ret;
};
Object.defineProperty(newFn, 'length', {
value: fn.length,
writable: false,
});
return copyFnProps(fn, newFn);
}
function copyFnProps(oldFn, newFn) {
Object.keys(oldFn).forEach((key) => {
newFn[key] = oldFn[key];
});
return newFn;
}

function patchRouterParam() {
const originalParam = Router.prototype.constructor.param;
Router.prototype.constructor.param = function param(name, fn) {
fn = wrap(fn);
return originalParam.call(this, name, fn);
};
}
function wrap(fn) {
const newFn = function newFn(...args) {
const ret = fn.apply(this, args);
const next = (args.length === 5 ? args[2] : last(args)) || noop;
if (ret && ret.catch) ret.catch(err => next(err));
return ret;
};
Object.defineProperty(newFn, 'length', {
value: fn.length,
writable: false,
});
return copyFnProps(fn, newFn);
}

function patchRouterParam() {
const originalParam = Router.prototype.constructor.param;
Router.prototype.constructor.param = function param(name, fn) {
fn = wrap(fn);
return originalParam.call(this, name, fn);
};
}

Object.defineProperty(Layer.prototype, 'handle', {
enumerable: true,
get() {
return this.__handle;
},
set(fn) {
fn = wrap(fn);
this.__handle = fn;
},
});
Object.defineProperty(Layer.prototype, 'handle', {
enumerable: true,
get() {
return this.__handle;
},
set(fn) {
fn = wrap(fn);
this.__handle = fn;
},
});

patchRouterParam();
patchRouterParam();
}

0 comments on commit 822f628

Please sign in to comment.