hurt
Version:
HTTP and SPA routing using RFC 6570 URI templates
87 lines (67 loc) • 6.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unshift = unshift;
exports.push = push;
exports.default = route;
var _handler = require('./handler');
var _handler2 = _interopRequireDefault(_handler);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var STACK = Symbol('stack');
var OPTIONS = Symbol('options');
function unshift(route) {
var _route$STACK;
for (var _len = arguments.length, stack = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
stack[_key - 1] = arguments[_key];
}
(_route$STACK = route[STACK]).unshift.apply(_route$STACK, stack);
}
function push(route) {
var _route$STACK2;
for (var _len2 = arguments.length, stack = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
stack[_key2 - 1] = arguments[_key2];
}
(_route$STACK2 = route[STACK]).push.apply(_route$STACK2, stack);
}
function isroute(arg) {
return typeof arg === 'function' && arg[STACK] && arg[OPTIONS];
}
function route() {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
if (args.length === 1 && isroute(args[0])) {
return args[0];
}
var stack = [];
var options = {};
var fn = (0, _handler2.default)(stack);
args.forEach(function (arg) {
if (isroute(arg)) {
stack.push.apply(stack, _toConsumableArray(arg[STACK]));
arg = arg[OPTIONS];
} else if (typeof arg === 'function') {
stack.push(arg);
arg = { name: arg.name };
}
Object.keys(arg).forEach(function (key) {
if (!options.hasOwnProperty(key)) {
options[key] = arg[key];
try {
Object.defineProperty(fn, key, {
value: options[key],
writable: false
});
} catch (e) {
//eslint-disable-no-empty
}
}
});
});
fn[STACK] = stack;
fn[OPTIONS] = options;
return fn;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yb3V0ZS5qcyJdLCJuYW1lcyI6WyJ1bnNoaWZ0IiwicHVzaCIsInJvdXRlIiwiU1RBQ0siLCJTeW1ib2wiLCJPUFRJT05TIiwic3RhY2siLCJpc3JvdXRlIiwiYXJnIiwiYXJncyIsImxlbmd0aCIsIm9wdGlvbnMiLCJmbiIsImZvckVhY2giLCJuYW1lIiwiT2JqZWN0Iiwia2V5cyIsImhhc093blByb3BlcnR5Iiwia2V5IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIndyaXRhYmxlIiwiZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFLZ0JBLE8sR0FBQUEsTztRQUlBQyxJLEdBQUFBLEk7a0JBUVFDLEs7O0FBakJ4Qjs7Ozs7Ozs7QUFFQSxJQUFNQyxRQUFRQyxPQUFPLE9BQVAsQ0FBZDtBQUNBLElBQU1DLFVBQVVELE9BQU8sU0FBUCxDQUFoQjs7QUFFTyxTQUFTSixPQUFULENBQWlCRSxLQUFqQixFQUFrQztBQUFBOztBQUFBLG9DQUFQSSxLQUFPO0FBQVBBLFNBQU87QUFBQTs7QUFDdkMsd0JBQU1ILEtBQU4sR0FBYUgsT0FBYixxQkFBd0JNLEtBQXhCO0FBQ0Q7O0FBRU0sU0FBU0wsSUFBVCxDQUFjQyxLQUFkLEVBQStCO0FBQUE7O0FBQUEscUNBQVBJLEtBQU87QUFBUEEsU0FBTztBQUFBOztBQUNwQyx5QkFBTUgsS0FBTixHQUFhRixJQUFiLHNCQUFxQkssS0FBckI7QUFDRDs7QUFFRCxTQUFTQyxPQUFULENBQWlCQyxHQUFqQixFQUFzQjtBQUNwQixTQUFTLE9BQU9BLEdBQVAsS0FBZSxVQUFqQixJQUFpQ0EsSUFBSUwsS0FBSixDQUFqQyxJQUErQ0ssSUFBSUgsT0FBSixDQUF0RDtBQUNEOztBQUVjLFNBQVNILEtBQVQsR0FBd0I7QUFBQSxxQ0FBTk8sSUFBTTtBQUFOQSxRQUFNO0FBQUE7O0FBQ3JDLE1BQUlBLEtBQUtDLE1BQUwsS0FBZ0IsQ0FBaEIsSUFBcUJILFFBQVFFLEtBQUssQ0FBTCxDQUFSLENBQXpCLEVBQTJDO0FBQ3pDLFdBQU9BLEtBQUssQ0FBTCxDQUFQO0FBQ0Q7O0FBRUQsTUFBTUgsUUFBUSxFQUFkO0FBQ0EsTUFBTUssVUFBVSxFQUFoQjtBQUNBLE1BQU1DLEtBQUssdUJBQVFOLEtBQVIsQ0FBWDs7QUFFQUcsT0FBS0ksT0FBTCxDQUFhLGVBQU87QUFDbEIsUUFBSU4sUUFBUUMsR0FBUixDQUFKLEVBQWtCO0FBQ2hCRixZQUFNTCxJQUFOLGlDQUFjTyxJQUFJTCxLQUFKLENBQWQ7QUFDQUssWUFBTUEsSUFBSUgsT0FBSixDQUFOO0FBQ0QsS0FIRCxNQUlLLElBQUksT0FBT0csR0FBUCxLQUFlLFVBQW5CLEVBQStCO0FBQ2xDRixZQUFNTCxJQUFOLENBQVdPLEdBQVg7QUFDQUEsWUFBTSxFQUFFTSxNQUFNTixJQUFJTSxJQUFaLEVBQU47QUFDRDtBQUNEQyxXQUFPQyxJQUFQLENBQVlSLEdBQVosRUFBaUJLLE9BQWpCLENBQXlCLGVBQU87QUFDOUIsVUFBSSxDQUFDRixRQUFRTSxjQUFSLENBQXVCQyxHQUF2QixDQUFMLEVBQWtDO0FBQ2hDUCxnQkFBUU8sR0FBUixJQUFlVixJQUFJVSxHQUFKLENBQWY7O0FBRUEsWUFBSTtBQUNGSCxpQkFBT0ksY0FBUCxDQUFzQlAsRUFBdEIsRUFBMEJNLEdBQTFCLEVBQStCO0FBQzdCRSxtQkFBT1QsUUFBUU8sR0FBUixDQURzQjtBQUU3Qkcsc0JBQVU7QUFGbUIsV0FBL0I7QUFJRCxTQUxELENBTUEsT0FBT0MsQ0FBUCxFQUFVO0FBQ1I7QUFDRDtBQUNGO0FBQ0YsS0FkRDtBQWVELEdBeEJEOztBQTBCQVYsS0FBR1QsS0FBSCxJQUFZRyxLQUFaO0FBQ0FNLEtBQUdQLE9BQUgsSUFBY00sT0FBZDs7QUFFQSxTQUFPQyxFQUFQO0FBQ0QiLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaGFuZGxlciBmcm9tICcuL2hhbmRsZXInO1xuXG5jb25zdCBTVEFDSyA9IFN5bWJvbCgnc3RhY2snKTtcbmNvbnN0IE9QVElPTlMgPSBTeW1ib2woJ29wdGlvbnMnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2hpZnQocm91dGUsIC4uLnN0YWNrKSB7XG4gIHJvdXRlW1NUQUNLXS51bnNoaWZ0KC4uLnN0YWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2gocm91dGUsIC4uLnN0YWNrKSB7XG4gIHJvdXRlW1NUQUNLXS5wdXNoKC4uLnN0YWNrKTtcbn1cblxuZnVuY3Rpb24gaXNyb3V0ZShhcmcpIHtcbiAgcmV0dXJuICggdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJyApICYmIGFyZ1tTVEFDS10gJiYgYXJnW09QVElPTlNdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByb3V0ZSguLi5hcmdzKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBpc3JvdXRlKGFyZ3NbMF0pKSB7XG4gICAgcmV0dXJuIGFyZ3NbMF07XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuICBjb25zdCBvcHRpb25zID0ge307XG4gIGNvbnN0IGZuID0gaGFuZGxlcihzdGFjayk7XG5cbiAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgaWYgKGlzcm91dGUoYXJnKSkge1xuICAgICAgc3RhY2sucHVzaCguLi5hcmdbU1RBQ0tdKTtcbiAgICAgIGFyZyA9IGFyZ1tPUFRJT05TXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhY2sucHVzaChhcmcpO1xuICAgICAgYXJnID0geyBuYW1lOiBhcmcubmFtZSB9O1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IGFyZ1trZXldO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zW2tleV0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vZXNsaW50LWRpc2FibGUtbm8tZW1wdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBmbltTVEFDS10gPSBzdGFjaztcbiAgZm5bT1BUSU9OU10gPSBvcHRpb25zO1xuXG4gIHJldHVybiBmbjtcbn1cbiJdfQ==