@code-art/rx-helpers
Version:
A library with Rxjs operators that can be used in your Angular 8 projects.
95 lines • 14.1 kB
JavaScript
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
const DESTROY_SUBJECT_SYMBOL = Symbol();
const DECORATOR_APPLIED_SYMBOL = Symbol();
function isComponentType(type) {
return type && !!type.ɵcmp;
}
function isDirectiveType(type) {
return type && !!type.ɵdir;
}
function isPipeType(type) {
return type && !!type.ɵpipe;
}
function isProviderType(type) {
return type && !!type.ɵprov;
}
function doOnDestroy() {
const subject = this[DESTROY_SUBJECT_SYMBOL];
if (subject) {
subject.next(0);
subject.complete();
this[DESTROY_SUBJECT_SYMBOL] = undefined;
}
}
function applyOnDestroyHook(def, handler) {
const oldOnDestroy = def.onDestroy;
def.onDestroy = function () {
if (oldOnDestroy) {
oldOnDestroy.apply(this);
}
handler.apply(this);
};
}
function applyOnDestroyToProvider(def, handler) {
const oldOnDestroy = def.prototype.ngOnDestroy;
def.prototype.ngOnDestroy = function (...args) {
if (oldOnDestroy) {
oldOnDestroy.apply(this, args);
}
handler.apply(this);
};
}
function applyOnDestroyToInstance(instance) {
if (!instance[DESTROY_SUBJECT_SYMBOL]) {
instance[DESTROY_SUBJECT_SYMBOL] = new Subject();
const constructor = instance.constructor;
if (typeof constructor === 'function') {
if (constructor[DECORATOR_APPLIED_SYMBOL]) {
return;
}
if (isPipeType(constructor)
|| isComponentType(constructor)
|| isDirectiveType(constructor)
|| isProviderType(constructor)) {
throw new Error(`To use ${takeUntilDestroyed.name} with Components, Pipes, Directives and Services add the @${TakeUntilDestroyed.name}.`);
}
}
if (typeof instance.ngOnDestroy !== 'function') {
throw new Error(`${takeUntilDestroyed.name} can only be applied to Components, Pipes, Directives and Services with @Injectable decorator or `
+ ` to object instance implementing OnDestroy interface.`);
}
const oldOnDestroy = instance.ngOnDestroy;
instance.ngOnDestroy = function (...args) {
oldOnDestroy.apply(instance, args);
doOnDestroy.apply(this);
};
}
}
function applyOnDestroyToClass(target) {
if (isComponentType(target)) {
applyOnDestroyHook(target.ɵcmp, doOnDestroy);
}
else if (isDirectiveType(target)) {
applyOnDestroyHook(target.ɵdir, doOnDestroy);
}
else if (isPipeType(target)) {
applyOnDestroyHook(target.ɵpipe, doOnDestroy);
}
else {
applyOnDestroyToProvider(target, doOnDestroy);
}
target[DECORATOR_APPLIED_SYMBOL] = true;
}
export function TakeUntilDestroyed() {
return applyOnDestroyToClass;
}
export function takeUntilDestroyed(instance) {
return (source) => {
const c = instance;
// const c = (component as any) as ComponentWithTakeUntilDestroy;
applyOnDestroyToInstance(c);
return source.pipe(takeUntil(c[DESTROY_SUBJECT_SYMBOL]));
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFrZVVudGlsRGVzdHJveWVkLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvZGUtYXJ0L3J4LWhlbHBlcnMvIiwic291cmNlcyI6WyJsaWIvb3BlcmF0b3JzL3Rha2VVbnRpbERlc3Ryb3llZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXdDLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUN4QyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sRUFBRSxDQUFDO0FBcUMxQyxTQUFTLGVBQWUsQ0FBQyxJQUFjO0lBQ3JDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBRSxJQUFzQixDQUFDLElBQUksQ0FBQztBQUNoRCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBYztJQUNyQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUUsSUFBc0IsQ0FBQyxJQUFJLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWM7SUFDaEMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFFLElBQWlCLENBQUMsS0FBSyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFjO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBRSxJQUFxQixDQUFDLEtBQUssQ0FBQztBQUNoRCxDQUFDO0FBSUQsU0FBUyxXQUFXO0lBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzdDLElBQUksT0FBTyxFQUFFO1FBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsU0FBUyxDQUFDO0tBQzFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsa0JB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TSxVQUFVLGtCQUFrQixDQUFJLFFBQWE7SUFDakQsT0FBTyxDQUFDLE1BQXFCLEVBQUUsRUFBRTtRQUMvQixNQUFNLENBQUMsR0FBRyxRQUF3QyxDQUFDO1FBQ25ELGlFQUFpRTtRQUNqRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBb0IsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuY29uc3QgREVTVFJPWV9TVUJKRUNUX1NZTUJPTCA9IFN5bWJvbCgpO1xyXG5jb25zdCBERUNPUkFUT1JfQVBQTElFRF9TWU1CT0wgPSBTeW1ib2woKTtcclxuXHJcbmludGVyZmFjZSBJbnN0YW5jZVdpdGhUYWtlVW50aWxEZXN0cm95IGV4dGVuZHMgT25EZXN0cm95IHtcclxuICBbREVTVFJPWV9TVUJKRUNUX1NZTUJPTF0/OiBTdWJqZWN0PG51bWJlcj47XHJcbn1cclxuXHJcbmludGVyZmFjZSBGdW5jdGlvbldpdGhEZWNvcmF0b3IgZXh0ZW5kcyBGdW5jdGlvbiB7XHJcbiAgW0RFQ09SQVRPUl9BUFBMSUVEX1NZTUJPTF0/OiBib29sZWFuO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ29tcG9uZW50RGVmaW5pdGlvbiB7XHJcbiAgb25EZXN0cm95OiAoKCkgPT4gdm9pZCkgfCBudWxsO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ29tcG9uZW50VHlwZSBleHRlbmRzIEZ1bmN0aW9uV2l0aERlY29yYXRvciB7XHJcbiAgybVjbXA6IENvbXBvbmVudERlZmluaXRpb247XHJcbn1cclxuXHJcbnR5cGUgRGlyZWN0aXZlRGVmaW5pdGlvbiA9IENvbXBvbmVudERlZmluaXRpb247XHJcbnR5cGUgUGlwZURlZmluaXRpb24gPSBDb21wb25lbnREZWZpbml0aW9uO1xyXG5cclxuaW50ZXJmYWNlIENvbXBvbmVudFR5cGUgZXh0ZW5kcyBGdW5jdGlvbldpdGhEZWNvcmF0b3Ige1xyXG4gIMm1Y21wOiBDb21wb25lbnREZWZpbml0aW9uO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRGlyZWN0aXZlVHlwZSBleHRlbmRzIEZ1bmN0aW9uV2l0aERlY29yYXRvciB7XHJcbiAgybVkaXI6IERpcmVjdGl2ZURlZmluaXRpb247XHJcbn1cclxuXHJcbmludGVyZmFjZSBQcm92aWRlclR5cGUgZXh0ZW5kcyBGdW5jdGlvbldpdGhEZWNvcmF0b3Ige1xyXG4gIMm1cHJvdjogYW55O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGlwZVR5cGUgZXh0ZW5kcyBGdW5jdGlvbldpdGhEZWNvcmF0b3Ige1xyXG4gIMm1cGlwZTogRGlyZWN0aXZlRGVmaW5pdGlvbjtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNDb21wb25lbnRUeXBlKHR5cGU6IEZ1bmN0aW9uKTogdHlwZSBpcyBDb21wb25lbnRUeXBlIHtcclxuICByZXR1cm4gdHlwZSAmJiAhISh0eXBlIGFzIENvbXBvbmVudFR5cGUpLsm1Y21wO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0RpcmVjdGl2ZVR5cGUodHlwZTogRnVuY3Rpb24pOiB0eXBlIGlzIERpcmVjdGl2ZVR5cGUge1xyXG4gIHJldHVybiB0eXBlICYmICEhKHR5cGUgYXMgRGlyZWN0aXZlVHlwZSkuybVkaXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUGlwZVR5cGUodHlwZTogRnVuY3Rpb24pOiB0eXBlIGlzIFBpcGVUeXBlIHtcclxuICByZXR1cm4gdHlwZSAmJiAhISh0eXBlIGFzIFBpcGVUeXBlKS7JtXBpcGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUHJvdmlkZXJUeXBlKHR5cGU6IEZ1bmN0aW9uKTogdHlwZSBpcyBQcm92aWRlclR5cGUge1xyXG4gIHJldHVybiB0eXBlICYmICEhKHR5cGUgYXMgUHJvdmlkZXJUeXBlKS7JtXByb3Y7XHJcbn1cclxuXHJcbnR5cGUgSG9va2FibGVEZWZpbml0aW9uID0gKENvbXBvbmVudERlZmluaXRpb24gfCBEaXJlY3RpdmVEZWZpbml0aW9uIHwgUGlwZURlZmluaXRpb24pO1xyXG5cclxuZnVuY3Rpb24gZG9PbkRlc3Ryb3kodGhpczogSW5zdGFuY2VXaXRoVGFrZVVudGlsRGVzdHJveSkge1xyXG4gIGNvbnN0IHN1YmplY3QgPSB0aGlzW0RFU1RST1lfU1VCSkVDVF9TWU1CT0xdO1xyXG4gIGlmIChzdWJqZWN0KSB7XHJcbiAgICBzdWJqZWN0Lm5leHQoMCk7XHJcbiAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzW0RFU1RST1lfU1VCSkVDVF9TWU1CT0xdID0gdW5kZWZpbmVkO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlPbkRlc3Ryb3lIb29rKGRlZjogSG9va2FibGVEZWZpbml0aW9uLCBoYW5kbGVyOiAodGhpczogSW5zdGFuY2VXaXRoVGFrZVVudGlsRGVzdHJveSkgPT4gdm9pZCkge1xyXG4gIGNvbnN0IG9sZE9uRGVzdHJveSA9IGRlZi5vbkRlc3Ryb3k7XHJcbiAgZGVmLm9uRGVzdHJveSA9IGZ1bmN0aW9uICh0aGlzOiBJbnN0YW5jZVdpdGhUYWtlVW50aWxEZXN0cm95KTogdm9pZCB7XHJcbiAgICBpZiAob2xkT25EZXN0cm95KSB7XHJcbiAgICAgIG9sZE9uRGVzdHJveS5hcHBseSh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZXIuYXBwbHkodGhpcyk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlPbkRlc3Ryb3lUb1Byb3ZpZGVyKGRlZjogRnVuY3Rpb24sIGhhbmRsZXI6ICh0aGlzOiBJbnN0YW5jZVdpdGhUYWtlVW50aWxEZXN0cm95KSA9PiB2b2lkKSB7XHJcbiAgY29uc3Qgb2xkT25EZXN0cm95ID0gZGVmLnByb3RvdHlwZS5uZ09uRGVzdHJveTtcclxuICBkZWYucHJvdG90eXBlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKHRoaXM6IEluc3RhbmNlV2l0aFRha2VVbnRpbERlc3Ryb3ksIC4uLmFyZ3M6IFtdKTogdm9pZCB7XHJcbiAgICBpZiAob2xkT25EZXN0cm95KSB7XHJcbiAgICAgIG9sZE9uRGVzdHJveS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZXIuYXBwbHkodGhpcyk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlPbkRlc3Ryb3lUb0luc3RhbmNlKGluc3RhbmNlOiBJbnN0YW5jZVdpdGhUYWtlVW50aWxEZXN0cm95KTogdm9pZCB7XHJcbiAgaWYgKCFpbnN0YW5jZVtERVNUUk9ZX1NVQkpFQ1RfU1lNQk9MXSkge1xyXG4gICAgaW5zdGFuY2VbREVTVFJPWV9TVUJKRUNUX1NZTUJPTF0gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGluc3RhbmNlLmNvbnN0cnVjdG9yIGFzIEZ1bmN0aW9uV2l0aERlY29yYXRvcjtcclxuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgaWYgKGNvbnN0cnVjdG9yW0RFQ09SQVRPUl9BUFBMSUVEX1NZTUJPTF0pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzUGlwZVR5cGUoY29uc3RydWN0b3IpXHJcbiAgICAgICAgfHwgaXNDb21wb25lbnRUeXBlKGNvbnN0cnVjdG9yKVxyXG4gICAgICAgIHx8IGlzRGlyZWN0aXZlVHlwZShjb25zdHJ1Y3RvcilcclxuICAgICAgICB8fCBpc1Byb3ZpZGVyVHlwZShjb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIHVzZSAke1xyXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQubmFtZVxyXG4gICAgICAgICAgfSB3aXRoIENvbXBvbmVudHMsIFBpcGVzLCBEaXJlY3RpdmVzIGFuZCBTZXJ2aWNlcyBhZGQgdGhlIEAke1xyXG4gICAgICAgICAgVGFrZVVudGlsRGVzdHJveWVkLm5hbWVcclxuICAgICAgICAgIH0uYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLm5nT25EZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtcclxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZC5uYW1lXHJcbiAgICAgICAgfSBjYW4gb25seSBiZSBhcHBsaWVkIHRvIENvbXBvbmVudHMsIFBpcGVzLCBEaXJlY3RpdmVzIGFuZCBTZXJ2aWNlcyB3aXRoIEBJbmplY3RhYmxlIGRlY29yYXRvciBvciBgXHJcbiAgICAgICAgKyBgIHRvIG9iamVjdCBpbnN0YW5jZSBpbXBsZW1lbnRpbmcgT25EZXN0cm95IGludGVyZmFjZS5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvbGRPbkRlc3Ryb3kgPSBpbnN0YW5jZS5uZ09uRGVzdHJveTtcclxuICAgIGluc3RhbmNlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKHRoaXM6IEluc3RhbmNlV2l0aFRha2VVbnRpbERlc3Ryb3ksIC4uLmFyZ3MpIHtcclxuICAgICAgb2xkT25EZXN0cm95LmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcclxuICAgICAgZG9PbkRlc3Ryb3kuYXBwbHkodGhpcyk7XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlPbkRlc3Ryb3lUb0NsYXNzKHRhcmdldDogRnVuY3Rpb25XaXRoRGVjb3JhdG9yKTogdm9pZCB7XHJcbiAgaWYgKGlzQ29tcG9uZW50VHlwZSh0YXJnZXQpKSB7XHJcbiAgICBhcHBseU9uRGVzdHJveUhvb2sodGFyZ2V0Lsm1Y21wLCBkb09uRGVzdHJveSk7XHJcbiAgfSBlbHNlIGlmIChpc0RpcmVjdGl2ZVR5cGUodGFyZ2V0KSkge1xyXG4gICAgYXBwbHlPbkRlc3Ryb3lIb29rKHRhcmdldC7JtWRpciwgZG9PbkRlc3Ryb3kpO1xyXG4gIH0gZWxzZSBpZiAoaXNQaXBlVHlwZSh0YXJnZXQpKSB7XHJcbiAgICBhcHBseU9uRGVzdHJveUhvb2sodGFyZ2V0Lsm1cGlwZSwgZG9PbkRlc3Ryb3kpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBhcHBseU9uRGVzdHJveVRvUHJvdmlkZXIodGFyZ2V0LCBkb09uRGVzdHJveSk7XHJcbiAgfVxyXG4gIHRhcmdldFtERUNPUkFUT1JfQVBQTElFRF9TWU1CT0xdID0gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFRha2VVbnRpbERlc3Ryb3llZCgpOiBDbGFzc0RlY29yYXRvciB7XHJcbiAgcmV0dXJuIGFwcGx5T25EZXN0cm95VG9DbGFzcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRha2VVbnRpbERlc3Ryb3llZDxUPihpbnN0YW5jZTogYW55KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+IHtcclxuICByZXR1cm4gKHNvdXJjZTogT2JzZXJ2YWJsZTxUPikgPT4ge1xyXG4gICAgY29uc3QgYyA9IGluc3RhbmNlIGFzIEluc3RhbmNlV2l0aFRha2VVbnRpbERlc3Ryb3k7XHJcbiAgICAvLyBjb25zdCBjID0gKGNvbXBvbmVudCBhcyBhbnkpIGFzIENvbXBvbmVudFdpdGhUYWtlVW50aWxEZXN0cm95O1xyXG4gICAgYXBwbHlPbkRlc3Ryb3lUb0luc3RhbmNlKGMpO1xyXG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHRha2VVbnRpbChjW0RFU1RST1lfU1VCSkVDVF9TWU1CT0xdIGFzIFN1YmplY3Q8bnVtYmVyPikpO1xyXG4gIH07XHJcbn1cclxuIl19