UNPKG

@flywine93/ngx-autounsubscrb

Version:

Angular 9+ automatically unsubscribe to the RXJS decorator, It is lightweight and practical!!

99 lines 10 kB
import { __values } from "tslib"; import { IvyKey } from './constant'; import { isFun } from './util'; var defaultOptions = { blackList: [], checkArrVar: false }; /** * unsubscribe variable * @param member public and private member or temp variable */ export function unsubscribe(variable, options) { var e_1, _a; if (variable) { if (isFun(variable.unsubscribe)) { variable.unsubscribe(); return; } // if variable is array type,will check and unsubscribe if (options.checkArrVar && Array.isArray(variable)) { try { for (var variable_1 = __values(variable), variable_1_1 = variable_1.next(); !variable_1_1.done; variable_1_1 = variable_1.next()) { var ele = variable_1_1.value; if (ele && isFun(ele.unsubscribe)) { ele.unsubscribe(); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (variable_1_1 && !variable_1_1.done && (_a = variable_1.return)) _a.call(variable_1); } finally { if (e_1) throw e_1.error; } } } } } /** * unsubscribe member variable and temp variable when destroy. * @param options options * 1.blackList---Variables in blacklist are not cancelled */ export function AutoUnsubscrb(options) { if (options === void 0) { options = {}; } return function (target) { var original = target.prototype['ngOnDestroy']; // cache original ngOnDestroy function if (!isFun(original)) { throw new Error(target.name + " is using @AutoUnsubscrb but does not implement OnDestroy"); } options = Object.assign(defaultOptions, options); target.prototype.autoAddList = []; // Used to cache objects added through MAutoAdd target.prototype.ngOnDestroy = function ngOnDestroy() { var e_2, _a; if (isFun(original)) { original.apply(this, arguments); // Preserve the original function } // unsubscribe public and private member variable for (var propName in this) { if (options.blackList.includes(propName)) { continue; } unsubscribe(this[propName], options); } try { // unsubscribe temp variable for (var _b = __values(this.autoAddList), _c = _b.next(); !_c.done; _c = _b.next()) { var sub = _c.value; unsubscribe(sub, options); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } }; // Ivy if (target.prototype.constructor[IvyKey.cmp]) { target.prototype.constructor[IvyKey.cmp].onDestroy = target.prototype.ngOnDestroy; } else if (target.prototype.constructor[IvyKey.dir]) { target.prototype.constructor[IvyKey.dir].onDestroy = target.prototype.ngOnDestroy; } }; } /** * Manually add temporary variables and unsubscribe when destroy. * @param target Class this keyword * @param subscrb Temp variable */ export function MAutoAdd(target, subscrb) { if (target && target.autoAddList) { target.autoAddList.push(subscrb); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF1dG91bnN1YnNjcmIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmx5d2luZTkzL25neC1hdXRvdW5zdWJzY3JiLyIsInNvdXJjZXMiOlsibGliL25neC1hdXRvdW5zdWJzY3JiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFPL0IsSUFBTSxjQUFjLEdBQUc7SUFDckIsU0FBUyxFQUFFLEVBQUU7SUFDYixXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxRQUFhLEVBQUUsT0FBZ0I7O0lBQ3pELElBQUksUUFBUSxFQUFFO1FBQ1osSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9CLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFDRCx1REFBdUQ7UUFDdkQsSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7O2dCQUNsRCxLQUFrQixJQUFBLGFBQUEsU0FBQSxRQUFRLENBQUEsa0NBQUEsd0RBQUU7b0JBQXZCLElBQU0sR0FBRyxxQkFBQTtvQkFDWixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUNqQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7cUJBQ25CO2lCQUNGOzs7Ozs7Ozs7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQXFCO0lBQXJCLHdCQUFBLEVBQUEsWUFBcUI7SUFDakQsT0FBTyxVQUFTLE1BQVc7UUFDekIsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztRQUN4RixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUksTUFBTSxDQUFDLElBQUksOERBQTJELENBQUMsQ0FBQztTQUM1RjtRQUNELE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQywrQ0FBK0M7UUFDbEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXOztZQUNqRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7YUFDbkU7WUFFRCxpREFBaUQ7WUFDakQsS0FBSyxJQUFNLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ3hDLFNBQVM7aUJBQ1Y7Z0JBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUN0Qzs7Z0JBQ0QsNEJBQTRCO2dCQUM1QixLQUFrQixJQUFBLEtBQUEsU0FBQSxJQUFJLENBQUMsV0FBVyxDQUFBLGdCQUFBLDRCQUFFO29CQUEvQixJQUFNLEdBQUcsV0FBQTtvQkFDWixXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUMzQjs7Ozs7Ozs7O1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTTtRQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7U0FDbkY7YUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1NBQ25GO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQVcsRUFBRSxPQUFZO0lBQ2hELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDaEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbEM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXZ5S2V5IH0gZnJvbSAnLi9jb25zdGFudCc7XG5pbXBvcnQgeyBpc0Z1biB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGJsYWNrTGlzdD86IHN0cmluZ1tdO1xuICBjaGVja0FyclZhcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBibGFja0xpc3Q6IFtdLFxuICBjaGVja0FyclZhcjogZmFsc2Vcbn07XG5cbi8qKlxuICogdW5zdWJzY3JpYmUgdmFyaWFibGVcbiAqIEBwYXJhbSBtZW1iZXIgcHVibGljIGFuZCBwcml2YXRlIG1lbWJlciBvciB0ZW1wIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnN1YnNjcmliZSh2YXJpYWJsZTogYW55LCBvcHRpb25zOiBPcHRpb25zKTogdm9pZCB7XG4gIGlmICh2YXJpYWJsZSkge1xuICAgIGlmIChpc0Z1bih2YXJpYWJsZS51bnN1YnNjcmliZSkpIHtcbiAgICAgIHZhcmlhYmxlLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHZhcmlhYmxlIGlzIGFycmF5IHR5cGXvvIx3aWxsIGNoZWNrIGFuZCB1bnN1YnNjcmliZVxuICAgIGlmIChvcHRpb25zLmNoZWNrQXJyVmFyICYmIEFycmF5LmlzQXJyYXkodmFyaWFibGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZSBvZiB2YXJpYWJsZSkge1xuICAgICAgICBpZiAoZWxlICYmIGlzRnVuKGVsZS51bnN1YnNjcmliZSkpIHtcbiAgICAgICAgICBlbGUudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHVuc3Vic2NyaWJlIG1lbWJlciB2YXJpYWJsZSBhbmQgdGVtcCB2YXJpYWJsZSB3aGVuIGRlc3Ryb3kuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zXG4gKiAxLmJsYWNrTGlzdC0tLVZhcmlhYmxlcyBpbiBibGFja2xpc3QgYXJlIG5vdCBjYW5jZWxsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEF1dG9VbnN1YnNjcmIob3B0aW9uczogT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gdGFyZ2V0LnByb3RvdHlwZVsnbmdPbkRlc3Ryb3knXTsgLy8gY2FjaGUgb3JpZ2luYWwgbmdPbkRlc3Ryb3kgZnVuY3Rpb25cbiAgICBpZiAoIWlzRnVuKG9yaWdpbmFsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhcmdldC5uYW1lfSBpcyB1c2luZyBAQXV0b1Vuc3Vic2NyYiBidXQgZG9lcyBub3QgaW1wbGVtZW50IE9uRGVzdHJveWApO1xuICAgIH1cbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGFyZ2V0LnByb3RvdHlwZS5hdXRvQWRkTGlzdCA9IFtdOyAvLyBVc2VkIHRvIGNhY2hlIG9iamVjdHMgYWRkZWQgdGhyb3VnaCBNQXV0b0FkZFxuICAgIHRhcmdldC5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiBuZ09uRGVzdHJveSgpIHtcbiAgICAgIGlmIChpc0Z1bihvcmlnaW5hbCkpIHtcbiAgICAgICAgb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIHVuc3Vic2NyaWJlIHB1YmxpYyBhbmQgcHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVcbiAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdGhpcykge1xuICAgICAgICBpZiAob3B0aW9ucy5ibGFja0xpc3QuaW5jbHVkZXMocHJvcE5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdW5zdWJzY3JpYmUodGhpc1twcm9wTmFtZV0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgLy8gdW5zdWJzY3JpYmUgdGVtcCB2YXJpYWJsZVxuICAgICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5hdXRvQWRkTGlzdCkge1xuICAgICAgICB1bnN1YnNjcmliZShzdWIsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gSXZ5XG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmNtcF0pIHtcbiAgICAgIHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmNtcF0ub25EZXN0cm95ID0gdGFyZ2V0LnByb3RvdHlwZS5uZ09uRGVzdHJveTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmRpcl0pIHtcbiAgICAgIHRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0b3JbSXZ5S2V5LmRpcl0ub25EZXN0cm95ID0gdGFyZ2V0LnByb3RvdHlwZS5uZ09uRGVzdHJveTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogTWFudWFsbHkgYWRkIHRlbXBvcmFyeSB2YXJpYWJsZXMgYW5kIHVuc3Vic2NyaWJlIHdoZW4gZGVzdHJveS5cbiAqIEBwYXJhbSB0YXJnZXQgQ2xhc3MgdGhpcyBrZXl3b3JkXG4gKiBAcGFyYW0gc3Vic2NyYiBUZW1wIHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNQXV0b0FkZCh0YXJnZXQ6IGFueSwgc3Vic2NyYjogYW55KTogdm9pZCB7XG4gIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmF1dG9BZGRMaXN0KSB7XG4gICAgdGFyZ2V0LmF1dG9BZGRMaXN0LnB1c2goc3Vic2NyYik7XG4gIH1cbn1cbiJdfQ==