@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.
- package/README.md +58 -24
- package/dist/browser/tracelog.js +1934 -3226
- package/dist/cjs/api.d.ts +33 -19
- package/dist/cjs/api.js +111 -156
- package/dist/cjs/app.constants.d.ts +80 -1
- package/dist/cjs/app.constants.js +90 -3
- package/dist/cjs/app.d.ts +29 -44
- package/dist/cjs/app.js +114 -212
- package/dist/cjs/app.types.d.ts +2 -7
- package/dist/cjs/app.types.js +10 -21
- package/dist/cjs/constants/api.constants.js +11 -5
- package/dist/cjs/constants/config.constants.d.ts +75 -0
- package/dist/cjs/constants/config.constants.js +178 -0
- package/dist/cjs/constants/error.constants.d.ts +29 -0
- package/dist/cjs/constants/error.constants.js +50 -0
- package/dist/cjs/constants/index.d.ts +3 -6
- package/dist/cjs/constants/index.js +3 -6
- package/dist/cjs/constants/performance.constants.d.ts +28 -0
- package/dist/cjs/constants/performance.constants.js +43 -0
- package/dist/cjs/handlers/click.handler.d.ts +1 -0
- package/dist/cjs/handlers/click.handler.js +30 -49
- package/dist/cjs/handlers/error.handler.d.ts +11 -6
- package/dist/cjs/handlers/error.handler.js +91 -51
- package/dist/cjs/handlers/page-view.handler.js +38 -29
- package/dist/cjs/handlers/performance.handler.d.ts +3 -0
- package/dist/cjs/handlers/performance.handler.js +76 -37
- package/dist/cjs/handlers/scroll.handler.d.ts +15 -0
- package/dist/cjs/handlers/scroll.handler.js +105 -31
- package/dist/cjs/handlers/session.handler.d.ts +6 -20
- package/dist/cjs/handlers/session.handler.js +38 -326
- package/dist/cjs/integrations/google-analytics.integration.d.ts +0 -1
- package/dist/cjs/integrations/google-analytics.integration.js +27 -98
- package/dist/cjs/listeners/input-listener-managers.d.ts +18 -9
- package/dist/cjs/listeners/input-listener-managers.js +24 -33
- package/dist/cjs/listeners/touch-listener-manager.d.ts +1 -3
- package/dist/cjs/listeners/touch-listener-manager.js +1 -23
- package/dist/cjs/listeners/visibility-listener-manager.d.ts +1 -4
- package/dist/cjs/listeners/visibility-listener-manager.js +6 -42
- package/dist/cjs/managers/api.manager.d.ts +13 -3
- package/dist/cjs/managers/api.manager.js +35 -5
- package/dist/cjs/managers/config.manager.d.ts +53 -3
- package/dist/cjs/managers/config.manager.js +131 -62
- package/dist/cjs/managers/event.manager.d.ts +57 -36
- package/dist/cjs/managers/event.manager.js +266 -417
- package/dist/cjs/managers/sender.manager.d.ts +40 -22
- package/dist/cjs/managers/sender.manager.js +200 -198
- package/dist/cjs/managers/session.manager.d.ts +80 -66
- package/dist/cjs/managers/session.manager.js +267 -522
- package/dist/cjs/managers/state.manager.d.ts +33 -0
- package/dist/cjs/managers/state.manager.js +79 -6
- package/dist/cjs/managers/storage.manager.d.ts +26 -2
- package/dist/cjs/managers/storage.manager.js +67 -34
- package/dist/cjs/managers/tags.manager.d.ts +31 -7
- package/dist/cjs/managers/tags.manager.js +123 -241
- package/dist/cjs/managers/user.manager.d.ts +14 -5
- package/dist/cjs/managers/user.manager.js +17 -9
- package/dist/cjs/public-api.d.ts +10 -1
- package/dist/cjs/public-api.js +18 -24
- package/dist/cjs/test-bridge.d.ts +48 -0
- package/dist/cjs/test-bridge.js +110 -0
- package/dist/cjs/types/api.types.d.ts +21 -6
- package/dist/cjs/types/api.types.js +21 -6
- package/dist/cjs/types/config.types.d.ts +22 -84
- package/dist/cjs/types/emitter.types.d.ts +11 -0
- package/dist/cjs/types/emitter.types.js +8 -0
- package/dist/cjs/types/event.types.d.ts +8 -11
- package/dist/cjs/types/index.d.ts +3 -1
- package/dist/cjs/types/index.js +3 -1
- package/dist/cjs/types/queue.types.d.ts +1 -0
- package/dist/cjs/types/session.types.d.ts +0 -64
- package/dist/cjs/types/state.types.d.ts +1 -0
- package/dist/cjs/types/test-bridge.types.d.ts +38 -0
- package/dist/cjs/types/validation-error.types.d.ts +7 -0
- package/dist/cjs/types/validation-error.types.js +11 -1
- package/dist/cjs/types/window.types.d.ts +1 -8
- package/dist/cjs/utils/data/uuid.utils.d.ts +1 -1
- package/dist/cjs/utils/data/uuid.utils.js +7 -5
- package/dist/cjs/utils/emitter.utils.d.ts +8 -0
- package/dist/cjs/utils/emitter.utils.js +33 -0
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.js +1 -0
- package/dist/cjs/utils/logging/debug-logger.utils.d.ts +10 -51
- package/dist/cjs/utils/logging/debug-logger.utils.js +36 -127
- package/dist/cjs/utils/network/fetch-with-timeout.utils.d.ts +4 -0
- package/dist/cjs/utils/network/fetch-with-timeout.utils.js +25 -0
- package/dist/cjs/utils/network/index.d.ts +1 -0
- package/dist/cjs/utils/network/index.js +1 -0
- package/dist/cjs/utils/network/url.utils.js +2 -42
- package/dist/cjs/utils/security/sanitize.utils.d.ts +1 -8
- package/dist/cjs/utils/security/sanitize.utils.js +7 -41
- package/dist/cjs/utils/validations/config-validations.utils.d.ts +7 -0
- package/dist/cjs/utils/validations/config-validations.utils.js +77 -22
- package/dist/esm/api.d.ts +33 -19
- package/dist/esm/api.js +105 -118
- package/dist/esm/app.constants.d.ts +80 -1
- package/dist/esm/app.constants.js +89 -1
- package/dist/esm/app.d.ts +29 -44
- package/dist/esm/app.js +115 -213
- package/dist/esm/app.types.d.ts +2 -7
- package/dist/esm/app.types.js +1 -7
- package/dist/esm/constants/api.constants.js +10 -4
- package/dist/esm/constants/config.constants.d.ts +75 -0
- package/dist/esm/constants/config.constants.js +174 -0
- package/dist/esm/constants/error.constants.d.ts +29 -0
- package/dist/esm/constants/error.constants.js +47 -0
- package/dist/esm/constants/index.d.ts +3 -6
- package/dist/esm/constants/index.js +3 -6
- package/dist/esm/constants/performance.constants.d.ts +28 -0
- package/dist/esm/constants/performance.constants.js +40 -0
- package/dist/esm/handlers/click.handler.d.ts +1 -0
- package/dist/esm/handlers/click.handler.js +30 -49
- package/dist/esm/handlers/error.handler.d.ts +11 -6
- package/dist/esm/handlers/error.handler.js +91 -51
- package/dist/esm/handlers/page-view.handler.js +38 -29
- package/dist/esm/handlers/performance.handler.d.ts +3 -0
- package/dist/esm/handlers/performance.handler.js +71 -32
- package/dist/esm/handlers/scroll.handler.d.ts +15 -0
- package/dist/esm/handlers/scroll.handler.js +106 -32
- package/dist/esm/handlers/session.handler.d.ts +6 -20
- package/dist/esm/handlers/session.handler.js +38 -326
- package/dist/esm/integrations/google-analytics.integration.d.ts +0 -1
- package/dist/esm/integrations/google-analytics.integration.js +27 -98
- package/dist/esm/listeners/input-listener-managers.d.ts +18 -9
- package/dist/esm/listeners/input-listener-managers.js +23 -32
- package/dist/esm/listeners/touch-listener-manager.d.ts +1 -3
- package/dist/esm/listeners/touch-listener-manager.js +1 -23
- package/dist/esm/listeners/visibility-listener-manager.d.ts +1 -4
- package/dist/esm/listeners/visibility-listener-manager.js +6 -42
- package/dist/esm/managers/api.manager.d.ts +13 -3
- package/dist/esm/managers/api.manager.js +34 -3
- package/dist/esm/managers/config.manager.d.ts +53 -3
- package/dist/esm/managers/config.manager.js +133 -64
- package/dist/esm/managers/event.manager.d.ts +57 -36
- package/dist/esm/managers/event.manager.js +268 -419
- package/dist/esm/managers/sender.manager.d.ts +40 -22
- package/dist/esm/managers/sender.manager.js +201 -199
- package/dist/esm/managers/session.manager.d.ts +80 -66
- package/dist/esm/managers/session.manager.js +269 -524
- package/dist/esm/managers/state.manager.d.ts +33 -0
- package/dist/esm/managers/state.manager.js +78 -6
- package/dist/esm/managers/storage.manager.d.ts +26 -2
- package/dist/esm/managers/storage.manager.js +66 -33
- package/dist/esm/managers/tags.manager.d.ts +31 -7
- package/dist/esm/managers/tags.manager.js +124 -242
- package/dist/esm/managers/user.manager.d.ts +14 -5
- package/dist/esm/managers/user.manager.js +17 -9
- package/dist/esm/public-api.d.ts +10 -1
- package/dist/esm/public-api.js +14 -1
- package/dist/esm/test-bridge.d.ts +48 -0
- package/dist/esm/test-bridge.js +106 -0
- package/dist/esm/types/api.types.d.ts +21 -6
- package/dist/esm/types/api.types.js +21 -6
- package/dist/esm/types/config.types.d.ts +22 -84
- package/dist/esm/types/emitter.types.d.ts +11 -0
- package/dist/esm/types/emitter.types.js +5 -0
- package/dist/esm/types/event.types.d.ts +8 -11
- package/dist/esm/types/index.d.ts +3 -1
- package/dist/esm/types/index.js +3 -1
- package/dist/esm/types/queue.types.d.ts +1 -0
- package/dist/esm/types/session.types.d.ts +0 -64
- package/dist/esm/types/state.types.d.ts +1 -0
- package/dist/esm/types/test-bridge.types.d.ts +38 -0
- package/dist/esm/types/validation-error.types.d.ts +7 -0
- package/dist/esm/types/validation-error.types.js +9 -0
- package/dist/esm/types/window.types.d.ts +1 -8
- package/dist/esm/utils/data/uuid.utils.d.ts +1 -1
- package/dist/esm/utils/data/uuid.utils.js +7 -5
- package/dist/esm/utils/emitter.utils.d.ts +8 -0
- package/dist/esm/utils/emitter.utils.js +29 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/logging/debug-logger.utils.d.ts +10 -51
- package/dist/esm/utils/logging/debug-logger.utils.js +36 -127
- package/dist/esm/utils/network/fetch-with-timeout.utils.d.ts +4 -0
- package/dist/esm/utils/network/fetch-with-timeout.utils.js +22 -0
- package/dist/esm/utils/network/index.d.ts +1 -0
- package/dist/esm/utils/network/index.js +1 -0
- package/dist/esm/utils/network/url.utils.js +2 -42
- package/dist/esm/utils/security/sanitize.utils.d.ts +1 -8
- package/dist/esm/utils/security/sanitize.utils.js +6 -39
- package/dist/esm/utils/validations/config-validations.utils.d.ts +7 -0
- package/dist/esm/utils/validations/config-validations.utils.js +76 -22
- package/package.json +23 -16
- package/dist/browser/web-vitals-CCnqwnC8.mjs +0 -198
- package/dist/cjs/constants/browser.constants.d.ts +0 -3
- package/dist/cjs/constants/browser.constants.js +0 -41
- package/dist/cjs/constants/initialization.constants.d.ts +0 -40
- package/dist/cjs/constants/initialization.constants.js +0 -48
- package/dist/cjs/constants/limits.constants.d.ts +0 -25
- package/dist/cjs/constants/limits.constants.js +0 -40
- package/dist/cjs/constants/security.constants.d.ts +0 -1
- package/dist/cjs/constants/security.constants.js +0 -12
- package/dist/cjs/constants/timing.constants.d.ts +0 -22
- package/dist/cjs/constants/timing.constants.js +0 -34
- package/dist/cjs/constants/validation.constants.d.ts +0 -13
- package/dist/cjs/constants/validation.constants.js +0 -31
- package/dist/cjs/handlers/network.handler.d.ts +0 -16
- package/dist/cjs/handlers/network.handler.js +0 -136
- package/dist/cjs/managers/cross-tab-session.manager.d.ts +0 -170
- package/dist/cjs/managers/cross-tab-session.manager.js +0 -730
- package/dist/cjs/managers/sampling.manager.d.ts +0 -8
- package/dist/cjs/managers/sampling.manager.js +0 -53
- package/dist/cjs/managers/session-recovery.manager.d.ts +0 -65
- package/dist/cjs/managers/session-recovery.manager.js +0 -237
- package/dist/cjs/types/web-vitals.types.d.ts +0 -6
- package/dist/esm/constants/browser.constants.d.ts +0 -3
- package/dist/esm/constants/browser.constants.js +0 -38
- package/dist/esm/constants/initialization.constants.d.ts +0 -40
- package/dist/esm/constants/initialization.constants.js +0 -45
- package/dist/esm/constants/limits.constants.d.ts +0 -25
- package/dist/esm/constants/limits.constants.js +0 -37
- package/dist/esm/constants/security.constants.d.ts +0 -1
- package/dist/esm/constants/security.constants.js +0 -9
- package/dist/esm/constants/timing.constants.d.ts +0 -22
- package/dist/esm/constants/timing.constants.js +0 -31
- package/dist/esm/constants/validation.constants.d.ts +0 -13
- package/dist/esm/constants/validation.constants.js +0 -28
- package/dist/esm/handlers/network.handler.d.ts +0 -16
- package/dist/esm/handlers/network.handler.js +0 -132
- package/dist/esm/managers/cross-tab-session.manager.d.ts +0 -170
- package/dist/esm/managers/cross-tab-session.manager.js +0 -726
- package/dist/esm/managers/sampling.manager.d.ts +0 -8
- package/dist/esm/managers/sampling.manager.js +0 -49
- package/dist/esm/managers/session-recovery.manager.d.ts +0 -65
- package/dist/esm/managers/session-recovery.manager.js +0 -233
- package/dist/esm/types/web-vitals.types.d.ts +0 -6
- /package/dist/cjs/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
- /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
|
-
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
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
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
|
182
|
-
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
case types_1.TagConditionOperator.
|
|
203
|
-
return
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
case types_1.TagConditionOperator.
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
227
|
-
const
|
|
228
|
-
const
|
|
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.
|
|
231
|
-
return
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
case types_1.TagConditionOperator.
|
|
237
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
26
|
+
storageManager.setItem(storageKey, newUserId);
|
|
19
27
|
return newUserId;
|
|
20
28
|
}
|
|
21
29
|
}
|
package/dist/cjs/public-api.d.ts
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
|
-
export *
|
|
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
|
+
};
|
package/dist/cjs/public-api.js
CHANGED
|
@@ -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
|
|
14
|
-
|
|
15
|
-
}
|
|
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.
|
|
37
|
-
|
|
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
|
+
}
|