space-router
Version:
All the routing essentials.
95 lines (94 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: Object.getOwnPropertyDescriptor(all, name).get
});
}
_export(exports, {
get match () {
return match;
},
get matchOne () {
return matchOne;
}
});
function match(routes, url, qs) {
if (!url) {
return;
}
for(var i = 0; i < routes.length; i++){
var m = matchOne(routes[i].pattern, url, qs);
if (m) {
return m;
}
}
}
function matchOne(pattern, url, qs) {
if (!pattern) {
return false;
}
var re = /(?:\?([^#]*))?(#.*)?$/;
var originalUrl = url;
var originalPattern = pattern;
var c = url.match(re);
var params = {};
var query = {};
var search = '';
var hash = '';
var ret;
if (c && c[1]) {
search = '?' + c[1];
query = qs.parse(c[1]);
}
if (c && c[2]) {
hash = c[2] || '';
}
if (pattern !== '*') {
url = segmentize(url.replace(re, ''));
pattern = segmentize(pattern || '');
var max = Math.max(url.length, pattern.length);
for(var i = 0; i < max; i++){
if (pattern[i] && pattern[i].charAt(0) === ':') {
var param = pattern[i].replace(/(^:|[+*?]+$)/g, '');
var flags = (pattern[i].match(/[+*?]+$/) || {})[0] || '';
var plus = flags.indexOf('+') > -1;
var star = flags.indexOf('*') > -1;
var val = url[i] || '';
if (!val && !star && (flags.indexOf('?') < 0 || plus)) {
ret = false;
break;
}
params[param] = decodeURIComponent(val);
if (plus || star) {
params[param] = url.slice(i).map(decodeURIComponent).join('/');
break;
}
} else if (pattern[i] !== url[i]) {
ret = false;
break;
}
}
if (ret === false) {
return false;
}
}
return {
pattern: originalPattern,
url: originalUrl,
pathname: originalUrl.replace(re, ''),
params: params,
query: query,
search: search,
hash: hash
};
}
function segmentize(url) {
return strip(url).split('/');
}
function strip(url) {
return url.replace(/(^\/+|\/+$)/g, '');
}