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