ngx-until-on-destroy
Version:
Allow you unsubscribe subscriptions when component was destroying. Can be used with Angular 5-10
61 lines • 7.42 kB
JavaScript
import { Subscription } from 'rxjs';
import { isIvy, wrapIvyHook } from './ivy';
import { wrapViewEngineHook } from './view-engine';
import { decoratedSymbol, onDestroySymbol, onInitSymbol, subSymbol } from './ngx-symbols';
function markAsDecorated(target) {
target[decoratedSymbol] = true;
}
function isDecorated(target) {
return target.hasOwnProperty(decoratedSymbol);
}
function createMethodWrapper(originalMethod) {
return function (...args) {
const originalResult = originalMethod.apply(this, args);
if (originalResult instanceof Subscription) {
this[subSymbol].add(originalResult);
}
else if (Array.isArray(originalResult)) {
originalResult.forEach(s => this[subSymbol].add(s));
}
else {
throw new Error('Decorated method must return Subscription or Subscription[]');
}
return originalResult;
};
}
function wrapOneHook(wrapParams) {
if (isIvy(wrapParams.target)) {
wrapIvyHook(wrapParams);
}
wrapViewEngineHook(wrapParams);
}
function wrapHooks(target) {
if (!isDecorated(target)) {
markAsDecorated(target);
wrapOneHook({
target,
hookName: 'OnInit',
oldName: onInitSymbol,
wrappingFn() {
this[subSymbol] = new Subscription();
}
});
wrapOneHook({
target,
hookName: 'OnDestroy',
oldName: onDestroySymbol,
wrappingFn() {
this[subSymbol].unsubscribe();
}
});
}
}
export function UntilOnDestroy() {
return function UntilOnDestroyDecorator(target, propertyKey) {
wrapHooks(target);
return {
value: createMethodWrapper(target[propertyKey]),
};
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW50aWwtb24tZGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS93aXNlbWFuL2pzL25neC11bnRpbC1vbi1kZXN0cm95L3Byb2plY3RzL25neC11bnRpbC1vbi1kZXN0cm95L3NyYy8iLCJzb3VyY2VzIjpbImxpYi91bnRpbC1vbi1kZXN0cm95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNMUYsU0FBUyxlQUFlLENBQUMsTUFBVztJQUNsQyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBSSxNQUFlO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBR0QsU0FBUyxtQkFBbUIsQ0FBSSxjQUFrQztJQUNoRSxPQUFPLFVBQXdDLEdBQUcsSUFBVztRQUMzRCxNQUFNLGNBQWMsR0FBa0MsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkYsSUFBSSxjQUFjLFlBQVksWUFBWSxFQUFFO1lBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDckM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDdkMsY0FBaUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekU7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztTQUNoRjtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBSSxVQUF5QjtJQUMvQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDNUIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0Qsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUdELFNBQVMsU0FBUyxDQUFJLE1BQWU7SUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4QixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEIsV0FBVyxDQUFDO1lBQ1YsTUFBTTtZQUNOLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLFVBQVU7Z0JBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQztZQUNWLE1BQU07WUFDTixRQUFRLEVBQUUsV0FBVztZQUNyQixPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVO2dCQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0tBQ0o7QUFDSCxDQUFDO0FBR0QsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyxTQUFTLHVCQUF1QixDQUFDLE1BQWUsRUFBRSxXQUFtQjtRQUMxRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsT0FBTztZQUNMLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEQsQ0FBQztJQUNKLENBQW9CLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZVdpdGhTdWJzY3JpcHRpb24gfSBmcm9tICcuL2NsYXNzLXdpdGgtc3Vic2NyaXB0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBpc0l2eSwgd3JhcEl2eUhvb2sgfSBmcm9tICcuL2l2eSc7XG5pbXBvcnQgeyB3cmFwVmlld0VuZ2luZUhvb2sgfSBmcm9tICcuL3ZpZXctZW5naW5lJztcbmltcG9ydCB7IFdyYXBQYXJhbXMgfSBmcm9tICcuL3dyYXAtcGFyYW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRlY29yYXRlZFN5bWJvbCwgb25EZXN0cm95U3ltYm9sLCBvbkluaXRTeW1ib2wsIHN1YlN5bWJvbCB9IGZyb20gJy4vbmd4LXN5bWJvbHMnO1xuXG5cbnR5cGUgU3Vic2NyaXB0aW9uTWV0aG9kID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBTdWJzY3JpcHRpb24gfCBTdWJzY3JpcHRpb25bXTtcblxuXG5mdW5jdGlvbiBtYXJrQXNEZWNvcmF0ZWQodGFyZ2V0OiBhbnkpOiB2b2lkIHtcbiAgdGFyZ2V0W2RlY29yYXRlZFN5bWJvbF0gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0RlY29yYXRlZDxUPih0YXJnZXQ6IFR5cGU8VD4pOiB0YXJnZXQgaXMgVHlwZVdpdGhTdWJzY3JpcHRpb248VD4ge1xuICByZXR1cm4gdGFyZ2V0Lmhhc093blByb3BlcnR5KGRlY29yYXRlZFN5bWJvbCk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlTWV0aG9kV3JhcHBlcjxUPihvcmlnaW5hbE1ldGhvZDogU3Vic2NyaXB0aW9uTWV0aG9kKTogU3Vic2NyaXB0aW9uTWV0aG9kIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IFR5cGVXaXRoU3Vic2NyaXB0aW9uPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IChTdWJzY3JpcHRpb24gfCBTdWJzY3JpcHRpb25bXSkge1xuICAgIGNvbnN0IG9yaWdpbmFsUmVzdWx0OiBTdWJzY3JpcHRpb24gfCBTdWJzY3JpcHRpb25bXSA9IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgaWYgKG9yaWdpbmFsUmVzdWx0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzW3N1YlN5bWJvbF0uYWRkKG9yaWdpbmFsUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWxSZXN1bHQpKSB7XG4gICAgICAob3JpZ2luYWxSZXN1bHQgYXMgU3Vic2NyaXB0aW9uW10pLmZvckVhY2gocyA9PiB0aGlzW3N1YlN5bWJvbF0uYWRkKHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWNvcmF0ZWQgbWV0aG9kIG11c3QgcmV0dXJuIFN1YnNjcmlwdGlvbiBvciBTdWJzY3JpcHRpb25bXScpO1xuICAgIH1cbiAgICByZXR1cm4gb3JpZ2luYWxSZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdyYXBPbmVIb29rPFQ+KHdyYXBQYXJhbXM6IFdyYXBQYXJhbXM8VD4pOiB2b2lkIHtcbiAgaWYgKGlzSXZ5KHdyYXBQYXJhbXMudGFyZ2V0KSkge1xuICAgIHdyYXBJdnlIb29rKHdyYXBQYXJhbXMpO1xuICB9XG4gIHdyYXBWaWV3RW5naW5lSG9vayh3cmFwUGFyYW1zKTtcbn1cblxuXG5mdW5jdGlvbiB3cmFwSG9va3M8VD4odGFyZ2V0OiBUeXBlPFQ+KTogdm9pZCB7XG4gIGlmICghaXNEZWNvcmF0ZWQodGFyZ2V0KSkge1xuICAgIG1hcmtBc0RlY29yYXRlZCh0YXJnZXQpO1xuXG4gICAgd3JhcE9uZUhvb2soe1xuICAgICAgdGFyZ2V0LFxuICAgICAgaG9va05hbWU6ICdPbkluaXQnLFxuICAgICAgb2xkTmFtZTogb25Jbml0U3ltYm9sLFxuICAgICAgd3JhcHBpbmdGbigpOiB2b2lkIHtcbiAgICAgICAgdGhpc1tzdWJTeW1ib2xdID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd3JhcE9uZUhvb2soe1xuICAgICAgdGFyZ2V0LFxuICAgICAgaG9va05hbWU6ICdPbkRlc3Ryb3knLFxuICAgICAgb2xkTmFtZTogb25EZXN0cm95U3ltYm9sLFxuICAgICAgd3JhcHBpbmdGbigpOiB2b2lkIHtcbiAgICAgICAgdGhpc1tzdWJTeW1ib2xdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gVW50aWxPbkRlc3Ryb3k8VD4oKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVudGlsT25EZXN0cm95RGVjb3JhdG9yKHRhcmdldDogVHlwZTxUPiwgcHJvcGVydHlLZXk6IHN0cmluZyk6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFN1YnNjcmlwdGlvbk1ldGhvZD4ge1xuICAgIHdyYXBIb29rcyh0YXJnZXQpO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogY3JlYXRlTWV0aG9kV3JhcHBlcih0YXJnZXRbcHJvcGVydHlLZXldKSxcbiAgICB9O1xuICB9IGFzIE1ldGhvZERlY29yYXRvcjtcbn1cbiJdfQ==