-
Notifications
You must be signed in to change notification settings - Fork 109
/
unchain-variables.js
39 lines (33 loc) · 1.25 KB
/
unchain-variables.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* Unchains chained variable declarations.
*/
module.exports = function(file, api, options) {
const jscodeshift = api.jscodeshift;
const printOptions = options.printOptions || {quote: 'single'};
const chainedDeclarations = jscodeshift(file.source)
.find(jscodeshift.VariableDeclaration)
.filter(variableDeclaration => (
variableDeclaration.value.declarations.length > 1
))
.filter(variableDeclaration => (
variableDeclaration.parent.value.type !== 'ForStatement'
));
chainedDeclarations.forEach(chainedDeclaration => {
const kind = chainedDeclaration.value.kind; // e.g. const, let, or var
jscodeshift(chainedDeclaration)
.replaceWith(chainedDeclaration.value.declarations.map((declaration, i) => {
const unchainedDeclaration =
jscodeshift.variableDeclaration(kind, [declaration]);
if (i === 0) {
unchainedDeclaration.comments = chainedDeclaration.value.comments;
} else if (declaration.comments) {
unchainedDeclaration.comments = declaration.comments;
declaration.comments = null;
}
return unchainedDeclaration;
}));
});
return chainedDeclarations.size()
? chainedDeclarations.toSource(printOptions)
: null;
};