// SPDX-FileCopyrightText: © 2017 EteSync Authors // SPDX-License-Identifier: AGPL-3.0-only export interface RouteKeysType { [Identifier: string]: any; } export class RouteResolver { public routes: {}; constructor(routes: {}) { this.routes = routes; } public getRoute(name: string, _keys?: RouteKeysType): string { let dict = this.routes; let path: string[] = []; name.split(".").forEach((key) => { const val = (typeof dict[key] === "string") ? dict[key] : (dict[key]._base) ? dict[key]._base : key; path.push(val); dict = dict[key]; }); if (_keys) { const keys = Object.assign({}, _keys); path = path.map((pathComponent) => { return pathComponent.split("/").map((val) => { if (val[0] === ":") { const ret = keys[val.slice(1)]; if (ret === undefined) { throw new Error("Missing key: " + val.slice(1)); } delete keys[val.slice(1)]; return ret; } return val; }).join("/"); }); if (Object.keys(keys).length !== 0) { throw new Error("Too many keys for route."); } } return "/" + path.join("/"); } }