123456789101112131415161718192021222324252627282930313233343536 |
- 'use strict';
- const pathToRegexp = require('path-to-regexp');
- module.exports = function(options) {
- options = options || {};
- if (options.match && options.ignore) throw new Error('options.match and options.ignore can not both present');
- if (!options.match && !options.ignore) return () => true;
- const matchFn = options.match ? toPathMatch(options.match) : toPathMatch(options.ignore);
- return function pathMatch(ctx) {
- const matched = matchFn(ctx);
- return options.match ? matched : !matched;
- };
- };
- function toPathMatch(pattern) {
- if (typeof pattern === 'string') {
- const reg = pathToRegexp(pattern, [], { end: false });
- if (reg.global) reg.lastIndex = 0;
- return ctx => reg.test(ctx.path);
- }
- if (pattern instanceof RegExp) {
- return ctx => {
- if (pattern.global) pattern.lastIndex = 0;
- return pattern.test(ctx.path);
- };
- }
- if (typeof pattern === 'function') return pattern;
- if (Array.isArray(pattern)) {
- const matchs = pattern.map(item => toPathMatch(item));
- return ctx => matchs.some(match => match(ctx));
- }
- throw new Error('match/ignore pattern must be RegExp, Array or String, but got ' + pattern);
- }
|