@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
101 lines • 13 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { UrlReflectionService } from '@bespunky/angular-zen/router-x';
import { UrlLocalization } from '../config/url-localization-config';
import { UrlLocalizer } from './url-localizer';
import * as i0 from "@angular/core";
import * as i1 from "@bespunky/angular-zen/router-x";
/**
* Provides tools for localization and delocalization of the currently navigated url by adding or removing
* a named query param dedicated for language.
*
* @export
* @class QueryParamsUrlLocalizer
* @extends {UrlLocalizer}
*/
export class QueryParamsUrlLocalizer extends UrlLocalizer {
constructor({ strategy }, urlReflection) {
super(urlReflection);
this.paramName = strategy;
}
/**
* Localizes the currently navigated url by adding or updating the query param specifying the language.
*
* @param {string} lang The new language of the url.
* @returns {string} The currently navigated url localized into the specified language.
*/
localize(lang) {
const currentUrlTree = this.parseUrlTree();
const localizedParams = this.replaceLanguageParam(this.urlReflection.queryParams, lang);
const localizedRoute = this.replaceQueryParamsInUrlTree(currentUrlTree, localizedParams);
const localizedRouteUrl = this.urlReflection.router.serializeUrl(localizedRoute);
return this.composeUrl(localizedRouteUrl);
}
/**
* Delocalizes the currently navigated url by removing the query param specifying the language.
*
* @returns {string} The currently navigated url without the query param for language.
*/
delocalize() {
return this.localize('');
}
/**
* Returns the `UrlTree` representing the currently navigated url.
*
* @protected
* @returns {UrlTree} The `UrlTree` representing the currently navigated url.
*/
parseUrlTree() {
const { router } = this.urlReflection;
// Parsing the url seems dumb as the router should have it parsed already, but the route object doesn't hold
// the tree and the router SOMETIMES holds it in getCurrentNavigation().
return router.parseUrl(router.url);
}
/**
* Updates the language param in a query params object.
*
* @protected
* @param {*} params The object representing the query params.
* @param {string} lang The new language to set to the language query param. If `null` or `undefined`, the language query param will be deleted from the object.
* @returns {*} The updated query params object.
*/
replaceLanguageParam(params, lang) {
if (lang)
params[this.paramName] = lang;
else
delete params[this.paramName];
return params;
}
/**
* Replaces the query params in a url tree object.
*
* @protected
* @param {UrlTree} url The url tree in which query params should be replaced.
* @param {Object} newParams The new query params object to set to the url tree.
* @returns {UrlTree} The updated url tree object.
*/
replaceQueryParamsInUrlTree(url, newParams) {
return Object.assign(url, { queryParams: newParams });
}
/**
* Concats the host url and the specified route url to compose a fully qualified url.
* Uses the host url provided by the url reflection service.
*
* @protected
* @param {string} routeUrl The route url to concat to the host url. Should be prefixed with '/'.
* @returns {string} The fully qualified url composed of the host url defined by the url reflection service and the specified route url.
*/
composeUrl(routeUrl) {
const { hostUrl } = this.urlReflection;
return `${hostUrl}${routeUrl}`;
}
}
QueryParamsUrlLocalizer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: QueryParamsUrlLocalizer, deps: [{ token: UrlLocalization }, { token: i1.UrlReflectionService }], target: i0.ɵɵFactoryTarget.Injectable });
QueryParamsUrlLocalizer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: QueryParamsUrlLocalizer, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: QueryParamsUrlLocalizer, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [UrlLocalization]
}] }, { type: i1.UrlReflectionService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW1zLXVybC1sb2NhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItemVuL2xhbmd1YWdlL3NyYy91cmwtbG9jYWxpemF0aW9uL2xvY2FsaXplcnMvcXVlcnktcGFyYW1zLXVybC1sb2NhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQXlCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRXpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsWUFBWTtJQVNyRCxZQUFxQyxFQUFFLFFBQVEsRUFBeUIsRUFBRSxhQUFtQztRQUV6RyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFrQixDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsQ0FBQyxJQUFZO1FBRWpCLE1BQU0sY0FBYyxHQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM5QyxNQUFNLGVBQWUsR0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUYsTUFBTSxjQUFjLEdBQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFFTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sWUFBWTtRQUVsQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV0Qyw0R0FBNEc7UUFDNUcsd0VBQXdFO1FBQ3hFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxvQkFBb0IsQ0FBQyxNQUFXLEVBQUUsSUFBWTtRQUVwRCxJQUFJLElBQUk7WUFDSixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7WUFFOUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sMkJBQTJCLENBQUMsR0FBWSxFQUFFLFNBQStCO1FBRS9FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLFVBQVUsQ0FBQyxRQUFnQjtRQUVqQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV2QyxPQUFPLEdBQUcsT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7O3FIQXJHUSx1QkFBdUIsa0JBU1osZUFBZTt5SEFUMUIsdUJBQXVCLGNBRFYsTUFBTTs0RkFDbkIsdUJBQXVCO2tCQURuQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBVWhCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXJsVHJlZSAgICAgICAgICAgIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgVXJsUmVmbGVjdGlvblNlcnZpY2UgICAgICAgICAgICAgICAgICAgfSBmcm9tICdAYmVzcHVua3kvYW5ndWxhci16ZW4vcm91dGVyLXgnO1xuaW1wb3J0IHsgVXJsTG9jYWxpemF0aW9uLCBVcmxMb2NhbGl6YXRpb25Db25maWcgfSBmcm9tICcuLi9jb25maWcvdXJsLWxvY2FsaXphdGlvbi1jb25maWcnO1xuaW1wb3J0IHsgVXJsTG9jYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmcm9tICcuL3VybC1sb2NhbGl6ZXInO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRvb2xzIGZvciBsb2NhbGl6YXRpb24gYW5kIGRlbG9jYWxpemF0aW9uIG9mIHRoZSBjdXJyZW50bHkgbmF2aWdhdGVkIHVybCBieSBhZGRpbmcgb3IgcmVtb3ZpbmdcbiAqIGEgbmFtZWQgcXVlcnkgcGFyYW0gZGVkaWNhdGVkIGZvciBsYW5ndWFnZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUXVlcnlQYXJhbXNVcmxMb2NhbGl6ZXJcbiAqIEBleHRlbmRzIHtVcmxMb2NhbGl6ZXJ9XG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBRdWVyeVBhcmFtc1VybExvY2FsaXplciBleHRlbmRzIFVybExvY2FsaXplclxue1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgbGFuZ3VhZ2UuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBwYXJhbU5hbWU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoVXJsTG9jYWxpemF0aW9uKSB7IHN0cmF0ZWd5IH06IFVybExvY2FsaXphdGlvbkNvbmZpZywgdXJsUmVmbGVjdGlvbjogVXJsUmVmbGVjdGlvblNlcnZpY2UpXG4gICAge1xuICAgICAgICBzdXBlcih1cmxSZWZsZWN0aW9uKTtcblxuICAgICAgICB0aGlzLnBhcmFtTmFtZSA9IHN0cmF0ZWd5IGFzIHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhbGl6ZXMgdGhlIGN1cnJlbnRseSBuYXZpZ2F0ZWQgdXJsIGJ5IGFkZGluZyBvciB1cGRhdGluZyB0aGUgcXVlcnkgcGFyYW0gc3BlY2lmeWluZyB0aGUgbGFuZ3VhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZyBUaGUgbmV3IGxhbmd1YWdlIG9mIHRoZSB1cmwuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnRseSBuYXZpZ2F0ZWQgdXJsIGxvY2FsaXplZCBpbnRvIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgICovXG4gICAgbG9jYWxpemUobGFuZzogc3RyaW5nKTogc3RyaW5nXG4gICAge1xuICAgICAgICBjb25zdCBjdXJyZW50VXJsVHJlZSAgICA9IHRoaXMucGFyc2VVcmxUcmVlKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsaXplZFBhcmFtcyAgID0gdGhpcy5yZXBsYWNlTGFuZ3VhZ2VQYXJhbSh0aGlzLnVybFJlZmxlY3Rpb24ucXVlcnlQYXJhbXMsIGxhbmcpO1xuICAgICAgICBjb25zdCBsb2NhbGl6ZWRSb3V0ZSAgICA9IHRoaXMucmVwbGFjZVF1ZXJ5UGFyYW1zSW5VcmxUcmVlKGN1cnJlbnRVcmxUcmVlLCBsb2NhbGl6ZWRQYXJhbXMpO1xuICAgICAgICBjb25zdCBsb2NhbGl6ZWRSb3V0ZVVybCA9IHRoaXMudXJsUmVmbGVjdGlvbi5yb3V0ZXIuc2VyaWFsaXplVXJsKGxvY2FsaXplZFJvdXRlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb21wb3NlVXJsKGxvY2FsaXplZFJvdXRlVXJsKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGVsb2NhbGl6ZXMgdGhlIGN1cnJlbnRseSBuYXZpZ2F0ZWQgdXJsIGJ5IHJlbW92aW5nIHRoZSBxdWVyeSBwYXJhbSBzcGVjaWZ5aW5nIHRoZSBsYW5ndWFnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50bHkgbmF2aWdhdGVkIHVybCB3aXRob3V0IHRoZSBxdWVyeSBwYXJhbSBmb3IgbGFuZ3VhZ2UuXG4gICAgICovXG4gICAgZGVsb2NhbGl6ZSgpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgVXJsVHJlZWAgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50bHkgbmF2aWdhdGVkIHVybC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcmV0dXJucyB7VXJsVHJlZX0gVGhlIGBVcmxUcmVlYCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseSBuYXZpZ2F0ZWQgdXJsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVVybFRyZWUoKTogVXJsVHJlZVxuICAgIHtcbiAgICAgICAgY29uc3QgeyByb3V0ZXIgfSA9IHRoaXMudXJsUmVmbGVjdGlvbjtcblxuICAgICAgICAvLyBQYXJzaW5nIHRoZSB1cmwgc2VlbXMgZHVtYiBhcyB0aGUgcm91dGVyIHNob3VsZCBoYXZlIGl0IHBhcnNlZCBhbHJlYWR5LCBidXQgdGhlIHJvdXRlIG9iamVjdCBkb2Vzbid0IGhvbGRcbiAgICAgICAgLy8gdGhlIHRyZWUgYW5kIHRoZSByb3V0ZXIgU09NRVRJTUVTIGhvbGRzIGl0IGluIGdldEN1cnJlbnROYXZpZ2F0aW9uKCkuXG4gICAgICAgIHJldHVybiByb3V0ZXIucGFyc2VVcmwocm91dGVyLnVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgbGFuZ3VhZ2UgcGFyYW0gaW4gYSBxdWVyeSBwYXJhbXMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7Kn0gcGFyYW1zIFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBxdWVyeSBwYXJhbXMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgVGhlIG5ldyBsYW5ndWFnZSB0byBzZXQgdG8gdGhlIGxhbmd1YWdlIHF1ZXJ5IHBhcmFtLiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBsYW5ndWFnZSBxdWVyeSBwYXJhbSB3aWxsIGJlIGRlbGV0ZWQgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCBxdWVyeSBwYXJhbXMgb2JqZWN0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXBsYWNlTGFuZ3VhZ2VQYXJhbShwYXJhbXM6IGFueSwgbGFuZzogc3RyaW5nKTogYW55XG4gICAge1xuICAgICAgICBpZiAobGFuZylcbiAgICAgICAgICAgIHBhcmFtc1t0aGlzLnBhcmFtTmFtZV0gPSBsYW5nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zW3RoaXMucGFyYW1OYW1lXTtcblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoZSBxdWVyeSBwYXJhbXMgaW4gYSB1cmwgdHJlZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtVcmxUcmVlfSB1cmwgVGhlIHVybCB0cmVlIGluIHdoaWNoIHF1ZXJ5IHBhcmFtcyBzaG91bGQgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG5ld1BhcmFtcyBUaGUgbmV3IHF1ZXJ5IHBhcmFtcyBvYmplY3QgdG8gc2V0IHRvIHRoZSB1cmwgdHJlZS5cbiAgICAgKiBAcmV0dXJucyB7VXJsVHJlZX0gVGhlIHVwZGF0ZWQgdXJsIHRyZWUgb2JqZWN0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXBsYWNlUXVlcnlQYXJhbXNJblVybFRyZWUodXJsOiBVcmxUcmVlLCBuZXdQYXJhbXM6IHsgW2s6IHN0cmluZ106IGFueSB9KTogVXJsVHJlZVxuICAgIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odXJsLCB7IHF1ZXJ5UGFyYW1zOiBuZXdQYXJhbXMgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uY2F0cyB0aGUgaG9zdCB1cmwgYW5kIHRoZSBzcGVjaWZpZWQgcm91dGUgdXJsIHRvIGNvbXBvc2UgYSBmdWxseSBxdWFsaWZpZWQgdXJsLlxuICAgICAqIFVzZXMgdGhlIGhvc3QgdXJsIHByb3ZpZGVkIGJ5IHRoZSB1cmwgcmVmbGVjdGlvbiBzZXJ2aWNlLlxuICAgICAqIFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcm91dGVVcmwgVGhlIHJvdXRlIHVybCB0byBjb25jYXQgdG8gdGhlIGhvc3QgdXJsLiBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLycuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCB1cmwgY29tcG9zZWQgb2YgdGhlIGhvc3QgdXJsIGRlZmluZWQgYnkgdGhlIHVybCByZWZsZWN0aW9uIHNlcnZpY2UgYW5kIHRoZSBzcGVjaWZpZWQgcm91dGUgdXJsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wb3NlVXJsKHJvdXRlVXJsOiBzdHJpbmcpOiBzdHJpbmdcbiAgICB7ICAgICAgXG4gICAgICAgIGNvbnN0IHsgaG9zdFVybCB9ID0gdGhpcy51cmxSZWZsZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiBgJHtob3N0VXJsfSR7cm91dGVVcmx9YDtcbiAgICB9XG59Il19