forked from DevExpress/testcafe-hammerhead
-
Notifications
You must be signed in to change notification settings - Fork 0
/
property-get.ts
63 lines (47 loc) · 2.19 KB
/
property-get.ts
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
// -------------------------------------------------------------
// WARNING: this file is used by both the client and the server.
// Do not use any browser or node-specific API!
// -------------------------------------------------------------
import { MemberExpression, Expression, Identifier } from 'estree';
import { Transformer } from './index';
import { createPropertyGetWrapper } from '../node-builder';
import { Syntax } from 'esotope-hammerhead';
import { shouldInstrumentProperty } from '../instrumented';
// Transform:
// obj.<wrappable-property> -->
// __get$(obj, '<wrappable-property>')
const transformer: Transformer<MemberExpression> = {
nodeReplacementRequireTransform: true,
nodeTypes: Syntax.MemberExpression,
condition: (node, parent) => {
if (node.computed || !parent)
return false;
if (node.property.type === Syntax.Identifier && !shouldInstrumentProperty(node.property.name))
return false;
// Skip: super.prop
if (node.object.type === Syntax.Super)
return false;
// Skip: object.prop = value
if (parent.type === Syntax.AssignmentExpression && parent.left === node)
return false;
// Skip: delete object.prop
if (parent.type === Syntax.UnaryExpression && parent.operator === 'delete')
return false;
// Skip: object.prop()
if (parent.type === Syntax.CallExpression && parent.callee === node)
return false;
// Skip: object.prop++ || object.prop-- || ++object.prop || --object.prop
if (parent.type === Syntax.UpdateExpression && (parent.operator === '++' || parent.operator === '--'))
return false;
// Skip: new (object.prop)() || new (object.prop)
if (parent.type === Syntax.NewExpression && parent.callee === node)
return false;
// Skip: for(object.prop in source)
if (parent.type === Syntax.ForInStatement && parent.left === node)
return false;
return true;
},
// eslint-disable-next-line
run: node => createPropertyGetWrapper((node.property as Identifier).name, node.object as Expression, node.optional)
};
export default transformer;