ngx-context
Version:
Angular Context: Easy property binding for router outlet and nested component trees.
101 lines • 12.8 kB
JavaScript
import { __rest } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, Optional, SkipSelf, ViewEncapsulation } from '@angular/core';
import { ReplaySubject, Subject } from 'rxjs';
import { isSubscribableOrPromise, parseKeys } from './internals';
export class ContextProviderComponent {
constructor(source) {
this.source = source;
this.initialized = false;
this._contextMap = {};
this._provide = '';
this.provided = new Map();
this.change$ = new ReplaySubject(1);
this.reset$ = new Subject();
}
set contextMap(map) {
this._contextMap = map || {};
}
get contextMap() {
return this._contextMap;
}
set provide(value) {
this._provide = value || '';
}
get provide() {
return this._provide;
}
get component() {
var _a;
return ((_a = this.source['_view']) === null || _a === void 0 ? void 0 : _a.component) || this.source['context'];
}
init() {
setTimeout(() => {
const THIS = this;
const context = new Map();
const provided = parseKeys(this.provide).filter(key => key && key in this.component);
provided.forEach(key => {
if (isSubscribableOrPromise(this.component[key])) {
this.change$.next(key);
return;
}
const propertyDescriptor = Object.getOwnPropertyDescriptor(this.component, key) ||
Object.getOwnPropertyDescriptor(this.component.__proto__, key);
this.provided.set(key, propertyDescriptor);
const { value, writable, get: getter, set: setter } = propertyDescriptor, prop = __rest(propertyDescriptor, ["value", "writable", "get", "set"]);
Object.defineProperty(this.component, key, Object.assign(Object.assign({}, prop), { get: getter
? function () {
return getter.call(this);
}
: function () {
return context.get(key);
}, set: setter
? function () {
setter.apply(this, arguments);
THIS.change$.next(key);
}
: function (newValue) {
context.set(key, newValue);
THIS.change$.next(key);
} }));
this.component[key] = value || this.component[key];
});
}, 0);
}
reset() {
this.provided.forEach((propertyDescriptor, key) => {
const value = this.component[key];
Object.defineProperty(this.component, key, propertyDescriptor);
this.component[key] = value;
});
this.provided.clear();
this.change$.next('');
this.reset$.next();
}
ngOnChanges() {
if (this.initialized) {
this.reset();
if (this.source)
this.init();
}
}
ngOnInit() {
this.initialized = true;
this.ngOnChanges();
}
}
ContextProviderComponent.decorators = [
{ type: Component, args: [{
selector: 'context-provider',
template: '<ng-content></ng-content>',
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None
},] }
];
ContextProviderComponent.ctorParameters = () => [
{ type: ChangeDetectorRef, decorators: [{ type: Optional }, { type: SkipSelf }] }
];
ContextProviderComponent.propDecorators = {
contextMap: [{ type: Input }],
provide: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbnRleHQvc3JjL2xpYi9wcm92aWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBR0wsUUFBUSxFQUNSLFFBQVEsRUFDUixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVNqRSxNQUFNLE9BQU8sd0JBQXdCO0lBOEJuQyxZQUdVLE1BQXlCO1FBQXpCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBaEMzQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixnQkFBVyxHQUFlLEVBQUUsQ0FBQztRQUM3QixhQUFRLEdBQXNCLEVBQUUsQ0FBQztRQUV6QyxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQXNCckIsWUFBTyxHQUFHLElBQUksYUFBYSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBTzdCLENBQUM7SUE1QkQsSUFDSSxVQUFVLENBQUMsR0FBZTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFDSSxPQUFPLENBQUMsS0FBd0I7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFP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QyxDQUFDO1lBRS9ELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUViLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7O1lBbkhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUUsMkJBQTJCO2dCQUNyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7OztZQWxCQyxpQkFBaUIsdUJBa0RkLFFBQVEsWUFDUixRQUFROzs7eUJBekJWLEtBQUs7c0JBUUwsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTa2lwU2VsZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc1N1YnNjcmliYWJsZU9yUHJvbWlzZSwgcGFyc2VLZXlzIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgQ29udGV4dE1hcCB9IGZyb20gJy4vc3ltYm9scyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbnRleHQtcHJvdmlkZXInLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dFByb3ZpZGVyQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2NvbnRleHRNYXA6IENvbnRleHRNYXAgPSB7fTtcbiAgcHJpdmF0ZSBfcHJvdmlkZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICBwcm92aWRlZCA9IG5ldyBNYXAoKTtcblxuICBASW5wdXQoKVxuICBzZXQgY29udGV4dE1hcChtYXA6IENvbnRleHRNYXApIHtcbiAgICB0aGlzLl9jb250ZXh0TWFwID0gbWFwIHx8IHt9O1xuICB9XG4gIGdldCBjb250ZXh0TWFwKCk6IENvbnRleHRNYXAge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0TWFwO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHByb3ZpZGUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcHJvdmlkZSA9IHZhbHVlIHx8ICcnO1xuICB9XG4gIGdldCBwcm92aWRlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvdmlkZTtcbiAgfVxuXG4gIGdldCBjb21wb25lbnQoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlWydfdmlldyddPy5jb21wb25lbnQgfHwgdGhpcy5zb3VyY2VbJ2NvbnRleHQnXVxuICB9XG5cbiAgY2hhbmdlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG4gIHJlc2V0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKClcbiAgICBAU2tpcFNlbGYoKVxuICAgIHByaXZhdGUgc291cmNlOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gIH1cblxuICBwcml2YXRlIGluaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBUSElTID0gdGhpcztcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCBwcm92aWRlZCA9IHBhcnNlS2V5cyh0aGlzLnByb3ZpZGUpLmZpbHRlcihcbiAgICAgICAga2V5ID0+IGtleSAmJiBrZXkgaW4gdGhpcy5jb21wb25lbnQsXG4gICAgICApO1xuXG4gICAgICBwcm92aWRlZC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChpc1N1YnNjcmliYWJsZU9yUHJvbWlzZSh0aGlzLmNvbXBvbmVudFtrZXldKSkge1xuICAgICAgICAgIHRoaXMuY2hhbmdlJC5uZXh0KGtleSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvcGVydHlEZXNjcmlwdG9yID1cbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuY29tcG9uZW50LCBrZXkpIHx8XG4gICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcigodGhpcy5jb21wb25lbnQgYXMgYW55KS5fX3Byb3RvX18sIGtleSk7XG5cbiAgICAgICAgdGhpcy5wcm92aWRlZC5zZXQoa2V5LCBwcm9wZXJ0eURlc2NyaXB0b3IpO1xuXG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIHdyaXRhYmxlLCBnZXQ6IGdldHRlciwgc2V0OiBzZXR0ZXIsIC4uLnByb3AgfSA9IHByb3BlcnR5RGVzY3JpcHRvcjtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jb21wb25lbnQsIGtleSwge1xuICAgICAgICAgIC4uLnByb3AsXG4gICAgICAgICAgZ2V0OiBnZXR0ZXJcbiAgICAgICAgICAgID8gZnVuY3Rpb24oKTogYW55IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24oKTogYW55IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IHNldHRlclxuICAgICAgICAgICAgPyBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBzZXR0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBUSElTLmNoYW5nZSQubmV4dChrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNldChrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBUSElTLmNoYW5nZSQubmV4dChrZXkpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudFtrZXldID0gdmFsdWUgfHwgdGhpcy5jb21wb25lbnRba2V5XTtcbiAgICAgIH0pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpIHtcbiAgICB0aGlzLnByb3ZpZGVkLmZvckVhY2goKHByb3BlcnR5RGVzY3JpcHRvciwga2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29tcG9uZW50W2tleV07XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNvbXBvbmVudCwga2V5LCBwcm9wZXJ0eURlc2NyaXB0b3IpO1xuXG4gICAgICB0aGlzLmNvbXBvbmVudFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3ZpZGVkLmNsZWFyKCk7XG4gICAgdGhpcy5jaGFuZ2UkLm5leHQoJycpO1xuICAgIHRoaXMucmVzZXQkLm5leHQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgIGlmICh0aGlzLnNvdXJjZSkgdGhpcy5pbml0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xuICB9XG59XG4iXX0=