@dashkite/oxygen
Version:
Browser-friendly URL-template-based routing
210 lines (209 loc) • 30.2 kB
JavaScript
var PageRouter, i, len, name, queue, ref, value;
import * as Fn from "@dashkite/joy/function";
import { generic } from "@dashkite/joy/generic";
import * as Type from "@dashkite/joy/type";
import * as Obj from "@dashkite/joy/object";
import { events } from "@dashkite/joy/iterable";
import { Router } from "@dashkite/url-router";
import { navigate } from "@dashkite/navigate";
import { encode } from "@dashkite/url-codex";
import { error, relative, isSameOrigin, isCurrentLocation } from "./helpers";
queue = function() {
return new Promise(function(resolve) {
return queueMicrotask(resolve);
});
};
PageRouter = class PageRouter {
static create(...ax) {
return new PageRouter(...ax);
}
constructor({ router, handlers, options } = {}){
this.router = router;
this.handlers = handlers;
this.options = options;
if (this.router == null) {
this.router = new Router();
}
if (this.handlers == null) {
this.handlers = {};
}
}
install() {
(async ()=>{
var ref, results, url;
ref = navigate(window);
results = [];
for await (url of ref){
results.push(this.browse({
url
}));
}
return results;
})();
return (async ()=>{
var event, ref, results;
ref = events("popstate", window);
results = [];
for await (event of ref){
results.push(this.dispatch({
url: window.location.href,
state: event.state
}));
}
return results;
})();
}
async start() {
var after, before, results;
results = [];
while(true){
before = this.router.routes.length;
await queue();
after = this.router.routes.length;
if (before === after) {
this.dispatch({
url: window.location.href
});
break;
} else {
results.push(void 0);
}
}
return results;
}
append(template, data, handler) {
this.router.append({
template,
data
});
return this.handlers[data.name] = handler;
}
prepend(template, data, handler) {
this.router.prepend({
template,
data
});
return this.handlers[data.name] = handler;
}
// convenience / backward compatibility
add(template, data, handler) {
return this.prepend(template, data, handler);
}
match(path) {
return this.router.match(path);
}
_normalize({ url, path, name, query, parameters, state }) {
if (path == null) {
path = (()=>{
if (url == null) {
url = this.link({
name,
query,
parameters
});
}
url = Type.isURL(url) ? url : new URL(url);
return relative(url);
})();
}
if (url == null) {
url = new URL(path, window.location.origin);
}
return {
url,
path,
state,
isSameOrigin: isSameOrigin(url),
isCurrentLocation: isCurrentLocation(url)
};
}
normalize(context) {
if (context.isSameOrigin != null) {
return context;
} else {
return this._normalize(context);
}
}
dispatch(context, store) {
var _error, bindings, data, path, result;
context = this.normalize(context);
({ path } = context);
if ((result = this.match(path)) == null) {
throw error(`dispatch: no matching route for [${path}]`);
} else {
({ data, bindings } = result);
try {
return this.handlers[data.name]({
path,
data,
bindings
}, store);
} catch (error1) {
_error = error1;
console.warn(_error);
throw error(`handler failed for [${path}]`);
}
}
}
link({ name, query, parameters }) {
var base, path, route;
if (query == null) {
query = {
name
};
}
base = window.location.href;
route = this.router.routes.find(function(route) {
return Obj.query(query, route.data);
});
if (route != null) {
path = encode(route.template, parameters != null ? parameters : {});
return new URL(path, base);
} else {
console.warn("no matching route for query", query);
return new URL("/", base);
}
}
push(context) {
context = this.normalize(context);
return window.history.pushState(context.state, "", context.path);
}
replace(context) {
context = this.normalize(context);
return window.history.replaceState(context.state, "", context.path);
}
browse(context) {
context = this.normalize(context);
if (context.isCurrentLocation) {} else if (!context.isSameOrigin) {
return window.open(context.url.href);
} else {
this.push(context);
return this.dispatch(context);
}
}
redirect(context) {
context = this.normalize(context);
if (context.isCurrentLocation) {} else if (!context.isSameOrigin) {
return window.open(context.url.href);
} else {
this.replace(context);
return this.dispatch(context);
}
}
};
ref = Object.getOwnPropertyNames(PageRouter.prototype);
// add convenience class methods
for(i = 0, len = ref.length; i < len; i++){
name = ref[i];
if (name !== "constructor") {
value = PageRouter.prototype[name];
if (Type.isFunction(value)) {
if (PageRouter[name] == null) {
PageRouter[name] = Fn.detach(value);
}
}
}
}
export default PageRouter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS9veHlnZW4vc3JjL2luZGV4LmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxJQUFBLFVBQUEsRUFBQSxDQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFBOztBQUFBLE9BQU8sQ0FBQSxNQUFQLE1BQUE7O0FBQ0EsT0FBQTtFQUFTLE9BQVQ7Q0FBQSxNQUFBOztBQUNBLE9BQU8sQ0FBQSxRQUFQLE1BQUE7O0FBQ0EsT0FBTyxDQUFBLE9BQVAsTUFBQTs7QUFDQSxPQUFBO0VBQVMsTUFBVDtDQUFBLE1BQUE7O0FBQ0EsT0FBQTtFQUFTLE1BQVQ7Q0FBQSxNQUFBOztBQUNBLE9BQUE7RUFBUyxRQUFUO0NBQUEsTUFBQTs7QUFDQSxPQUFBO0VBQVMsTUFBVDtDQUFBLE1BQUE7O0FBQ0EsT0FBQTtFQUFTLEtBQVQ7RUFBZ0IsUUFBaEI7RUFBMEIsWUFBMUI7RUFBd0MsaUJBQXhDO0NBQUEsTUFBQTs7QUFHQSxLQUFBLEdBQVEsUUFBQSxDQUFBLENBQUE7U0FDTixJQUFJLE9BQUosQ0FBWSxRQUFBLENBQUUsT0FBRixDQUFBO1dBQ1YsY0FBQSxDQUFlLE9BQWY7RUFEVSxDQUFaO0FBRE07O0FBSUYsYUFBTixNQUFBLFdBQUE7RUFFVyxPQUFSLE1BQVEsQ0FBQSxHQUFFLEVBQUYsQ0FBQTtXQUFhLElBQUksVUFBSixDQUFlLEdBQUEsRUFBZjtFQUFiOztFQUVULFdBQWEsQ0FBQyxPQUFBLFVBQUEsU0FBQSxJQUFtQyxDQUFBLENBQXBDLENBQUE7SUFBRyxJQUFDLENBQUE7SUFBUSxJQUFDLENBQUE7SUFBVSxJQUFDLENBQUE7O01BQ25DLElBQUMsQ0FBQSxTQUFVLElBQUksTUFBSixDQUFBOzs7TUFDWCxJQUFDLENBQUEsV0FBWSxDQUFBOztFQUZGOztFQUliLE9BQVMsQ0FBQSxDQUFBO0lBRUosQ0FBQSxLQUFBLENBQUEsQ0FBQSxHQUFBO0FBQ1AsVUFBQSxHQUFBLEVBQUEsT0FBQSxFQUFBO0FBQU07QUFBQTtNQUFBLHNCQUFBO3FCQUNFLElBQUMsQ0FBQSxNQUFELENBQVEsQ0FBRSxHQUFGLENBQVI7TUFERixDQUFBOztJQURDLENBQUE7V0FJQSxDQUFBLEtBQUEsQ0FBQSxDQUFBLEdBQUE7QUFDUCxVQUFBLEtBQUEsRUFBQSxHQUFBLEVBQUE7QUFBTTtBQUFBO01BQUEsd0JBQUE7cUJBQ0UsSUFBQyxDQUFBLFFBQUQsQ0FDRTtVQUFBLEdBQUEsRUFBSyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQXJCO1VBQ0EsS0FBQSxFQUFPLEtBQUssQ0FBQztRQURiLENBREY7TUFERixDQUFBOztJQURDLENBQUE7RUFOSTs7RUFZRixNQUFQLEtBQU8sQ0FBQSxDQUFBO0FBQ1QsUUFBQSxLQUFBLEVBQUEsTUFBQSxFQUFBO0FBQUk7V0FBQSxJQUFBO01BQ0UsTUFBQSxHQUFTLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDO01BQ3hCLE1BQVM7TUFDVCxLQUFBLEdBQVEsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUM7TUFDdkIsSUFBRyxNQUFBLEtBQVUsS0FBYjtRQUNFLElBQUMsQ0FBQSxRQUFELENBQVU7VUFBQSxHQUFBLEVBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUFyQixDQUFWO0FBQ0EsY0FGRjtPQUFBLE1BQUE7NkJBQUE7O0lBSkYsQ0FBQTs7RUFESzs7RUFTUCxNQUFRLENBQUUsUUFBRixFQUFZLElBQVosRUFBa0IsT0FBbEIsQ0FBQTtJQUNOLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBUixDQUFlLENBQUUsUUFBRixFQUFZLElBQVosQ0FBZjtXQUNBLElBQUMsQ0FBQSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQU4sQ0FBVCxHQUF1QjtFQUZqQjs7RUFJUixPQUFTLENBQUUsUUFBRixFQUFZLElBQVosRUFBa0IsT0FBbEIsQ0FBQTtJQUNQLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixDQUFnQixDQUFFLFFBQUYsRUFBWSxJQUFaLENBQWhCO1dBQ0EsSUFBQyxDQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBTixDQUFULEdBQXVCO0VBRmhCLENBL0JYOzs7RUFvQ0UsR0FBSyxDQUFFLFFBQUYsRUFBWSxJQUFaLEVBQWtCLE9BQWxCLENBQUE7V0FDSCxJQUFDLENBQUEsT0FBRCxDQUFTLFFBQVQsRUFBbUIsSUFBbkIsRUFBeUIsT0FBekI7RUFERzs7RUFHTCxLQUFPLENBQUUsSUFBRixDQUFBO1dBQVksSUFBQyxDQUFBLE1BQU0sQ0FBQyxLQUFSLENBQWMsSUFBZDtFQUFaOztFQUVQLFVBQVksQ0FBQyxDQUFFLEdBQUYsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixLQUFuQixFQUEwQixVQUExQixFQUFzQyxLQUF0QyxDQUFELENBQUE7O01BQ1YsT0FBVyxDQUFBLENBQUEsQ0FBQSxHQUFBOztVQUNULE1BQU8sSUFBQyxDQUFBLElBQUQsQ0FBTSxDQUFFLElBQUYsRUFBUSxLQUFSLEVBQWUsVUFBZixDQUFOOztRQUNQLEdBQUEsR0FBUyxJQUFJLENBQUMsS0FBTCxDQUFXLEdBQVgsQ0FBSCxHQUF1QixHQUF2QixHQUFnQyxJQUFJLEdBQUosQ0FBUSxHQUFSO2VBQ3RDLFFBQUEsQ0FBUyxHQUFUO01BSFMsQ0FBQTs7O01BSVgsTUFBTyxJQUFJLEdBQUosQ0FBUSxJQUFSLEVBQWMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUE5Qjs7V0FDUDtNQUNFLEdBREY7TUFDTyxJQURQO01BQ2EsS0FEYjtNQUVFLFlBQUEsRUFBYyxZQUFBLENBQWEsR0FBYixDQUZoQjtNQUdFLGlCQUFBLEVBQW1CLGlCQUFBLENBQWtCLEdBQWxCO0lBSHJCO0VBTlU7O0VBWVosU0FBVyxDQUFFLE9BQUYsQ0FBQTtJQUNULElBQUcsNEJBQUg7YUFDRSxRQURGO0tBQUEsTUFBQTthQUVLLElBQUMsQ0FBQSxVQUFELENBQVksT0FBWixFQUZMOztFQURTOztFQUtYLFFBQVUsQ0FBRSxPQUFGLEVBQVcsS0FBWCxDQUFBO0FBQ1osUUFBQSxNQUFBLEVBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxJQUFBLEVBQUE7SUFBSSxPQUFBLEdBQVUsSUFBQyxDQUFBLFNBQUQsQ0FBVyxPQUFYO0lBQ1YsQ0FBQSxDQUFFLElBQUYsQ0FBQSxHQUFXLE9BQVg7SUFDQSxJQUFJLG1DQUFKO01BQ0UsTUFBTSxLQUFBLENBQU0sQ0FBQSxpQ0FBQSxDQUFBLENBQXFDLElBQXJDLENBQUEsQ0FBQSxDQUFOLEVBRFI7S0FBQSxNQUFBO01BR0UsQ0FBQSxDQUFFLElBQUYsRUFBUSxRQUFSLENBQUEsR0FBcUIsTUFBckI7QUFDQTtlQUNFLElBQUMsQ0FBQSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQU4sQ0FBVCxDQUFxQixDQUFFLElBQUYsRUFBUSxJQUFSLEVBQWMsUUFBZCxDQUFyQixFQUErQyxLQUEvQyxFQURGO09BRUEsY0FBQTtRQUFNO1FBQ0osT0FBTyxDQUFDLElBQVIsQ0FBYSxNQUFiO1FBQ0EsTUFBTSxLQUFBLENBQU0sQ0FBQSxvQkFBQSxDQUFBLENBQXdCLElBQXhCLENBQUEsQ0FBQSxDQUFOLEVBRlI7T0FORjs7RUFIUTs7RUFhVixJQUFNLENBQUMsQ0FBRSxJQUFGLEVBQVEsS0FBUixFQUFlLFVBQWYsQ0FBRCxDQUFBO0FBQ1IsUUFBQSxJQUFBLEVBQUEsSUFBQSxFQUFBOztNQUFJLFFBQVMsQ0FBRSxJQUFGOztJQUNULElBQUEsR0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLEtBQUEsR0FBUSxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFmLENBQW9CLFFBQUEsQ0FBRSxLQUFGLENBQUE7YUFBYSxHQUFHLENBQUMsS0FBSixDQUFVLEtBQVYsRUFBaUIsS0FBSyxDQUFDLElBQXZCO0lBQWIsQ0FBcEI7SUFDUixJQUFHLGFBQUg7TUFDRSxJQUFBLEdBQU8sTUFBQSxDQUFPLEtBQUssQ0FBQyxRQUFiLHVCQUF5QixhQUFhLENBQUEsQ0FBdEM7YUFDUCxJQUFJLEdBQUosQ0FBUSxJQUFSLEVBQWMsSUFBZCxFQUZGO0tBQUEsTUFBQTtNQUlFLE9BQU8sQ0FBQyxJQUFSLENBQWEsNkJBQWIsRUFBNEMsS0FBNUM7YUFDQSxJQUFJLEdBQUosQ0FBUSxHQUFSLEVBQWEsSUFBYixFQUxGOztFQUpJOztFQVdOLElBQU0sQ0FBRSxPQUFGLENBQUE7SUFDSixPQUFBLEdBQVUsSUFBQyxDQUFBLFNBQUQsQ0FBVyxPQUFYO1dBQ1YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFmLENBQXlCLE9BQU8sQ0FBQyxLQUFqQyxFQUF3QyxFQUF4QyxFQUE0QyxPQUFPLENBQUMsSUFBcEQ7RUFGSTs7RUFJTixPQUFTLENBQUUsT0FBRixDQUFBO0lBQ1AsT0FBQSxHQUFVLElBQUMsQ0FBQSxTQUFELENBQVcsT0FBWDtXQUNWLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBZixDQUE0QixPQUFPLENBQUMsS0FBcEMsRUFBMkMsRUFBM0MsRUFBK0MsT0FBTyxDQUFDLElBQXZEO0VBRk87O0VBSVQsTUFBUSxDQUFFLE9BQUYsQ0FBQTtJQUNOLE9BQUEsR0FBVSxJQUFDLENBQUEsU0FBRCxDQUFXLE9BQVg7SUFDVixJQUFHLE9BQU8sQ0FBQyxpQkFBWDtBQUFBO0tBQUEsTUFFSyxJQUFHLENBQUMsT0FBTyxDQUFDLFlBQVo7YUFDSCxNQUFNLENBQUMsSUFBUCxDQUFZLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBeEIsRUFERztLQUFBLE1BQUE7TUFHSCxJQUFDLENBQUEsSUFBRCxDQUFNLE9BQU47YUFDQSxJQUFDLENBQUEsUUFBRCxDQUFVLE9BQVYsRUFKRzs7RUFKQzs7RUFVUixRQUFVLENBQUUsT0FBRixDQUFBO0lBQ1IsT0FBQSxHQUFVLElBQUMsQ0FBQSxTQUFELENBQVcsT0FBWDtJQUNWLElBQUcsT0FBTyxDQUFDLGlCQUFYO0FBQUE7S0FBQSxNQUVLLElBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWjthQUNILE1BQU0sQ0FBQyxJQUFQLENBQVksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUF4QixFQURHO0tBQUEsTUFBQTtNQUdILElBQUMsQ0FBQSxPQUFELENBQVMsT0FBVDthQUNBLElBQUMsQ0FBQSxRQUFELENBQVUsT0FBVixFQUpHOztFQUpHOztBQXRHWjs7QUFrSEE7OztBQUFBLEtBQUEscUNBQUE7O0VBQ0UsSUFBRyxJQUFBLEtBQVEsYUFBWDtJQUNFLEtBQUEsR0FBUSxVQUFVLENBQUEsU0FBRSxDQUFFLElBQUY7SUFDcEIsSUFBRyxJQUFJLENBQUMsVUFBTCxDQUFnQixLQUFoQixDQUFIOztRQUNFLFVBQVUsQ0FBRSxJQUFGLElBQVksRUFBRSxDQUFDLE1BQUgsQ0FBVSxLQUFWO09BRHhCO0tBRkY7O0FBREY7O0FBTUEsT0FBQSxRQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRm4gIGZyb20gXCJAZGFzaGtpdGUvam95L2Z1bmN0aW9uXCJcbmltcG9ydCB7IGdlbmVyaWMgfSAgZnJvbSBcIkBkYXNoa2l0ZS9qb3kvZ2VuZXJpY1wiXG5pbXBvcnQgKiBhcyBUeXBlICBmcm9tIFwiQGRhc2hraXRlL2pveS90eXBlXCJcbmltcG9ydCAqIGFzIE9iaiAgZnJvbSBcIkBkYXNoa2l0ZS9qb3kvb2JqZWN0XCJcbmltcG9ydCB7IGV2ZW50cyB9IGZyb20gXCJAZGFzaGtpdGUvam95L2l0ZXJhYmxlXCJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAZGFzaGtpdGUvdXJsLXJvdXRlclwiXG5pbXBvcnQgeyBuYXZpZ2F0ZSB9IGZyb20gXCJAZGFzaGtpdGUvbmF2aWdhdGVcIlxuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSBcIkBkYXNoa2l0ZS91cmwtY29kZXhcIlxuaW1wb3J0IHsgZXJyb3IsIHJlbGF0aXZlLCBpc1NhbWVPcmlnaW4sIGlzQ3VycmVudExvY2F0aW9uIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cblxucXVldWUgPSAtPlxuICBuZXcgUHJvbWlzZSAoIHJlc29sdmUgKSAtPlxuICAgIHF1ZXVlTWljcm90YXNrIHJlc29sdmVcblxuY2xhc3MgUGFnZVJvdXRlclxuXG4gIEBjcmVhdGU6ICggYXguLi4gKSAtPiBuZXcgUGFnZVJvdXRlciBheC4uLlxuXG4gIGNvbnN0cnVjdG9yOiAoeyBAcm91dGVyLCBAaGFuZGxlcnMsIEBvcHRpb25zIH0gPSB7fSkgLT5cbiAgICBAcm91dGVyID89IG5ldyBSb3V0ZXJcbiAgICBAaGFuZGxlcnMgPz0ge31cblxuICBpbnN0YWxsOiAtPlxuXG4gICAgZG8gPT5cbiAgICAgIGZvciBhd2FpdCB1cmwgZnJvbSBuYXZpZ2F0ZSB3aW5kb3dcbiAgICAgICAgQGJyb3dzZSB7IHVybCB9XG5cbiAgICBkbyA9PlxuICAgICAgZm9yIGF3YWl0IGV2ZW50IGZyb20gZXZlbnRzIFwicG9wc3RhdGVcIiwgd2luZG93XG4gICAgICAgIEBkaXNwYXRjaFxuICAgICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgICAgICBzdGF0ZTogZXZlbnQuc3RhdGVcblxuICBzdGFydDogLT5cbiAgICBsb29wXG4gICAgICBiZWZvcmUgPSBAcm91dGVyLnJvdXRlcy5sZW5ndGhcbiAgICAgIGF3YWl0IGRvIHF1ZXVlXG4gICAgICBhZnRlciA9IEByb3V0ZXIucm91dGVzLmxlbmd0aFxuICAgICAgaWYgYmVmb3JlID09IGFmdGVyXG4gICAgICAgIEBkaXNwYXRjaCB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAgIGJyZWFrXG5cbiAgYXBwZW5kOiAoIHRlbXBsYXRlLCBkYXRhLCBoYW5kbGVyICkgLT5cbiAgICBAcm91dGVyLmFwcGVuZCB7IHRlbXBsYXRlLCBkYXRhIH1cbiAgICBAaGFuZGxlcnNbZGF0YS5uYW1lXSA9IGhhbmRsZXJcblxuICBwcmVwZW5kOiAoIHRlbXBsYXRlLCBkYXRhLCBoYW5kbGVyICkgLT5cbiAgICBAcm91dGVyLnByZXBlbmQgeyB0ZW1wbGF0ZSwgZGF0YSB9XG4gICAgQGhhbmRsZXJzW2RhdGEubmFtZV0gPSBoYW5kbGVyXG5cbiAgIyBjb252ZW5pZW5jZSAvIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgYWRkOiAoIHRlbXBsYXRlLCBkYXRhLCBoYW5kbGVyICkgLT4gXG4gICAgQHByZXBlbmQgdGVtcGxhdGUsIGRhdGEsIGhhbmRsZXJcblxuICBtYXRjaDogKCBwYXRoICkgLT4gQHJvdXRlci5tYXRjaCBwYXRoXG5cbiAgX25vcm1hbGl6ZTogKHsgdXJsLCBwYXRoLCBuYW1lLCBxdWVyeSwgcGFyYW1ldGVycywgc3RhdGUgfSkgLT5cbiAgICBwYXRoID89IGRvID0+XG4gICAgICB1cmwgPz0gQGxpbmsgeyBuYW1lLCBxdWVyeSwgcGFyYW1ldGVycyB9XG4gICAgICB1cmwgPSBpZiBUeXBlLmlzVVJMIHVybCB0aGVuIHVybCBlbHNlIG5ldyBVUkwgdXJsXG4gICAgICByZWxhdGl2ZSB1cmxcbiAgICB1cmwgPz0gbmV3IFVSTCBwYXRoLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luXG4gICAgeyBcbiAgICAgIHVybCwgcGF0aCwgc3RhdGUgXG4gICAgICBpc1NhbWVPcmlnaW46IGlzU2FtZU9yaWdpbiB1cmxcbiAgICAgIGlzQ3VycmVudExvY2F0aW9uOiBpc0N1cnJlbnRMb2NhdGlvbiB1cmxcbiAgICB9XG5cbiAgbm9ybWFsaXplOiAoIGNvbnRleHQgKSAtPlxuICAgIGlmIGNvbnRleHQuaXNTYW1lT3JpZ2luP1xuICAgICAgY29udGV4dFxuICAgIGVsc2UgQF9ub3JtYWxpemUgY29udGV4dFxuICAgIFxuICBkaXNwYXRjaDogKCBjb250ZXh0LCBzdG9yZSApIC0+XG4gICAgY29udGV4dCA9IEBub3JtYWxpemUgY29udGV4dFxuICAgIHsgcGF0aCB9ID0gY29udGV4dFxuICAgIGlmICEoIHJlc3VsdCA9IEBtYXRjaCBwYXRoICk/XG4gICAgICB0aHJvdyBlcnJvciBcImRpc3BhdGNoOiBubyBtYXRjaGluZyByb3V0ZSBmb3IgWyN7IHBhdGggfV1cIlxuICAgIGVsc2VcbiAgICAgIHsgZGF0YSwgYmluZGluZ3MgfSA9IHJlc3VsdFxuICAgICAgdHJ5XG4gICAgICAgIEBoYW5kbGVyc1tkYXRhLm5hbWVdIHsgcGF0aCwgZGF0YSwgYmluZGluZ3MgfSwgc3RvcmVcbiAgICAgIGNhdGNoIF9lcnJvclxuICAgICAgICBjb25zb2xlLndhcm4gX2Vycm9yXG4gICAgICAgIHRocm93IGVycm9yIFwiaGFuZGxlciBmYWlsZWQgZm9yIFsjeyBwYXRoIH1dXCJcblxuICBsaW5rOiAoeyBuYW1lLCBxdWVyeSwgcGFyYW1ldGVycyB9KSAtPlxuICAgIHF1ZXJ5ID89IHsgbmFtZSB9XG4gICAgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmICAgIFxuICAgIHJvdXRlID0gQHJvdXRlci5yb3V0ZXMuZmluZCAoIHJvdXRlICkgLT4gT2JqLnF1ZXJ5IHF1ZXJ5LCByb3V0ZS5kYXRhXG4gICAgaWYgcm91dGU/XG4gICAgICBwYXRoID0gZW5jb2RlIHJvdXRlLnRlbXBsYXRlLCAoIHBhcmFtZXRlcnMgPyB7fSApICBcbiAgICAgIG5ldyBVUkwgcGF0aCwgYmFzZVxuICAgIGVsc2VcbiAgICAgIGNvbnNvbGUud2FybiBcIm5vIG1hdGNoaW5nIHJvdXRlIGZvciBxdWVyeVwiLCBxdWVyeVxuICAgICAgbmV3IFVSTCBcIi9cIiwgYmFzZVxuXG4gIHB1c2g6ICggY29udGV4dCApIC0+XG4gICAgY29udGV4dCA9IEBub3JtYWxpemUgY29udGV4dFxuICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSBjb250ZXh0LnN0YXRlLCBcIlwiLCBjb250ZXh0LnBhdGhcblxuICByZXBsYWNlOiAoIGNvbnRleHQgKSAtPlxuICAgIGNvbnRleHQgPSBAbm9ybWFsaXplIGNvbnRleHRcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUgY29udGV4dC5zdGF0ZSwgXCJcIiwgY29udGV4dC5wYXRoXG5cbiAgYnJvd3NlOiAoIGNvbnRleHQgKSAtPlxuICAgIGNvbnRleHQgPSBAbm9ybWFsaXplIGNvbnRleHRcbiAgICBpZiBjb250ZXh0LmlzQ3VycmVudExvY2F0aW9uXG4gICAgICByZXR1cm5cbiAgICBlbHNlIGlmICFjb250ZXh0LmlzU2FtZU9yaWdpblxuICAgICAgd2luZG93Lm9wZW4gY29udGV4dC51cmwuaHJlZlxuICAgIGVsc2VcbiAgICAgIEBwdXNoIGNvbnRleHRcbiAgICAgIEBkaXNwYXRjaCBjb250ZXh0XG5cbiAgcmVkaXJlY3Q6ICggY29udGV4dCApIC0+XG4gICAgY29udGV4dCA9IEBub3JtYWxpemUgY29udGV4dFxuICAgIGlmIGNvbnRleHQuaXNDdXJyZW50TG9jYXRpb25cbiAgICAgIHJldHVyblxuICAgIGVsc2UgaWYgIWNvbnRleHQuaXNTYW1lT3JpZ2luXG4gICAgICB3aW5kb3cub3BlbiBjb250ZXh0LnVybC5ocmVmXG4gICAgZWxzZVxuICAgICAgQHJlcGxhY2UgY29udGV4dFxuICAgICAgQGRpc3BhdGNoIGNvbnRleHRcbiAgXG5cbiMgYWRkIGNvbnZlbmllbmNlIGNsYXNzIG1ldGhvZHNcbmZvciBuYW1lIGluICggT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgUGFnZVJvdXRlcjo6IClcbiAgaWYgbmFtZSAhPSBcImNvbnN0cnVjdG9yXCJcbiAgICB2YWx1ZSA9IFBhZ2VSb3V0ZXI6OlsgbmFtZSBdXG4gICAgaWYgVHlwZS5pc0Z1bmN0aW9uIHZhbHVlXG4gICAgICBQYWdlUm91dGVyWyBuYW1lIF0gPz0gRm4uZGV0YWNoIHZhbHVlXG5cbmV4cG9ydCBkZWZhdWx0IFBhZ2VSb3V0ZXJcbiJdfQ==
//# sourceURL=/@dashkite/oxygen/src/index.coffee
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL294eWdlbi9zcmMvaW5kZXguY29mZmVlIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBGbiAgZnJvbSBcIkBkYXNoa2l0ZS9qb3kvZnVuY3Rpb25cIlxuaW1wb3J0IHsgZ2VuZXJpYyB9ICBmcm9tIFwiQGRhc2hraXRlL2pveS9nZW5lcmljXCJcbmltcG9ydCAqIGFzIFR5cGUgIGZyb20gXCJAZGFzaGtpdGUvam95L3R5cGVcIlxuaW1wb3J0ICogYXMgT2JqICBmcm9tIFwiQGRhc2hraXRlL2pveS9vYmplY3RcIlxuaW1wb3J0IHsgZXZlbnRzIH0gZnJvbSBcIkBkYXNoa2l0ZS9qb3kvaXRlcmFibGVcIlxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBkYXNoa2l0ZS91cmwtcm91dGVyXCJcbmltcG9ydCB7IG5hdmlnYXRlIH0gZnJvbSBcIkBkYXNoa2l0ZS9uYXZpZ2F0ZVwiXG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tIFwiQGRhc2hraXRlL3VybC1jb2RleFwiXG5pbXBvcnQgeyBlcnJvciwgcmVsYXRpdmUsIGlzU2FtZU9yaWdpbiwgaXNDdXJyZW50TG9jYXRpb24gfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuXG5xdWV1ZSA9IC0+XG4gIG5ldyBQcm9taXNlICggcmVzb2x2ZSApIC0+XG4gICAgcXVldWVNaWNyb3Rhc2sgcmVzb2x2ZVxuXG5jbGFzcyBQYWdlUm91dGVyXG5cbiAgQGNyZWF0ZTogKCBheC4uLiApIC0+IG5ldyBQYWdlUm91dGVyIGF4Li4uXG5cbiAgY29uc3RydWN0b3I6ICh7IEByb3V0ZXIsIEBoYW5kbGVycywgQG9wdGlvbnMgfSA9IHt9KSAtPlxuICAgIEByb3V0ZXIgPz0gbmV3IFJvdXRlclxuICAgIEBoYW5kbGVycyA/PSB7fVxuXG4gIGluc3RhbGw6IC0+XG5cbiAgICBkbyA9PlxuICAgICAgZm9yIGF3YWl0IHVybCBmcm9tIG5hdmlnYXRlIHdpbmRvd1xuICAgICAgICBAYnJvd3NlIHsgdXJsIH1cblxuICAgIGRvID0+XG4gICAgICBmb3IgYXdhaXQgZXZlbnQgZnJvbSBldmVudHMgXCJwb3BzdGF0ZVwiLCB3aW5kb3dcbiAgICAgICAgQGRpc3BhdGNoXG4gICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgICAgIHN0YXRlOiBldmVudC5zdGF0ZVxuXG4gIHN0YXJ0OiAtPlxuICAgIGxvb3BcbiAgICAgIGJlZm9yZSA9IEByb3V0ZXIucm91dGVzLmxlbmd0aFxuICAgICAgYXdhaXQgZG8gcXVldWVcbiAgICAgIGFmdGVyID0gQHJvdXRlci5yb3V0ZXMubGVuZ3RoXG4gICAgICBpZiBiZWZvcmUgPT0gYWZ0ZXJcbiAgICAgICAgQGRpc3BhdGNoIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgICAgYnJlYWtcblxuICBhcHBlbmQ6ICggdGVtcGxhdGUsIGRhdGEsIGhhbmRsZXIgKSAtPlxuICAgIEByb3V0ZXIuYXBwZW5kIHsgdGVtcGxhdGUsIGRhdGEgfVxuICAgIEBoYW5kbGVyc1tkYXRhLm5hbWVdID0gaGFuZGxlclxuXG4gIHByZXBlbmQ6ICggdGVtcGxhdGUsIGRhdGEsIGhhbmRsZXIgKSAtPlxuICAgIEByb3V0ZXIucHJlcGVuZCB7IHRlbXBsYXRlLCBkYXRhIH1cbiAgICBAaGFuZGxlcnNbZGF0YS5uYW1lXSA9IGhhbmRsZXJcblxuICAjIGNvbnZlbmllbmNlIC8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBhZGQ6ICggdGVtcGxhdGUsIGRhdGEsIGhhbmRsZXIgKSAtPiBcbiAgICBAcHJlcGVuZCB0ZW1wbGF0ZSwgZGF0YSwgaGFuZGxlclxuXG4gIG1hdGNoOiAoIHBhdGggKSAtPiBAcm91dGVyLm1hdGNoIHBhdGhcblxuICBfbm9ybWFsaXplOiAoeyB1cmwsIHBhdGgsIG5hbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBzdGF0ZSB9KSAtPlxuICAgIHBhdGggPz0gZG8gPT5cbiAgICAgIHVybCA/PSBAbGluayB7IG5hbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzIH1cbiAgICAgIHVybCA9IGlmIFR5cGUuaXNVUkwgdXJsIHRoZW4gdXJsIGVsc2UgbmV3IFVSTCB1cmxcbiAgICAgIHJlbGF0aXZlIHVybFxuICAgIHVybCA/PSBuZXcgVVJMIHBhdGgsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgICB7IFxuICAgICAgdXJsLCBwYXRoLCBzdGF0ZSBcbiAgICAgIGlzU2FtZU9yaWdpbjogaXNTYW1lT3JpZ2luIHVybFxuICAgICAgaXNDdXJyZW50TG9jYXRpb246IGlzQ3VycmVudExvY2F0aW9uIHVybFxuICAgIH1cblxuICBub3JtYWxpemU6ICggY29udGV4dCApIC0+XG4gICAgaWYgY29udGV4dC5pc1NhbWVPcmlnaW4/XG4gICAgICBjb250ZXh0XG4gICAgZWxzZSBAX25vcm1hbGl6ZSBjb250ZXh0XG4gICAgXG4gIGRpc3BhdGNoOiAoIGNvbnRleHQsIHN0b3JlICkgLT5cbiAgICBjb250ZXh0ID0gQG5vcm1hbGl6ZSBjb250ZXh0XG4gICAgeyBwYXRoIH0gPSBjb250ZXh0XG4gICAgaWYgISggcmVzdWx0ID0gQG1hdGNoIHBhdGggKT9cbiAgICAgIHRocm93IGVycm9yIFwiZGlzcGF0Y2g6IG5vIG1hdGNoaW5nIHJvdXRlIGZvciBbI3sgcGF0aCB9XVwiXG4gICAgZWxzZVxuICAgICAgeyBkYXRhLCBiaW5kaW5ncyB9ID0gcmVzdWx0XG4gICAgICB0cnlcbiAgICAgICAgQGhhbmRsZXJzW2RhdGEubmFtZV0geyBwYXRoLCBkYXRhLCBiaW5kaW5ncyB9LCBzdG9yZVxuICAgICAgY2F0Y2ggX2Vycm9yXG4gICAgICAgIGNvbnNvbGUud2FybiBfZXJyb3JcbiAgICAgICAgdGhyb3cgZXJyb3IgXCJoYW5kbGVyIGZhaWxlZCBmb3IgWyN7IHBhdGggfV1cIlxuXG4gIGxpbms6ICh7IG5hbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzIH0pIC0+XG4gICAgcXVlcnkgPz0geyBuYW1lIH1cbiAgICBiYXNlID0gd2luZG93LmxvY2F0aW9uLmhyZWYgICAgXG4gICAgcm91dGUgPSBAcm91dGVyLnJvdXRlcy5maW5kICggcm91dGUgKSAtPiBPYmoucXVlcnkgcXVlcnksIHJvdXRlLmRhdGFcbiAgICBpZiByb3V0ZT9cbiAgICAgIHBhdGggPSBlbmNvZGUgcm91dGUudGVtcGxhdGUsICggcGFyYW1ldGVycyA/IHt9ICkgIFxuICAgICAgbmV3IFVSTCBwYXRoLCBiYXNlXG4gICAgZWxzZVxuICAgICAgY29uc29sZS53YXJuIFwibm8gbWF0Y2hpbmcgcm91dGUgZm9yIHF1ZXJ5XCIsIHF1ZXJ5XG4gICAgICBuZXcgVVJMIFwiL1wiLCBiYXNlXG5cbiAgcHVzaDogKCBjb250ZXh0ICkgLT5cbiAgICBjb250ZXh0ID0gQG5vcm1hbGl6ZSBjb250ZXh0XG4gICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlIGNvbnRleHQuc3RhdGUsIFwiXCIsIGNvbnRleHQucGF0aFxuXG4gIHJlcGxhY2U6ICggY29udGV4dCApIC0+XG4gICAgY29udGV4dCA9IEBub3JtYWxpemUgY29udGV4dFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSBjb250ZXh0LnN0YXRlLCBcIlwiLCBjb250ZXh0LnBhdGhcblxuICBicm93c2U6ICggY29udGV4dCApIC0+XG4gICAgY29udGV4dCA9IEBub3JtYWxpemUgY29udGV4dFxuICAgIGlmIGNvbnRleHQuaXNDdXJyZW50TG9jYXRpb25cbiAgICAgIHJldHVyblxuICAgIGVsc2UgaWYgIWNvbnRleHQuaXNTYW1lT3JpZ2luXG4gICAgICB3aW5kb3cub3BlbiBjb250ZXh0LnVybC5ocmVmXG4gICAgZWxzZVxuICAgICAgQHB1c2ggY29udGV4dFxuICAgICAgQGRpc3BhdGNoIGNvbnRleHRcblxuICByZWRpcmVjdDogKCBjb250ZXh0ICkgLT5cbiAgICBjb250ZXh0ID0gQG5vcm1hbGl6ZSBjb250ZXh0XG4gICAgaWYgY29udGV4dC5pc0N1cnJlbnRMb2NhdGlvblxuICAgICAgcmV0dXJuXG4gICAgZWxzZSBpZiAhY29udGV4dC5pc1NhbWVPcmlnaW5cbiAgICAgIHdpbmRvdy5vcGVuIGNvbnRleHQudXJsLmhyZWZcbiAgICBlbHNlXG4gICAgICBAcmVwbGFjZSBjb250ZXh0XG4gICAgICBAZGlzcGF0Y2ggY29udGV4dFxuICBcblxuIyBhZGQgY29udmVuaWVuY2UgY2xhc3MgbWV0aG9kc1xuZm9yIG5hbWUgaW4gKCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyBQYWdlUm91dGVyOjogKVxuICBpZiBuYW1lICE9IFwiY29uc3RydWN0b3JcIlxuICAgIHZhbHVlID0gUGFnZVJvdXRlcjo6WyBuYW1lIF1cbiAgICBpZiBUeXBlLmlzRnVuY3Rpb24gdmFsdWVcbiAgICAgIFBhZ2VSb3V0ZXJbIG5hbWUgXSA/PSBGbi5kZXRhY2ggdmFsdWVcblxuZXhwb3J0IGRlZmF1bHQgUGFnZVJvdXRlclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUEsVUFBQSxFQUFBLENBQUEsRUFBQSxHQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsRUFBQSxHQUFBLEVBQUE7QUFBQSxPQUFPLENBQUEsSUFBQSxFQUFQLE1BQUEseUJBQUE7QUFDQSxPQUFBLEVBQVMsT0FBVCxRQUFBLHdCQUFBO0FBQ0EsT0FBTyxDQUFBLElBQUEsSUFBUCxNQUFBLHFCQUFBO0FBQ0EsT0FBTyxDQUFBLElBQUEsR0FBUCxNQUFBLHVCQUFBO0FBQ0EsT0FBQSxFQUFTLE1BQVQsUUFBQSx5QkFBQTtBQUNBLE9BQUEsRUFBUyxNQUFULFFBQUEsdUJBQUE7QUFDQSxPQUFBLEVBQVMsUUFBVCxRQUFBLHFCQUFBO0FBQ0EsT0FBQSxFQUFTLE1BQVQsUUFBQSxzQkFBQTtBQUNBLE9BQUEsRUFBUyxLQUFULEVBQWdCLFFBQWhCLEVBQTBCLFlBQTFCLEVBQXdDLGlCQUF4QyxRQUFBLFlBQUE7QUFHQSxLQUFBLEdBQVEsUUFBQSxDQUFBLENBQUE7V0FDTixJQUFJLE9BQUosQ0FBWSxRQUFBLENBQUUsT0FBRixDQUFBO2VBQ1YsY0FBQSxDQUFlLE9BQWY7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