-
Notifications
You must be signed in to change notification settings - Fork 12
/
pagex.min.js
1 lines (1 loc) · 5.81 KB
/
pagex.min.js
1
(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):global.pagex=factory()})(this,function(){"use strict";var pathToRegexp_1=pathToRegexp;var parse_1=parse;var compile_1=compile;var tokensToFunction_1=tokensToFunction;var tokensToRegExp_1=tokensToRegExp;var DEFAULT_DELIMITER="/";var DEFAULT_DELIMITERS="./";var PATH_REGEXP=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g");function parse(str,options){var tokens=[];var key=0;var index=0;var path="";var defaultDelimiter=options&&options.delimiter||DEFAULT_DELIMITER;var delimiters=options&&options.delimiters||DEFAULT_DELIMITERS;var pathEscaped=false;var res;while((res=PATH_REGEXP.exec(str))!==null){var m=res[0];var escaped=res[1];var offset=res.index;path+=str.slice(index,offset);index=offset+m.length;if(escaped){path+=escaped[1];pathEscaped=true;continue}var prev="";var next=str[index];var name=res[2];var capture=res[3];var group=res[4];var modifier=res[5];if(!pathEscaped&&path.length){var k=path.length-1;if(delimiters.indexOf(path[k])>-1){prev=path[k];path=path.slice(0,k)}}if(path){tokens.push(path);path="";pathEscaped=false}var partial=prev!==""&&next!==undefined&&next!==prev;var repeat=modifier==="+"||modifier==="*";var optional=modifier==="?"||modifier==="*";var delimiter=prev||defaultDelimiter;var pattern=capture||group;tokens.push({name:name||key++,prefix:prev,delimiter:delimiter,optional:optional,repeat:repeat,partial:partial,pattern:pattern?escapeGroup(pattern):"[^"+escapeString(delimiter)+"]+?"})}if(path||index<str.length){tokens.push(path+str.substr(index))}return tokens}function compile(str,options){return tokensToFunction(parse(str,options))}function tokensToFunction(tokens){var matches=new Array(tokens.length);for(var i=0;i<tokens.length;i++){if(typeof tokens[i]==="object"){matches[i]=new RegExp("^(?:"+tokens[i].pattern+")$")}}return function(data,options){var path="";var encode=options&&options.encode||encodeURIComponent;for(var i=0;i<tokens.length;i++){var token=tokens[i];if(typeof token==="string"){path+=token;continue}var value=data?data[token.name]:undefined;var segment;if(Array.isArray(value)){if(!token.repeat){throw new TypeError('Expected "'+token.name+'" to not repeat, but got array')}if(value.length===0){if(token.optional)continue;throw new TypeError('Expected "'+token.name+'" to not be empty')}for(var j=0;j<value.length;j++){segment=encode(value[j],token);if(!matches[i].test(segment)){throw new TypeError('Expected all "'+token.name+'" to match "'+token.pattern+'"')}path+=(j===0?token.prefix:token.delimiter)+segment}continue}if(typeof value==="string"||typeof value==="number"||typeof value==="boolean"){segment=encode(String(value),token);if(!matches[i].test(segment)){throw new TypeError('Expected "'+token.name+'" to match "'+token.pattern+'", but got "'+segment+'"')}path+=token.prefix+segment;continue}if(token.optional){if(token.partial)path+=token.prefix;continue}throw new TypeError('Expected "'+token.name+'" to be '+(token.repeat?"an array":"a string"))}return path}}function escapeString(str){return str.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}function escapeGroup(group){return group.replace(/([=!:$/()])/g,"\\$1")}function flags(options){return options&&options.sensitive?"":"i"}function regexpToRegexp(path,keys){if(!keys)return path;var groups=path.source.match(/\((?!\?)/g);if(groups){for(var i=0;i<groups.length;i++){keys.push({name:i,prefix:null,delimiter:null,optional:false,repeat:false,partial:false,pattern:null})}}return path}function arrayToRegexp(path,keys,options){var parts=[];for(var i=0;i<path.length;i++){parts.push(pathToRegexp(path[i],keys,options).source)}return new RegExp("(?:"+parts.join("|")+")",flags(options))}function stringToRegexp(path,keys,options){return tokensToRegExp(parse(path,options),keys,options)}function tokensToRegExp(tokens,keys,options){options=options||{};var strict=options.strict;var start=options.start!==false;var end=options.end!==false;var delimiter=escapeString(options.delimiter||DEFAULT_DELIMITER);var delimiters=options.delimiters||DEFAULT_DELIMITERS;var endsWith=[].concat(options.endsWith||[]).map(escapeString).concat("$").join("|");var route=start?"^":"";var isEndDelimited=tokens.length===0;for(var i=0;i<tokens.length;i++){var token=tokens[i];if(typeof token==="string"){route+=escapeString(token);isEndDelimited=i===tokens.length-1&&delimiters.indexOf(token[token.length-1])>-1}else{var capture=token.repeat?"(?:"+token.pattern+")(?:"+escapeString(token.delimiter)+"(?:"+token.pattern+"))*":token.pattern;if(keys)keys.push(token);if(token.optional){if(token.partial){route+=escapeString(token.prefix)+"("+capture+")?"}else{route+="(?:"+escapeString(token.prefix)+"("+capture+"))?"}}else{route+=escapeString(token.prefix)+"("+capture+")"}}}if(end){if(!strict)route+="(?:"+delimiter+")?";route+=endsWith==="$"?"$":"(?="+endsWith+")"}else{if(!strict)route+="(?:"+delimiter+"(?="+endsWith+"))?";if(!isEndDelimited)route+="(?="+delimiter+"|"+endsWith+")"}return new RegExp(route,flags(options))}function pathToRegexp(path,keys,options){if(path instanceof RegExp){return regexpToRegexp(path,keys)}if(Array.isArray(path)){return arrayToRegexp(path,keys,options)}return stringToRegexp(path,keys,options)}pathToRegexp_1.parse=parse_1;pathToRegexp_1.compile=compile_1;pathToRegexp_1.tokensToFunction=tokensToFunction_1;pathToRegexp_1.tokensToRegExp=tokensToRegExp_1;const is=val=>arg=>typeof arg===val;var pagex=(reg,...args)=>{if(typeof reg==="string"){reg=pathToRegexp_1(reg==="*"?"(.*)":reg)}const negate=args.find(is("boolean"))||false;const callback=args.find(is("function"))||((...args)=>args);const url=args.find(is("string"))||window.location.pathname;if(reg.test(url)===negate)return false;const matched=url.match(reg)||[{}];return callback(...matched.slice(1))};return pagex});