@eventra_dev/eventra-cli 0.0.18 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -166
- package/dist/commands/check.js +25 -88
- package/dist/commands/sync.js +22 -77
- package/dist/commands/watch.js +135 -0
- package/dist/engine/callResolver.js +31 -0
- package/dist/engine/engine.js +33 -0
- package/dist/engine/extract.js +53 -0
- package/dist/engine/flow.js +38 -0
- package/dist/engine/graph.js +22 -0
- package/dist/engine/project.js +74 -0
- package/dist/engine/resolver.js +38 -0
- package/dist/engine/scanner.js +78 -0
- package/dist/engine/symbol.js +31 -0
- package/dist/index.js +10 -6
- package/dist/utils/parsers/vue.js +16 -12
- package/dist/utils/processFile.js +20 -0
- package/package.json +2 -1
- package/src/commands/check.ts +29 -136
- package/src/commands/sync.ts +24 -135
- package/src/commands/watch.ts +166 -0
- package/src/engine/callResolver.ts +37 -0
- package/src/engine/engine.ts +39 -0
- package/src/engine/extract.ts +74 -0
- package/src/engine/flow.ts +54 -0
- package/src/engine/graph.ts +23 -0
- package/src/engine/project.ts +75 -0
- package/src/engine/resolver.ts +53 -0
- package/src/engine/scanner.ts +90 -0
- package/src/engine/symbol.ts +42 -0
- package/src/index.ts +11 -6
- package/src/types.ts +3 -5
- package/src/utils/parsers/vue.ts +19 -20
- package/src/utils/processFile.ts +18 -0
- package/tests/fixtures/backend/express/app.ts +167 -12
- package/tests/fixtures/wrappers/component/test.tsx +1 -1
- package/tests/run.ts +4 -17
- package/dist/utils/extract.js +0 -136
- package/dist/utils/scanners/component-wrappers.js +0 -70
- package/dist/utils/scanners/function-wrappers.js +0 -85
- package/dist/utils/scanners/track.js +0 -52
- package/src/utils/extract.ts +0 -185
- package/src/utils/scanners/component-wrappers.ts +0 -107
- package/src/utils/scanners/function-wrappers.ts +0 -180
- package/src/utils/scanners/track.ts +0 -84
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SourceFile,
|
|
3
|
-
SyntaxKind,
|
|
4
|
-
Node,
|
|
5
|
-
CallExpression,
|
|
6
|
-
PropertyAccessExpression,
|
|
7
|
-
} from "ts-morph";
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
FunctionWrapper,
|
|
11
|
-
ExtractedEvent
|
|
12
|
-
} from "../../types";
|
|
13
|
-
|
|
14
|
-
import { extractExpression } from "../extract";
|
|
15
|
-
|
|
16
|
-
export function scanFunctionWrappers(
|
|
17
|
-
source: SourceFile,
|
|
18
|
-
wrappers: FunctionWrapper[]
|
|
19
|
-
) {
|
|
20
|
-
const events =
|
|
21
|
-
new Set<ExtractedEvent>();
|
|
22
|
-
|
|
23
|
-
const calls =
|
|
24
|
-
source.getDescendantsOfKind(
|
|
25
|
-
SyntaxKind.CallExpression
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
for (const call of calls) {
|
|
29
|
-
const name =
|
|
30
|
-
getFunctionName(call);
|
|
31
|
-
|
|
32
|
-
if (!name) continue;
|
|
33
|
-
|
|
34
|
-
for (const wrapper of wrappers) {
|
|
35
|
-
if (wrapper.name !== name)
|
|
36
|
-
continue;
|
|
37
|
-
|
|
38
|
-
const results =
|
|
39
|
-
extractEventFromArgs(
|
|
40
|
-
call,
|
|
41
|
-
wrapper.event
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
if (!results) continue;
|
|
45
|
-
|
|
46
|
-
results.forEach(
|
|
47
|
-
(r) => events.add(r)
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return events;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function getFunctionName(
|
|
56
|
-
call: CallExpression
|
|
57
|
-
): string | null {
|
|
58
|
-
|
|
59
|
-
const expression =
|
|
60
|
-
call.getExpression();
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
Node.isIdentifier(
|
|
64
|
-
expression
|
|
65
|
-
)
|
|
66
|
-
) {
|
|
67
|
-
return expression.getText();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (
|
|
71
|
-
Node.isPropertyAccessExpression(
|
|
72
|
-
expression
|
|
73
|
-
)
|
|
74
|
-
) {
|
|
75
|
-
return getDeepName(
|
|
76
|
-
expression
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function getDeepName(
|
|
84
|
-
node: PropertyAccessExpression
|
|
85
|
-
): string {
|
|
86
|
-
|
|
87
|
-
let current:
|
|
88
|
-
| Node
|
|
89
|
-
| undefined = node;
|
|
90
|
-
|
|
91
|
-
let name = "";
|
|
92
|
-
|
|
93
|
-
while (
|
|
94
|
-
Node.isPropertyAccessExpression(
|
|
95
|
-
current
|
|
96
|
-
)
|
|
97
|
-
) {
|
|
98
|
-
name =
|
|
99
|
-
current.getName();
|
|
100
|
-
|
|
101
|
-
current =
|
|
102
|
-
current.getExpression();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return name;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function extractEventFromArgs(
|
|
109
|
-
call: CallExpression,
|
|
110
|
-
event?: string
|
|
111
|
-
): ExtractedEvent[] | null {
|
|
112
|
-
|
|
113
|
-
const args =
|
|
114
|
-
call.getArguments();
|
|
115
|
-
|
|
116
|
-
const events: ExtractedEvent[] = [];
|
|
117
|
-
|
|
118
|
-
for (let i = 0; i < args.length; i++) {
|
|
119
|
-
const arg = args[i];
|
|
120
|
-
|
|
121
|
-
// track("event")
|
|
122
|
-
if (!event) {
|
|
123
|
-
const result =
|
|
124
|
-
extractExpression(arg);
|
|
125
|
-
|
|
126
|
-
if (!result) continue;
|
|
127
|
-
|
|
128
|
-
result.values.forEach(
|
|
129
|
-
(value) =>
|
|
130
|
-
events.push({
|
|
131
|
-
value,
|
|
132
|
-
dynamic:
|
|
133
|
-
result.dynamic
|
|
134
|
-
})
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// track({event})
|
|
139
|
-
if (event) {
|
|
140
|
-
const obj =
|
|
141
|
-
arg.asKind(
|
|
142
|
-
SyntaxKind.ObjectLiteralExpression
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
if (!obj) continue;
|
|
146
|
-
|
|
147
|
-
const prop =
|
|
148
|
-
obj.getProperty(event);
|
|
149
|
-
|
|
150
|
-
if (!prop) continue;
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
Node.isPropertyAssignment(prop)
|
|
154
|
-
) {
|
|
155
|
-
const init =
|
|
156
|
-
prop.getInitializer();
|
|
157
|
-
|
|
158
|
-
if (!init) continue;
|
|
159
|
-
|
|
160
|
-
const result =
|
|
161
|
-
extractExpression(init);
|
|
162
|
-
|
|
163
|
-
if (!result) continue;
|
|
164
|
-
|
|
165
|
-
result.values.forEach(
|
|
166
|
-
(value) =>
|
|
167
|
-
events.push({
|
|
168
|
-
value,
|
|
169
|
-
dynamic:
|
|
170
|
-
result.dynamic
|
|
171
|
-
})
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return events.length
|
|
178
|
-
? events
|
|
179
|
-
: null;
|
|
180
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SourceFile,
|
|
3
|
-
SyntaxKind,
|
|
4
|
-
Node,
|
|
5
|
-
} from "ts-morph";
|
|
6
|
-
|
|
7
|
-
import { ExtractedEvent, EventraConfig } from "../../types";
|
|
8
|
-
import { extractExpression } from "../extract";
|
|
9
|
-
|
|
10
|
-
export function scanTrack(
|
|
11
|
-
source: SourceFile,
|
|
12
|
-
config: EventraConfig
|
|
13
|
-
) {
|
|
14
|
-
const events = new Set<ExtractedEvent>();
|
|
15
|
-
|
|
16
|
-
const calls = source.getDescendantsOfKind(
|
|
17
|
-
SyntaxKind.CallExpression
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
for (const call of calls) {
|
|
21
|
-
const expr = call.getExpression();
|
|
22
|
-
|
|
23
|
-
let isTrack = false;
|
|
24
|
-
|
|
25
|
-
// track()
|
|
26
|
-
if (Node.isIdentifier(expr)) {
|
|
27
|
-
isTrack = expr.getText() === "track";
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// analytics.track()
|
|
31
|
-
if (Node.isPropertyAccessExpression(expr)) {
|
|
32
|
-
isTrack = expr.getName() === "track";
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (!isTrack) continue;
|
|
36
|
-
|
|
37
|
-
const func =
|
|
38
|
-
call.getFirstAncestorByKind(SyntaxKind.FunctionDeclaration) ||
|
|
39
|
-
call.getFirstAncestorByKind(SyntaxKind.ArrowFunction) ||
|
|
40
|
-
call.getFirstAncestorByKind(SyntaxKind.FunctionExpression);
|
|
41
|
-
|
|
42
|
-
let fnName: string | undefined;
|
|
43
|
-
|
|
44
|
-
if (func) {
|
|
45
|
-
if (Node.isFunctionDeclaration(func)) {
|
|
46
|
-
fnName = func.getName();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
Node.isArrowFunction(func) ||
|
|
51
|
-
Node.isFunctionExpression(func)
|
|
52
|
-
) {
|
|
53
|
-
const varDecl = func.getFirstAncestorByKind(
|
|
54
|
-
SyntaxKind.VariableDeclaration
|
|
55
|
-
);
|
|
56
|
-
fnName = varDecl?.getName();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
fnName &&
|
|
62
|
-
config.functionWrappers?.some(
|
|
63
|
-
(w) => w.name === fnName
|
|
64
|
-
)
|
|
65
|
-
) {
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const arg = call.getArguments()[0];
|
|
70
|
-
if (!arg) continue;
|
|
71
|
-
|
|
72
|
-
const result = extractExpression(arg);
|
|
73
|
-
if (!result) continue;
|
|
74
|
-
|
|
75
|
-
result.values.forEach((value) =>
|
|
76
|
-
events.add({
|
|
77
|
-
value,
|
|
78
|
-
dynamic: result.dynamic,
|
|
79
|
-
})
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return events;
|
|
84
|
-
}
|