Skip to content

Commit

Permalink
[REFACTOR] Cleaning up and refactoring callback transform
Browse files Browse the repository at this point in the history
  • Loading branch information
rajasegar committed Apr 11, 2019
1 parent 477294c commit f20e884
Showing 1 changed file with 45 additions and 48 deletions.
93 changes: 45 additions & 48 deletions transforms/callback-leaks/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,42 @@ module.exports = function transformer(file, api) {
let props = dec.arguments[0].properties;

let entityType = dec.callee.object.type === "Identifier" ? dec.callee.object.name : dec.callee.object.property.name;
//console.log(entityType);
let destroyHooksTable = {
const destroyHooksTable = {
'Component': 'willDestroyElement',
'Service': 'willDestroy'
};

let destroyHook = destroyHooksTable[entityType];
//console.log(destroyHook)
let hookName = destroyHooksTable[entityType];

let destroyFilter = p => {
return p.value ? p.value.type === "FunctionExpression" && p.key.name === destroyHook
: p.type === "FunctionExpression" && p.key.name === destroyHook;
return p.value ? p.value.type === "FunctionExpression" && p.key.name === hookName
: p.type === "FunctionExpression" && p.key.name === hookName;
};

let initFn = props.filter(destroyFilter)[0];
let destroyHook = props.filter(destroyFilter)[0];

//console.log(initFn)

let initFnBody;
if(initFn) {
initFnBody = initFn.value.body.body;
let destroyHookBody;
if(destroyHook) {
destroyHookBody = destroyHook.value.body.body;
} else {
// We don't have an init() , hence create one

let superCall = j.expressionStatement(j.callExpression(j.memberExpression(j.thisExpression(),j.identifier('_super'),false),[j.identifier('...arguments')]))
let initProp = j.property("init",j.identifier(destroyHook), j.functionExpression(null,[],j.blockStatement([superCall]),false,false));
let superCall = j.expressionStatement(
j.callExpression(
j.memberExpression(
j.thisExpression(),
j.identifier('_super'),false),
[j.identifier('...arguments')]));

let initProp = j.property(
"init",
j.identifier(hookName),
j.functionExpression(null,[],j.blockStatement([superCall]),false,false));

props.push(initProp);
initFn = props.filter(destroyFilter)[0];
initFnBody = initFn.value.body.body;
destroyHook = props.filter(destroyFilter)[0];
destroyHookBody = destroyHook.value.body.body;
}

let addedListeners = [];
Expand All @@ -53,32 +59,32 @@ module.exports = function transformer(file, api) {
})
.forEach(m => {

// Normalize the handler
if(m.value.arguments[1].type !== "MemberExpression") {

// Create a member expression

const capitalizedEventName = eventname => {
return eventname
.split()
.map(s => {
return s[0].toUpperCase() + s.slice(1);
})
.join("");
};
let handlerName = `_on${capitalizedEventName(m.value.arguments[0].value)}Handler`;
let mExp = j.memberExpression(j.thisExpression(),j.identifier(handlerName),false);
let expSt = j.expressionStatement(j.assignmentExpression(
'=',
mExp,
m.value.arguments[1]
// Normalize the handler
if(m.value.arguments[1].type !== "MemberExpression") {

const capitalizedEventName = eventname => {
return eventname
.split()
.map(s => {
return s[0].toUpperCase() + s.slice(1);
})
.join("");
};

let handlerName = `_on${capitalizedEventName(m.value.arguments[0].value)}Handler`;

// Create a member expression
let mExp = j.memberExpression(j.thisExpression(),j.identifier(handlerName),false);
let expSt = j.expressionStatement(j.assignmentExpression(
'=',
mExp,
m.value.arguments[1]
));

m.parentPath.parentPath.value.unshift(expSt);
m.value.arguments[1] = mExp;

}
m.parentPath.parentPath.value.unshift(expSt);
m.value.arguments[1] = mExp;

}

let listener = {
el: m.value.callee.object.name,
Expand All @@ -88,7 +94,6 @@ const capitalizedEventName = eventname => {

addedListeners.push(listener);


});

let removedListeners = [];
Expand All @@ -100,22 +105,15 @@ const capitalizedEventName = eventname => {
})
.forEach(m => {

//console.log(m)
//console.log(m.value.callee.object.name);
//console.log(m.value.arguments[0].value);

let listener = {
el: m.value.callee.object.name,
event: m.value.arguments[0].value
};

removedListeners.push(listener);


});

//console.log(addedListeners);
//console.log(removedListeners);

addedListeners.forEach(a => {
let idx = removedListeners.findIndex(function(r) {
Expand All @@ -125,14 +123,13 @@ const capitalizedEventName = eventname => {
if(idx < 0) {
// No removeEventListener


let removeEventListener = j.expressionStatement(
j.callExpression(
j.memberExpression(
j.identifier(a.el),
j.identifier('removeEventListener'),
false),[j.literal(a.event), a.handler]));
initFnBody.unshift(removeEventListener);
destroyHookBody.unshift(removeEventListener);
}
});

Expand Down

0 comments on commit f20e884

Please sign in to comment.