UNPKG

@spartacus/core

Version:

Spartacus - the core framework

82 lines 11.1 kB
import { Injectable } from '@angular/core'; import { EMPTY, isObservable, throwError, } from 'rxjs'; import { delay, map, publishReplay, shareReplay, switchMap, } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "../feature-modules.service"; /** * Service that can create proxy facade, which is a service that will expose * methods and properties from a facade implemented in the lazy loaded module. * * Returned proxy facade will lazy load the feature and facade implementation * at first method call or when first property observable will be subscribed. */ export class FacadeFactoryService { constructor(featureModules, injector) { this.featureModules = featureModules; this.injector = injector; } getResolver(feature, facadeClass, async = false) { if (!this.featureModules.isConfigured(feature)) { return throwError(new Error(`Feature ${feature} is not configured properly`)); } let facadeService$ = this.featureModules.resolveFeature(feature).pipe(map((moduleRef) => moduleRef.injector), map((injector) => injector.get(facadeClass))); if (async) { facadeService$ = facadeService$.pipe(delay(0)); } return facadeService$.pipe(shareReplay()); } /** * Calls a method on a facade * * Method should either return an observable or void. Any other return type * than observable is ignored. * * @param resolver$ * @param method * @param args * @protected */ call(resolver$, method, args) { const callResult$ = resolver$.pipe(map((service) => service[method](...args)), publishReplay()); callResult$.connect(); return callResult$.pipe(switchMap((result) => { if (isObservable(result)) { return result; } return EMPTY; })); } /** * Get the property value from the facade * * Property has to be an aobservable * * @param resolver$ * @param property * @protected */ get(resolver$, property) { return resolver$.pipe(switchMap((service) => service[property])); } create({ facade, feature, methods, properties, async, }) { const resolver$ = this.getResolver(feature, facade, async); const result = new (class extends facade { })(); (methods !== null && methods !== void 0 ? methods : []).forEach((method) => { result[method] = (...args) => this.call(resolver$, method, args); }); (properties !== null && properties !== void 0 ? properties : []).forEach((property) => { result[property] = this.get(resolver$, property); }); return result; } } FacadeFactoryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: FacadeFactoryService, deps: [{ token: i1.FeatureModulesService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); FacadeFactoryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: FacadeFactoryService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: FacadeFactoryService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.FeatureModulesService }, { type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjYWRlLWZhY3Rvcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xhenktbG9hZGluZy9mYWNhZGUtZmFjdG9yeS9mYWNhZGUtZmFjdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFFTCxLQUFLLEVBQ0wsWUFBWSxFQUVaLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxLQUFLLEVBQ0wsR0FBRyxFQUNILGFBQWEsRUFDYixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7OztBQUl4Qjs7Ozs7O0dBTUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQ1ksY0FBcUMsRUFDckMsUUFBa0I7UUFEbEIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLGFBQVEsR0FBUixRQUFRLENBQVU7SUFDM0IsQ0FBQztJQUVNLFdBQVcsQ0FDbkIsT0FBZSxFQUNmLFdBQTRCLEVBQzVCLEtBQUssR0FBRyxLQUFLO1FBRWIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlDLE9BQU8sVUFBVSxDQUNmLElBQUksS0FBSyxDQUFDLFdBQVcsT0FBTyw2QkFBNkIsQ0FBQyxDQUMzRCxDQUFDO1NBQ0g7UUFFRCxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ25FLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUN0QyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FDN0MsQ0FBQztRQUNGLElBQUksS0FBSyxFQUFFO1lBQ1QsY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNPLElBQUksQ0FDWixTQUEwQixFQUMxQixNQUFjLEVBQ2QsSUFBZTtRQUVmLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQ2hDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFDMUMsYUFBYSxFQUFFLENBQ2hCLENBQUM7UUFDRCxXQUEwQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXRELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FDckIsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxHQUFHLENBQ1gsU0FBMEIsRUFDMUIsUUFBZ0I7UUFFaEIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFtQixFQUN2QixNQUFNLEVBQ04sT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsS0FBSyxHQUNlO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRCxNQUFNLE1BQU0sR0FBUSxJQUFJLENBQUMsS0FBTSxTQUFTLE1BQWM7U0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQWtCLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O2lIQTlGVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdFR5cGUsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb25uZWN0YWJsZU9ic2VydmFibGUsXG4gIEVNUFRZLFxuICBpc09ic2VydmFibGUsXG4gIE9ic2VydmFibGUsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZGVsYXksXG4gIG1hcCxcbiAgcHVibGlzaFJlcGxheSxcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRmVhdHVyZU1vZHVsZXNTZXJ2aWNlIH0gZnJvbSAnLi4vZmVhdHVyZS1tb2R1bGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmFjYWRlRGVzY3JpcHRvciB9IGZyb20gJy4vZmFjYWRlLWRlc2NyaXB0b3InO1xuXG4vKipcbiAqIFNlcnZpY2UgdGhhdCBjYW4gY3JlYXRlIHByb3h5IGZhY2FkZSwgd2hpY2ggaXMgYSBzZXJ2aWNlIHRoYXQgd2lsbCBleHBvc2VcbiAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgZnJvbSBhIGZhY2FkZSBpbXBsZW1lbnRlZCBpbiB0aGUgbGF6eSBsb2FkZWQgbW9kdWxlLlxuICpcbiAqIFJldHVybmVkIHByb3h5IGZhY2FkZSB3aWxsIGxhenkgbG9hZCB0aGUgZmVhdHVyZSBhbmQgZmFjYWRlIGltcGxlbWVudGF0aW9uXG4gKiBhdCBmaXJzdCBtZXRob2QgY2FsbCBvciB3aGVuIGZpcnN0IHByb3BlcnR5IG9ic2VydmFibGUgd2lsbCBiZSBzdWJzY3JpYmVkLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRmFjYWRlRmFjdG9yeVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZmVhdHVyZU1vZHVsZXM6IEZlYXR1cmVNb2R1bGVzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgZ2V0UmVzb2x2ZXI8VD4oXG4gICAgZmVhdHVyZTogc3RyaW5nLFxuICAgIGZhY2FkZUNsYXNzOiBBYnN0cmFjdFR5cGU8VD4sXG4gICAgYXN5bmMgPSBmYWxzZVxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAoIXRoaXMuZmVhdHVyZU1vZHVsZXMuaXNDb25maWd1cmVkKGZlYXR1cmUpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgbmV3IEVycm9yKGBGZWF0dXJlICR7ZmVhdHVyZX0gaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHlgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgZmFjYWRlU2VydmljZSQgPSB0aGlzLmZlYXR1cmVNb2R1bGVzLnJlc29sdmVGZWF0dXJlKGZlYXR1cmUpLnBpcGUoXG4gICAgICBtYXAoKG1vZHVsZVJlZikgPT4gbW9kdWxlUmVmLmluamVjdG9yKSxcbiAgICAgIG1hcCgoaW5qZWN0b3IpID0+IGluamVjdG9yLmdldChmYWNhZGVDbGFzcykpXG4gICAgKTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGZhY2FkZVNlcnZpY2UkID0gZmFjYWRlU2VydmljZSQucGlwZShkZWxheSgwKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWNhZGVTZXJ2aWNlJC5waXBlKHNoYXJlUmVwbGF5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgZmFjYWRlXG4gICAqXG4gICAqIE1ldGhvZCBzaG91bGQgZWl0aGVyIHJldHVybiBhbiBvYnNlcnZhYmxlIG9yIHZvaWQuIEFueSBvdGhlciByZXR1cm4gdHlwZVxuICAgKiB0aGFuIG9ic2VydmFibGUgaXMgaWdub3JlZC5cbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyJFxuICAgKiBAcGFyYW0gbWV0aG9kXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjYWxsKFxuICAgIHJlc29sdmVyJDogT2JzZXJ2YWJsZTxhbnk+LFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd25bXVxuICApOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWxsUmVzdWx0JCA9IHJlc29sdmVyJC5waXBlKFxuICAgICAgbWFwKChzZXJ2aWNlKSA9PiBzZXJ2aWNlW21ldGhvZF0oLi4uYXJncykpLFxuICAgICAgcHVibGlzaFJlcGxheSgpXG4gICAgKTtcbiAgICAoY2FsbFJlc3VsdCQgYXMgQ29ubmVjdGFibGVPYnNlcnZhYmxlPGFueT4pLmNvbm5lY3QoKTtcblxuICAgIHJldHVybiBjYWxsUmVzdWx0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHRoZSBmYWNhZGVcbiAgICpcbiAgICogUHJvcGVydHkgaGFzIHRvIGJlIGFuIGFvYnNlcnZhYmxlXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciRcbiAgICogQHBhcmFtIHByb3BlcnR5XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQoXG4gICAgcmVzb2x2ZXIkOiBPYnNlcnZhYmxlPGFueT4sXG4gICAgcHJvcGVydHk6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gcmVzb2x2ZXIkLnBpcGUoc3dpdGNoTWFwKChzZXJ2aWNlKSA9PiBzZXJ2aWNlW3Byb3BlcnR5XSkpO1xuICB9XG5cbiAgY3JlYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHtcbiAgICBmYWNhZGUsXG4gICAgZmVhdHVyZSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXMsXG4gICAgYXN5bmMsXG4gIH06IEZhY2FkZURlc2NyaXB0b3I8VD4pOiBUIHtcbiAgICBjb25zdCByZXNvbHZlciQgPSB0aGlzLmdldFJlc29sdmVyKGZlYXR1cmUsIGZhY2FkZSwgYXN5bmMpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBuZXcgKGNsYXNzIGV4dGVuZHMgKGZhY2FkZSBhcyBhbnkpIHt9KSgpO1xuICAgIChtZXRob2RzID8/IFtdKS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgIHJlc3VsdFttZXRob2RdID0gKC4uLmFyZ3MpID0+XG4gICAgICAgIHRoaXMuY2FsbChyZXNvbHZlciQsIG1ldGhvZCBhcyBzdHJpbmcsIGFyZ3MpO1xuICAgIH0pO1xuICAgIChwcm9wZXJ0aWVzID8/IFtdKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IHRoaXMuZ2V0KHJlc29sdmVyJCwgcHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==