UNPKG

@spartacus/core

Version:

Spartacus - the core framework

119 lines 14.6 kB
import { Injectable } from '@angular/core'; import { DefaultUrlSerializer } from '@angular/router'; import * as i0 from "@angular/core"; import * as i1 from "./site-context-params.service"; /** * Angular URL Serializer aware of Spartacus site context parameters * encoded in the URL. */ export class SiteContextUrlSerializer extends DefaultUrlSerializer { constructor(siteContextParams) { super(); this.siteContextParams = siteContextParams; /** * Splits the URL into 2 parts: path and the query/fragment part */ this.URL_SPLIT = /(^[^#?]*)(.*)/; } /** * Names of site context parameters encoded in the URL */ get urlEncodingParameters() { return this.siteContextParams.getUrlEncodingParameters(); } /** * Tells whether any site context parameters should be encoded in the URL */ get hasContextInRoutes() { return this.urlEncodingParameters.length > 0; } /** * @override Recognizes the site context parameters encoded in the prefix segments * of the given URL. * * It returns the UrlTree for the given URL shortened by the recognized params, but saves * the params' values in the custom property of UrlTree: `siteContext`. */ parse(url) { if (this.hasContextInRoutes) { const urlWithParams = this.urlExtractContextParameters(url); const parsed = super.parse(urlWithParams.url); this.urlTreeIncludeContextParameters(parsed, urlWithParams.params); return parsed; } else { return super.parse(url); } } /** * Recognizes the site context parameters encoded in the prefix segments of the given URL. * * It returns the recognized site context params as well as the * URL shortened by the recognized params. */ urlExtractContextParameters(url) { const [, urlPart, queryPart] = url.match(this.URL_SPLIT); const segments = urlPart.split('/'); if (segments[0] === '') { segments.shift(); } const params = {}; let paramId = 0; let segmentId = 0; while (paramId < this.urlEncodingParameters.length && segmentId < segments.length) { const paramName = this.urlEncodingParameters[paramId]; const paramValues = this.siteContextParams.getParamValues(paramName); if (paramValues.includes(segments[segmentId])) { params[paramName] = segments[segmentId]; segmentId++; } paramId++; } url = segments.slice(segmentId).join('/') + queryPart; return { url, params }; } /** * Saves the given site context parameters in the custom property * of the given UrlTree: `siteContext`. */ urlTreeIncludeContextParameters(urlTree, params) { urlTree.siteContext = params; } /** * @override Serializes the given UrlTree to a string and prepends * to it the current values of the site context parameters. */ serialize(tree) { const params = this.urlTreeExtractContextParameters(tree); const url = super.serialize(tree); const serialized = this.urlIncludeContextParameters(url, params); return serialized; } /** * Returns the site context parameters stored in the custom property * of the UrlTree: `siteContext`. */ urlTreeExtractContextParameters(urlTree) { return urlTree.siteContext ? urlTree.siteContext : {}; } /** * Prepends the current values of the site context parameters to the given URL. */ urlIncludeContextParameters(url, params) { const contextRoutePart = this.urlEncodingParameters .map((param) => { return params[param] ? params[param] : this.siteContextParams.getValue(param); }) .join('/'); return contextRoutePart + url; } } SiteContextUrlSerializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SiteContextUrlSerializer, deps: [{ token: i1.SiteContextParamsService }], target: i0.ɵɵFactoryTarget.Injectable }); SiteContextUrlSerializer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SiteContextUrlSerializer }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SiteContextUrlSerializer, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.SiteContextParamsService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l0ZS1jb250ZXh0LXVybC1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvc2l0ZS1jb250ZXh0L3NlcnZpY2VzL3NpdGUtY29udGV4dC11cmwtc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBVyxNQUFNLGlCQUFpQixDQUFDOzs7QUFrQmhFOzs7R0FHRztBQUVILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxvQkFBb0I7SUFvQmhFLFlBQW9CLGlCQUEyQztRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQURVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFuQi9EOztXQUVHO1FBQ2dCLGNBQVMsR0FBVyxlQUFlLENBQUM7SUFrQnZELENBQUM7SUFoQkQ7O09BRUc7SUFDSCxJQUFjLHFCQUFxQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNILElBQWMsa0JBQWtCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQU1EOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxHQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBMkIsQ0FBQztZQUN4RSxJQUFJLENBQUMsK0JBQStCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRSxPQUFP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eEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGVmYXVsdFVybFNlcmlhbGl6ZXIsIFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU2l0ZUNvbnRleHRQYXJhbXNTZXJ2aWNlIH0gZnJvbSAnLi9zaXRlLWNvbnRleHQtcGFyYW1zLnNlcnZpY2UnO1xuXG4vKipcbiAqIFZhbHVlcyBvZiB0aGUgc2l0ZSBjb250ZXh0IHBhcmFtZXRlcnMgZW5jb2RlZCBpbiB0aGUgVVJMLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVDb250ZXh0VXJsUGFyYW1zIHtcbiAgW25hbWU6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBVcmxUcmVlIGRlY29yYXRlZCB3aXRoIGEgY3VzdG9tIHByb3BlcnR5IGBzaXRlQ29udGV4dGBcbiAqIGZvciBzdG9yaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHNpdGUgY29udGV4dCBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVybFRyZWVXaXRoU2l0ZUNvbnRleHQgZXh0ZW5kcyBVcmxUcmVlIHtcbiAgc2l0ZUNvbnRleHQ/OiBTaXRlQ29udGV4dFVybFBhcmFtcztcbn1cblxuLyoqXG4gKiBBbmd1bGFyIFVSTCBTZXJpYWxpemVyIGF3YXJlIG9mIFNwYXJ0YWN1cyBzaXRlIGNvbnRleHQgcGFyYW1ldGVyc1xuICogZW5jb2RlZCBpbiB0aGUgVVJMLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2l0ZUNvbnRleHRVcmxTZXJpYWxpemVyIGV4dGVuZHMgRGVmYXVsdFVybFNlcmlhbGl6ZXIge1xuICAvKipcbiAgICogU3BsaXRzIHRoZSBVUkwgaW50byAyIHBhcnRzOiBwYXRoIGFuZCB0aGUgcXVlcnkvZnJhZ21lbnQgcGFydFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFVSTF9TUExJVDogUmVnRXhwID0gLyheW14jP10qKSguKikvO1xuXG4gIC8qKlxuICAgKiBOYW1lcyBvZiBzaXRlIGNvbnRleHQgcGFyYW1ldGVycyBlbmNvZGVkIGluIHRoZSBVUkxcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdXJsRW5jb2RpbmdQYXJhbWV0ZXJzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zaXRlQ29udGV4dFBhcmFtcy5nZXRVcmxFbmNvZGluZ1BhcmFtZXRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIGFueSBzaXRlIGNvbnRleHQgcGFyYW1ldGVycyBzaG91bGQgYmUgZW5jb2RlZCBpbiB0aGUgVVJMXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGhhc0NvbnRleHRJblJvdXRlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51cmxFbmNvZGluZ1BhcmFtZXRlcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2l0ZUNvbnRleHRQYXJhbXM6IFNpdGVDb250ZXh0UGFyYW1zU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQG92ZXJyaWRlIFJlY29nbml6ZXMgdGhlIHNpdGUgY29udGV4dCBwYXJhbWV0ZXJzIGVuY29kZWQgaW4gdGhlIHByZWZpeCBzZWdtZW50c1xuICAgKiBvZiB0aGUgZ2l2ZW4gVVJMLlxuICAgKlxuICAgKiBJdCByZXR1cm5zIHRoZSBVcmxUcmVlIGZvciB0aGUgZ2l2ZW4gVVJMIHNob3J0ZW5lZCBieSB0aGUgcmVjb2duaXplZCBwYXJhbXMsIGJ1dCBzYXZlc1xuICAgKiB0aGUgcGFyYW1zJyB2YWx1ZXMgaW4gdGhlIGN1c3RvbSBwcm9wZXJ0eSBvZiBVcmxUcmVlOiBgc2l0ZUNvbnRleHRgLlxuICAgKi9cbiAgcGFyc2UodXJsOiBzdHJpbmcpOiBVcmxUcmVlV2l0aFNpdGVDb250ZXh0IHtcbiAgICBpZiAodGhpcy5oYXNDb250ZXh0SW5Sb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHVybFdpdGhQYXJhbXMgPSB0aGlzLnVybEV4dHJhY3RDb250ZXh0UGFyYW1ldGVycyh1cmwpO1xuICAgICAgY29uc3QgcGFyc2VkID0gc3VwZXIucGFyc2UodXJsV2l0aFBhcmFtcy51cmwpIGFzIFVybFRyZWVXaXRoU2l0ZUNvbnRleHQ7XG4gICAgICB0aGlzLnVybFRyZWVJbmNsdWRlQ29udGV4dFBhcmFtZXRlcnMocGFyc2VkLCB1cmxXaXRoUGFyYW1zLnBhcmFtcyk7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIucGFyc2UodXJsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb2duaXplcyB0aGUgc2l0ZSBjb250ZXh0IHBhcmFtZXRlcnMgZW5jb2RlZCBpbiB0aGUgcHJlZml4IHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBVUkwuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdGhlIHJlY29nbml6ZWQgc2l0ZSBjb250ZXh0IHBhcmFtcyBhcyB3ZWxsIGFzIHRoZVxuICAgKiBVUkwgc2hvcnRlbmVkIGJ5IHRoZSByZWNvZ25pemVkIHBhcmFtcy5cbiAgICovXG4gIHVybEV4dHJhY3RDb250ZXh0UGFyYW1ldGVycyh1cmw6IHN0cmluZyk6IHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBwYXJhbXM6IFNpdGVDb250ZXh0VXJsUGFyYW1zO1xuICB9IHtcbiAgICBjb25zdCBbLCB1cmxQYXJ0LCBxdWVyeVBhcnRdID0gdXJsLm1hdGNoKHRoaXMuVVJMX1NQTElUKTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gdXJsUGFydC5zcGxpdCgnLycpO1xuICAgIGlmIChzZWdtZW50c1swXSA9PT0gJycpIHtcbiAgICAgIHNlZ21lbnRzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuXG4gICAgbGV0IHBhcmFtSWQgPSAwO1xuICAgIGxldCBzZWdtZW50SWQgPSAwO1xuICAgIHdoaWxlIChcbiAgICAgIHBhcmFtSWQgPCB0aGlzLnVybEVuY29kaW5nUGFyYW1ldGVycy5sZW5ndGggJiZcbiAgICAgIHNlZ21lbnRJZCA8IHNlZ21lbnRzLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdGhpcy51cmxFbmNvZGluZ1BhcmFtZXRlcnNbcGFyYW1JZF07XG4gICAgICBjb25zdCBwYXJhbVZhbHVlcyA9IHRoaXMuc2l0ZUNvbnRleHRQYXJhbXMuZ2V0UGFyYW1WYWx1ZXMocGFyYW1OYW1lKTtcblxuICAgICAgaWYgKHBhcmFtVmFsdWVzLmluY2x1ZGVzKHNlZ21lbnRzW3NlZ21lbnRJZF0pKSB7XG4gICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gc2VnbWVudHNbc2VnbWVudElkXTtcbiAgICAgICAgc2VnbWVudElkKys7XG4gICAgICB9XG4gICAgICBwYXJhbUlkKys7XG4gICAgfVxuXG4gICAgdXJsID0gc2VnbWVudHMuc2xpY2Uoc2VnbWVudElkKS5qb2luKCcvJykgKyBxdWVyeVBhcnQ7XG4gICAgcmV0dXJuIHsgdXJsLCBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgZ2l2ZW4gc2l0ZSBjb250ZXh0IHBhcmFtZXRlcnMgaW4gdGhlIGN1c3RvbSBwcm9wZXJ0eVxuICAgKiBvZiB0aGUgZ2l2ZW4gVXJsVHJlZTogYHNpdGVDb250ZXh0YC5cbiAgICovXG4gIHByb3RlY3RlZCB1cmxUcmVlSW5jbHVkZUNvbnRleHRQYXJhbWV0ZXJzKFxuICAgIHVybFRyZWU6IFVybFRyZWVXaXRoU2l0ZUNvbnRleHQsXG4gICAgcGFyYW1zOiBTaXRlQ29udGV4dFVybFBhcmFtc1xuICApOiB2b2lkIHtcbiAgICB1cmxUcmVlLnNpdGVDb250ZXh0ID0gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZSBTZXJpYWxpemVzIHRoZSBnaXZlbiBVcmxUcmVlIHRvIGEgc3RyaW5nIGFuZCBwcmVwZW5kc1xuICAgKiAgdG8gaXQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBzaXRlIGNvbnRleHQgcGFyYW1ldGVycy5cbiAgICovXG4gIHNlcmlhbGl6ZSh0cmVlOiBVcmxUcmVlV2l0aFNpdGVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnVybFRyZWVFeHRyYWN0Q29udGV4dFBhcmFtZXRlcnModHJlZSk7XG4gICAgY29uc3QgdXJsID0gc3VwZXIuc2VyaWFsaXplKHRyZWUpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnVybEluY2x1ZGVDb250ZXh0UGFyYW1ldGVycyh1cmwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2l0ZSBjb250ZXh0IHBhcmFtZXRlcnMgc3RvcmVkIGluIHRoZSBjdXN0b20gcHJvcGVydHlcbiAgICogb2YgdGhlIFVybFRyZWU6IGBzaXRlQ29udGV4dGAuXG4gICAqL1xuICB1cmxUcmVlRXh0cmFjdENvbnRleHRQYXJhbWV0ZXJzKFxuICAgIHVybFRyZWU6IFVybFRyZWVXaXRoU2l0ZUNvbnRleHRcbiAgKTogU2l0ZUNvbnRleHRVcmxQYXJhbXMge1xuICAgIHJldHVybiB1cmxUcmVlLnNpdGVDb250ZXh0ID8gdXJsVHJlZS5zaXRlQ29udGV4dCA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmRzIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgc2l0ZSBjb250ZXh0IHBhcmFtZXRlcnMgdG8gdGhlIGdpdmVuIFVSTC5cbiAgICovXG4gIHByb3RlY3RlZCB1cmxJbmNsdWRlQ29udGV4dFBhcmFtZXRlcnMoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBTaXRlQ29udGV4dFVybFBhcmFtc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRleHRSb3V0ZVBhcnQgPSB0aGlzLnVybEVuY29kaW5nUGFyYW1ldGVyc1xuICAgICAgLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbV1cbiAgICAgICAgICA/IHBhcmFtc1twYXJhbV1cbiAgICAgICAgICA6IHRoaXMuc2l0ZUNvbnRleHRQYXJhbXMuZ2V0VmFsdWUocGFyYW0pO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcvJyk7XG5cbiAgICByZXR1cm4gY29udGV4dFJvdXRlUGFydCArIHVybDtcbiAgfVxufVxuIl19