ngx-named-routes
Version:
Add named routes to your angular 7 projects
194 lines • 15.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { cloneDeep } from 'lodash';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
/**
* @record
*/
export function IChildRoute() { }
if (false) {
/** @type {?} */
IChildRoute.prototype.routes;
/** @type {?} */
IChildRoute.prototype.parent_path;
}
/**
* @record
*/
export function INamedRoute() { }
if (false) {
/** @type {?|undefined} */
INamedRoute.prototype.name;
/** @type {?|undefined} */
INamedRoute.prototype.children;
/** @type {?|undefined} */
INamedRoute.prototype._loadedConfig;
}
var NgxNamedRoutesService = /** @class */ (function () {
function NgxNamedRoutesService(__router) {
this.__router = __router;
this.counter = 0;
this.__named_routes = {};
}
/**
* @param {?=} child_route
* @return {?}
*/
NgxNamedRoutesService.prototype.loadRoutes = /**
* @param {?=} child_route
* @return {?}
*/
function (child_route) {
var e_1, _a;
this.counter++;
/** @type {?} */
var routes = [];
routes = child_route ? child_route.routes : cloneDeep(this.__router.config);
try {
for (var routes_1 = tslib_1.__values(routes), routes_1_1 = routes_1.next(); !routes_1_1.done; routes_1_1 = routes_1.next()) {
var route = routes_1_1.value;
/** @type {?} */
var backslash_required = void 0;
if (child_route && ['', '/'].indexOf(child_route.parent_path) === -1) {
backslash_required = child_route.parent_path[0] === '/' ? '' : '/';
route.path = backslash_required + child_route.parent_path + (route.path !== '' ? '/' + route.path : '');
}
else {
backslash_required = route.path[0] === '/' && route.path !== '' ? '' : '/';
route.path = backslash_required + route.path;
}
if (route.name && !this.__named_routes[route.name]) {
this.__named_routes[route.name] = tslib_1.__assign({}, route);
}
if (route.children) {
this.loadRoutes({ routes: route.children, parent_path: route.path });
}
if (route._loadedConfig) {
this.loadRoutes({ routes: route._loadedConfig.routes, parent_path: route.path });
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (routes_1_1 && !routes_1_1.done && (_a = routes_1.return)) _a.call(routes_1);
}
finally { if (e_1) throw e_1.error; }
}
return this.__named_routes;
};
/**
* @param {?} name
* @param {?=} param_values
* @return {?}
*/
NgxNamedRoutesService.prototype.getRoute = /**
* @param {?} name
* @param {?=} param_values
* @return {?}
*/
function (name, param_values) {
// TODO: si no existe el nombre, llamar nuevamente a loadRoutes, porque el módulo puede haber sido cargado perezosamente
// need preloading strategy PreloadAllModules
/** @type {?} */
var raw_route;
/** @type {?} */
var route;
if (!this.__named_routes[name]) {
this.loadRoutes();
if (!this.__named_routes[name]) {
throw new Error("La ruta " + name + " no existe o el m\u00F3dulo que la define a\u00FAn no ha sido cargado.");
}
raw_route = this.__named_routes[name].path;
if (raw_route) {
return this.fillRouteParams(raw_route, param_values);
}
}
else {
raw_route = this.__named_routes[name].path;
return this.fillRouteParams(raw_route, param_values);
}
};
/**
* @return {?}
*/
NgxNamedRoutesService.prototype.getNamedRoutes = /**
* @return {?}
*/
function () {
if (Object.keys(this.__named_routes).length === 0) {
this.loadRoutes();
}
return this.__named_routes;
};
/**
* @param {?} name
* @return {?}
*/
NgxNamedRoutesService.prototype.getNamedRoute = /**
* @param {?} name
* @return {?}
*/
function (name) {
if (Object.keys(this.__named_routes).length === 0) {
this.loadRoutes();
}
return this.__named_routes[name];
};
/**
* @private
* @param {?} raw_route
* @param {?=} param_values
* @return {?}
*/
NgxNamedRoutesService.prototype.fillRouteParams = /**
* @private
* @param {?} raw_route
* @param {?=} param_values
* @return {?}
*/
function (raw_route, param_values) {
if (!param_values || param_values === {}) {
return raw_route;
}
/** @type {?} */
var route = raw_route;
for (var param_key in param_values) {
route = route.replace(':' + param_key, param_values[param_key]);
}
return route;
};
NgxNamedRoutesService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxNamedRoutesService.ctorParameters = function () { return [
{ type: Router }
]; };
/** @nocollapse */ NgxNamedRoutesService.ngInjectableDef = i0.defineInjectable({ factory: function NgxNamedRoutesService_Factory() { return new NgxNamedRoutesService(i0.inject(i1.Router)); }, token: NgxNamedRoutesService, providedIn: "root" });
return NgxNamedRoutesService;
}());
export { NgxNamedRoutesService };
if (false) {
/** @type {?} */
NgxNamedRoutesService.prototype.counter;
/**
* @type {?}
* @private
*/
NgxNamedRoutesService.prototype.__named_routes;
/**
* @type {?}
* @private
*/
NgxNamedRoutesService.prototype.__router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5hbWVkLXJvdXRlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LW5hbWVkLXJvdXRlcy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbmFtZWQtcm91dGVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7QUFFbkMsaUNBR0M7OztJQUZHLDZCQUFvQzs7SUFDcEMsa0NBQW9COzs7OztBQUd4QixpQ0FJQzs7O0lBSEcsMkJBQWM7O0lBQ2QsK0JBQThCOztJQUM5QixvQ0FBaUU7O0FBSXJFO0lBU0ksK0JBQTJCLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFKcEMsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVYLG1CQUFjLEdBQXlCLEVBQUUsQ0FBQztJQUVKLENBQUM7Ozs7O0lBRXhDLDBDQUFVOzs7O0lBQWpCLFVBQWtCLFdBQXlCOztRQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUM7O1lBQ1osTUFBTSxHQUFHLEVBQUU7UUFDZixNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDNUUsS0FBa0IsSUFBQSxXQUFBLGlCQUFBLE1BQU0sQ0FBQSw4QkFBQSxrREFBRTtnQkFBckIsSUFBSSxLQUFLLG1CQUFBOztvQkFDTixrQkFBa0IsU0FBUTtnQkFDOUIsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFD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QUFDLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3JCO1FBRUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7Ozs7SUFFTywrQ0FBZTs7Ozs7O0lBQXZCLFVBQXdCLFNBQVMsRUFBRSxZQUFhO1FBQzVDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxLQUFLLEVBQUUsRUFBRTtZQUN0QyxPQUFPLFNBQVMsQ0FBQztTQUNwQjs7WUFDRyxLQUFLLEdBQUcsU0FBUztRQUNyQixLQUFLLElBQUksU0FBUyxJQUFJLFlBQVksRUFBRTtZQUNoQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7Z0JBdEZKLFVBQVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7Z0JBakJRLE1BQU07OztnQ0FEZjtDQXVHQyxBQXZGRCxJQXVGQztTQXBGWSxxQkFBcUI7OztJQUU5Qix3Q0FBbUI7Ozs7O0lBRW5CLCtDQUFrRDs7Ozs7SUFFL0IseUNBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyLCBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGlsZFJvdXRlIHtcbiAgICByb3V0ZXM6IEFycmF5PHtba2V5OiBzdHJpbmddOiBhbnl9PjtcbiAgICBwYXJlbnRfcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOYW1lZFJvdXRlIGV4dGVuZHMgUm91dGUge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY2hpbGRyZW4/OiBBcnJheTxJTmFtZWRSb3V0ZT47XG4gICAgX2xvYWRlZENvbmZpZz86IHtyb3V0ZXM6IEFycmF5PElOYW1lZFJvdXRlPjsgW2tleTogc3RyaW5nXTogYW55fTtcbn1cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hOYW1lZFJvdXRlc1NlcnZpY2Uge1xuXG4gICAgcHVibGljIGNvdW50ZXIgPSAwO1xuXG4gICAgcHJpdmF0ZSBfX25hbWVkX3JvdXRlczoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9fcm91dGVyOiBSb3V0ZXIpIHt9XG5cbiAgICBwdWJsaWMgbG9hZFJvdXRlcyhjaGlsZF9yb3V0ZT86IElDaGlsZFJvdXRlKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgICAgICB0aGlzLmNvdW50ZXIgKys7XG4gICAgICAgIGxldCByb3V0ZXMgPSBbXTtcbiAgICAgICAgcm91dGVzID0gY2hpbGRfcm91dGUgPyBjaGlsZF9yb3V0ZS5yb3V0ZXMgOiBjbG9uZURlZXAodGhpcy5fX3JvdXRlci5jb25maWcpO1xuICAgICAgICBmb3IgKGxldCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgICAgICAgIGxldCBiYWNrc2xhc2hfcmVxdWlyZWQ6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChjaGlsZF9yb3V0ZSAmJiBbJycsICcvJ10uaW5kZXhPZihjaGlsZF9yb3V0ZS5wYXJlbnRfcGF0aCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgYmFja3NsYXNoX3JlcXVpcmVkID0gY2hpbGRfcm91dGUucGFyZW50X3BhdGhbMF0gPT09ICcvJyA/ICcnIDogJy8nO1xuICAgICAgICAgICAgICAgIHJvdXRlLnBhdGggPSBiYWNrc2xhc2hfcmVxdWlyZWQgKyBjaGlsZF9yb3V0ZS5wYXJlbnRfcGF0aCArIChyb3V0ZS5wYXRoICE9PSAnJyA/ICcvJyArIHJvdXRlLnBhdGggOiAnJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJhY2tzbGFzaF9yZXF1aXJlZCA9IHJvdXRlLnBhdGhbMF0gPT09ICcvJyAmJiByb3V0ZS5wYXRoICE9PSAnJyA/ICcnIDogJy8nO1xuICAgICAgICAgICAgICAgIHJvdXRlLnBhdGggPSBiYWNrc2xhc2hfcmVxdWlyZWQgKyByb3V0ZS5wYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlLm5hbWUgJiYgIXRoaXMuX19uYW1lZF9yb3V0ZXNbcm91dGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fbmFtZWRfcm91dGVzW3JvdXRlLm5hbWVdID0geyAuLi5yb3V0ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUm91dGVzKHtyb3V0ZXM6IHJvdXRlLmNoaWxkcmVuLCBwYXJlbnRfcGF0aDogcm91dGUucGF0aH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlLl9sb2FkZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSb3V0ZXMoe3JvdXRlczogcm91dGUuX2xvYWRlZENvbmZpZy5yb3V0ZXMsIHBhcmVudF9wYXRoOiByb3V0ZS5wYXRofSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVkX3JvdXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um91dGUobmFtZTogc3RyaW5nLCBwYXJhbV92YWx1ZXM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyfSk6IHN0cmluZyB7XG4gICAgICAgIC8vIFRPRE86IHNpIG5vIGV4aXN0ZSBlbCBub21icmUsIGxsYW1hciBudWV2YW1lbnRlIGEgbG9hZFJvdXRlcywgcG9ycXVlIGVsIG3Ds2R1bG8gcHVlZGUgaGFiZXIgc2lkbyBjYXJnYWRvIHBlcmV6b3NhbWVudGVcbiAgICAgICAgLy8gbmVlZCBwcmVsb2FkaW5nIHN0cmF0ZWd5IFByZWxvYWRBbGxNb2R1bGVzXG4gICAgICAgIGxldCByYXdfcm91dGU6IHN0cmluZztcbiAgICAgICAgbGV0IHJvdXRlOiBzdHJpbmc7XG4gICAgICAgIGlmICghdGhpcy5fX25hbWVkX3JvdXRlc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm91dGVzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX19uYW1lZF9yb3V0ZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhIHJ1dGEgJHtuYW1lfSBubyBleGlzdGUgbyBlbCBtw7NkdWxvIHF1ZSBsYSBkZWZpbmUgYcO6biBubyBoYSBzaWRvIGNhcmdhZG8uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJhd19yb3V0ZSA9IHRoaXMuX19uYW1lZF9yb3V0ZXNbbmFtZV0ucGF0aDtcbiAgICAgICAgICAgIGlmIChyYXdfcm91dGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxsUm91dGVQYXJhbXMocmF3X3JvdXRlLCBwYXJhbV92YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmF3X3JvdXRlID0gdGhpcy5fX25hbWVkX3JvdXRlc1tuYW1lXS5wYXRoO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxsUm91dGVQYXJhbXMocmF3X3JvdXRlLCBwYXJhbV92YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWVkUm91dGVzKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX19uYW1lZF9yb3V0ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm91dGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fX25hbWVkX3JvdXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmFtZWRSb3V0ZShuYW1lOiBzdHJpbmcpOiBJTmFtZWRSb3V0ZSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9fbmFtZWRfcm91dGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFJvdXRlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19uYW1lZF9yb3V0ZXNbbmFtZV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWxsUm91dGVQYXJhbXMocmF3X3JvdXRlLCBwYXJhbV92YWx1ZXM/KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFwYXJhbV92YWx1ZXMgfHwgcGFyYW1fdmFsdWVzID09PSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIHJhd19yb3V0ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGUgPSByYXdfcm91dGU7XG4gICAgICAgIGZvciAobGV0IHBhcmFtX2tleSBpbiBwYXJhbV92YWx1ZXMpIHtcbiAgICAgICAgICAgIHJvdXRlID0gcm91dGUucmVwbGFjZSgnOicgKyBwYXJhbV9rZXksIHBhcmFtX3ZhbHVlc1twYXJhbV9rZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb3V0ZTtcbiAgICB9XG59XG4iXX0=