diff options
author | Sebastian <sebasjm@gmail.com> | 2021-08-23 16:46:06 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2021-08-23 16:48:30 -0300 |
commit | 38acabfa6089ab8ac469c12b5f55022fb96935e5 (patch) | |
tree | 453dbf70000cc5e338b06201af1eaca8343f8f73 /preact-router/src/util.js | |
parent | f26125e039143b92dc0d84e7775f508ab0cdcaa8 (diff) | |
download | node-vendor-master.tar.gz node-vendor-master.tar.bz2 node-vendor-master.zip |
Diffstat (limited to 'preact-router/src/util.js')
-rw-r--r-- | preact-router/src/util.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/preact-router/src/util.js b/preact-router/src/util.js new file mode 100644 index 0000000..8bd989c --- /dev/null +++ b/preact-router/src/util.js @@ -0,0 +1,82 @@ + +const EMPTY = {}; + +export function assign(obj, props) { + // eslint-disable-next-line guard-for-in + for (let i in props) { + obj[i] = props[i]; + } + return obj; +} + +export function exec(url, route, opts) { + let reg = /(?:\?([^#]*))?(#.*)?$/, + c = url.match(reg), + matches = {}, + ret; + if (c && c[1]) { + let p = c[1].split('&'); + for (let i=0; i<p.length; i++) { + let r = p[i].split('='); + matches[decodeURIComponent(r[0])] = decodeURIComponent(r.slice(1).join('=')); + } + } + url = segmentize(url.replace(reg, '')); + route = segmentize(route || ''); + let max = Math.max(url.length, route.length); + for (let i=0; i<max; i++) { + if (route[i] && route[i].charAt(0)===':') { + let param = route[i].replace(/(^:|[+*?]+$)/g, ''), + flags = (route[i].match(/[+*?]+$/) || EMPTY)[0] || '', + plus = ~flags.indexOf('+'), + star = ~flags.indexOf('*'), + val = url[i] || ''; + if (!val && !star && (flags.indexOf('?')<0 || plus)) { + ret = false; + break; + } + matches[param] = decodeURIComponent(val); + if (plus || star) { + matches[param] = url.slice(i).map(decodeURIComponent).join('/'); + break; + } + } + else if (route[i]!==url[i]) { + ret = false; + break; + } + } + if (opts.default!==true && ret===false) return false; + return matches; +} + +export function pathRankSort(a, b) { + return ( + (a.rank < b.rank) ? 1 : + (a.rank > b.rank) ? -1 : + (a.index - b.index) + ); +} + +// filter out VNodes without attributes (which are unrankeable), and add `index`/`rank` properties to be used in sorting. +export function prepareVNodeForRanking(vnode, index) { + vnode.index = index; + vnode.rank = rankChild(vnode); + return vnode.props; +} + +export function segmentize(url) { + return url.replace(/(^\/+|\/+$)/g, '').split('/'); +} + +export function rankSegment(segment) { + return segment.charAt(0)==':' ? (1 + '*+?'.indexOf(segment.charAt(segment.length-1))) || 4 : 5; +} + +export function rank(path) { + return segmentize(path).map(rankSegment).join(''); +} + +function rankChild(vnode) { + return vnode.props.default ? 0 : rank(vnode.props.path); +} |