@flywine93/ngx-autounsubscrb
Version:
Angular 9+ automatically unsubscribe to the RXJS decorator, It is lightweight and practical!!
99 lines • 10 kB
JavaScript
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==