UNPKG

@spartacus/core

Version:

Spartacus - the core framework

106 lines 15.1 kB
import { isPlatformBrowser } from '@angular/common'; import { Inject, Injectable, isDevMode, PLATFORM_ID } from '@angular/core'; import { defer, of } from 'rxjs'; import { filter, map, shareReplay, switchMap } from 'rxjs/operators'; import { resolveApplicable } from '../../util/applicable'; import { uniteLatest } from '../../util/rxjs/unite-latest'; import { PageMetaResolver } from '../page/page-meta.resolver'; import * as i0 from "@angular/core"; import * as i1 from "./cms.service"; import * as i2 from "../../lazy-loading/unified-injector"; import * as i3 from "../page/config/page-meta.config"; /** * Service that collects the page meta data by using injected page resolvers. */ export class PageMetaService { constructor(cms, unifiedInjector, pageMetaConfig, platformId) { this.cms = cms; this.unifiedInjector = unifiedInjector; this.pageMetaConfig = pageMetaConfig; this.platformId = platformId; this.resolvers$ = this.unifiedInjector .getMulti(PageMetaResolver) .pipe(shareReplay({ bufferSize: 1, refCount: true })); this.meta$ = defer(() => this.cms.getCurrentPage()).pipe(filter((page) => Boolean(page)), switchMap((page) => this.getMetaResolver(page)), switchMap((metaResolver) => metaResolver ? this.resolve(metaResolver) : of(null)), shareReplay({ bufferSize: 1, refCount: true })); } /** * Returns the observed page meta data for the current page. * * The data is resolved by various PageResolvers, which are configurable. */ getMeta() { return this.meta$; } /** * If a `PageResolver` has implemented a resolver interface, the resolved data * is merged into the `PageMeta` object. * @param metaResolver */ resolve(metaResolver) { const resolverMethods = this.getResolverMethods(); const resolvedData = Object.keys(resolverMethods) // TODO: Revisit if typing is possible here with Template Literal Types when we update to TS >=4.1 .filter((key) => metaResolver[resolverMethods[key]]) .map((key) => { return metaResolver[resolverMethods[key]]() .pipe(map((data) => ({ [key]: data }))); }); if (resolvedData.length === 0) { // uniteLatest will fail otherwise return of({}); } else { return uniteLatest(resolvedData).pipe(map((data) => Object.assign({}, ...data))); } } /** * Returns an object with resolvers. The object properties represent the `PageMeta` property, i.e.: * * ``` * { * title: 'resolveTitle', * robots: 'resolveRobots' * } * ``` * * This list of resolvers is filtered for CSR vs SSR processing since not all resolvers are * relevant during browsing. */ getResolverMethods() { var _a, _b, _c; let resolverMethods = {}; // filter the resolvers to avoid unnecessary processing in CSR (_c = (_b = (_a = this.pageMetaConfig) === null || _a === void 0 ? void 0 : _a.pageMeta) === null || _b === void 0 ? void 0 : _b.resolvers) === null || _c === void 0 ? void 0 : _c.filter((resolver) => { var _a, _b, _c; return ( // always resolve in SSR !isPlatformBrowser((_a = this.platformId) !== null && _a !== void 0 ? _a : '') || // resolve in CSR when it's not disabled !resolver.disabledInCsr || // resolve in CSR when resolver is enabled in devMode (isDevMode() && ((_c = (_b = this.pageMetaConfig) === null || _b === void 0 ? void 0 : _b.pageMeta) === null || _c === void 0 ? void 0 : _c.enableInDevMode))); }).forEach((resolver) => (resolverMethods[resolver.property] = resolver.method)); return resolverMethods; } /** * Return the resolver with the best match, based on a score * generated by the resolver. * * Resolvers match by default on `PageType` and `page.template`. */ getMetaResolver(page) { return this.resolvers$.pipe(map((resolvers) => resolveApplicable(resolvers, [page], [page]))); } } PageMetaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageMetaService, deps: [{ token: i1.CmsService }, { token: i2.UnifiedInjector }, { token: i3.PageMetaConfig }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); PageMetaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageMetaService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageMetaService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.CmsService }, { type: i2.UnifiedInjector }, { type: i3.PageMetaConfig }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1tZXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9jbXMvZmFjYWRlL3BhZ2UtbWV0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUczRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7QUFHOUQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUNZLEdBQWUsRUFDZixlQUFnQyxFQUNoQyxjQUE4QixFQUNULFVBQWtCO1FBSHZDLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ1QsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUd6QyxlQUFVLEdBQW1DLElBQUksQ0FBQyxlQUFlO2FBQ3hFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzthQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FFckQsQ0FBQztRQUVRLFVBQUssR0FBZ0MsS0FBSyxDQUFD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SUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ2pFLENBQUM7SUFDSixDQUFDOzs0R0F6R1UsZUFBZSx5R0FLaEIsV0FBVztnSEFMVixlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBTUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBpc0Rldk1vZGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWZlciwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVW5pZmllZEluamVjdG9yIH0gZnJvbSAnLi4vLi4vbGF6eS1sb2FkaW5nL3VuaWZpZWQtaW5qZWN0b3InO1xuaW1wb3J0IHsgcmVzb2x2ZUFwcGxpY2FibGUgfSBmcm9tICcuLi8uLi91dGlsL2FwcGxpY2FibGUnO1xuaW1wb3J0IHsgdW5pdGVMYXRlc3QgfSBmcm9tICcuLi8uLi91dGlsL3J4anMvdW5pdGUtbGF0ZXN0JztcbmltcG9ydCB7IFBhZ2UsIFBhZ2VNZXRhIH0gZnJvbSAnLi4vbW9kZWwvcGFnZS5tb2RlbCc7XG5pbXBvcnQgeyBQYWdlTWV0YUNvbmZpZyB9IGZyb20gJy4uL3BhZ2UvY29uZmlnL3BhZ2UtbWV0YS5jb25maWcnO1xuaW1wb3J0IHsgUGFnZU1ldGFSZXNvbHZlciB9IGZyb20gJy4uL3BhZ2UvcGFnZS1tZXRhLnJlc29sdmVyJztcbmltcG9ydCB7IENtc1NlcnZpY2UgfSBmcm9tICcuL2Ntcy5zZXJ2aWNlJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgY29sbGVjdHMgdGhlIHBhZ2UgbWV0YSBkYXRhIGJ5IHVzaW5nIGluamVjdGVkIHBhZ2UgcmVzb2x2ZXJzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGFnZU1ldGFTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNtczogQ21zU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdW5pZmllZEluamVjdG9yOiBVbmlmaWVkSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHBhZ2VNZXRhQ29uZmlnOiBQYWdlTWV0YUNvbmZpZyxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcm90ZWN0ZWQgcGxhdGZvcm1JZDogc3RyaW5nXG4gICkge31cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZXJzJDogT2JzZXJ2YWJsZTxQYWdlTWV0YVJlc29sdmVyW10+ID0gdGhpcy51bmlmaWVkSW5qZWN0b3JcbiAgICAuZ2V0TXVsdGkoUGFnZU1ldGFSZXNvbHZlcilcbiAgICAucGlwZShzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pKSBhcyBPYnNlcnZhYmxlPFxuICAgIFBhZ2VNZXRhUmVzb2x2ZXJbXVxuICA+O1xuXG4gIHByb3RlY3RlZCBtZXRhJDogT2JzZXJ2YWJsZTxQYWdlTWV0YSB8IG51bGw+ID0gZGVmZXIoKCkgPT5cbiAgICB0aGlzLmNtcy5nZXRDdXJyZW50UGFnZSgpXG4gICkucGlwZShcbiAgICBmaWx0ZXIoKHBhZ2UpID0+IEJvb2xlYW4ocGFnZSkpLFxuICAgIHN3aXRjaE1hcCgocGFnZTogUGFnZSkgPT4gdGhpcy5nZXRNZXRhUmVzb2x2ZXIocGFnZSkpLFxuICAgIHN3aXRjaE1hcCgobWV0YVJlc29sdmVyOiBQYWdlTWV0YVJlc29sdmVyIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgbWV0YVJlc29sdmVyID8gdGhpcy5yZXNvbHZlKG1ldGFSZXNvbHZlcikgOiBvZihudWxsKVxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICApO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvYnNlcnZlZCBwYWdlIG1ldGEgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICpcbiAgICogVGhlIGRhdGEgaXMgcmVzb2x2ZWQgYnkgdmFyaW91cyBQYWdlUmVzb2x2ZXJzLCB3aGljaCBhcmUgY29uZmlndXJhYmxlLlxuICAgKi9cbiAgZ2V0TWV0YSgpOiBPYnNlcnZhYmxlPFBhZ2VNZXRhIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGEkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgYFBhZ2VSZXNvbHZlcmAgaGFzIGltcGxlbWVudGVkIGEgcmVzb2x2ZXIgaW50ZXJmYWNlLCB0aGUgcmVzb2x2ZWQgZGF0YVxuICAgKiBpcyBtZXJnZWQgaW50byB0aGUgYFBhZ2VNZXRhYCBvYmplY3QuXG4gICAqIEBwYXJhbSBtZXRhUmVzb2x2ZXJcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlKG1ldGFSZXNvbHZlcjogUGFnZU1ldGFSZXNvbHZlcik6IE9ic2VydmFibGU8UGFnZU1ldGE+IHtcbiAgICBjb25zdCByZXNvbHZlck1ldGhvZHMgPSB0aGlzLmdldFJlc29sdmVyTWV0aG9kcygpO1xuICAgIGNvbnN0IHJlc29sdmVkRGF0YTogT2JzZXJ2YWJsZTxQYWdlTWV0YT5bXSA9IE9iamVjdC5rZXlzKHJlc29sdmVyTWV0aG9kcylcbiAgICAgIC8vIFRPRE86IFJldmlzaXQgaWYgdHlwaW5nIGlzIHBvc3NpYmxlIGhlcmUgd2l0aCBUZW1wbGF0ZSBMaXRlcmFsIFR5cGVzIHdoZW4gd2UgdXBkYXRlIHRvIFRTID49NC4xXG4gICAgICAuZmlsdGVyKChrZXkpID0+IChtZXRhUmVzb2x2ZXIgYXMgYW55KVtyZXNvbHZlck1ldGhvZHNba2V5XV0pXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIChtZXRhUmVzb2x2ZXIgYXMgYW55KVxuICAgICAgICAgIFtyZXNvbHZlck1ldGhvZHNba2V5XV0oKVxuICAgICAgICAgIC5waXBlKG1hcCgoZGF0YSkgPT4gKHsgW2tleV06IGRhdGEgfSkpKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHJlc29sdmVkRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHVuaXRlTGF0ZXN0IHdpbGwgZmFpbCBvdGhlcndpc2VcbiAgICAgIHJldHVybiBvZih7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bml0ZUxhdGVzdChyZXNvbHZlZERhdGEpLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uZGF0YSkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHJlc29sdmVycy4gVGhlIG9iamVjdCBwcm9wZXJ0aWVzIHJlcHJlc2VudCB0aGUgYFBhZ2VNZXRhYCBwcm9wZXJ0eSwgaS5lLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICB0aXRsZTogJ3Jlc29sdmVUaXRsZScsXG4gICAqICAgcm9ib3RzOiAncmVzb2x2ZVJvYm90cydcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhpcyBsaXN0IG9mIHJlc29sdmVycyBpcyBmaWx0ZXJlZCBmb3IgQ1NSIHZzIFNTUiBwcm9jZXNzaW5nIHNpbmNlIG5vdCBhbGwgcmVzb2x2ZXJzIGFyZVxuICAgKiByZWxldmFudCBkdXJpbmcgYnJvd3NpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UmVzb2x2ZXJNZXRob2RzKCk6IHsgW3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgbGV0IHJlc29sdmVyTWV0aG9kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIC8vIGZpbHRlciB0aGUgcmVzb2x2ZXJzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcgaW4gQ1NSXG4gICAgdGhpcy5wYWdlTWV0YUNvbmZpZz8ucGFnZU1ldGE/LnJlc29sdmVyc1xuICAgICAgPy5maWx0ZXIoKHJlc29sdmVyKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy8gYWx3YXlzIHJlc29sdmUgaW4gU1NSXG4gICAgICAgICAgIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCA/PyAnJykgfHxcbiAgICAgICAgICAvLyByZXNvbHZlIGluIENTUiB3aGVuIGl0J3Mgbm90IGRpc2FibGVkXG4gICAgICAgICAgIXJlc29sdmVyLmRpc2FibGVkSW5Dc3IgfHxcbiAgICAgICAgICAvLyByZXNvbHZlIGluIENTUiB3aGVuIHJlc29sdmVyIGlzIGVuYWJsZWQgaW4gZGV2TW9kZVxuICAgICAgICAgIChpc0Rldk1vZGUoKSAmJiB0aGlzLnBhZ2VNZXRhQ29uZmlnPy5wYWdlTWV0YT8uZW5hYmxlSW5EZXZNb2RlKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5mb3JFYWNoKFxuICAgICAgICAocmVzb2x2ZXIpID0+IChyZXNvbHZlck1ldGhvZHNbcmVzb2x2ZXIucHJvcGVydHldID0gcmVzb2x2ZXIubWV0aG9kKVxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzb2x2ZXJNZXRob2RzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcmVzb2x2ZXIgd2l0aCB0aGUgYmVzdCBtYXRjaCwgYmFzZWQgb24gYSBzY29yZVxuICAgKiBnZW5lcmF0ZWQgYnkgdGhlIHJlc29sdmVyLlxuICAgKlxuICAgKiBSZXNvbHZlcnMgbWF0Y2ggYnkgZGVmYXVsdCBvbiBgUGFnZVR5cGVgIGFuZCBgcGFnZS50ZW1wbGF0ZWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TWV0YVJlc29sdmVyKFxuICAgIHBhZ2U6IFBhZ2VcbiAgKTogT2JzZXJ2YWJsZTxQYWdlTWV0YVJlc29sdmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZXJzJC5waXBlKFxuICAgICAgbWFwKChyZXNvbHZlcnMpID0+IHJlc29sdmVBcHBsaWNhYmxlKHJlc29sdmVycywgW3BhZ2VdLCBbcGFnZV0pKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==