-
-
Notifications
You must be signed in to change notification settings - Fork 39
/
index.js
93 lines (70 loc) 路 2.08 KB
/
index.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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
'use strict';
const {
operate,
template,
types,
} = require('putout');
const {
replaceWith,
insertAfter,
} = operate;
const {
Identifier,
ObjectProperty,
} = types;
const fullstore = require('fullstore');
module.exports.report = () => {
return `"operate.replaceWith" should be called instead of "path.replaceWith"`;
};
const replaceWithAST = template.ast(`
const {replaceWith} = require('putout').operate;
`);
module.exports.fix = ({path, calleePath, property, object, program, isInserted}) => {
replaceWith(calleePath, property);
const strictModePath = program.get('body.0');
const {bindings} = strictModePath.scope;
path.node.arguments.unshift(object);
if (bindings.replaceWith || isInserted())
return;
if (!bindings.replaceWithMultiple && !bindings.insertAfter && !isInserted()) {
isInserted(true);
insertAfter(strictModePath, replaceWithAST);
return;
}
const id = Identifier('replaceWith');
const varPath = getVarPath(bindings);
varPath.node.id.properties
.unshift(ObjectProperty(id, id, false, true));
};
function getVarPath(bindings) {
const {
replaceWithMultiple,
insertAfter,
} = bindings;
if (replaceWithMultiple)
return replaceWithMultiple.path;
if (insertAfter)
return insertAfter.path;
}
module.exports.traverse = ({push}) => {
const isInserted = fullstore();
return {
CallExpression(path) {
const calleePath = path.get('callee');
if (!calleePath.isMemberExpression())
return;
const {object, property} = calleePath.node;
if (property.name !== 'replaceWith')
return;
const program = path.findParent((path) => path.isProgram());
push({
isInserted,
path,
object,
program,
property,
calleePath,
});
},
};
};