@dashkite/url-router
Version:
Match and destructure URLs based on URL templates
68 lines (67 loc) • 9.01 kB
JavaScript
var Assert, Route, Router;
import { match } from "@dashkite/url-codex";
Assert = {
available: function(router, route) {
if (router.exists(route)) {
throw new Error(`url-router: route with template [ ${route.template} ] already exists`);
}
}
};
Route = class Route {
static make(description) {
return new Route(description);
}
constructor({ template: template1, data: data1 }){
this.template = template1;
this.data = data1;
}
};
Router = class Router {
static create() {
return new Router();
}
static make() {
return new Router();
}
constructor(){
this.routes = [];
}
find(route) {
return this.routes.find(function({ template }) {
return template === route.template;
});
}
exists(route) {
return this.find(route) != null;
}
append(route) {
Assert.available(this, route);
return this.routes.push(Route.make(route));
}
prepend(route) {
Assert.available(this, route);
return this.routes.unshift(Route.make(route));
}
// convenience / backward compatibility
add(route) {
return this.append(route);
}
match(url) {
var bindings, data, i, len, ref, template;
ref = this.routes;
for(i = 0, len = ref.length; i < len; i++){
({ template, data } = ref[i]);
if ((bindings = match(template, url)) != null) {
return {
template,
data,
bindings
};
}
}
return void 0;
}
};
export { Router }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS91cmwtcm91dGVyL3NyYy9pbmRleC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsSUFBQSxNQUFBLEVBQUEsS0FBQSxFQUFBOztBQUFBLE9BQUE7RUFBUyxLQUFUO0NBQUEsTUFBQTs7QUFFQSxNQUFBLEdBRUU7RUFBQSxTQUFBLEVBQVcsUUFBQSxDQUFFLE1BQUYsRUFBVSxLQUFWLENBQUE7SUFDVCxJQUFHLE1BQU0sQ0FBQyxNQUFQLENBQWMsS0FBZCxDQUFIO01BQ0UsTUFBTSxJQUFJLEtBQUosQ0FBVSxDQUFBLGtDQUFBLENBQUEsQ0FFVCxLQUFLLENBQUMsUUFGRyxDQUFBLGlCQUFBLENBQVYsRUFEUjs7RUFEUztBQUFYOztBQU9JLFFBQU4sTUFBQSxNQUFBO0VBRVMsT0FBTixJQUFNLENBQUUsV0FBRixDQUFBO1dBQW1CLElBQUksS0FBSixDQUFVLFdBQVY7RUFBbkI7O0VBRVAsV0FBYSxDQUFDO01BQUcsbUJBQUg7TUFBYztJQUFkLENBQUQsQ0FBQTtJQUFHLElBQUMsQ0FBQTtJQUFVLElBQUMsQ0FBQTtFQUFmOztBQUpmOztBQU1NLFNBQU4sTUFBQSxPQUFBO0VBRVcsT0FBUixNQUFRLENBQUEsQ0FBQTtXQUFHLElBQUksTUFBSixDQUFBO0VBQUg7O0VBQ0YsT0FBTixJQUFNLENBQUEsQ0FBQTtXQUFHLElBQUksTUFBSixDQUFBO0VBQUg7O0VBRVAsV0FBYSxDQUFBLENBQUE7SUFBRyxJQUFDLENBQUEsTUFBRCxHQUFVO0VBQWI7O0VBRWIsSUFBTSxDQUFFLEtBQUYsQ0FBQTtXQUNKLElBQUMsQ0FBQSxNQUFNLENBQUMsSUFBUixDQUFhLFFBQUEsQ0FBQyxDQUFFLFFBQUYsQ0FBRCxDQUFBO2FBQ1gsUUFBQSxLQUFZLEtBQUssQ0FBQztJQURQLENBQWI7RUFESTs7RUFJTixNQUFRLENBQUUsS0FBRixDQUFBO1dBQWE7RUFBYjs7RUFFUixNQUFRLENBQUUsS0FBRixDQUFBO0lBQ04sTUFBTSxDQUFDLFNBQVAsQ0FBaUIsSUFBakIsRUFBb0IsS0FBcEI7V0FDQSxJQUFDLENBQUEsTUFBTSxDQUFDLElBQVIsQ0FBYSxLQUFLLENBQUMsSUFBTixDQUFXLEtBQVgsQ0FBYjtFQUZNOztFQUlSLE9BQVMsQ0FBRSxLQUFGLENBQUE7SUFDUCxNQUFNLENBQUMsU0FBUCxDQUFpQixJQUFqQixFQUFvQixLQUFwQjtXQUNBLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixDQUFnQixLQUFLLENBQUMsSUFBTixDQUFXLEtBQVgsQ0FBaEI7RUFGTyxDQWZYOzs7O0VBb0JFLEdBQUssQ0FBRSxLQUFGLENBQUE7V0FBYSxJQUFDLENBQUEsTUFBRCxDQUFRLEtBQVI7RUFBYjs7RUFFTCxLQUFPLENBQUUsR0FBRixDQUFBO0FBQ1QsUUFBQSxRQUFBLEVBQUEsSUFBQSxFQUFBLENBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBO0FBQUk7SUFBQSxLQUFBLHFDQUFBO09BQUksQ0FBRSxRQUFGLEVBQVksSUFBWjtNQUNGLElBQUcseUNBQUg7QUFDRSxlQUFPLENBQUUsUUFBRixFQUFZLElBQVosRUFBa0IsUUFBbEIsRUFEVDs7SUFERjtBQUdBLFdBQU87RUFKRjs7QUF4QlQ7O0FBOEJBLE9BQUE7RUFBUyxNQUFUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiQGRhc2hraXRlL3VybC1jb2RleFwiXG5cbkFzc2VydCA9XG5cbiAgYXZhaWxhYmxlOiAoIHJvdXRlciwgcm91dGUgKSAtPlxuICAgIGlmIHJvdXRlci5leGlzdHMgcm91dGVcbiAgICAgIHRocm93IG5ldyBFcnJvciBcInVybC1yb3V0ZXI6XG4gICAgICAgIHJvdXRlIHdpdGggdGVtcGxhdGVcbiAgICAgICAgWyAjeyByb3V0ZS50ZW1wbGF0ZSB9IF1cbiAgICAgICAgYWxyZWFkeSBleGlzdHNcIlxuXG5jbGFzcyBSb3V0ZVxuXG4gIEBtYWtlOiAoIGRlc2NyaXB0aW9uICkgLT4gbmV3IFJvdXRlIGRlc2NyaXB0aW9uXG5cbiAgY29uc3RydWN0b3I6ICh7IEB0ZW1wbGF0ZSwgQGRhdGEgfSkgLT5cblxuY2xhc3MgUm91dGVyXG5cbiAgQGNyZWF0ZTogLT4gbmV3IFJvdXRlclxuICBAbWFrZTogLT4gbmV3IFJvdXRlclxuXG4gIGNvbnN0cnVjdG9yOiAtPiBAcm91dGVzID0gW11cblxuICBmaW5kOiAoIHJvdXRlICkgLT5cbiAgICBAcm91dGVzLmZpbmQgKHsgdGVtcGxhdGUgfSkgLT4gXG4gICAgICB0ZW1wbGF0ZSA9PSByb3V0ZS50ZW1wbGF0ZVxuXG4gIGV4aXN0czogKCByb3V0ZSApIC0+ICggQGZpbmQgcm91dGUgKT9cblxuICBhcHBlbmQ6ICggcm91dGUgKSAtPiBcbiAgICBBc3NlcnQuYXZhaWxhYmxlIEAsIHJvdXRlXG4gICAgQHJvdXRlcy5wdXNoIFJvdXRlLm1ha2Ugcm91dGVcblxuICBwcmVwZW5kOiAoIHJvdXRlICkgLT4gXG4gICAgQXNzZXJ0LmF2YWlsYWJsZSBALCByb3V0ZVxuICAgIEByb3V0ZXMudW5zaGlmdCBSb3V0ZS5tYWtlIHJvdXRlXG4gIFxuICAjIGNvbnZlbmllbmNlIC8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBhZGQ6ICggcm91dGUgKSAtPiBAYXBwZW5kIHJvdXRlXG5cbiAgbWF0Y2g6ICggdXJsICkgLT5cbiAgICBmb3IgeyB0ZW1wbGF0ZSwgZGF0YSB9IGluIEByb3V0ZXNcbiAgICAgIGlmICggYmluZGluZ3MgPSBtYXRjaCB0ZW1wbGF0ZSwgdXJsICk/XG4gICAgICAgIHJldHVybiB7IHRlbXBsYXRlLCBkYXRhLCBiaW5kaW5ncyB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuXG5leHBvcnQgeyBSb3V0ZXIgfVxuIl19
//# sourceURL=/@dashkite/url-router/src/index.coffee
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL3VybC1yb3V0ZXIvc3JjL2luZGV4LmNvZmZlZSJdLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiQGRhc2hraXRlL3VybC1jb2RleFwiXG5cbkFzc2VydCA9XG5cbiAgYXZhaWxhYmxlOiAoIHJvdXRlciwgcm91dGUgKSAtPlxuICAgIGlmIHJvdXRlci5leGlzdHMgcm91dGVcbiAgICAgIHRocm93IG5ldyBFcnJvciBcInVybC1yb3V0ZXI6XG4gICAgICAgIHJvdXRlIHdpdGggdGVtcGxhdGVcbiAgICAgICAgWyAjeyByb3V0ZS50ZW1wbGF0ZSB9IF1cbiAgICAgICAgYWxyZWFkeSBleGlzdHNcIlxuXG5jbGFzcyBSb3V0ZVxuXG4gIEBtYWtlOiAoIGRlc2NyaXB0aW9uICkgLT4gbmV3IFJvdXRlIGRlc2NyaXB0aW9uXG5cbiAgY29uc3RydWN0b3I6ICh7IEB0ZW1wbGF0ZSwgQGRhdGEgfSkgLT5cblxuY2xhc3MgUm91dGVyXG5cbiAgQGNyZWF0ZTogLT4gbmV3IFJvdXRlclxuICBAbWFrZTogLT4gbmV3IFJvdXRlclxuXG4gIGNvbnN0cnVjdG9yOiAtPiBAcm91dGVzID0gW11cblxuICBmaW5kOiAoIHJvdXRlICkgLT5cbiAgICBAcm91dGVzLmZpbmQgKHsgdGVtcGxhdGUgfSkgLT4gXG4gICAgICB0ZW1wbGF0ZSA9PSByb3V0ZS50ZW1wbGF0ZVxuXG4gIGV4aXN0czogKCByb3V0ZSApIC0+ICggQGZpbmQgcm91dGUgKT9cblxuICBhcHBlbmQ6ICggcm91dGUgKSAtPiBcbiAgICBBc3NlcnQuYXZhaWxhYmxlIEAsIHJvdXRlXG4gICAgQHJvdXRlcy5wdXNoIFJvdXRlLm1ha2Ugcm91dGVcblxuICBwcmVwZW5kOiAoIHJvdXRlICkgLT4gXG4gICAgQXNzZXJ0LmF2YWlsYWJsZSBALCByb3V0ZVxuICAgIEByb3V0ZXMudW5zaGlmdCBSb3V0ZS5tYWtlIHJvdXRlXG4gIFxuICAjIGNvbnZlbmllbmNlIC8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBhZGQ6ICggcm91dGUgKSAtPiBAYXBwZW5kIHJvdXRlXG5cbiAgbWF0Y2g6ICggdXJsICkgLT5cbiAgICBmb3IgeyB0ZW1wbGF0ZSwgZGF0YSB9IGluIEByb3V0ZXNcbiAgICAgIGlmICggYmluZGluZ3MgPSBtYXRjaCB0ZW1wbGF0ZSwgdXJsICk/XG4gICAgICAgIHJldHVybiB7IHRlbXBsYXRlLCBkYXRhLCBiaW5kaW5ncyB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuXG5leHBvcnQgeyBSb3V0ZXIgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUEsTUFBQSxFQUFBLEtBQUEsRUFBQTtBQUFBLE9BQUEsRUFBUyxLQUFULFFBQUEsc0JBQUE7QUFFQSxNQUFBLEdBRUU7SUFBQSxTQUFBLEVBQVcsUUFBQSxDQUFFLE1BQUYsRUFBVSxLQUFWLENBQUE7UUFDVCxJQUFHLE1BQU0sQ0FBQyxNQUFQLENBQWMsS0FBZCxDQUFILEVBQUE7WUFDRSxNQUFNLElBQUksS0FBSixDQUFVLENBQUEsa0NBQUEsQ0FBQSxDQUVULEtBQUssQ0FBQyxRQUZHLENBQUEsaUJBQUEsQ0FBVixFQURSOztJQURTO0FBQVg7QUFPSSxRQUFOLE1BQUEsTUFBQTtJQUVTLE9BQU4sSUFBTSxDQUFFLFdBQUYsQ0FBQSxDQUFBO2VBQW1CLElBQUksS0FBSixDQUFVLFdBQVY7SUFBbkI7SUFFUCxXQUFhLENBQUMsRUFBRyxVQUFBLFNBQUgsRUFBYyxNQUFBLEtBQUEsRUFBZixDQUFBO1FBQUcsSUFBQyxDQUFBLFFBQUEsR0FBQTtRQUFVLElBQUMsQ0FBQSxJQUFBLEdBQUE7SUFBZjtBQUpmO0FBTU0sU0FBTixNQUFBLE9BQUE7SUFFVyxPQUFSLE1BQVEsQ0FBQSxDQUFBLENBQUE7ZUFBRyxJQUFJLE1BQUosQ0FBQTtJQUFIO0lBQ0YsT0FBTixJQUFNLENBQUEsQ0FBQSxDQUFBO2VBQUcsSUFBSSxNQUFKLENBQUE7SUFBSDtJQUVQLFdBQWEsQ0FBQSxDQUFBO1FBQUcsSUFBQyxDQUFBLE1BQUQsR0FBVSxFQUFBO0lBQWI7SUFFYixJQUFNLENBQUUsS0FBRixDQUFBLENBQUE7ZUFDSixJQUFDLENBQUEsTUFBTSxDQUFDLElBQVIsQ0FBYSxRQUFBLENBQUMsRUFBRSxRQUFGLEVBQUQsQ0FBQTttQkFDWCxRQUFBLEtBQVksS0FBSyxDQUFDLFFBQUE7UUFEUCxDQUFiO0lBREk7SUFJTixNQUFRLENBQUUsS0FBRixDQUFBLENBQUE7ZUFBYSxJQUFBLENBQUEsSUFBQSxDQUFBLFVBQUE7SUFBYjtJQUVSLE1BQVEsQ0FBRSxLQUFGLENBQUEsQ0FBQTtRQUNOLE1BQU0sQ0FBQyxTQUFQLENBQWlCLElBQWpCLEVBQW9CLEtBQXBCO2VBQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxJQUFSLENBQWEsS0FBSyxDQUFDLElBQU4sQ0FBVyxLQUFYLENBQWI7SUFGTTtJQUlSLE9BQVMsQ0FBRSxLQUFGLENBQUEsQ0FBQTtRQUNQLE1BQU0sQ0FBQyxTQUFQLENBQWlCLElBQWpCLEVBQW9CLEtBQXBCO2VBQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFSLENBQWdCLEtBQUssQ0FBQyxJQUFOLENBQVcsS0FBWCxDQUFoQjtJQUZPLENBZlg7O0lBb0JFLEdBQUssQ0FBRSxLQUFGLENBQUEsQ0FBQTtlQUFhLElBQUMsQ0FBQSxNQUFELENBQVEsS0FBUjtJQUFiO0lBRUwsS0FBTyxDQUFFLEdBQUYsQ0FBQSxDQUFBO1FBQ1QsSUFBQSxRQUFBLEVBQUEsSUFBQSxFQUFBLENBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBO1FBQUksTUFBQSxJQUFBLENBQUEsTUFBQTtRQUFBLElBQUEsSUFBQSxHQUFBLE1BQUEsSUFBQSxNQUFBLEVBQUEsSUFBQSxLQUFBLEdBQUEsQ0FBQTthQUFJLEVBQUUsUUFBRixFQUFZLElBQVosRUFBQSxHQUFBLEdBQUEsQ0FBQSxFQUFBO1lBQ0YsSUFBRyxDQUFBLFdBQUEsTUFBQSxVQUFBLElBQUEsS0FBQSxJQUFILEVBQUE7Z0JBQ0UsT0FBTztvQkFBRSxRQUFGO29CQUFZLElBQVo7b0JBQWtCO2dCQUFsQixFQURUOztRQURGO1FBR0EsT0FBTyxLQUFBO0lBSkY7QUF4QlQ7QUE4QkEsT0FBQSxFQUFTLE1BQVQifQ==