@spartacus/core
Version:
Spartacus - the core framework
106 lines • 15.1 kB
JavaScript
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==