mirror of https://github.com/MaxLeiter/Drift
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
JavaScript
85 lines
1.9 KiB
JavaScript
var URL = require('url');
|
|
|
|
function unless(middleware, options) {
|
|
if (typeof options === 'undefined') {
|
|
options = middleware;
|
|
middleware = this;
|
|
}
|
|
|
|
var opts = typeof options === 'function' ? {custom: options} : options;
|
|
opts.useOriginalUrl = (typeof opts.useOriginalUrl === 'undefined') ? true : opts.useOriginalUrl;
|
|
|
|
const result = async function (req, res, next) {
|
|
var url = URL.parse((opts.useOriginalUrl ? req.originalUrl : req.url) || req.url || '', true);
|
|
|
|
var skip = false;
|
|
|
|
if (opts.custom) {
|
|
skip = skip || (await opts.custom(req));
|
|
}
|
|
|
|
var paths = oneOrMany(opts.path);
|
|
|
|
if (paths) {
|
|
skip = skip || paths.some(function (p) {
|
|
var methods = p.methods || oneOrMany(p.method);
|
|
return isUrlMatch(p, url.pathname) && isMethodMatch(methods, req.method);
|
|
});
|
|
}
|
|
|
|
var exts = (!opts.ext || Array.isArray(opts.ext)) ?
|
|
opts.ext : [opts.ext];
|
|
|
|
if (exts) {
|
|
skip = skip || exts.some(function (ext) {
|
|
return url.pathname.substr(ext.length * -1) === ext;
|
|
});
|
|
}
|
|
|
|
var methods = oneOrMany(opts.method);
|
|
|
|
if (methods) {
|
|
skip = skip || methods.indexOf(req.method) > -1;
|
|
}
|
|
|
|
if (skip) {
|
|
return next();
|
|
}
|
|
|
|
middleware(req, res, next);
|
|
};
|
|
|
|
result.unless = unless;
|
|
|
|
return result;
|
|
}
|
|
|
|
function oneOrMany(elementOrArray) {
|
|
return !elementOrArray || Array.isArray(elementOrArray) ?
|
|
elementOrArray : [elementOrArray];
|
|
}
|
|
|
|
function isUrlMatch(p, url) {
|
|
var ret = (typeof p === 'string' && p === url) || (p instanceof RegExp && !!p.exec(url));
|
|
if (p instanceof RegExp) {
|
|
p.lastIndex = 0;
|
|
}
|
|
|
|
if (p && p.url) {
|
|
ret = isUrlMatch(p.url, url);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function isMethodMatch(methods, m) {
|
|
if (!methods) {
|
|
return true;
|
|
}
|
|
|
|
methods = oneOrMany(methods);
|
|
|
|
return methods.indexOf(m) > -1;
|
|
}
|
|
|
|
module.exports = unless;
|