@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.
@@ -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
- if (!event)
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]);
@@ -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
- // "signup"
6
+ // "event"
7
7
  if (ts_morph_1.Node.isStringLiteral(expr)) {
8
8
  return {
9
- value: expr.getLiteralText(),
9
+ values: [expr.getLiteralText()],
10
10
  dynamic: false
11
11
  };
12
12
  }
13
- // `signup`
13
+ // `event`
14
14
  if (expr.getKind() ===
15
15
  ts_morph_1.SyntaxKind.NoSubstitutionTemplateLiteral) {
16
16
  return {
17
- value: expr
18
- .getText()
19
- .replace(/`/g, ""),
17
+ values: [
18
+ expr
19
+ .getText()
20
+ .replace(/`/g, "")
21
+ ],
20
22
  dynamic: false
21
23
  };
22
24
  }
23
- // template `${event}`
24
- if (ts_morph_1.Node.isTemplateExpression(expr)) {
25
+ // identifier
26
+ if (ts_morph_1.Node.isIdentifier(expr)) {
25
27
  return {
26
- value: expr.getText(),
28
+ values: [expr.getText()],
27
29
  dynamic: true
28
30
  };
29
31
  }
30
- // ROUTES.APP
32
+ // property access (ROUTES.ACCOUNT)
31
33
  if (ts_morph_1.Node.isPropertyAccessExpression(expr)) {
32
34
  return {
33
- value: expr.getText(),
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
- // getEvent()
45
- if (ts_morph_1.Node.isCallExpression(expr)) {
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
- value: expr
48
- .getExpression()
49
- .getText(),
49
+ values,
50
50
  dynamic: true
51
51
  };
52
52
  }
53
- // condition ? "a" : "b"
54
- if (ts_morph_1.Node.isConditionalExpression(expr)) {
53
+ // template
54
+ if (ts_morph_1.Node.isTemplateExpression(expr)) {
55
55
  return {
56
- value: expr.getText(),
56
+ values: [expr.getText()],
57
57
  dynamic: true
58
58
  };
59
59
  }
60
- // array[index]
61
- if (ts_morph_1.Node.isElementAccessExpression(expr)) {
60
+ // call
61
+ if (ts_morph_1.Node.isCallExpression(expr)) {
62
62
  return {
63
- value: expr.getText(),
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
- // event="signup"
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
- // event={...}
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
- events.add(result);
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 result = extractEventFromArgs(call, wrapper.event);
17
- if (result)
18
- events.add(result);
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
- return result;
53
+ if (!result)
54
+ continue;
55
+ result.values.forEach((value) => events.push({
56
+ value,
57
+ dynamic: result.dynamic
58
+ }));
53
59
  }
54
- // track({ event: "..." })
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
- return (0, extract_1.extractExpression)(init);
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 null;
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 (expr.getKind() ===
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 (expr.getKind() ===
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
- prop.getName() === "track";
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
- if (arg.getKind() ===
30
- ts_morph_1.SyntaxKind.StringLiteral) {
31
- const value = arg.asKindOrThrow(ts_morph_1.SyntaxKind.StringLiteral);
32
- events.add(value.getLiteralText());
33
- }
34
- // template literal
35
- if (arg.getKind() ===
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventra_dev/eventra-cli",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "Eventra CLI",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -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
- if (!event) continue;
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]) {
@@ -3,92 +3,110 @@ import {
3
3
  SyntaxKind
4
4
  } from "ts-morph";
5
5
 
6
- import { ExtractedEvent } from "../types";
6
+ export type ExtractResult = {
7
+ values: string[];
8
+ dynamic: boolean;
9
+ };
7
10
 
8
11
  export function extractExpression(
9
12
  expr: Node
10
- ): ExtractedEvent | null {
13
+ ): ExtractResult | null {
11
14
 
12
- // "signup"
15
+ // "event"
13
16
  if (Node.isStringLiteral(expr)) {
14
17
  return {
15
- value: expr.getLiteralText(),
18
+ values: [expr.getLiteralText()],
16
19
  dynamic: false
17
20
  };
18
21
  }
19
22
 
20
- // `signup`
23
+ // `event`
21
24
  if (
22
25
  expr.getKind() ===
23
26
  SyntaxKind.NoSubstitutionTemplateLiteral
24
27
  ) {
25
28
  return {
26
- value: expr
27
- .getText()
28
- .replace(/`/g, ""),
29
+ values: [
30
+ expr
31
+ .getText()
32
+ .replace(/`/g, "")
33
+ ],
29
34
  dynamic: false
30
35
  };
31
36
  }
32
37
 
33
- // template `${event}`
38
+ // identifier
34
39
  if (
35
- Node.isTemplateExpression(expr)
40
+ Node.isIdentifier(expr)
36
41
  ) {
37
42
  return {
38
- value: expr.getText(),
43
+ values: [expr.getText()],
39
44
  dynamic: true
40
45
  };
41
46
  }
42
47
 
43
- // ROUTES.APP
48
+ // property access (ROUTES.ACCOUNT)
44
49
  if (
45
50
  Node.isPropertyAccessExpression(expr)
46
51
  ) {
47
52
  return {
48
- value: expr.getText(),
53
+ values: [expr.getText()],
49
54
  dynamic: true
50
55
  };
51
56
  }
52
57
 
53
- // EVENT
58
+ // ternary
54
59
  if (
55
- Node.isIdentifier(expr)
60
+ Node.isConditionalExpression(expr)
56
61
  ) {
57
- return {
58
- value: expr.getText(),
59
- dynamic: true
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
- value:
69
- expr
70
- .getExpression()
71
- .getText(),
85
+ values,
72
86
  dynamic: true
73
87
  };
74
88
  }
75
89
 
76
- // condition ? "a" : "b"
90
+ // template
77
91
  if (
78
- Node.isConditionalExpression(expr)
92
+ Node.isTemplateExpression(expr)
79
93
  ) {
80
94
  return {
81
- value: expr.getText(),
95
+ values: [expr.getText()],
82
96
  dynamic: true
83
97
  };
84
98
  }
85
99
 
86
- // array[index]
100
+ // call
87
101
  if (
88
- Node.isElementAccessExpression(expr)
102
+ Node.isCallExpression(expr)
89
103
  ) {
90
104
  return {
91
- value: expr.getText(),
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 { ComponentWrapper, ExtractedEvent } from "../../types";
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
- // event="signup"
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
- // event={...}
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
- events.add(result);
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 result =
38
+ const results =
35
39
  extractEventFromArgs(
36
40
  call,
37
41
  wrapper.event
38
42
  );
39
43
 
40
- if (result)
41
- events.add(result);
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(expression)
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
- return result;
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({ event: "..." })
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
- return extractExpression(
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 null;
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<string>();
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
- expr.getKind() ===
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
- expr.getKind() ===
35
- SyntaxKind.PropertyAccessExpression
39
+ Node.isPropertyAccessExpression(
40
+ expr
41
+ )
36
42
  ) {
37
- const prop =
38
- expr.asKindOrThrow(
39
- SyntaxKind.PropertyAccessExpression
40
- );
41
-
42
43
  isTrack =
43
- prop.getName() === "track";
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
- if (
54
- arg.getKind() ===
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
- // template literal
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
- events.add(
78
- value.getLiteralText()
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;