UNPKG

2.19 kBJavaScriptView Raw
1var _ = require('lodash');
2var url = require('url');
3var isGlob = require('is-glob');
4var micromatch = require('micromatch');
5
6module.exports = {
7 match: matchContext
8};
9
10function matchContext(context, uri, req) {
11
12 // single path
13 if (isStringPath(context)) {
14 return matchSingleStringPath(context, uri);
15 }
16
17 // single glob path
18 if (isGlobPath(context)) {
19 return matchSingleGlobPath(context, uri);
20 }
21
22 // multi path
23 if (Array.isArray(context)) {
24 if (context.every(isStringPath)) {
25 return matchMultiPath(context, uri);
26 }
27 if (context.every(isGlobPath)) {
28 return matchMultiGlobPath(context, uri);
29 }
30
31 throw new Error('[HPM] Invalid context. Expecting something like: ["/api", "/ajax"] or ["/api/**", "!**.html"]');
32 }
33
34 // custom matching
35 if (_.isFunction(context)) {
36 var path = getUrlPath(uri);
37 return context(path, req);
38 }
39
40 throw new Error('[HPM] Invalid context. Expecting something like: "/api" or ["/api", "/ajax"]');
41}
42
43/**
44 * @param {String} context '/api'
45 * @param {String} uri 'http://example.org/api/b/c/d.html'
46 * @return {Boolean}
47 */
48function matchSingleStringPath(context, uri) {
49 var path = getUrlPath(uri);
50 return path.indexOf(context) === 0;
51}
52
53function matchSingleGlobPath(pattern, uri) {
54 var path = getUrlPath(uri);
55 var matches = micromatch(path, pattern);
56 return matches && (matches.length > 0);
57}
58
59function matchMultiGlobPath(patternList, uri) {
60 return matchSingleGlobPath(patternList, uri);
61}
62
63/**
64 * @param {String} context ['/api', '/ajax']
65 * @param {String} uri 'http://example.org/api/b/c/d.html'
66 * @return {Boolean}
67 */
68function matchMultiPath(contextList, uri) {
69 for (var i = 0; i < contextList.length; i++) {
70 var context = contextList[i];
71 if (matchSingleStringPath(context, uri)) {
72 return true;
73 }
74 }
75 return false;
76}
77
78function getUrlPath(uri) {
79 return uri && url.parse(uri).path;
80}
81
82function isStringPath(context) {
83 return _.isString(context) && !isGlob(context);
84}
85
86function isGlobPath(context) {
87 return isGlob(context);
88}