@ditojs/router
Advanced tools
Comparing version 0.40.0 to 0.41.0
@@ -7,5 +7,4 @@ "use strict"; | ||
exports.default = void 0; | ||
const STATIC = 0; | ||
const PARAM = 1; | ||
const MATCH_ANY = 2; | ||
const PARAM = ':'; | ||
const MATCH_ANY = '*'; | ||
@@ -17,6 +16,5 @@ class Node { | ||
initialize(prefix = '/', type = STATIC, children = [], handler = null, paramNames = null) { | ||
this.label = prefix.charCodeAt(0); | ||
initialize(prefix = '/', children = {}, handler = null, paramNames = null) { | ||
this.label = prefix[0]; | ||
this.prefix = prefix; | ||
this.type = type; | ||
this.children = children; | ||
@@ -29,29 +27,9 @@ this.handler = handler; | ||
addChild(child) { | ||
this.children.push(child); | ||
this.children[child.label] = child; | ||
} | ||
findChild(label, type) { | ||
for (const child of this.children) { | ||
if (child.label === label && child.type === type) { | ||
return child; | ||
} | ||
} | ||
findChild(label) { | ||
return this.children[label]; | ||
} | ||
findChildWithLabel(label) { | ||
for (const child of this.children) { | ||
if (child.label === label) { | ||
return child; | ||
} | ||
} | ||
} | ||
findChildWithType(type) { | ||
for (const child of this.children) { | ||
if (child.type === type) { | ||
return child; | ||
} | ||
} | ||
} | ||
add(path, handler) { | ||
@@ -63,4 +41,4 @@ const paramNames = []; | ||
if (ch === ':') { | ||
this.insert(path.substring(0, pos), STATIC); | ||
if (ch === PARAM) { | ||
this.insert(path.substring(0, pos)); | ||
pos++; | ||
@@ -74,18 +52,18 @@ const start = pos; | ||
if (start === length) { | ||
return this.insert(path, PARAM, paramNames, handler); | ||
return this.insert(path, paramNames, handler); | ||
} | ||
pos = start; | ||
this.insert(path.substring(0, pos), PARAM, paramNames); | ||
} else if (ch === '*') { | ||
this.insert(path.substring(0, pos), STATIC); | ||
paramNames.push('*'); | ||
return this.insert(path, MATCH_ANY, paramNames, handler); | ||
this.insert(path.substring(0, pos), paramNames); | ||
} else if (ch === MATCH_ANY) { | ||
this.insert(path.substring(0, pos)); | ||
paramNames.push(MATCH_ANY); | ||
return this.insert(path, paramNames, handler); | ||
} | ||
} | ||
this.insert(path, STATIC, paramNames, handler); | ||
this.insert(path, paramNames, handler); | ||
} | ||
insert(path, type, paramNames, handler) { | ||
insert(path, paramNames, handler) { | ||
let current = this; | ||
@@ -100,3 +78,3 @@ | ||
while (pos < max && path.charCodeAt(pos) === prefix.charCodeAt(pos)) { | ||
while (pos < max && path[pos] === prefix[pos]) { | ||
pos++; | ||
@@ -106,10 +84,8 @@ } | ||
if (pos < prefix.length) { | ||
const node = new Node(prefix.substring(pos), current.type, current.children, current.handler, current.paramNames); | ||
const node = new Node(prefix.substring(pos), current.children, current.handler, current.paramNames); | ||
current.initialize(prefix.substring(0, pos)); | ||
current.addChild(node); | ||
if (pos === path.length) { | ||
current.type = type; | ||
} else { | ||
const node = new Node(path.substring(pos), type); | ||
if (pos < path.length) { | ||
const node = new Node(path.substring(pos)); | ||
current.addChild(node); | ||
@@ -120,3 +96,3 @@ current = node; | ||
path = path.substring(pos); | ||
const child = current.findChildWithLabel(path.charCodeAt(0)); | ||
const child = current.findChild(path[0]); | ||
@@ -128,3 +104,3 @@ if (child !== undefined) { | ||
const node = new Node(path, type); | ||
const node = new Node(path); | ||
current.addChild(node); | ||
@@ -175,7 +151,7 @@ current = node; | ||
path = path.substring(this.prefix.length); | ||
} else if (this.type !== PARAM) { | ||
} else if (this.label !== PARAM) { | ||
return null; | ||
} | ||
const staticChild = this.findChild(path.charCodeAt(0), STATIC); | ||
const staticChild = this.findChild(path[0]); | ||
@@ -194,3 +170,3 @@ if (staticChild) { | ||
const paramChild = this.findChildWithType(PARAM); | ||
const paramChild = this.findChild(PARAM); | ||
@@ -209,7 +185,7 @@ if (paramChild) { | ||
const anyChild = this.findChildWithType(MATCH_ANY); | ||
const matchAnyChild = this.findChild(MATCH_ANY); | ||
if (anyChild) { | ||
if (matchAnyChild) { | ||
paramValues.push(path); | ||
return anyChild.find('', paramValues); | ||
return matchAnyChild.find('', paramValues); | ||
} | ||
@@ -225,7 +201,5 @@ | ||
const lines = [`${format(prefix, tail, '└── ', '├── ')}${this.type === PARAM ? `${this.prefix}${this.paramName}` : this.prefix}${handler ? ` ${handler}` : ''} children=${this.children.length}`]; | ||
const children = Object.values(this.children); | ||
const lines = [`${format(prefix, tail, '└── ', '├── ')}${this.label === PARAM ? `${this.prefix}${this.paramName}` : this.prefix}${handler ? ` ${handler}` : ''} children=${children.length}`]; | ||
const str = format(prefix, tail, ' ', '│ '); | ||
const { | ||
children | ||
} = this; | ||
@@ -242,2 +216,2 @@ for (let i = 0, l = children.length - 1; i <= l; i++) { | ||
exports.default = Node; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Ob2RlLmpzIl0sIm5hbWVzIjpbIlNUQVRJQyIsIlBBUkFNIiwiTUFUQ0hfQU5ZIiwiTm9kZSIsImNvbnN0cnVjdG9yIiwiYXJncyIsImluaXRpYWxpemUiLCJwcmVmaXgiLCJ0eXBlIiwiY2hpbGRyZW4iLCJoYW5kbGVyIiwicGFyYW1OYW1lcyIsImxhYmVsIiwiY2hhckNvZGVBdCIsInBhcmFtTmFtZSIsImFkZENoaWxkIiwiY2hpbGQiLCJwdXNoIiwiZmluZENoaWxkIiwiZmluZENoaWxkV2l0aExhYmVsIiwiZmluZENoaWxkV2l0aFR5cGUiLCJhZGQiLCJwYXRoIiwicG9zIiwibGVuZ3RoIiwiY2giLCJpbnNlcnQiLCJzdWJzdHJpbmciLCJzdGFydCIsIm1hdGNoIiwiY3VycmVudCIsIm1heCIsIm5vZGUiLCJ1bmRlZmluZWQiLCJmaW5kIiwicGFyYW1WYWx1ZXMiLCJwYXJhbXMiLCJpIiwibmFtZSIsImZ1bGxNYXRjaCIsInN0YXJ0c1dpdGgiLCJzdGF0aWNDaGlsZCIsInJlc3VsdCIsInBhcmFtQ2hpbGQiLCJwb3AiLCJhbnlDaGlsZCIsInRvU3RyaW5nIiwidGFpbCIsInJvb3QiLCJmb3JtYXQiLCJvbiIsIm9mZiIsImxpbmVzIiwic3RyIiwibCIsImpvaW4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE1BQU1BLE1BQU0sR0FBRyxDQUFmO0FBQ0EsTUFBTUMsS0FBSyxHQUFHLENBQWQ7QUFDQSxNQUFNQyxTQUFTLEdBQUcsQ0FBbEI7O0FBRWUsTUFBTUMsSUFBTixDQUFXO0FBQ3hCQyxFQUFBQSxXQUFXLENBQUMsR0FBR0MsSUFBSixFQUFVO0FBQ25CLFNBQUtDLFVBQUwsQ0FBZ0IsR0FBR0QsSUFBbkI7QUFDRDs7QUFFREMsRUFBQUEsVUFBVSxDQUNSQyxNQUFNLEdBQUcsR0FERCxFQUVSQyxJQUFJLEdBQUdSLE1BRkMsRUFHUlMsUUFBUSxHQUFHLEVBSEgsRUFJUkMsT0FBTyxHQUFHLElBSkYsRUFLUkMsVUFBVSxHQUFHLElBTEws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RUFBMEJoQixDQUFDLEtBQUtpQixDQUFoQyxFQUFtQyxLQUFuQyxDQUFYO0FBQ0Q7O0FBQ0QsV0FBT0YsS0FBSyxDQUFDRyxJQUFOLENBQVcsSUFBWCxDQUFQO0FBQ0Q7O0FBOU51QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5vZGUgVHlwZXM6XG5jb25zdCBTVEFUSUMgPSAwXG5jb25zdCBQQVJBTSA9IDFcbmNvbnN0IE1BVENIX0FOWSA9IDJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICB0aGlzLmluaXRpYWxpemUoLi4uYXJncylcbiAgfVxuXG4gIGluaXRpYWxpemUoXG4gICAgcHJlZml4ID0gJy8nLFxuICAgIHR5cGUgPSBTVEFUSUMsXG4gICAgY2hpbGRyZW4gPSBbXSxcbiAgICBoYW5kbGVyID0gbnVsbCxcbiAgICBwYXJhbU5hbWVzID0gbnVsbFxuICApIHtcbiAgICB0aGlzLmxhYmVsID0gcHJlZml4LmNoYXJDb2RlQXQoMClcbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW5cbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdGhpcy5wYXJhbU5hbWVzID0gcGFyYW1OYW1lc1xuICAgIHRoaXMucGFyYW1OYW1lID0gbnVsbFxuICB9XG5cbiAgYWRkQ2hpbGQoY2hpbGQpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpXG4gIH1cblxuICBmaW5kQ2hpbGQobGFiZWwsIHR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC5sYWJlbCA9PT0gbGFiZWwgJiYgY2hpbGQudHlwZSA9PT0gdHlwZSkge1xuICAgICAgICByZXR1cm4gY2hpbGRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaW5kQ2hpbGRXaXRoTGFiZWwobGFiZWwpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjaGlsZC5sYWJlbCA9PT0gbGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZmluZENoaWxkV2l0aFR5cGUodHlwZSkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkKHBhdGgsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBwYXJhbU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBwb3MgPSAwLCBsZW5ndGggPSBwYXRoLmxlbmd0aDsgcG9zIDwgbGVuZ3RoOyBwb3MrKykge1xuICAgICAgY29uc3QgY2ggPSBwYXRoW3Bvc11cbiAgICAgIGlmIChjaCA9PT0gJzonKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHBhdGguc3Vic3RyaW5nKDAsIHBvcyksIFNUQVRJQylcbiAgICAgICAgcG9zKysgLy8gU2tpcCBjb2xvbi5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwb3NcbiAgICAgICAgLy8gTW92ZSBwb3MgdG8gdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgc2xhc2ggb3IgdGhlIGVuZDpcbiAgICAgICAgcG9zICs9IHBhdGguc3Vic3RyaW5nKHBvcykubWF0Y2goL14oW14vXSopLylbMV0ubGVuZ3RoXG5cbiAgICAgICAgcGFyYW1OYW1lcy5wdXNoKHBhdGguc3Vic3RyaW5nKHN0YXJ0LCBwb3MpKVxuICAgICAgICAvLyBDaG9wIG91dCBwYXJhbSBuYW1lIGZyb20gcGF0aCwgYnV0IGtlZXAgY29sb24uXG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzdGFydCkgKyBwYXRoLnN1YnN0cmluZyhwb3MpXG4gICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoIC8vIFVwZGF0ZSBsZW5ndGggYWZ0ZXIgY2hhbmdpbmcgcGF0aC5cblxuICAgICAgICBpZiAoc3RhcnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydChwYXRoLCBQQVJBTSwgcGFyYW1OYW1lcywgaGFuZGxlcilcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBzdGFydFxuICAgICAgICB0aGlzLmluc2VydChwYXRoLnN1YnN0cmluZygwLCBwb3MpLCBQQVJBTSwgcGFyYW1OYW1lcylcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcqJykge1xuICAgICAgICB0aGlzLmluc2VydChwYXRoLnN1YnN0cmluZygwLCBwb3MpLCBTVEFUSUMpXG4gICAgICAgIHBhcmFtTmFtZXMucHVzaCgnKicpXG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydChwYXRoLCBNQVRDSF9BTlksIHBhcmFtTmFtZXMsIGhhbmRsZXIpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHBhdGgsIFNUQVRJQywgcGFyYW1OYW1lcywgaGFuZGxlcilcbiAgfVxuXG4gIGluc2VydChwYXRoLCB0eXBlLCBwYXJhbU5hbWVzLCBoYW5kbGVyKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEZpbmQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBwYXRoIGFuZCB0aGUgbm9kZSdzIHByZWZpeCBzdGFydCBkaXZlcmdpbmcuXG4gICAgICBjb25zdCB7IHByZWZpeCB9ID0gY3VycmVudFxuICAgICAgbGV0IHBvcyA9IDBcbiAgICAgIGNvbnN0IG1heCA9IHBhdGgubGVuZ3RoIDwgcHJlZml4Lmxlbmd0aCA/IHBhdGgubGVuZ3RoIDogcHJlZml4Lmxlbmd0aFxuICAgICAgd2hpbGUgKHBvcyA8IG1heCAmJiBwYXRoLmNoYXJDb2RlQXQocG9zKSA9PT0gcHJlZml4LmNoYXJDb2RlQXQocG9zKSkge1xuICAgICAgICBwb3MrK1xuICAgICAgfVxuICAgICAgaWYgKHBvcyA8IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgLy8gU3BsaXQgbm9kZVxuICAgICAgICBjb25zdCBub2RlID0gbmV3IE5vZGUoXG4gICAgICAgICAgcHJlZml4LnN1YnN0cmluZyhwb3MpLFxuICAgICAgICAgIGN1cnJlbnQudHlwZSxcbiAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnQuaGFuZGxlcixcbiAgICAgICAgICBjdXJyZW50LnBhcmFtTmFtZXNcbiAgICAgICAgKVxuICAgICAgICAvLyBSZXNldCBwYXJlbnQgbm9kZSBhbmQgYWRkIG5ldyBub2RlIGFzIGNoaWxkIHRvIGl0OlxuICAgICAgICBjdXJyZW50LmluaXRpYWxpemUocHJlZml4LnN1YnN0cmluZygwLCBwb3MpKVxuICAgICAgICBjdXJyZW50LmFkZENoaWxkKG5vZGUpXG4gICAgICAgIGlmIChwb3MgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQXQgcGFyZW50IG5vZGVcbiAgICAgICAgICBjdXJyZW50LnR5cGUgPSB0eXBlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNoaWxkIG5vZGVcbiAgICAgICAgICBjb25zdCBub2RlID0gbmV3IE5vZGUocGF0aC5zdWJzdHJpbmcocG9zKSwgdHlwZSlcbiAgICAgICAgICBjdXJyZW50LmFkZENoaWxkKG5vZGUpXG4gICAgICAgICAgY3VycmVudCA9IG5vZGUgLy8gU3dpdGNoIHRvIGNoaWxkIHRvIHNldCBoYW5kbGVyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocG9zIDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBvcylcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50LmZpbmRDaGlsZFdpdGhMYWJlbChwYXRoLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgIGlmIChjaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gR28gZGVlcGVyXG4gICAgICAgICAgY3VycmVudCA9IGNoaWxkXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgY2hpbGQgbm9kZVxuICAgICAgICBjb25zdCBub2RlID0gbmV3IE5vZGUocGF0aCwgdHlwZSlcbiAgICAgICAgY3VycmVudC5hZGRDaGlsZChub2RlKVxuICAgICAgICBjdXJyZW50ID0gbm9kZSAvLyBTd2l0Y2ggdG8gY2hpbGQgdG8gc2V0IGhhbmRsZXJcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIGN1cnJlbnQuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgY3VycmVudC5wYXJhbU5hbWVzID0gcGFyYW1OYW1lc1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtTmFtZXMpIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGxhc3QgZW50cnkgZnJvbSB0aGUgbGlzdCBvZiBwYXJhbSBuYW1lcyB0aGF0IGtlZXBzXG4gICAgICAgIC8vIGdyb3dpbmcgZHVyaW5nIHBhcnNpbmcgYXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgY3VycmVudC5wYXJhbU5hbWUgPSBwYXJhbU5hbWVzW3BhcmFtTmFtZXMubGVuZ3RoIC0gMV1cbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgZmluZChwYXRoLCBwYXJhbVZhbHVlcyA9IFtdKSB7XG4gICAgaWYgKCFwYXRoIHx8IHBhdGggPT09IHRoaXMucHJlZml4KSB7XG4gICAgICAvLyBJdCdzIGEgbWF0Y2ghXG4gICAgICBjb25zdCB7IGhhbmRsZXIsIHBhcmFtTmFtZXMgfSA9IHRoaXNcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIC8vIENvbnZlcnQgcGFyYW1OYW1lcyBhbmQgdmFsdWVzIHRvIHBhcmFtc1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHBhcmFtTmFtZXMpIHtcbiAgICAgICAgICBwYXJhbXNbbmFtZV0gPSBwYXJhbVZhbHVlc1tpKytdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaGFuZGxlciwgcGFyYW1zIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgZnVsbE1hdGNoID0gcGF0aC5zdGFydHNXaXRoKHRoaXMucHJlZml4KVxuICAgIGlmIChmdWxsTWF0Y2gpIHtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyh0aGlzLnByZWZpeC5sZW5ndGgpXG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgIT09IFBBUkFNKSB7XG4gICAgICAvLyBJZiB0aGUgcGF0aCBkb2Vzbid0IGZ1bGx5IG1hdGNoIHRoZSBwcmVmaXgsIHdlIG9ubHkgbmVlZCB0byBsb29rXG4gICAgICAvLyBmdXJ0aGVyIG9uIHBhcmFtIG5vZGVzLCB3aGljaCBjYW4gaGF2ZSBvdmVybGFwcGluZyBzdGF0aWMgY2hpbGRyZW4uXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFNlYXJjaCBvcmRlcjogU3RhdGljID4gUGFyYW0gPiBNYXRjaC1hbnlcblxuICAgIC8vIFN0YXRpYyBub2RlXG4gICAgY29uc3Qgc3RhdGljQ2hpbGQgPSB0aGlzLmZpbmRDaGlsZChwYXRoLmNoYXJDb2RlQXQoMCksIFNUQVRJQylcbiAgICBpZiAoc3RhdGljQ2hpbGQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRpY0NoaWxkLmZpbmQocGF0aCwgcGFyYW1WYWx1ZXMpXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb2RlIG5vdCBmb3VuZFxuICAgIGlmICghZnVsbE1hdGNoKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFBhcmFtIG5vZGVcbiAgICBjb25zdCBwYXJhbUNoaWxkID0gdGhpcy5maW5kQ2hpbGRXaXRoVHlwZShQQVJBTSlcbiAgICBpZiAocGFyYW1DaGlsZCkge1xuICAgICAgLy8gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgc2xhc2g6XG4gICAgICBjb25zdCBwb3MgPSBwYXRoLm1hdGNoKC9eKFteL10qKS8pWzFdLmxlbmd0aFxuICAgICAgcGFyYW1WYWx1ZXMucHVzaChwYXRoLnN1YnN0cmluZygwLCBwb3MpKVxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyYW1DaGlsZC5maW5kKHBhdGguc3Vic3RyaW5nKHBvcyksIHBhcmFtVmFsdWVzKVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICBwYXJhbVZhbHVlcy5wb3AoKVxuICAgIH1cblxuICAgIC8vIE1hdGNoLWFueSBub2RlXG4gICAgY29uc3QgYW55Q2hpbGQgPSB0aGlzLmZpbmRDaGlsZFdpdGhUeXBlKE1BVENIX0FOWSlcbiAgICBpZiAoYW55Q2hpbGQpIHtcbiAgICAgIHBhcmFtVmFsdWVzLnB1c2gocGF0aClcbiAgICAgIHJldHVybiBhbnlDaGlsZC5maW5kKCcnLCBwYXJhbVZhbHVlcykgLy8gJycgPT0gRW5kXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHRvU3RyaW5nKHByZWZpeCA9ICcnLCB0YWlsID0gdHJ1ZSwgcm9vdCA9IHRydWUpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyICYmIGAke3RoaXMuaGFuZGxlci5uYW1lIHx8ICfGkid9KClgXG4gICAgY29uc3QgZm9ybWF0ID0gKHByZWZpeCwgdGFpbCwgb24sIG9mZikgPT5cbiAgICAgIHJvb3QgPyAnJyA6IGAke3ByZWZpeH0ke3RhaWwgPyBvbiA6IG9mZn1gXG4gICAgY29uc3QgbGluZXMgPSBbXG4gICAgICBgJHtmb3JtYXQocHJlZml4LCB0YWlsLCAn4pSU4pSA4pSAICcsICfilJzilIDilIAgJyl9JHtcbiAgICAgICAgdGhpcy50eXBlID09PSBQQVJBTVxuICAgICAgICAgID8gYCR7dGhpcy5wcmVmaXh9JHt0aGlzLnBhcmFtTmFtZX1gXG4gICAgICAgICAgOiB0aGlzLnByZWZpeFxuICAgICAgfSR7XG4gICAgICAgIGhhbmRsZXIgPyBgICR7aGFuZGxlcn1gIDogJydcbiAgICAgIH0gY2hpbGRyZW49JHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGhcbiAgICAgIH1gXG4gICAgXVxuXG4gICAgY29uc3Qgc3RyID0gZm9ybWF0KHByZWZpeCwgdGFpbCwgJyAgICAnLCAn4pSCICAgJylcbiAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSB0aGlzXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpIDw9IGw7IGkrKykge1xuICAgICAgbGluZXMucHVzaChjaGlsZHJlbltpXS50b1N0cmluZyhzdHIsIGkgPT09IGwsIGZhbHNlKSlcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpXG4gIH1cbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Ob2RlLmpzIl0sIm5hbWVzIjpbIlBBUkFNIiwiTUFUQ0hfQU5ZIiwiTm9kZSIsImNvbnN0cnVjdG9yIiwiYXJncyIsImluaXRpYWxpemUiLCJwcmVmaXgiLCJjaGlsZHJlbiIsImhhbmRsZXIiLCJwYXJhbU5hbWVzIiwibGFiZWwiLCJwYXJhbU5hbWUiLCJhZGRDaGlsZCIsImNoaWxkIiwiZmluZENoaWxkIiwiYWRkIiwicGF0aCIsInBvcyIsImxlbmd0aCIsImNoIiwiaW5zZXJ0Iiwic3Vic3RyaW5nIiwic3RhcnQiLCJtYXRjaCIsInB1c2giLCJjdXJyZW50IiwibWF4Iiwibm9kZSIsInVuZGVmaW5lZCIsImZpbmQiLCJwYXJhbVZhbHVlcyIsInBhcmFtcyIsImkiLCJuYW1lIiwiZnVsbE1hdGNoIiwic3RhcnRzV2l0aCIsInN0YXRpY0NoaWxkIiwicmVzdWx0IiwicGFyYW1DaGlsZCIsInBvcCIsIm1hdGNoQW55Q2hpbGQiLCJ0b1N0cmluZyIsInRhaWwiLCJyb290IiwiZm9ybWF0Iiwib24iLCJvZmYiLCJPYmplY3QiLCJ2YWx1ZXMiLCJsaW5lcyIsInN0ciIsImwiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxNQUFNQSxLQUFLLEdBQUcsR0FBZDtBQUNBLE1BQU1DLFNBQVMsR0FBRyxHQUFsQjs7QUFFZSxNQUFNQyxJQUFOLENBQVc7QUFDeEJDLEVBQUFBLFdBQVcsQ0FBQyxHQUFHQyxJQUFKLEVBQVU7QUFDbkIsU0FBS0MsVUFBTCxDQUFnQixHQUFHRCxJQUFuQjtBQUNEOztBQUVEQyxFQUFBQSxVQUFVLENBQ1JDLE1BQU0sR0FBRyxHQURELEVBRVJDLFFBQVEsR0FBRyxFQUZILEVBR1JDLE9BQU8sR0FBRyxJQUhGLEVBSVJDLFVBQVUsR0FBRyxJQUpMLEVBS1I7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLE1BQU0sQ0FBQyxDQUFELENBQW5CO0FBQ0EsU0FBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsU0FBS0MsUUFBTCxHQUFn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QUssQ0FBQ3pCLElBQU4sQ0FBV2pCLFFBQVEsQ0FBQ3lCLENBQUQsQ0FBUixDQUFZUyxRQUFaLENBQXFCUyxHQUFyQixFQUEwQmxCLENBQUMsS0FBS21CLENBQWhDLEVBQW1DLEtBQW5DLENBQVg7QUFDRDs7QUFDRCxXQUFPRixLQUFLLENBQUNHLElBQU4sQ0FBVyxJQUFYLENBQVA7QUFDRDs7QUF2TXVCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU3BlY2lhbCBMYWJlbHM6XG5jb25zdCBQQVJBTSA9ICc6J1xuY29uc3QgTUFUQ0hfQU5ZID0gJyonXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vZGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKC4uLmFyZ3MpXG4gIH1cblxuICBpbml0aWFsaXplKFxuICAgIHByZWZpeCA9ICcvJyxcbiAgICBjaGlsZHJlbiA9IHt9LFxuICAgIGhhbmRsZXIgPSBudWxsLFxuICAgIHBhcmFtTmFtZXMgPSBudWxsXG4gICkge1xuICAgIHRoaXMubGFiZWwgPSBwcmVmaXhbMF1cbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlblxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLnBhcmFtTmFtZXMgPSBwYXJhbU5hbWVzXG4gICAgdGhpcy5wYXJhbU5hbWUgPSBudWxsXG4gIH1cblxuICBhZGRDaGlsZChjaGlsZCkge1xuICAgIC8vIE5vIHR3byBjaGlsZHJlbiBjYW4gaGF2ZSB0aGUgc2FtZSBsYWJlbCBpbiBhIHByZWZpeC10cmVlIHNvIHRoaXMgaXMgZmluZTpcbiAgICB0aGlzLmNoaWxkcmVuW2NoaWxkLmxhYmVsXSA9IGNoaWxkXG4gIH1cblxuICBmaW5kQ2hpbGQobGFiZWwpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltsYWJlbF1cbiAgfVxuXG4gIGFkZChwYXRoLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgcGFyYW1OYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgcG9zID0gMCwgbGVuZ3RoID0gcGF0aC5sZW5ndGg7IHBvcyA8IGxlbmd0aDsgcG9zKyspIHtcbiAgICAgIGNvbnN0IGNoID0gcGF0aFtwb3NdXG4gICAgICBpZiAoY2ggPT09IFBBUkFNKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHBhdGguc3Vic3RyaW5nKDAsIHBvcykpXG4gICAgICAgIHBvcysrIC8vIFNraXAgY29sb24uXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9zXG4gICAgICAgIC8vIE1vdmUgcG9zIHRvIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHNsYXNoIG9yIHRoZSBlbmQ6XG4gICAgICAgIHBvcyArPSBwYXRoLnN1YnN0cmluZyhwb3MpLm1hdGNoKC9eKFteL10qKS8pWzFdLmxlbmd0aFxuXG4gICAgICAgIHBhcmFtTmFtZXMucHVzaChwYXRoLnN1YnN0cmluZyhzdGFydCwgcG9zKSlcbiAgICAgICAgLy8gQ2hvcCBvdXQgcGFyYW0gbmFtZSBmcm9tIHBhdGgsIGJ1dCBrZWVwIGNvbG9uLlxuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgc3RhcnQpICsgcGF0aC5zdWJzdHJpbmcocG9zKVxuICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCAvLyBVcGRhdGUgbGVuZ3RoIGFmdGVyIGNoYW5naW5nIHBhdGguXG5cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQocGF0aCwgcGFyYW1OYW1lcywgaGFuZGxlcilcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBzdGFydFxuICAgICAgICAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgcGFyYW1OYW1lcyBoZXJlIGZvciB0b1N0cmluZygpIGFuZCBuZXN0ZWQgcXVlcmllcy5cbiAgICAgICAgdGhpcy5pbnNlcnQocGF0aC5zdWJzdHJpbmcoMCwgcG9zKSwgcGFyYW1OYW1lcylcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IE1BVENIX0FOWSkge1xuICAgICAgICB0aGlzLmluc2VydChwYXRoLnN1YnN0cmluZygwLCBwb3MpKVxuICAgICAgICBwYXJhbU5hbWVzLnB1c2goTUFUQ0hfQU5ZKVxuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQocGF0aCwgcGFyYW1OYW1lcywgaGFuZGxlcilcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocGF0aCwgcGFyYW1OYW1lcywgaGFuZGxlcilcbiAgfVxuXG4gIGluc2VydChwYXRoLCBwYXJhbU5hbWVzLCBoYW5kbGVyKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEZpbmQgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBwYXRoIGFuZCB0aGUgbm9kZSdzIHByZWZpeCBzdGFydCBkaXZlcmdpbmdcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjdXJyZW50XG4gICAgICBsZXQgcG9zID0gMFxuICAgICAgY29uc3QgbWF4ID0gcGF0aC5sZW5ndGggPCBwcmVmaXgubGVuZ3RoID8gcGF0aC5sZW5ndGggOiBwcmVmaXgubGVuZ3RoXG4gICAgICB3aGlsZSAocG9zIDwgbWF4ICYmIHBhdGhbcG9zXSA9PT0gcHJlZml4W3Bvc10pIHtcbiAgICAgICAgcG9zKytcbiAgICAgIH1cbiAgICAgIGlmIChwb3MgPCBwcmVmaXgubGVuZ3RoKSB7XG4gICAgICAgIC8vIFNwbGl0IG5vZGVcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBOb2RlKFxuICAgICAgICAgIHByZWZpeC5zdWJzdHJpbmcocG9zKSxcbiAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnQuaGFuZGxlcixcbiAgICAgICAgICBjdXJyZW50LnBhcmFtTmFtZXNcbiAgICAgICAgKVxuICAgICAgICAvLyBSZXNldCBwYXJlbnQgbm9kZSBhbmQgYWRkIG5ldyBub2RlIGFzIGNoaWxkIHRvIGl0OlxuICAgICAgICBjdXJyZW50LmluaXRpYWxpemUocHJlZml4LnN1YnN0cmluZygwLCBwb3MpKVxuICAgICAgICBjdXJyZW50LmFkZENoaWxkKG5vZGUpXG4gICAgICAgIGlmIChwb3MgPCBwYXRoLmxlbmd0aCkge1xuICAgICAgICAgIC8vIENyZWF0ZSBjaGlsZCBub2RlXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBOb2RlKHBhdGguc3Vic3RyaW5nKHBvcykpXG4gICAgICAgICAgY3VycmVudC5hZGRDaGlsZChub2RlKVxuICAgICAgICAgIGN1cnJlbnQgPSBub2RlIC8vIFN3aXRjaCB0byBjaGlsZCB0byBzZXQgaGFuZGxlclxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBvcyA8IHBhdGgubGVuZ3RoKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhwb3MpXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY3VycmVudC5maW5kQ2hpbGQocGF0aFswXSlcbiAgICAgICAgaWYgKGNoaWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBHbyBkZWVwZXJcbiAgICAgICAgICBjdXJyZW50ID0gY2hpbGRcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBjaGlsZCBub2RlXG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgTm9kZShwYXRoKVxuICAgICAgICBjdXJyZW50LmFkZENoaWxkKG5vZGUpXG4gICAgICAgIGN1cnJlbnQgPSBub2RlIC8vIFN3aXRjaCB0byBjaGlsZCB0byBzZXQgaGFuZGxlclxuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudC5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICBjdXJyZW50LnBhcmFtTmFtZXMgPSBwYXJhbU5hbWVzXG4gICAgICB9XG4gICAgICBpZiAocGFyYW1OYW1lcykge1xuICAgICAgICAvLyBSZW1lbWJlciB0aGUgbGFzdCBlbnRyeSBmcm9tIHRoZSBsaXN0IG9mIHBhcmFtIG5hbWVzIHRoYXQga2VlcHNcbiAgICAgICAgLy8gZ3Jvd2luZyBkdXJpbmcgcGFyc2luZyBhcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICBjdXJyZW50LnBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbcGFyYW1OYW1lcy5sZW5ndGggLSAxXVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBmaW5kKHBhdGgsIHBhcmFtVmFsdWVzID0gW10pIHtcbiAgICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gdGhpcy5wcmVmaXgpIHtcbiAgICAgIC8vIEl0J3MgYSBtYXRjaCFcbiAgICAgIGNvbnN0IHsgaGFuZGxlciwgcGFyYW1OYW1lcyB9ID0gdGhpc1xuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgLy8gQ29udmVydCBwYXJhbU5hbWVzIGFuZCB2YWx1ZXMgdG8gcGFyYW1zXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9XG4gICAgICAgIGxldCBpID0gMFxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcGFyYW1OYW1lcykge1xuICAgICAgICAgIHBhcmFtc1tuYW1lXSA9IHBhcmFtVmFsdWVzW2krK11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoYW5kbGVyLCBwYXJhbXMgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsTWF0Y2ggPSBwYXRoLnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpXG4gICAgaWYgKGZ1bGxNYXRjaCkge1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHRoaXMucHJlZml4Lmxlbmd0aClcbiAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWwgIT09IFBBUkFNKSB7XG4gICAgICAvLyBJZiB0aGUgcGF0aCBkb2Vzbid0IGZ1bGx5IG1hdGNoIHRoZSBwcmVmaXgsIHdlIG9ubHkgbmVlZCB0byBsb29rXG4gICAgICAvLyBmdXJ0aGVyIG9uIHBhcmFtIG5vZGVzLCB3aGljaCBjYW4gaGF2ZSBvdmVybGFwcGluZyBzdGF0aWMgY2hpbGRyZW4uXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFNlYXJjaCBvcmRlcjogU3RhdGljID4gUGFyYW0gPiBNYXRjaC1hbnlcblxuICAgIC8vIFN0YXRpYyBub2RlXG4gICAgY29uc3Qgc3RhdGljQ2hpbGQgPSB0aGlzLmZpbmRDaGlsZChwYXRoWzBdKVxuICAgIGlmIChzdGF0aWNDaGlsZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdGljQ2hpbGQuZmluZChwYXRoLCBwYXJhbVZhbHVlcylcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vZGUgbm90IGZvdW5kXG4gICAgaWYgKCFmdWxsTWF0Y2gpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gUGFyYW0gbm9kZVxuICAgIGNvbnN0IHBhcmFtQ2hpbGQgPSB0aGlzLmZpbmRDaGlsZChQQVJBTSlcbiAgICBpZiAocGFyYW1DaGlsZCkge1xuICAgICAgLy8gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgc2xhc2g6XG4gICAgICBjb25zdCBwb3MgPSBwYXRoLm1hdGNoKC9eKFteL10qKS8pWzFdLmxlbmd0aFxuICAgICAgcGFyYW1WYWx1ZXMucHVzaChwYXRoLnN1YnN0cmluZygwLCBwb3MpKVxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyYW1DaGlsZC5maW5kKHBhdGguc3Vic3RyaW5nKHBvcyksIHBhcmFtVmFsdWVzKVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICBwYXJhbVZhbHVlcy5wb3AoKVxuICAgIH1cblxuICAgIC8vIE1hdGNoLWFueSBub2RlXG4gICAgY29uc3QgbWF0Y2hBbnlDaGlsZCA9IHRoaXMuZmluZENoaWxkKE1BVENIX0FOWSlcbiAgICBpZiAobWF0Y2hBbnlDaGlsZCkge1xuICAgICAgcGFyYW1WYWx1ZXMucHVzaChwYXRoKVxuICAgICAgcmV0dXJuIG1hdGNoQW55Q2hpbGQuZmluZCgnJywgcGFyYW1WYWx1ZXMpIC8vICcnID09IEVuZFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICB0b1N0cmluZyhwcmVmaXggPSAnJywgdGFpbCA9IHRydWUsIHJvb3QgPSB0cnVlKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlciAmJiBgJHt0aGlzLmhhbmRsZXIubmFtZSB8fCAnxpInfSgpYFxuICAgIGNvbnN0IGZvcm1hdCA9IChwcmVmaXgsIHRhaWwsIG9uLCBvZmYpID0+XG4gICAgICByb290ID8gJycgOiBgJHtwcmVmaXh9JHt0YWlsID8gb24gOiBvZmZ9YFxuICAgIGNvbnN0IGNoaWxkcmVuID0gT2JqZWN0LnZhbHVlcyh0aGlzLmNoaWxkcmVuKVxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYCR7Zm9ybWF0KHByZWZpeCwgdGFpbCwgJ+KUlOKUgOKUgCAnLCAn4pSc4pSA4pSAICcpfSR7XG4gICAgICAgIHRoaXMubGFiZWwgPT09IFBBUkFNXG4gICAgICAgICAgPyBgJHt0aGlzLnByZWZpeH0ke3RoaXMucGFyYW1OYW1lfWBcbiAgICAgICAgICA6IHRoaXMucHJlZml4XG4gICAgICB9JHtcbiAgICAgICAgaGFuZGxlciA/IGAgJHtoYW5kbGVyfWAgOiAnJ1xuICAgICAgfSBjaGlsZHJlbj0ke1xuICAgICAgICBjaGlsZHJlbi5sZW5ndGhcbiAgICAgIH1gXG4gICAgXVxuXG4gICAgY29uc3Qgc3RyID0gZm9ybWF0KHByZWZpeCwgdGFpbCwgJyAgICAnLCAn4pSCICAgJylcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA8PSBsOyBpKyspIHtcbiAgICAgIGxpbmVzLnB1c2goY2hpbGRyZW5baV0udG9TdHJpbmcoc3RyLCBpID09PSBsLCBmYWxzZSkpXG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxuICB9XG59XG4iXX0= |
{ | ||
"name": "@ditojs/router", | ||
"version": "0.40.0", | ||
"version": "0.41.0", | ||
"description": "Dito.js Router – Dito.js is a declarative and modern web framework, based on Objection.js, Koa.js and Vue.js", | ||
@@ -29,3 +29,3 @@ "main": "lib/index.js", | ||
"devDependencies": { | ||
"@ditojs/utils": "^0.40.0" | ||
"@ditojs/utils": "^0.41.0" | ||
}, | ||
@@ -39,3 +39,3 @@ "keywords": [ | ||
], | ||
"gitHead": "19103cf1701a5b7c2a46c52075bdc160a28bfb97" | ||
"gitHead": "41f5f6724fec81c02f0cf16359bd1d795c3e8aff" | ||
} |
@@ -1,5 +0,4 @@ | ||
// Node Types: | ||
const STATIC = 0 | ||
const PARAM = 1 | ||
const MATCH_ANY = 2 | ||
// Special Labels: | ||
const PARAM = ':' | ||
const MATCH_ANY = '*' | ||
@@ -13,10 +12,8 @@ export default class Node { | ||
prefix = '/', | ||
type = STATIC, | ||
children = [], | ||
children = {}, | ||
handler = null, | ||
paramNames = null | ||
) { | ||
this.label = prefix.charCodeAt(0) | ||
this.label = prefix[0] | ||
this.prefix = prefix | ||
this.type = type | ||
this.children = children | ||
@@ -29,29 +26,10 @@ this.handler = handler | ||
addChild(child) { | ||
this.children.push(child) | ||
// No two children can have the same label in a prefix-tree so this is fine: | ||
this.children[child.label] = child | ||
} | ||
findChild(label, type) { | ||
for (const child of this.children) { | ||
if (child.label === label && child.type === type) { | ||
return child | ||
} | ||
} | ||
findChild(label) { | ||
return this.children[label] | ||
} | ||
findChildWithLabel(label) { | ||
for (const child of this.children) { | ||
if (child.label === label) { | ||
return child | ||
} | ||
} | ||
} | ||
findChildWithType(type) { | ||
for (const child of this.children) { | ||
if (child.type === type) { | ||
return child | ||
} | ||
} | ||
} | ||
add(path, handler) { | ||
@@ -61,4 +39,4 @@ const paramNames = [] | ||
const ch = path[pos] | ||
if (ch === ':') { | ||
this.insert(path.substring(0, pos), STATIC) | ||
if (ch === PARAM) { | ||
this.insert(path.substring(0, pos)) | ||
pos++ // Skip colon. | ||
@@ -75,23 +53,24 @@ const start = pos | ||
if (start === length) { | ||
return this.insert(path, PARAM, paramNames, handler) | ||
return this.insert(path, paramNames, handler) | ||
} | ||
pos = start | ||
this.insert(path.substring(0, pos), PARAM, paramNames) | ||
} else if (ch === '*') { | ||
this.insert(path.substring(0, pos), STATIC) | ||
paramNames.push('*') | ||
return this.insert(path, MATCH_ANY, paramNames, handler) | ||
// We need to include paramNames here for toString() and nested queries. | ||
this.insert(path.substring(0, pos), paramNames) | ||
} else if (ch === MATCH_ANY) { | ||
this.insert(path.substring(0, pos)) | ||
paramNames.push(MATCH_ANY) | ||
return this.insert(path, paramNames, handler) | ||
} | ||
} | ||
this.insert(path, STATIC, paramNames, handler) | ||
this.insert(path, paramNames, handler) | ||
} | ||
insert(path, type, paramNames, handler) { | ||
insert(path, paramNames, handler) { | ||
let current = this | ||
while (true) { | ||
// Find the position where the path and the node's prefix start diverging. | ||
// Find the position where the path and the node's prefix start diverging | ||
const { prefix } = current | ||
let pos = 0 | ||
const max = path.length < prefix.length ? path.length : prefix.length | ||
while (pos < max && path.charCodeAt(pos) === prefix.charCodeAt(pos)) { | ||
while (pos < max && path[pos] === prefix[pos]) { | ||
pos++ | ||
@@ -103,3 +82,2 @@ } | ||
prefix.substring(pos), | ||
current.type, | ||
current.children, | ||
@@ -112,8 +90,5 @@ current.handler, | ||
current.addChild(node) | ||
if (pos === path.length) { | ||
// At parent node | ||
current.type = type | ||
} else { | ||
if (pos < path.length) { | ||
// Create child node | ||
const node = new Node(path.substring(pos), type) | ||
const node = new Node(path.substring(pos)) | ||
current.addChild(node) | ||
@@ -124,3 +99,3 @@ current = node // Switch to child to set handler | ||
path = path.substring(pos) | ||
const child = current.findChildWithLabel(path.charCodeAt(0)) | ||
const child = current.findChild(path[0]) | ||
if (child !== undefined) { | ||
@@ -132,3 +107,3 @@ // Go deeper | ||
// Create child node | ||
const node = new Node(path, type) | ||
const node = new Node(path) | ||
current.addChild(node) | ||
@@ -169,3 +144,3 @@ current = node // Switch to child to set handler | ||
path = path.substring(this.prefix.length) | ||
} else if (this.type !== PARAM) { | ||
} else if (this.label !== PARAM) { | ||
// If the path doesn't fully match the prefix, we only need to look | ||
@@ -179,3 +154,3 @@ // further on param nodes, which can have overlapping static children. | ||
// Static node | ||
const staticChild = this.findChild(path.charCodeAt(0), STATIC) | ||
const staticChild = this.findChild(path[0]) | ||
if (staticChild) { | ||
@@ -194,3 +169,3 @@ const result = staticChild.find(path, paramValues) | ||
// Param node | ||
const paramChild = this.findChildWithType(PARAM) | ||
const paramChild = this.findChild(PARAM) | ||
if (paramChild) { | ||
@@ -208,6 +183,6 @@ // Find the position of the next slash: | ||
// Match-any node | ||
const anyChild = this.findChildWithType(MATCH_ANY) | ||
if (anyChild) { | ||
const matchAnyChild = this.findChild(MATCH_ANY) | ||
if (matchAnyChild) { | ||
paramValues.push(path) | ||
return anyChild.find('', paramValues) // '' == End | ||
return matchAnyChild.find('', paramValues) // '' == End | ||
} | ||
@@ -222,5 +197,6 @@ | ||
root ? '' : `${prefix}${tail ? on : off}` | ||
const children = Object.values(this.children) | ||
const lines = [ | ||
`${format(prefix, tail, '└── ', '├── ')}${ | ||
this.type === PARAM | ||
this.label === PARAM | ||
? `${this.prefix}${this.paramName}` | ||
@@ -231,3 +207,3 @@ : this.prefix | ||
} children=${ | ||
this.children.length | ||
children.length | ||
}` | ||
@@ -237,3 +213,3 @@ ] | ||
const str = format(prefix, tail, ' ', '│ ') | ||
const { children } = this | ||
for (let i = 0, l = children.length - 1; i <= l; i++) { | ||
@@ -240,0 +216,0 @@ lines.push(children[i].toString(str, i === l, false)) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
159238
1622