UNPKG

@bespunky/angular-zen

Version:

The Angular tools you always wished were there.

101 lines 13 kB
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