UNPKG

@spartacus/storefront

Version:

Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.

88 lines 15.5 kB
import { Injectable } from '@angular/core'; import { PageType, } from '@spartacus/core'; import { of } from 'rxjs'; import { filter, map, switchMap, take, tap, withLatestFrom, } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/core"; import * as i2 from "../services/cms-routes.service"; import * as i3 from "../services/cms-i18n.service"; import * as i4 from "../services/cms-guards.service"; import * as i5 from "../services/cms-components.service"; /** * Helper service for `CmsPageGuard` */ export class CmsPageGuardService { constructor(semanticPathService, cmsService, cmsRoutes, cmsI18n, cmsGuards, cmsComponentsService, routing) { this.semanticPathService = semanticPathService; this.cmsService = cmsService; this.cmsRoutes = cmsRoutes; this.cmsI18n = cmsI18n; this.cmsGuards = cmsGuards; this.cmsComponentsService = cmsComponentsService; this.routing = routing; } /** * Takes CMS components types in the current CMS page, triggers (configurable) side effects and returns a boolean - whether the route can be activated. * * Based on `cmsComponents` config for the components in the page: * - Evaluates components' guards; if one of them emits false or UrlTree - the route cannot be activated or redirects to the given UrlTree, respectively. * - If all components' guards emitted true, then the route can be activated * - Then we trigger loading of configured i18n chunks in parallel * - And we register the configured children routes of cms components * * @param pageContext current cms page context * @param pageData cms page data * @param route activated route snapshot * @param state router state snapshot * * @returns boolean observable - whether the route can be activated */ canActivatePage(pageContext, pageData, route, state) { return this.cmsService.getPageComponentTypes(pageContext).pipe(take(1), switchMap((componentTypes) => this.cmsComponentsService.determineMappings(componentTypes)), switchMap((componentTypes) => this.cmsGuards .cmsPageCanActivate(componentTypes, route, state) .pipe(withLatestFrom(of(componentTypes)))), tap(([canActivate, componentTypes]) => { if (canActivate === true) { this.cmsI18n.loadForComponents(componentTypes); } }), map(([canActivate, componentTypes]) => { var _a; const pageLabel = pageData.label || pageContext.id; // for content pages the page label returned from backend can be different than ID initially assumed from route if (canActivate === true && !((_a = route === null || route === void 0 ? void 0 : route.data) === null || _a === void 0 ? void 0 : _a.cxCmsRouteContext)) { return this.cmsRoutes.handleCmsRoutesInGuard(pageContext, componentTypes, state.url, pageLabel); } return canActivate; })); } /** * Activates the "NOT FOUND" cms page. * * It loads cms page data for the "NOT FOUND" page and puts it in the state of the the requested page label. * Then it processes its CMS components with the method `canActivatePage()` of this service. For more, see its docs. */ canActivateNotFoundPage(pageContext, route, state) { const notFoundCmsPageContext = { type: PageType.CONTENT_PAGE, id: this.semanticPathService.get('notFound'), }; return this.cmsService.getPage(notFoundCmsPageContext).pipe(switchMap((notFoundPage) => { if (notFoundPage) { return this.cmsService.getPageIndex(notFoundCmsPageContext).pipe(tap((notFoundIndex) => { this.cmsService.setPageFailIndex(pageContext, notFoundIndex); this.routing.changeNextPageContext(notFoundCmsPageContext); }), switchMap((notFoundIndex) => this.cmsService.getPageIndex(pageContext).pipe( // we have to wait for page index update filter((index) => index === notFoundIndex))), switchMap(() => this.canActivatePage(pageContext, notFoundPage, route, state))); } return of(false); })); } } CmsPageGuardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsPageGuardService, deps: [{ token: i1.SemanticPathService }, { token: i1.CmsService }, { token: i2.CmsRoutesService }, { token: i3.CmsI18nService }, { token: i4.CmsGuardsService }, { token: i5.CmsComponentsService }, { token: i1.RoutingService }], target: i0.ɵɵFactoryTarget.Injectable }); CmsPageGuardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsPageGuardService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsPageGuardService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.SemanticPathService }, { type: i1.CmsService }, { type: i2.CmsRoutesService }, { type: i3.CmsI18nService }, { type: i4.CmsGuardsService }, { type: i5.CmsComponentsService }, { type: i1.RoutingService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21zLXBhZ2UtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0b3JlZnJvbnRsaWIvY21zLXN0cnVjdHVyZS9ndWFyZHMvY21zLXBhZ2UtZ3VhcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFLTCxRQUFRLEdBR1QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTXhCOztHQUVHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUNZLG1CQUF3QyxFQUN4QyxVQUFzQixFQUN0QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixTQUEyQixFQUMzQixvQkFBMEMsRUFDMUMsT0FBdUI7UUFOdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7SUFDaEMsQ0FBQztJQUVKOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILGVBQWUsQ0FDYixXQUF3QixFQUN4QixRQUFjLEVBQ2QsS0FBZ0MsRUFDaEMsS0FBMEI7UUFFMUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FDNUQsSUFBSSxDQUFD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VixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIENtc0FjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIENtc1NlcnZpY2UsXG4gIFBhZ2UsXG4gIFBhZ2VDb250ZXh0LFxuICBQYWdlVHlwZSxcbiAgU2VtYW50aWNQYXRoU2VydmljZSxcbiAgUm91dGluZ1NlcnZpY2UsXG59IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ21zQ29tcG9uZW50c1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbXMtY29tcG9uZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IENtc0d1YXJkc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbXMtZ3VhcmRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ21zSTE4blNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbXMtaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IENtc1JvdXRlc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jbXMtcm91dGVzLnNlcnZpY2UnO1xuXG4vKipcbiAqIEhlbHBlciBzZXJ2aWNlIGZvciBgQ21zUGFnZUd1YXJkYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ21zUGFnZUd1YXJkU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBzZW1hbnRpY1BhdGhTZXJ2aWNlOiBTZW1hbnRpY1BhdGhTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjbXNTZXJ2aWNlOiBDbXNTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjbXNSb3V0ZXM6IENtc1JvdXRlc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNtc0kxOG46IENtc0kxOG5TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjbXNHdWFyZHM6IENtc0d1YXJkc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNtc0NvbXBvbmVudHNTZXJ2aWNlOiBDbXNDb21wb25lbnRzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcm91dGluZzogUm91dGluZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUYWtlcyBDTVMgY29tcG9uZW50cyB0eXBlcyBpbiB0aGUgY3VycmVudCBDTVMgcGFnZSwgdHJpZ2dlcnMgKGNvbmZpZ3VyYWJsZSkgc2lkZSBlZmZlY3RzIGFuZCByZXR1cm5zIGEgYm9vbGVhbiAtIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBhY3RpdmF0ZWQuXG4gICAqXG4gICAqIEJhc2VkIG9uIGBjbXNDb21wb25lbnRzYCBjb25maWcgZm9yIHRoZSBjb21wb25lbnRzIGluIHRoZSBwYWdlOlxuICAgKiAtIEV2YWx1YXRlcyBjb21wb25lbnRzJyBndWFyZHM7IGlmIG9uZSBvZiB0aGVtIGVtaXRzIGZhbHNlIG9yIFVybFRyZWUgLSB0aGUgcm91dGUgY2Fubm90IGJlIGFjdGl2YXRlZCBvciByZWRpcmVjdHMgdG8gdGhlIGdpdmVuIFVybFRyZWUsIHJlc3BlY3RpdmVseS5cbiAgICogLSBJZiBhbGwgY29tcG9uZW50cycgZ3VhcmRzIGVtaXR0ZWQgdHJ1ZSwgdGhlbiB0aGUgcm91dGUgY2FuIGJlIGFjdGl2YXRlZFxuICAgKiAtIFRoZW4gd2UgdHJpZ2dlciBsb2FkaW5nIG9mIGNvbmZpZ3VyZWQgaTE4biBjaHVua3MgaW4gcGFyYWxsZWxcbiAgICogLSBBbmQgd2UgcmVnaXN0ZXIgdGhlIGNvbmZpZ3VyZWQgY2hpbGRyZW4gcm91dGVzIG9mIGNtcyBjb21wb25lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlQ29udGV4dCBjdXJyZW50IGNtcyBwYWdlIGNvbnRleHRcbiAgICogQHBhcmFtIHBhZ2VEYXRhIGNtcyBwYWdlIGRhdGFcbiAgICogQHBhcmFtIHJvdXRlIGFjdGl2YXRlZCByb3V0ZSBzbmFwc2hvdFxuICAgKiBAcGFyYW0gc3RhdGUgcm91dGVyIHN0YXRlIHNuYXBzaG90XG4gICAqXG4gICAqIEByZXR1cm5zIGJvb2xlYW4gb2JzZXJ2YWJsZSAtIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBhY3RpdmF0ZWRcbiAgICovXG4gIGNhbkFjdGl2YXRlUGFnZShcbiAgICBwYWdlQ29udGV4dDogUGFnZUNvbnRleHQsXG4gICAgcGFnZURhdGE6IFBhZ2UsXG4gICAgcm91dGU6IENtc0FjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3RcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIHJldHVybiB0aGlzLmNtc1NlcnZpY2UuZ2V0UGFnZUNvbXBvbmVudFR5cGVzKHBhZ2VDb250ZXh0KS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcCgoY29tcG9uZW50VHlwZXMpID0+XG4gICAgICAgIHRoaXMuY21zQ29tcG9uZW50c1NlcnZpY2UuZGV0ZXJtaW5lTWFwcGluZ3MoY29tcG9uZW50VHlwZXMpXG4gICAgICApLFxuICAgICAgc3dpdGNoTWFwKChjb21wb25lbnRUeXBlcykgPT5cbiAgICAgICAgdGhpcy5jbXNHdWFyZHNcbiAgICAgICAgICAuY21zUGFnZUNhbkFjdGl2YXRlKGNvbXBvbmVudFR5cGVzLCByb3V0ZSwgc3RhdGUpXG4gICAgICAgICAgLnBpcGUod2l0aExhdGVzdEZyb20ob2YoY29tcG9uZW50VHlwZXMpKSlcbiAgICAgICksXG4gICAgICB0YXAoKFtjYW5BY3RpdmF0ZSwgY29tcG9uZW50VHlwZXNdKSA9PiB7XG4gICAgICAgIGlmIChjYW5BY3RpdmF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuY21zSTE4bi5sb2FkRm9yQ29tcG9uZW50cyhjb21wb25lbnRUeXBlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKChbY2FuQWN0aXZhdGUsIGNvbXBvbmVudFR5cGVzXSkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlTGFiZWwgPSBwYWdlRGF0YS5sYWJlbCB8fCBwYWdlQ29udGV4dC5pZDsgLy8gZm9yIGNvbnRlbnQgcGFnZXMgdGhlIHBhZ2UgbGFiZWwgcmV0dXJuZWQgZnJvbSBiYWNrZW5kIGNhbiBiZSBkaWZmZXJlbnQgdGhhbiBJRCBpbml0aWFsbHkgYXNzdW1lZCBmcm9tIHJvdXRlXG4gICAgICAgIGlmIChjYW5BY3RpdmF0ZSA9PT0gdHJ1ZSAmJiAhcm91dGU/LmRhdGE/LmN4Q21zUm91dGVDb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY21zUm91dGVzLmhhbmRsZUNtc1JvdXRlc0luR3VhcmQoXG4gICAgICAgICAgICBwYWdlQ29udGV4dCxcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGVzLFxuICAgICAgICAgICAgc3RhdGUudXJsLFxuICAgICAgICAgICAgcGFnZUxhYmVsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuQWN0aXZhdGU7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGVzIHRoZSBcIk5PVCBGT1VORFwiIGNtcyBwYWdlLlxuICAgKlxuICAgKiBJdCBsb2FkcyBjbXMgcGFnZSBkYXRhIGZvciB0aGUgXCJOT1QgRk9VTkRcIiBwYWdlIGFuZCBwdXRzIGl0IGluIHRoZSBzdGF0ZSBvZiB0aGUgdGhlIHJlcXVlc3RlZCBwYWdlIGxhYmVsLlxuICAgKiBUaGVuIGl0IHByb2Nlc3NlcyBpdHMgQ01TIGNvbXBvbmVudHMgd2l0aCB0aGUgbWV0aG9kIGBjYW5BY3RpdmF0ZVBhZ2UoKWAgb2YgdGhpcyBzZXJ2aWNlLiBGb3IgbW9yZSwgc2VlIGl0cyBkb2NzLlxuICAgKi9cbiAgY2FuQWN0aXZhdGVOb3RGb3VuZFBhZ2UoXG4gICAgcGFnZUNvbnRleHQ6IFBhZ2VDb250ZXh0LFxuICAgIHJvdXRlOiBDbXNBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90XG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICBjb25zdCBub3RGb3VuZENtc1BhZ2VDb250ZXh0OiBQYWdlQ29udGV4dCA9IHtcbiAgICAgIHR5cGU6IFBhZ2VUeXBlLkNPTlRFTlRfUEFHRSxcbiAgICAgIGlkOiB0aGlzLnNlbWFudGljUGF0aFNlcnZpY2UuZ2V0KCdub3RGb3VuZCcpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5jbXNTZXJ2aWNlLmdldFBhZ2Uobm90Rm91bmRDbXNQYWdlQ29udGV4dCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobm90Rm91bmRQYWdlKSA9PiB7XG4gICAgICAgIGlmIChub3RGb3VuZFBhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jbXNTZXJ2aWNlLmdldFBhZ2VJbmRleChub3RGb3VuZENtc1BhZ2VDb250ZXh0KS5waXBlKFxuICAgICAgICAgICAgdGFwKChub3RGb3VuZEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY21zU2VydmljZS5zZXRQYWdlRmFpbEluZGV4KHBhZ2VDb250ZXh0LCBub3RGb3VuZEluZGV4KTtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0aW5nLmNoYW5nZU5leHRQYWdlQ29udGV4dChub3RGb3VuZENtc1BhZ2VDb250ZXh0KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChub3RGb3VuZEluZGV4KSA9PlxuICAgICAgICAgICAgICB0aGlzLmNtc1NlcnZpY2UuZ2V0UGFnZUluZGV4KHBhZ2VDb250ZXh0KS5waXBlKFxuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gd2FpdCBmb3IgcGFnZSBpbmRleCB1cGRhdGVcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGluZGV4KSA9PiBpbmRleCA9PT0gbm90Rm91bmRJbmRleClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICB0aGlzLmNhbkFjdGl2YXRlUGFnZShwYWdlQ29udGV4dCwgbm90Rm91bmRQYWdlLCByb3V0ZSwgc3RhdGUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=