@eventra_dev/eventra-cli 0.0.8 → 0.0.9
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/dist/commands/sync.js +1 -8
- package/dist/utils/extract.js +33 -29
- package/dist/utils/scanners/component-wrappers.js +8 -4
- package/dist/utils/scanners/function-wrappers.js +22 -8
- package/dist/utils/scanners/track.js +11 -17
- package/package.json +1 -1
- package/src/commands/sync.ts +4 -12
- package/src/utils/extract.ts +52 -34
- package/src/utils/scanners/component-wrappers.ts +17 -5
- package/src/utils/scanners/function-wrappers.ts +45 -12
- package/src/utils/scanners/track.ts +24 -38
package/dist/commands/sync.js
CHANGED
|
@@ -49,14 +49,7 @@ async function sync() {
|
|
|
49
49
|
...(0, component_wrappers_1.scanComponentWrappers)(source, config.wrappers ?? [])
|
|
50
50
|
];
|
|
51
51
|
for (const event of found) {
|
|
52
|
-
|
|
53
|
-
continue;
|
|
54
|
-
const value = typeof event === "string"
|
|
55
|
-
? event
|
|
56
|
-
: event.value;
|
|
57
|
-
const dynamic = typeof event === "string"
|
|
58
|
-
? false
|
|
59
|
-
: event.dynamic;
|
|
52
|
+
const { value, dynamic } = event;
|
|
60
53
|
// alias exists
|
|
61
54
|
if (aliases[value]) {
|
|
62
55
|
events.add(aliases[value]);
|
package/dist/utils/extract.js
CHANGED
|
@@ -3,64 +3,68 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.extractExpression = extractExpression;
|
|
4
4
|
const ts_morph_1 = require("ts-morph");
|
|
5
5
|
function extractExpression(expr) {
|
|
6
|
-
// "
|
|
6
|
+
// "event"
|
|
7
7
|
if (ts_morph_1.Node.isStringLiteral(expr)) {
|
|
8
8
|
return {
|
|
9
|
-
|
|
9
|
+
values: [expr.getLiteralText()],
|
|
10
10
|
dynamic: false
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
-
// `
|
|
13
|
+
// `event`
|
|
14
14
|
if (expr.getKind() ===
|
|
15
15
|
ts_morph_1.SyntaxKind.NoSubstitutionTemplateLiteral) {
|
|
16
16
|
return {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
values: [
|
|
18
|
+
expr
|
|
19
|
+
.getText()
|
|
20
|
+
.replace(/`/g, "")
|
|
21
|
+
],
|
|
20
22
|
dynamic: false
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
|
-
//
|
|
24
|
-
if (ts_morph_1.Node.
|
|
25
|
+
// identifier
|
|
26
|
+
if (ts_morph_1.Node.isIdentifier(expr)) {
|
|
25
27
|
return {
|
|
26
|
-
|
|
28
|
+
values: [expr.getText()],
|
|
27
29
|
dynamic: true
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
|
-
// ROUTES.
|
|
32
|
+
// property access (ROUTES.ACCOUNT)
|
|
31
33
|
if (ts_morph_1.Node.isPropertyAccessExpression(expr)) {
|
|
32
34
|
return {
|
|
33
|
-
|
|
34
|
-
dynamic: true
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
// EVENT
|
|
38
|
-
if (ts_morph_1.Node.isIdentifier(expr)) {
|
|
39
|
-
return {
|
|
40
|
-
value: expr.getText(),
|
|
35
|
+
values: [expr.getText()],
|
|
41
36
|
dynamic: true
|
|
42
37
|
};
|
|
43
38
|
}
|
|
44
|
-
//
|
|
45
|
-
if (ts_morph_1.Node.
|
|
39
|
+
// ternary
|
|
40
|
+
if (ts_morph_1.Node.isConditionalExpression(expr)) {
|
|
41
|
+
const values = [];
|
|
42
|
+
const whenTrue = extractExpression(expr.getWhenTrue());
|
|
43
|
+
const whenFalse = extractExpression(expr.getWhenFalse());
|
|
44
|
+
if (whenTrue)
|
|
45
|
+
values.push(...whenTrue.values);
|
|
46
|
+
if (whenFalse)
|
|
47
|
+
values.push(...whenFalse.values);
|
|
46
48
|
return {
|
|
47
|
-
|
|
48
|
-
.getExpression()
|
|
49
|
-
.getText(),
|
|
49
|
+
values,
|
|
50
50
|
dynamic: true
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
|
-
//
|
|
54
|
-
if (ts_morph_1.Node.
|
|
53
|
+
// template
|
|
54
|
+
if (ts_morph_1.Node.isTemplateExpression(expr)) {
|
|
55
55
|
return {
|
|
56
|
-
|
|
56
|
+
values: [expr.getText()],
|
|
57
57
|
dynamic: true
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
//
|
|
61
|
-
if (ts_morph_1.Node.
|
|
60
|
+
// call
|
|
61
|
+
if (ts_morph_1.Node.isCallExpression(expr)) {
|
|
62
62
|
return {
|
|
63
|
-
|
|
63
|
+
values: [
|
|
64
|
+
expr
|
|
65
|
+
.getExpression()
|
|
66
|
+
.getText()
|
|
67
|
+
],
|
|
64
68
|
dynamic: true
|
|
65
69
|
};
|
|
66
70
|
}
|
|
@@ -33,21 +33,25 @@ function scanComponentWrappers(source, wrappers) {
|
|
|
33
33
|
const init = attrNode.getInitializer();
|
|
34
34
|
if (!init)
|
|
35
35
|
continue;
|
|
36
|
-
//
|
|
36
|
+
// string
|
|
37
37
|
if (ts_morph_1.Node.isStringLiteral(init)) {
|
|
38
38
|
events.add({
|
|
39
39
|
value: init.getLiteralText(),
|
|
40
40
|
dynamic: false
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
//
|
|
43
|
+
// jsx expression
|
|
44
44
|
if (ts_morph_1.Node.isJsxExpression(init)) {
|
|
45
45
|
const expr = init.getExpression();
|
|
46
46
|
if (!expr)
|
|
47
47
|
continue;
|
|
48
48
|
const result = (0, extract_1.extractExpression)(expr);
|
|
49
|
-
if (result)
|
|
50
|
-
|
|
49
|
+
if (!result)
|
|
50
|
+
continue;
|
|
51
|
+
result.values.forEach((value) => events.add({
|
|
52
|
+
value,
|
|
53
|
+
dynamic: result.dynamic
|
|
54
|
+
}));
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
}
|
|
@@ -13,9 +13,10 @@ function scanFunctionWrappers(source, wrappers) {
|
|
|
13
13
|
for (const wrapper of wrappers) {
|
|
14
14
|
if (wrapper.name !== name)
|
|
15
15
|
continue;
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
|
|
16
|
+
const results = extractEventFromArgs(call, wrapper.event);
|
|
17
|
+
if (!results)
|
|
18
|
+
continue;
|
|
19
|
+
results.forEach((r) => events.add(r));
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
return events;
|
|
@@ -43,15 +44,20 @@ function getDeepName(node) {
|
|
|
43
44
|
}
|
|
44
45
|
function extractEventFromArgs(call, event) {
|
|
45
46
|
const args = call.getArguments();
|
|
47
|
+
const events = [];
|
|
46
48
|
for (let i = 0; i < args.length; i++) {
|
|
47
49
|
const arg = args[i];
|
|
48
50
|
// track("event")
|
|
49
51
|
if (!event) {
|
|
50
52
|
const result = (0, extract_1.extractExpression)(arg);
|
|
51
|
-
if (result)
|
|
52
|
-
|
|
53
|
+
if (!result)
|
|
54
|
+
continue;
|
|
55
|
+
result.values.forEach((value) => events.push({
|
|
56
|
+
value,
|
|
57
|
+
dynamic: result.dynamic
|
|
58
|
+
}));
|
|
53
59
|
}
|
|
54
|
-
// track({
|
|
60
|
+
// track({event})
|
|
55
61
|
if (event) {
|
|
56
62
|
const obj = arg.asKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
|
|
57
63
|
if (!obj)
|
|
@@ -63,9 +69,17 @@ function extractEventFromArgs(call, event) {
|
|
|
63
69
|
const init = prop.getInitializer();
|
|
64
70
|
if (!init)
|
|
65
71
|
continue;
|
|
66
|
-
|
|
72
|
+
const result = (0, extract_1.extractExpression)(init);
|
|
73
|
+
if (!result)
|
|
74
|
+
continue;
|
|
75
|
+
result.values.forEach((value) => events.push({
|
|
76
|
+
value,
|
|
77
|
+
dynamic: result.dynamic
|
|
78
|
+
}));
|
|
67
79
|
}
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
|
-
return
|
|
82
|
+
return events.length
|
|
83
|
+
? events
|
|
84
|
+
: null;
|
|
71
85
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.scanTrack = scanTrack;
|
|
4
4
|
const ts_morph_1 = require("ts-morph");
|
|
5
|
+
const extract_1 = require("../extract");
|
|
5
6
|
function scanTrack(source) {
|
|
6
7
|
const events = new Set();
|
|
7
8
|
const calls = source.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression);
|
|
@@ -9,34 +10,27 @@ function scanTrack(source) {
|
|
|
9
10
|
const expr = call.getExpression();
|
|
10
11
|
let isTrack = false;
|
|
11
12
|
// track()
|
|
12
|
-
if (
|
|
13
|
-
ts_morph_1.SyntaxKind.Identifier) {
|
|
13
|
+
if (ts_morph_1.Node.isIdentifier(expr)) {
|
|
14
14
|
isTrack =
|
|
15
15
|
expr.getText() === "track";
|
|
16
16
|
}
|
|
17
17
|
// analytics.track()
|
|
18
|
-
if (
|
|
19
|
-
ts_morph_1.SyntaxKind.PropertyAccessExpression) {
|
|
20
|
-
const prop = expr.asKindOrThrow(ts_morph_1.SyntaxKind.PropertyAccessExpression);
|
|
18
|
+
if (ts_morph_1.Node.isPropertyAccessExpression(expr)) {
|
|
21
19
|
isTrack =
|
|
22
|
-
|
|
20
|
+
expr.getName() === "track";
|
|
23
21
|
}
|
|
24
22
|
if (!isTrack)
|
|
25
23
|
continue;
|
|
26
24
|
const arg = call.getArguments()[0];
|
|
27
25
|
if (!arg)
|
|
28
26
|
continue;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
ts_morph_1.SyntaxKind.NoSubstitutionTemplateLiteral) {
|
|
37
|
-
const value = arg.asKindOrThrow(ts_morph_1.SyntaxKind.NoSubstitutionTemplateLiteral);
|
|
38
|
-
events.add(value.getLiteralText());
|
|
39
|
-
}
|
|
27
|
+
const result = (0, extract_1.extractExpression)(arg);
|
|
28
|
+
if (!result)
|
|
29
|
+
continue;
|
|
30
|
+
result.values.forEach((value) => events.add({
|
|
31
|
+
value,
|
|
32
|
+
dynamic: result.dynamic
|
|
33
|
+
}));
|
|
40
34
|
}
|
|
41
35
|
return events;
|
|
42
36
|
}
|
package/package.json
CHANGED
package/src/commands/sync.ts
CHANGED
|
@@ -18,6 +18,8 @@ import { scanTrack } from "../utils/scanners/track";
|
|
|
18
18
|
import { scanFunctionWrappers } from "../utils/scanners/function-wrappers";
|
|
19
19
|
import { scanComponentWrappers } from "../utils/scanners/component-wrappers";
|
|
20
20
|
|
|
21
|
+
import { ExtractedEvent } from "../types";
|
|
22
|
+
|
|
21
23
|
export async function sync() {
|
|
22
24
|
const config = await loadConfig();
|
|
23
25
|
|
|
@@ -76,7 +78,7 @@ export async function sync() {
|
|
|
76
78
|
{ overwrite: true }
|
|
77
79
|
);
|
|
78
80
|
|
|
79
|
-
const found = [
|
|
81
|
+
const found: ExtractedEvent[] = [
|
|
80
82
|
...scanTrack(source),
|
|
81
83
|
...scanFunctionWrappers(
|
|
82
84
|
source,
|
|
@@ -89,17 +91,7 @@ export async function sync() {
|
|
|
89
91
|
];
|
|
90
92
|
|
|
91
93
|
for (const event of found) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const value =
|
|
95
|
-
typeof event === "string"
|
|
96
|
-
? event
|
|
97
|
-
: event.value;
|
|
98
|
-
|
|
99
|
-
const dynamic =
|
|
100
|
-
typeof event === "string"
|
|
101
|
-
? false
|
|
102
|
-
: event.dynamic;
|
|
94
|
+
const { value, dynamic } = event;
|
|
103
95
|
|
|
104
96
|
// alias exists
|
|
105
97
|
if (aliases[value]) {
|
package/src/utils/extract.ts
CHANGED
|
@@ -3,92 +3,110 @@ import {
|
|
|
3
3
|
SyntaxKind
|
|
4
4
|
} from "ts-morph";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
export type ExtractResult = {
|
|
7
|
+
values: string[];
|
|
8
|
+
dynamic: boolean;
|
|
9
|
+
};
|
|
7
10
|
|
|
8
11
|
export function extractExpression(
|
|
9
12
|
expr: Node
|
|
10
|
-
):
|
|
13
|
+
): ExtractResult | null {
|
|
11
14
|
|
|
12
|
-
// "
|
|
15
|
+
// "event"
|
|
13
16
|
if (Node.isStringLiteral(expr)) {
|
|
14
17
|
return {
|
|
15
|
-
|
|
18
|
+
values: [expr.getLiteralText()],
|
|
16
19
|
dynamic: false
|
|
17
20
|
};
|
|
18
21
|
}
|
|
19
22
|
|
|
20
|
-
// `
|
|
23
|
+
// `event`
|
|
21
24
|
if (
|
|
22
25
|
expr.getKind() ===
|
|
23
26
|
SyntaxKind.NoSubstitutionTemplateLiteral
|
|
24
27
|
) {
|
|
25
28
|
return {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
values: [
|
|
30
|
+
expr
|
|
31
|
+
.getText()
|
|
32
|
+
.replace(/`/g, "")
|
|
33
|
+
],
|
|
29
34
|
dynamic: false
|
|
30
35
|
};
|
|
31
36
|
}
|
|
32
37
|
|
|
33
|
-
//
|
|
38
|
+
// identifier
|
|
34
39
|
if (
|
|
35
|
-
Node.
|
|
40
|
+
Node.isIdentifier(expr)
|
|
36
41
|
) {
|
|
37
42
|
return {
|
|
38
|
-
|
|
43
|
+
values: [expr.getText()],
|
|
39
44
|
dynamic: true
|
|
40
45
|
};
|
|
41
46
|
}
|
|
42
47
|
|
|
43
|
-
// ROUTES.
|
|
48
|
+
// property access (ROUTES.ACCOUNT)
|
|
44
49
|
if (
|
|
45
50
|
Node.isPropertyAccessExpression(expr)
|
|
46
51
|
) {
|
|
47
52
|
return {
|
|
48
|
-
|
|
53
|
+
values: [expr.getText()],
|
|
49
54
|
dynamic: true
|
|
50
55
|
};
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
//
|
|
58
|
+
// ternary
|
|
54
59
|
if (
|
|
55
|
-
Node.
|
|
60
|
+
Node.isConditionalExpression(expr)
|
|
56
61
|
) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
const values: string[] = [];
|
|
63
|
+
|
|
64
|
+
const whenTrue =
|
|
65
|
+
extractExpression(
|
|
66
|
+
expr.getWhenTrue()
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const whenFalse =
|
|
70
|
+
extractExpression(
|
|
71
|
+
expr.getWhenFalse()
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
if (whenTrue)
|
|
75
|
+
values.push(
|
|
76
|
+
...whenTrue.values
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
if (whenFalse)
|
|
80
|
+
values.push(
|
|
81
|
+
...whenFalse.values
|
|
82
|
+
);
|
|
62
83
|
|
|
63
|
-
// getEvent()
|
|
64
|
-
if (
|
|
65
|
-
Node.isCallExpression(expr)
|
|
66
|
-
) {
|
|
67
84
|
return {
|
|
68
|
-
|
|
69
|
-
expr
|
|
70
|
-
.getExpression()
|
|
71
|
-
.getText(),
|
|
85
|
+
values,
|
|
72
86
|
dynamic: true
|
|
73
87
|
};
|
|
74
88
|
}
|
|
75
89
|
|
|
76
|
-
//
|
|
90
|
+
// template
|
|
77
91
|
if (
|
|
78
|
-
Node.
|
|
92
|
+
Node.isTemplateExpression(expr)
|
|
79
93
|
) {
|
|
80
94
|
return {
|
|
81
|
-
|
|
95
|
+
values: [expr.getText()],
|
|
82
96
|
dynamic: true
|
|
83
97
|
};
|
|
84
98
|
}
|
|
85
99
|
|
|
86
|
-
//
|
|
100
|
+
// call
|
|
87
101
|
if (
|
|
88
|
-
Node.
|
|
102
|
+
Node.isCallExpression(expr)
|
|
89
103
|
) {
|
|
90
104
|
return {
|
|
91
|
-
|
|
105
|
+
values: [
|
|
106
|
+
expr
|
|
107
|
+
.getExpression()
|
|
108
|
+
.getText()
|
|
109
|
+
],
|
|
92
110
|
dynamic: true
|
|
93
111
|
};
|
|
94
112
|
}
|
|
@@ -4,7 +4,11 @@ import {
|
|
|
4
4
|
Node
|
|
5
5
|
} from "ts-morph";
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
ComponentWrapper,
|
|
9
|
+
ExtractedEvent
|
|
10
|
+
} from "../../types";
|
|
11
|
+
|
|
8
12
|
import { extractExpression } from "../extract";
|
|
9
13
|
|
|
10
14
|
export function scanComponentWrappers(
|
|
@@ -64,7 +68,7 @@ export function scanComponentWrappers(
|
|
|
64
68
|
|
|
65
69
|
if (!init) continue;
|
|
66
70
|
|
|
67
|
-
//
|
|
71
|
+
// string
|
|
68
72
|
if (
|
|
69
73
|
Node.isStringLiteral(init)
|
|
70
74
|
) {
|
|
@@ -75,7 +79,7 @@ export function scanComponentWrappers(
|
|
|
75
79
|
});
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
//
|
|
82
|
+
// jsx expression
|
|
79
83
|
if (
|
|
80
84
|
Node.isJsxExpression(init)
|
|
81
85
|
) {
|
|
@@ -87,8 +91,16 @@ export function scanComponentWrappers(
|
|
|
87
91
|
const result =
|
|
88
92
|
extractExpression(expr);
|
|
89
93
|
|
|
90
|
-
if (result)
|
|
91
|
-
|
|
94
|
+
if (!result) continue;
|
|
95
|
+
|
|
96
|
+
result.values.forEach(
|
|
97
|
+
(value) =>
|
|
98
|
+
events.add({
|
|
99
|
+
value,
|
|
100
|
+
dynamic:
|
|
101
|
+
result.dynamic
|
|
102
|
+
})
|
|
103
|
+
);
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
}
|
|
@@ -6,8 +6,12 @@ import {
|
|
|
6
6
|
PropertyAccessExpression,
|
|
7
7
|
} from "ts-morph";
|
|
8
8
|
|
|
9
|
+
import {
|
|
10
|
+
FunctionWrapper,
|
|
11
|
+
ExtractedEvent
|
|
12
|
+
} from "../../types";
|
|
13
|
+
|
|
9
14
|
import { extractExpression } from "../extract";
|
|
10
|
-
import { FunctionWrapper, ExtractedEvent } from "../../types";
|
|
11
15
|
|
|
12
16
|
export function scanFunctionWrappers(
|
|
13
17
|
source: SourceFile,
|
|
@@ -31,14 +35,17 @@ export function scanFunctionWrappers(
|
|
|
31
35
|
if (wrapper.name !== name)
|
|
32
36
|
continue;
|
|
33
37
|
|
|
34
|
-
const
|
|
38
|
+
const results =
|
|
35
39
|
extractEventFromArgs(
|
|
36
40
|
call,
|
|
37
41
|
wrapper.event
|
|
38
42
|
);
|
|
39
43
|
|
|
40
|
-
if (
|
|
41
|
-
|
|
44
|
+
if (!results) continue;
|
|
45
|
+
|
|
46
|
+
results.forEach(
|
|
47
|
+
(r) => events.add(r)
|
|
48
|
+
);
|
|
42
49
|
}
|
|
43
50
|
}
|
|
44
51
|
|
|
@@ -48,11 +55,14 @@ export function scanFunctionWrappers(
|
|
|
48
55
|
function getFunctionName(
|
|
49
56
|
call: CallExpression
|
|
50
57
|
): string | null {
|
|
58
|
+
|
|
51
59
|
const expression =
|
|
52
60
|
call.getExpression();
|
|
53
61
|
|
|
54
62
|
if (
|
|
55
|
-
Node.isIdentifier(
|
|
63
|
+
Node.isIdentifier(
|
|
64
|
+
expression
|
|
65
|
+
)
|
|
56
66
|
) {
|
|
57
67
|
return expression.getText();
|
|
58
68
|
}
|
|
@@ -73,6 +83,7 @@ function getFunctionName(
|
|
|
73
83
|
function getDeepName(
|
|
74
84
|
node: PropertyAccessExpression
|
|
75
85
|
): string {
|
|
86
|
+
|
|
76
87
|
let current:
|
|
77
88
|
| Node
|
|
78
89
|
| undefined = node;
|
|
@@ -97,11 +108,13 @@ function getDeepName(
|
|
|
97
108
|
function extractEventFromArgs(
|
|
98
109
|
call: CallExpression,
|
|
99
110
|
event?: string
|
|
100
|
-
): ExtractedEvent | null {
|
|
111
|
+
): ExtractedEvent[] | null {
|
|
101
112
|
|
|
102
113
|
const args =
|
|
103
114
|
call.getArguments();
|
|
104
115
|
|
|
116
|
+
const events: ExtractedEvent[] = [];
|
|
117
|
+
|
|
105
118
|
for (let i = 0; i < args.length; i++) {
|
|
106
119
|
const arg = args[i];
|
|
107
120
|
|
|
@@ -110,11 +123,19 @@ function extractEventFromArgs(
|
|
|
110
123
|
const result =
|
|
111
124
|
extractExpression(arg);
|
|
112
125
|
|
|
113
|
-
if (result)
|
|
114
|
-
|
|
126
|
+
if (!result) continue;
|
|
127
|
+
|
|
128
|
+
result.values.forEach(
|
|
129
|
+
(value) =>
|
|
130
|
+
events.push({
|
|
131
|
+
value,
|
|
132
|
+
dynamic:
|
|
133
|
+
result.dynamic
|
|
134
|
+
})
|
|
135
|
+
);
|
|
115
136
|
}
|
|
116
137
|
|
|
117
|
-
// track({
|
|
138
|
+
// track({event})
|
|
118
139
|
if (event) {
|
|
119
140
|
const obj =
|
|
120
141
|
arg.asKind(
|
|
@@ -136,12 +157,24 @@ function extractEventFromArgs(
|
|
|
136
157
|
|
|
137
158
|
if (!init) continue;
|
|
138
159
|
|
|
139
|
-
|
|
140
|
-
init
|
|
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
|
+
})
|
|
141
172
|
);
|
|
142
173
|
}
|
|
143
174
|
}
|
|
144
175
|
}
|
|
145
176
|
|
|
146
|
-
return
|
|
177
|
+
return events.length
|
|
178
|
+
? events
|
|
179
|
+
: null;
|
|
147
180
|
}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SourceFile,
|
|
3
|
-
SyntaxKind
|
|
3
|
+
SyntaxKind,
|
|
4
|
+
Node,
|
|
5
|
+
CallExpression,
|
|
6
|
+
PropertyAccessExpression
|
|
4
7
|
} from "ts-morph";
|
|
5
8
|
|
|
9
|
+
import { ExtractedEvent } from "../../types";
|
|
10
|
+
import { extractExpression } from "../extract";
|
|
11
|
+
|
|
6
12
|
export function scanTrack(
|
|
7
13
|
source: SourceFile
|
|
8
14
|
) {
|
|
9
15
|
const events =
|
|
10
|
-
new Set<
|
|
16
|
+
new Set<ExtractedEvent>();
|
|
11
17
|
|
|
12
18
|
const calls =
|
|
13
19
|
source.getDescendantsOfKind(
|
|
@@ -22,8 +28,7 @@ export function scanTrack(
|
|
|
22
28
|
|
|
23
29
|
// track()
|
|
24
30
|
if (
|
|
25
|
-
|
|
26
|
-
SyntaxKind.Identifier
|
|
31
|
+
Node.isIdentifier(expr)
|
|
27
32
|
) {
|
|
28
33
|
isTrack =
|
|
29
34
|
expr.getText() === "track";
|
|
@@ -31,16 +36,12 @@ export function scanTrack(
|
|
|
31
36
|
|
|
32
37
|
// analytics.track()
|
|
33
38
|
if (
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
Node.isPropertyAccessExpression(
|
|
40
|
+
expr
|
|
41
|
+
)
|
|
36
42
|
) {
|
|
37
|
-
const prop =
|
|
38
|
-
expr.asKindOrThrow(
|
|
39
|
-
SyntaxKind.PropertyAccessExpression
|
|
40
|
-
);
|
|
41
|
-
|
|
42
43
|
isTrack =
|
|
43
|
-
|
|
44
|
+
expr.getName() === "track";
|
|
44
45
|
}
|
|
45
46
|
|
|
46
47
|
if (!isTrack) continue;
|
|
@@ -50,34 +51,19 @@ export function scanTrack(
|
|
|
50
51
|
|
|
51
52
|
if (!arg) continue;
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
arg
|
|
55
|
-
SyntaxKind.StringLiteral
|
|
56
|
-
) {
|
|
57
|
-
const value =
|
|
58
|
-
arg.asKindOrThrow(
|
|
59
|
-
SyntaxKind.StringLiteral
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
events.add(
|
|
63
|
-
value.getLiteralText()
|
|
64
|
-
);
|
|
65
|
-
}
|
|
54
|
+
const result =
|
|
55
|
+
extractExpression(arg);
|
|
66
56
|
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
arg.getKind() ===
|
|
70
|
-
SyntaxKind.NoSubstitutionTemplateLiteral
|
|
71
|
-
) {
|
|
72
|
-
const value =
|
|
73
|
-
arg.asKindOrThrow(
|
|
74
|
-
SyntaxKind.NoSubstitutionTemplateLiteral
|
|
75
|
-
);
|
|
57
|
+
if (!result) continue;
|
|
76
58
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
59
|
+
result.values.forEach(
|
|
60
|
+
(value) =>
|
|
61
|
+
events.add({
|
|
62
|
+
value,
|
|
63
|
+
dynamic:
|
|
64
|
+
result.dynamic
|
|
65
|
+
})
|
|
66
|
+
);
|
|
81
67
|
}
|
|
82
68
|
|
|
83
69
|
return events;
|