@tracelog/lib 0.0.8 → 0.2.0

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.
Files changed (228) hide show
  1. package/README.md +58 -24
  2. package/dist/browser/tracelog.js +1934 -3226
  3. package/dist/cjs/api.d.ts +33 -19
  4. package/dist/cjs/api.js +111 -156
  5. package/dist/cjs/app.constants.d.ts +80 -1
  6. package/dist/cjs/app.constants.js +90 -3
  7. package/dist/cjs/app.d.ts +29 -44
  8. package/dist/cjs/app.js +114 -212
  9. package/dist/cjs/app.types.d.ts +2 -7
  10. package/dist/cjs/app.types.js +10 -21
  11. package/dist/cjs/constants/api.constants.js +11 -5
  12. package/dist/cjs/constants/config.constants.d.ts +75 -0
  13. package/dist/cjs/constants/config.constants.js +178 -0
  14. package/dist/cjs/constants/error.constants.d.ts +29 -0
  15. package/dist/cjs/constants/error.constants.js +50 -0
  16. package/dist/cjs/constants/index.d.ts +3 -6
  17. package/dist/cjs/constants/index.js +3 -6
  18. package/dist/cjs/constants/performance.constants.d.ts +28 -0
  19. package/dist/cjs/constants/performance.constants.js +43 -0
  20. package/dist/cjs/handlers/click.handler.d.ts +1 -0
  21. package/dist/cjs/handlers/click.handler.js +30 -49
  22. package/dist/cjs/handlers/error.handler.d.ts +11 -6
  23. package/dist/cjs/handlers/error.handler.js +91 -51
  24. package/dist/cjs/handlers/page-view.handler.js +38 -29
  25. package/dist/cjs/handlers/performance.handler.d.ts +3 -0
  26. package/dist/cjs/handlers/performance.handler.js +76 -37
  27. package/dist/cjs/handlers/scroll.handler.d.ts +15 -0
  28. package/dist/cjs/handlers/scroll.handler.js +105 -31
  29. package/dist/cjs/handlers/session.handler.d.ts +6 -20
  30. package/dist/cjs/handlers/session.handler.js +38 -326
  31. package/dist/cjs/integrations/google-analytics.integration.d.ts +0 -1
  32. package/dist/cjs/integrations/google-analytics.integration.js +27 -98
  33. package/dist/cjs/listeners/input-listener-managers.d.ts +18 -9
  34. package/dist/cjs/listeners/input-listener-managers.js +24 -33
  35. package/dist/cjs/listeners/touch-listener-manager.d.ts +1 -3
  36. package/dist/cjs/listeners/touch-listener-manager.js +1 -23
  37. package/dist/cjs/listeners/visibility-listener-manager.d.ts +1 -4
  38. package/dist/cjs/listeners/visibility-listener-manager.js +6 -42
  39. package/dist/cjs/managers/api.manager.d.ts +13 -3
  40. package/dist/cjs/managers/api.manager.js +35 -5
  41. package/dist/cjs/managers/config.manager.d.ts +53 -3
  42. package/dist/cjs/managers/config.manager.js +131 -62
  43. package/dist/cjs/managers/event.manager.d.ts +57 -36
  44. package/dist/cjs/managers/event.manager.js +266 -417
  45. package/dist/cjs/managers/sender.manager.d.ts +40 -22
  46. package/dist/cjs/managers/sender.manager.js +200 -198
  47. package/dist/cjs/managers/session.manager.d.ts +80 -66
  48. package/dist/cjs/managers/session.manager.js +267 -522
  49. package/dist/cjs/managers/state.manager.d.ts +33 -0
  50. package/dist/cjs/managers/state.manager.js +79 -6
  51. package/dist/cjs/managers/storage.manager.d.ts +26 -2
  52. package/dist/cjs/managers/storage.manager.js +67 -34
  53. package/dist/cjs/managers/tags.manager.d.ts +31 -7
  54. package/dist/cjs/managers/tags.manager.js +123 -241
  55. package/dist/cjs/managers/user.manager.d.ts +14 -5
  56. package/dist/cjs/managers/user.manager.js +17 -9
  57. package/dist/cjs/public-api.d.ts +10 -1
  58. package/dist/cjs/public-api.js +18 -24
  59. package/dist/cjs/test-bridge.d.ts +48 -0
  60. package/dist/cjs/test-bridge.js +110 -0
  61. package/dist/cjs/types/api.types.d.ts +21 -6
  62. package/dist/cjs/types/api.types.js +21 -6
  63. package/dist/cjs/types/config.types.d.ts +22 -84
  64. package/dist/cjs/types/emitter.types.d.ts +11 -0
  65. package/dist/cjs/types/emitter.types.js +8 -0
  66. package/dist/cjs/types/event.types.d.ts +8 -11
  67. package/dist/cjs/types/index.d.ts +3 -1
  68. package/dist/cjs/types/index.js +3 -1
  69. package/dist/cjs/types/queue.types.d.ts +1 -0
  70. package/dist/cjs/types/session.types.d.ts +0 -64
  71. package/dist/cjs/types/state.types.d.ts +1 -0
  72. package/dist/cjs/types/test-bridge.types.d.ts +38 -0
  73. package/dist/cjs/types/validation-error.types.d.ts +7 -0
  74. package/dist/cjs/types/validation-error.types.js +11 -1
  75. package/dist/cjs/types/window.types.d.ts +1 -8
  76. package/dist/cjs/utils/data/uuid.utils.d.ts +1 -1
  77. package/dist/cjs/utils/data/uuid.utils.js +7 -5
  78. package/dist/cjs/utils/emitter.utils.d.ts +8 -0
  79. package/dist/cjs/utils/emitter.utils.js +33 -0
  80. package/dist/cjs/utils/index.d.ts +1 -0
  81. package/dist/cjs/utils/index.js +1 -0
  82. package/dist/cjs/utils/logging/debug-logger.utils.d.ts +10 -51
  83. package/dist/cjs/utils/logging/debug-logger.utils.js +36 -127
  84. package/dist/cjs/utils/network/fetch-with-timeout.utils.d.ts +4 -0
  85. package/dist/cjs/utils/network/fetch-with-timeout.utils.js +25 -0
  86. package/dist/cjs/utils/network/index.d.ts +1 -0
  87. package/dist/cjs/utils/network/index.js +1 -0
  88. package/dist/cjs/utils/network/url.utils.js +2 -42
  89. package/dist/cjs/utils/security/sanitize.utils.d.ts +1 -8
  90. package/dist/cjs/utils/security/sanitize.utils.js +7 -41
  91. package/dist/cjs/utils/validations/config-validations.utils.d.ts +7 -0
  92. package/dist/cjs/utils/validations/config-validations.utils.js +77 -22
  93. package/dist/esm/api.d.ts +33 -19
  94. package/dist/esm/api.js +105 -118
  95. package/dist/esm/app.constants.d.ts +80 -1
  96. package/dist/esm/app.constants.js +89 -1
  97. package/dist/esm/app.d.ts +29 -44
  98. package/dist/esm/app.js +115 -213
  99. package/dist/esm/app.types.d.ts +2 -7
  100. package/dist/esm/app.types.js +1 -7
  101. package/dist/esm/constants/api.constants.js +10 -4
  102. package/dist/esm/constants/config.constants.d.ts +75 -0
  103. package/dist/esm/constants/config.constants.js +174 -0
  104. package/dist/esm/constants/error.constants.d.ts +29 -0
  105. package/dist/esm/constants/error.constants.js +47 -0
  106. package/dist/esm/constants/index.d.ts +3 -6
  107. package/dist/esm/constants/index.js +3 -6
  108. package/dist/esm/constants/performance.constants.d.ts +28 -0
  109. package/dist/esm/constants/performance.constants.js +40 -0
  110. package/dist/esm/handlers/click.handler.d.ts +1 -0
  111. package/dist/esm/handlers/click.handler.js +30 -49
  112. package/dist/esm/handlers/error.handler.d.ts +11 -6
  113. package/dist/esm/handlers/error.handler.js +91 -51
  114. package/dist/esm/handlers/page-view.handler.js +38 -29
  115. package/dist/esm/handlers/performance.handler.d.ts +3 -0
  116. package/dist/esm/handlers/performance.handler.js +71 -32
  117. package/dist/esm/handlers/scroll.handler.d.ts +15 -0
  118. package/dist/esm/handlers/scroll.handler.js +106 -32
  119. package/dist/esm/handlers/session.handler.d.ts +6 -20
  120. package/dist/esm/handlers/session.handler.js +38 -326
  121. package/dist/esm/integrations/google-analytics.integration.d.ts +0 -1
  122. package/dist/esm/integrations/google-analytics.integration.js +27 -98
  123. package/dist/esm/listeners/input-listener-managers.d.ts +18 -9
  124. package/dist/esm/listeners/input-listener-managers.js +23 -32
  125. package/dist/esm/listeners/touch-listener-manager.d.ts +1 -3
  126. package/dist/esm/listeners/touch-listener-manager.js +1 -23
  127. package/dist/esm/listeners/visibility-listener-manager.d.ts +1 -4
  128. package/dist/esm/listeners/visibility-listener-manager.js +6 -42
  129. package/dist/esm/managers/api.manager.d.ts +13 -3
  130. package/dist/esm/managers/api.manager.js +34 -3
  131. package/dist/esm/managers/config.manager.d.ts +53 -3
  132. package/dist/esm/managers/config.manager.js +133 -64
  133. package/dist/esm/managers/event.manager.d.ts +57 -36
  134. package/dist/esm/managers/event.manager.js +268 -419
  135. package/dist/esm/managers/sender.manager.d.ts +40 -22
  136. package/dist/esm/managers/sender.manager.js +201 -199
  137. package/dist/esm/managers/session.manager.d.ts +80 -66
  138. package/dist/esm/managers/session.manager.js +269 -524
  139. package/dist/esm/managers/state.manager.d.ts +33 -0
  140. package/dist/esm/managers/state.manager.js +78 -6
  141. package/dist/esm/managers/storage.manager.d.ts +26 -2
  142. package/dist/esm/managers/storage.manager.js +66 -33
  143. package/dist/esm/managers/tags.manager.d.ts +31 -7
  144. package/dist/esm/managers/tags.manager.js +124 -242
  145. package/dist/esm/managers/user.manager.d.ts +14 -5
  146. package/dist/esm/managers/user.manager.js +17 -9
  147. package/dist/esm/public-api.d.ts +10 -1
  148. package/dist/esm/public-api.js +14 -1
  149. package/dist/esm/test-bridge.d.ts +48 -0
  150. package/dist/esm/test-bridge.js +106 -0
  151. package/dist/esm/types/api.types.d.ts +21 -6
  152. package/dist/esm/types/api.types.js +21 -6
  153. package/dist/esm/types/config.types.d.ts +22 -84
  154. package/dist/esm/types/emitter.types.d.ts +11 -0
  155. package/dist/esm/types/emitter.types.js +5 -0
  156. package/dist/esm/types/event.types.d.ts +8 -11
  157. package/dist/esm/types/index.d.ts +3 -1
  158. package/dist/esm/types/index.js +3 -1
  159. package/dist/esm/types/queue.types.d.ts +1 -0
  160. package/dist/esm/types/session.types.d.ts +0 -64
  161. package/dist/esm/types/state.types.d.ts +1 -0
  162. package/dist/esm/types/test-bridge.types.d.ts +38 -0
  163. package/dist/esm/types/validation-error.types.d.ts +7 -0
  164. package/dist/esm/types/validation-error.types.js +9 -0
  165. package/dist/esm/types/window.types.d.ts +1 -8
  166. package/dist/esm/utils/data/uuid.utils.d.ts +1 -1
  167. package/dist/esm/utils/data/uuid.utils.js +7 -5
  168. package/dist/esm/utils/emitter.utils.d.ts +8 -0
  169. package/dist/esm/utils/emitter.utils.js +29 -0
  170. package/dist/esm/utils/index.d.ts +1 -0
  171. package/dist/esm/utils/index.js +1 -0
  172. package/dist/esm/utils/logging/debug-logger.utils.d.ts +10 -51
  173. package/dist/esm/utils/logging/debug-logger.utils.js +36 -127
  174. package/dist/esm/utils/network/fetch-with-timeout.utils.d.ts +4 -0
  175. package/dist/esm/utils/network/fetch-with-timeout.utils.js +22 -0
  176. package/dist/esm/utils/network/index.d.ts +1 -0
  177. package/dist/esm/utils/network/index.js +1 -0
  178. package/dist/esm/utils/network/url.utils.js +2 -42
  179. package/dist/esm/utils/security/sanitize.utils.d.ts +1 -8
  180. package/dist/esm/utils/security/sanitize.utils.js +6 -39
  181. package/dist/esm/utils/validations/config-validations.utils.d.ts +7 -0
  182. package/dist/esm/utils/validations/config-validations.utils.js +76 -22
  183. package/package.json +23 -16
  184. package/dist/browser/web-vitals-CCnqwnC8.mjs +0 -198
  185. package/dist/cjs/constants/browser.constants.d.ts +0 -3
  186. package/dist/cjs/constants/browser.constants.js +0 -41
  187. package/dist/cjs/constants/initialization.constants.d.ts +0 -40
  188. package/dist/cjs/constants/initialization.constants.js +0 -48
  189. package/dist/cjs/constants/limits.constants.d.ts +0 -25
  190. package/dist/cjs/constants/limits.constants.js +0 -40
  191. package/dist/cjs/constants/security.constants.d.ts +0 -1
  192. package/dist/cjs/constants/security.constants.js +0 -12
  193. package/dist/cjs/constants/timing.constants.d.ts +0 -22
  194. package/dist/cjs/constants/timing.constants.js +0 -34
  195. package/dist/cjs/constants/validation.constants.d.ts +0 -13
  196. package/dist/cjs/constants/validation.constants.js +0 -31
  197. package/dist/cjs/handlers/network.handler.d.ts +0 -16
  198. package/dist/cjs/handlers/network.handler.js +0 -136
  199. package/dist/cjs/managers/cross-tab-session.manager.d.ts +0 -170
  200. package/dist/cjs/managers/cross-tab-session.manager.js +0 -730
  201. package/dist/cjs/managers/sampling.manager.d.ts +0 -8
  202. package/dist/cjs/managers/sampling.manager.js +0 -53
  203. package/dist/cjs/managers/session-recovery.manager.d.ts +0 -65
  204. package/dist/cjs/managers/session-recovery.manager.js +0 -237
  205. package/dist/cjs/types/web-vitals.types.d.ts +0 -6
  206. package/dist/esm/constants/browser.constants.d.ts +0 -3
  207. package/dist/esm/constants/browser.constants.js +0 -38
  208. package/dist/esm/constants/initialization.constants.d.ts +0 -40
  209. package/dist/esm/constants/initialization.constants.js +0 -45
  210. package/dist/esm/constants/limits.constants.d.ts +0 -25
  211. package/dist/esm/constants/limits.constants.js +0 -37
  212. package/dist/esm/constants/security.constants.d.ts +0 -1
  213. package/dist/esm/constants/security.constants.js +0 -9
  214. package/dist/esm/constants/timing.constants.d.ts +0 -22
  215. package/dist/esm/constants/timing.constants.js +0 -31
  216. package/dist/esm/constants/validation.constants.d.ts +0 -13
  217. package/dist/esm/constants/validation.constants.js +0 -28
  218. package/dist/esm/handlers/network.handler.d.ts +0 -16
  219. package/dist/esm/handlers/network.handler.js +0 -132
  220. package/dist/esm/managers/cross-tab-session.manager.d.ts +0 -170
  221. package/dist/esm/managers/cross-tab-session.manager.js +0 -726
  222. package/dist/esm/managers/sampling.manager.d.ts +0 -8
  223. package/dist/esm/managers/sampling.manager.js +0 -49
  224. package/dist/esm/managers/session-recovery.manager.d.ts +0 -65
  225. package/dist/esm/managers/session-recovery.manager.js +0 -233
  226. package/dist/esm/types/web-vitals.types.d.ts +0 -6
  227. /package/dist/cjs/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
  228. /package/dist/esm/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
@@ -4,256 +4,116 @@ exports.TagsManager = void 0;
4
4
  const types_1 = require("../types");
5
5
  const state_manager_1 = require("./state.manager");
6
6
  class TagsManager extends state_manager_1.StateManager {
7
+ /**
8
+ * Gets matching tag IDs for an event based on configured tag conditions
9
+ */
7
10
  getEventTagsIds(event, deviceType) {
8
- switch (event.type) {
9
- case types_1.EventType.PAGE_VIEW: {
10
- return this.checkEventTypePageView(event, deviceType);
11
- }
12
- case types_1.EventType.CLICK: {
13
- return this.checkEventTypeClick(event, deviceType);
14
- }
15
- default: {
16
- return [];
17
- }
18
- }
19
- }
20
- checkEventTypePageView(event, deviceType) {
21
- const tags = this.get('config')?.tags?.filter((tag) => tag.triggerType === types_1.EventType.PAGE_VIEW) ?? [];
11
+ const tags = this.get('config')?.tags?.filter((tag) => tag.triggerType === event.type) ?? [];
22
12
  if (tags.length === 0) {
23
13
  return [];
24
14
  }
25
- const matchedTagIds = [];
26
- for (const tag of tags) {
27
- const { id, logicalOperator, conditions } = tag;
28
- const results = [];
29
- for (const condition of conditions) {
30
- switch (condition.type) {
31
- case types_1.TagConditionType.URL_MATCHES: {
32
- results.push(this.matchUrlMatches(condition, event.page_url));
33
- break;
34
- }
35
- case types_1.TagConditionType.DEVICE_TYPE: {
36
- results.push(this.matchDeviceType(condition, deviceType));
37
- break;
38
- }
39
- case types_1.TagConditionType.UTM_SOURCE: {
40
- results.push(this.matchUtmCondition(condition, event.utm?.source));
41
- break;
42
- }
43
- case types_1.TagConditionType.UTM_MEDIUM: {
44
- results.push(this.matchUtmCondition(condition, event.utm?.medium));
45
- break;
46
- }
47
- case types_1.TagConditionType.UTM_CAMPAIGN: {
48
- results.push(this.matchUtmCondition(condition, event.utm?.campaign));
49
- break;
50
- }
51
- }
52
- }
53
- let isMatch = false;
54
- isMatch = logicalOperator === types_1.TagLogicalOperator.AND ? results.every(Boolean) : results.some(Boolean);
55
- if (isMatch) {
56
- matchedTagIds.push(id);
57
- }
58
- }
59
- return matchedTagIds;
15
+ const context = {
16
+ event,
17
+ deviceType,
18
+ clickData: event.click_data,
19
+ };
20
+ return tags.filter((tag) => this.evaluateTagConditions(tag, context)).map((tag) => tag.id);
60
21
  }
61
- checkEventTypeClick(event, deviceType) {
62
- const tags = this.get('config')?.tags?.filter((tag) => tag.triggerType === types_1.EventType.CLICK) ?? [];
63
- if (tags.length === 0) {
64
- return [];
65
- }
66
- const matchedTagIds = [];
67
- for (const tag of tags) {
68
- const { id, logicalOperator, conditions } = tag;
69
- const results = [];
70
- for (const condition of conditions) {
71
- if (!event.click_data) {
72
- results.push(false);
73
- continue;
74
- }
75
- const clickData = event.click_data;
76
- switch (condition.type) {
77
- case types_1.TagConditionType.ELEMENT_MATCHES: {
78
- results.push(this.matchElementSelector(condition, clickData));
79
- break;
80
- }
81
- case types_1.TagConditionType.DEVICE_TYPE: {
82
- results.push(this.matchDeviceType(condition, deviceType));
83
- break;
84
- }
85
- case types_1.TagConditionType.URL_MATCHES: {
86
- results.push(this.matchUrlMatches(condition, event.page_url));
87
- break;
88
- }
89
- case types_1.TagConditionType.UTM_SOURCE: {
90
- results.push(this.matchUtmCondition(condition, event.utm?.source));
91
- break;
92
- }
93
- case types_1.TagConditionType.UTM_MEDIUM: {
94
- results.push(this.matchUtmCondition(condition, event.utm?.medium));
95
- break;
96
- }
97
- case types_1.TagConditionType.UTM_CAMPAIGN: {
98
- results.push(this.matchUtmCondition(condition, event.utm?.campaign));
99
- break;
100
- }
101
- }
102
- }
103
- let isMatch = false;
104
- isMatch = logicalOperator === types_1.TagLogicalOperator.AND ? results.every(Boolean) : results.some(Boolean);
105
- if (isMatch) {
106
- matchedTagIds.push(id);
107
- }
108
- }
109
- return matchedTagIds;
110
- }
111
- matchUrlMatches(condition, url) {
112
- if (condition.type !== types_1.TagConditionType.URL_MATCHES) {
22
+ /**
23
+ * Evaluates all conditions for a tag using logical operators
24
+ */
25
+ evaluateTagConditions(tag, context) {
26
+ const { conditions, logicalOperator = types_1.TagLogicalOperator.OR } = tag;
27
+ if (!conditions || conditions.length === 0) {
113
28
  return false;
114
29
  }
115
- const targetValue = condition.value.toLowerCase();
116
- const targetUrl = url.toLowerCase();
117
- switch (condition.operator) {
118
- case types_1.TagConditionOperator.EQUALS: {
119
- return targetUrl === targetValue;
120
- }
121
- case types_1.TagConditionOperator.CONTAINS: {
122
- return targetUrl.includes(targetValue);
123
- }
124
- case types_1.TagConditionOperator.STARTS_WITH: {
125
- return targetUrl.startsWith(targetValue);
126
- }
127
- case types_1.TagConditionOperator.ENDS_WITH: {
128
- return targetUrl.endsWith(targetValue);
129
- }
130
- case types_1.TagConditionOperator.REGEX: {
131
- try {
132
- const regex = new RegExp(targetValue, 'gi');
133
- return regex.test(targetUrl);
134
- }
135
- catch {
30
+ const results = conditions.map((condition) => this.evaluateCondition(condition, context));
31
+ return logicalOperator === types_1.TagLogicalOperator.AND ? results.every(Boolean) : results.some(Boolean);
32
+ }
33
+ /**
34
+ * Evaluates a single tag condition
35
+ */
36
+ evaluateCondition(condition, context) {
37
+ try {
38
+ switch (condition.type) {
39
+ case types_1.TagConditionType.URL_MATCHES:
40
+ return this.matchStringCondition(condition, context.event.page_url);
41
+ case types_1.TagConditionType.DEVICE_TYPE:
42
+ return this.matchStringCondition(condition, context.deviceType);
43
+ case types_1.TagConditionType.UTM_SOURCE:
44
+ return this.matchStringCondition(condition, context.event.utm?.source ?? '');
45
+ case types_1.TagConditionType.UTM_MEDIUM:
46
+ return this.matchStringCondition(condition, context.event.utm?.medium ?? '');
47
+ case types_1.TagConditionType.UTM_CAMPAIGN:
48
+ return this.matchStringCondition(condition, context.event.utm?.campaign ?? '');
49
+ case types_1.TagConditionType.ELEMENT_MATCHES:
50
+ return context.clickData ? this.matchElementCondition(condition, context.clickData) : false;
51
+ default:
136
52
  return false;
137
- }
138
- }
139
- default: {
140
- return false;
141
53
  }
142
54
  }
143
- }
144
- matchDeviceType(condition, deviceType) {
145
- if (condition.type !== types_1.TagConditionType.DEVICE_TYPE) {
55
+ catch {
146
56
  return false;
147
57
  }
148
- const targetValue = condition.value.toLowerCase();
149
- const targetDevice = deviceType.toLowerCase();
150
- switch (condition.operator) {
151
- case types_1.TagConditionOperator.EQUALS: {
152
- return targetDevice === targetValue;
153
- }
154
- case types_1.TagConditionOperator.CONTAINS: {
155
- return targetDevice.includes(targetValue);
156
- }
157
- case types_1.TagConditionOperator.STARTS_WITH: {
158
- return targetDevice.startsWith(targetValue);
159
- }
160
- case types_1.TagConditionOperator.ENDS_WITH: {
161
- return targetDevice.endsWith(targetValue);
162
- }
163
- case types_1.TagConditionOperator.REGEX: {
164
- try {
165
- const regex = new RegExp(targetValue, 'gi');
166
- return regex.test(targetDevice);
167
- }
168
- catch {
169
- return false;
170
- }
171
- }
172
- default: {
173
- return false;
174
- }
175
- }
176
58
  }
177
- matchElementSelector(condition, clickData) {
178
- if (condition.type !== types_1.TagConditionType.ELEMENT_MATCHES) {
59
+ /**
60
+ * Unified string matching logic for all string-based conditions
61
+ */
62
+ matchStringCondition(condition, value) {
63
+ if (!value &&
64
+ condition.operator !== types_1.TagConditionOperator.EXISTS &&
65
+ condition.operator !== types_1.TagConditionOperator.NOT_EXISTS) {
179
66
  return false;
180
67
  }
181
- const elementData = [
182
- clickData.id ?? '',
183
- clickData.class ?? '',
184
- clickData.tag ?? '',
185
- clickData.text ?? '',
186
- clickData.href ?? '',
187
- clickData.title ?? '',
188
- clickData.alt ?? '',
189
- clickData.role ?? '',
190
- clickData.ariaLabel ?? '',
191
- ...Object.values(clickData.dataAttributes ?? {}),
192
- ].join(' ');
193
- const targetValue = condition.value.toLowerCase();
194
- const targetElementData = elementData.toLowerCase();
68
+ const conditionValue = condition.value.toLowerCase();
69
+ const targetValue = value.toLowerCase();
195
70
  switch (condition.operator) {
196
- case types_1.TagConditionOperator.EQUALS: {
197
- return this.checkElementFieldEquals(clickData, targetValue);
198
- }
199
- case types_1.TagConditionOperator.CONTAINS: {
200
- return targetElementData.includes(targetValue);
201
- }
202
- case types_1.TagConditionOperator.STARTS_WITH: {
203
- return targetElementData.startsWith(targetValue);
204
- }
205
- case types_1.TagConditionOperator.ENDS_WITH: {
206
- return targetElementData.endsWith(targetValue);
207
- }
208
- case types_1.TagConditionOperator.REGEX: {
209
- try {
210
- const regex = new RegExp(targetValue, 'gi');
211
- return regex.test(targetElementData);
212
- }
213
- catch {
214
- return false;
215
- }
216
- }
217
- default: {
71
+ case types_1.TagConditionOperator.EQUALS:
72
+ return targetValue === conditionValue;
73
+ case types_1.TagConditionOperator.CONTAINS:
74
+ return targetValue.includes(conditionValue);
75
+ case types_1.TagConditionOperator.STARTS_WITH:
76
+ return targetValue.startsWith(conditionValue);
77
+ case types_1.TagConditionOperator.ENDS_WITH:
78
+ return targetValue.endsWith(conditionValue);
79
+ case types_1.TagConditionOperator.REGEX:
80
+ return this.testRegex(conditionValue, targetValue);
81
+ case types_1.TagConditionOperator.EXISTS:
82
+ return !!value;
83
+ case types_1.TagConditionOperator.NOT_EXISTS:
84
+ return !value;
85
+ default:
218
86
  return false;
219
- }
220
87
  }
221
88
  }
222
- matchUtmCondition(condition, utmValue) {
223
- if (![types_1.TagConditionType.UTM_SOURCE, types_1.TagConditionType.UTM_MEDIUM, types_1.TagConditionType.UTM_CAMPAIGN].includes(condition.type)) {
224
- return false;
89
+ /**
90
+ * Element-specific matching logic with optimized data extraction
91
+ */
92
+ matchElementCondition(condition, clickData) {
93
+ if (condition.operator === types_1.TagConditionOperator.EQUALS) {
94
+ return this.matchElementFieldExact(condition, clickData);
225
95
  }
226
- const value = utmValue ?? '';
227
- const targetValue = condition.value.toLowerCase();
228
- const targetUtmValue = value.toLowerCase();
96
+ // Build searchable element data string once
97
+ const elementData = this.buildElementDataString(clickData).toLowerCase();
98
+ const conditionValue = condition.value.toLowerCase();
229
99
  switch (condition.operator) {
230
- case types_1.TagConditionOperator.EQUALS: {
231
- return targetUtmValue === targetValue;
232
- }
233
- case types_1.TagConditionOperator.CONTAINS: {
234
- return targetUtmValue.includes(targetValue);
235
- }
236
- case types_1.TagConditionOperator.STARTS_WITH: {
237
- return targetUtmValue.startsWith(targetValue);
238
- }
239
- case types_1.TagConditionOperator.ENDS_WITH: {
240
- return targetUtmValue.endsWith(targetValue);
241
- }
242
- case types_1.TagConditionOperator.REGEX: {
243
- try {
244
- const regex = new RegExp(targetValue, 'gi');
245
- return regex.test(targetUtmValue);
246
- }
247
- catch {
248
- return false;
249
- }
250
- }
251
- default: {
100
+ case types_1.TagConditionOperator.CONTAINS:
101
+ return elementData.includes(conditionValue);
102
+ case types_1.TagConditionOperator.STARTS_WITH:
103
+ return elementData.startsWith(conditionValue);
104
+ case types_1.TagConditionOperator.ENDS_WITH:
105
+ return elementData.endsWith(conditionValue);
106
+ case types_1.TagConditionOperator.REGEX:
107
+ return this.testRegex(conditionValue, elementData);
108
+ default:
252
109
  return false;
253
- }
254
110
  }
255
111
  }
256
- checkElementFieldEquals(clickData, targetValue) {
112
+ /**
113
+ * Exact field matching for element EQUALS operations
114
+ */
115
+ matchElementFieldExact(condition, clickData) {
116
+ const conditionValue = condition.value.toLowerCase();
257
117
  const fields = [
258
118
  clickData.id,
259
119
  clickData.class,
@@ -265,25 +125,47 @@ class TagsManager extends state_manager_1.StateManager {
265
125
  clickData.role,
266
126
  clickData.ariaLabel,
267
127
  ];
268
- for (const field of fields) {
269
- if (field) {
270
- const fieldValue = field.toLowerCase();
271
- const target = targetValue.toLowerCase();
272
- if (fieldValue === target) {
273
- return true;
274
- }
275
- }
128
+ // Check standard fields
129
+ if (fields.some((field) => field && field.toLowerCase() === conditionValue)) {
130
+ return true;
276
131
  }
132
+ // Check data attributes
277
133
  if (clickData.dataAttributes) {
278
- for (const dataValue of Object.values(clickData.dataAttributes)) {
279
- const fieldValue = dataValue.toLowerCase();
280
- const target = targetValue.toLowerCase();
281
- if (fieldValue === target) {
282
- return true;
283
- }
284
- }
134
+ return Object.values(clickData.dataAttributes).some((value) => value.toLowerCase() === conditionValue);
285
135
  }
286
136
  return false;
287
137
  }
138
+ /**
139
+ * Builds searchable element data string with null safety
140
+ */
141
+ buildElementDataString(clickData) {
142
+ const parts = [
143
+ clickData.id,
144
+ clickData.class,
145
+ clickData.tag,
146
+ clickData.text,
147
+ clickData.href,
148
+ clickData.title,
149
+ clickData.alt,
150
+ clickData.role,
151
+ clickData.ariaLabel,
152
+ ].filter(Boolean);
153
+ if (clickData.dataAttributes) {
154
+ parts.push(...Object.values(clickData.dataAttributes));
155
+ }
156
+ return parts.join(' ');
157
+ }
158
+ /**
159
+ * Safe regex testing with error handling
160
+ */
161
+ testRegex(pattern, text) {
162
+ try {
163
+ const regex = new RegExp(pattern, 'gi');
164
+ return regex.test(text);
165
+ }
166
+ catch {
167
+ return false;
168
+ }
169
+ }
288
170
  }
289
171
  exports.TagsManager = TagsManager;
@@ -1,7 +1,16 @@
1
- import { StateManager } from './state.manager';
2
1
  import { StorageManager } from './storage.manager';
3
- export declare class UserManager extends StateManager {
4
- private readonly storageManager;
5
- constructor(storageManager: StorageManager);
6
- getId(): string;
2
+ /**
3
+ * Simple utility for managing user identification.
4
+ * Generates and persists unique user IDs per project.
5
+ */
6
+ export declare class UserManager {
7
+ /**
8
+ * Gets or creates a unique user ID for the given project.
9
+ * The user ID is persisted in localStorage and reused across sessions.
10
+ *
11
+ * @param storageManager - Storage manager instance
12
+ * @param projectId - Project identifier for namespacing
13
+ * @returns Persistent unique user ID
14
+ */
15
+ static getId(storageManager: StorageManager, projectId?: string): string;
7
16
  }
@@ -3,19 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UserManager = void 0;
4
4
  const constants_1 = require("../constants");
5
5
  const utils_1 = require("../utils");
6
- const state_manager_1 = require("./state.manager");
7
- class UserManager extends state_manager_1.StateManager {
8
- constructor(storageManager) {
9
- super();
10
- this.storageManager = storageManager;
11
- }
12
- getId() {
13
- const storedUserId = this.storageManager.getItem((0, constants_1.USER_ID_KEY)(this.get('config')?.id));
6
+ /**
7
+ * Simple utility for managing user identification.
8
+ * Generates and persists unique user IDs per project.
9
+ */
10
+ class UserManager {
11
+ /**
12
+ * Gets or creates a unique user ID for the given project.
13
+ * The user ID is persisted in localStorage and reused across sessions.
14
+ *
15
+ * @param storageManager - Storage manager instance
16
+ * @param projectId - Project identifier for namespacing
17
+ * @returns Persistent unique user ID
18
+ */
19
+ static getId(storageManager, projectId) {
20
+ const storageKey = (0, constants_1.USER_ID_KEY)(projectId ?? '');
21
+ const storedUserId = storageManager.getItem(storageKey);
14
22
  if (storedUserId) {
15
23
  return storedUserId;
16
24
  }
17
25
  const newUserId = (0, utils_1.generateUUID)();
18
- this.storageManager.setItem((0, constants_1.USER_ID_KEY)(this.get('config')?.id), newUserId);
26
+ storageManager.setItem(storageKey, newUserId);
19
27
  return newUserId;
20
28
  }
21
29
  }
@@ -1 +1,10 @@
1
- export * as TraceLog from './api';
1
+ export * from './app.constants';
2
+ export * from './app.types';
3
+ export declare const tracelog: {
4
+ init: (appConfig: import("./app.types").AppConfig) => Promise<void>;
5
+ event: (name: string, metadata?: Record<string, import("./app.types").MetadataType>) => void;
6
+ on: <K extends keyof import("./types").EmitterMap>(event: K, callback: import("./types").EmitterCallback<import("./types").EmitterMap[K]>) => void;
7
+ off: <K extends keyof import("./types").EmitterMap>(event: K, callback: import("./types").EmitterCallback<import("./types").EmitterMap[K]>) => void;
8
+ isInitialized: () => boolean;
9
+ destroy: () => Promise<void>;
10
+ };
@@ -10,28 +10,22 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
35
16
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TraceLog = void 0;
37
- exports.TraceLog = __importStar(require("./api"));
17
+ exports.tracelog = void 0;
18
+ const api_1 = require("./api");
19
+ // Constants
20
+ __exportStar(require("./app.constants"), exports);
21
+ // Types
22
+ __exportStar(require("./app.types"), exports);
23
+ // TraceLog namespace containing all API methods
24
+ exports.tracelog = {
25
+ init: api_1.init,
26
+ event: api_1.event,
27
+ on: api_1.on,
28
+ off: api_1.off,
29
+ isInitialized: api_1.isInitialized,
30
+ destroy: api_1.destroy,
31
+ };
@@ -0,0 +1,48 @@
1
+ import { App } from './app';
2
+ import { ClickHandler } from './handlers/click.handler';
3
+ import { ErrorHandler } from './handlers/error.handler';
4
+ import { PageViewHandler } from './handlers/page-view.handler';
5
+ import { PerformanceHandler } from './handlers/performance.handler';
6
+ import { ScrollHandler } from './handlers/scroll.handler';
7
+ import { SessionHandler } from './handlers/session.handler';
8
+ import { GoogleAnalyticsIntegration } from './integrations/google-analytics.integration';
9
+ import { EventManager } from './managers/event.manager';
10
+ import { StorageManager } from './managers/storage.manager';
11
+ import { State, TraceLogTestBridge } from './types';
12
+ /**
13
+ * Test bridge for E2E testing
14
+ */
15
+ export declare class TestBridge extends App implements TraceLogTestBridge {
16
+ private _isInitializing;
17
+ private _isDestroying;
18
+ constructor(isInitializing: boolean, isDestroying: boolean);
19
+ isInitializing(): boolean;
20
+ sendCustomEvent(name: string, data?: Record<string, unknown>): void;
21
+ getSessionData(): Record<string, unknown> | null;
22
+ setSessionTimeout(timeout: number): void;
23
+ getQueueLength(): number;
24
+ forceInitLock(enabled?: boolean): void;
25
+ get<T extends keyof State>(key: T): State[T];
26
+ getStorageManager(): StorageManager | null;
27
+ getEventManager(): EventManager | null;
28
+ getSessionHandler(): SessionHandler | null;
29
+ getPageViewHandler(): PageViewHandler | null;
30
+ getClickHandler(): ClickHandler | null;
31
+ getScrollHandler(): ScrollHandler | null;
32
+ getPerformanceHandler(): PerformanceHandler | null;
33
+ getErrorHandler(): ErrorHandler | null;
34
+ getGoogleAnalytics(): GoogleAnalyticsIntegration | null;
35
+ destroy(): Promise<void>;
36
+ /**
37
+ * Helper to safely access managers/handlers and convert undefined to null
38
+ */
39
+ private safeAccess;
40
+ /**
41
+ * Ensures the app is initialized, throws if not
42
+ */
43
+ private ensureInitialized;
44
+ /**
45
+ * Ensures destroy operation is not in progress, throws if it is
46
+ */
47
+ private ensureNotDestroying;
48
+ }