summaryrefslogtreecommitdiff
path: root/preact-router/src/util.js
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-08-23 16:46:06 -0300
committerSebastian <sebasjm@gmail.com>2021-08-23 16:48:30 -0300
commit38acabfa6089ab8ac469c12b5f55022fb96935e5 (patch)
tree453dbf70000cc5e338b06201af1eaca8343f8f73 /preact-router/src/util.js
parentf26125e039143b92dc0d84e7775f508ab0cdcaa8 (diff)
downloadnode-vendor-master.tar.gz
node-vendor-master.tar.bz2
node-vendor-master.zip
added web vendorsHEADmaster
Diffstat (limited to 'preact-router/src/util.js')
-rw-r--r--preact-router/src/util.js82
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);
+}