@amplitude/analytics-browser 2.23.7 → 2.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/lib/cjs/config/joined-config.d.ts +14 -1
  3. package/lib/cjs/config/joined-config.d.ts.map +1 -1
  4. package/lib/cjs/config/joined-config.js +93 -19
  5. package/lib/cjs/config/joined-config.js.map +1 -1
  6. package/lib/cjs/config.d.ts +1 -1
  7. package/lib/cjs/default-tracking.d.ts.map +1 -1
  8. package/lib/cjs/default-tracking.js +3 -4
  9. package/lib/cjs/default-tracking.js.map +1 -1
  10. package/lib/cjs/version.d.ts +1 -1
  11. package/lib/cjs/version.js +1 -1
  12. package/lib/cjs/version.js.map +1 -1
  13. package/lib/esm/config/joined-config.d.ts +14 -1
  14. package/lib/esm/config/joined-config.d.ts.map +1 -1
  15. package/lib/esm/config/joined-config.js +94 -20
  16. package/lib/esm/config/joined-config.js.map +1 -1
  17. package/lib/esm/config.d.ts +1 -1
  18. package/lib/esm/default-tracking.d.ts.map +1 -1
  19. package/lib/esm/default-tracking.js +3 -4
  20. package/lib/esm/default-tracking.js.map +1 -1
  21. package/lib/esm/version.d.ts +1 -1
  22. package/lib/esm/version.js +1 -1
  23. package/lib/esm/version.js.map +1 -1
  24. package/lib/scripts/amplitude-bookmarklet-snippet-min.js +1 -1
  25. package/lib/scripts/amplitude-bookmarklet.html +1 -1
  26. package/lib/scripts/amplitude-gtm-min.js +1 -1
  27. package/lib/scripts/amplitude-gtm-min.js.gz +0 -0
  28. package/lib/scripts/amplitude-gtm-min.js.map +1 -1
  29. package/lib/scripts/amplitude-gtm-snippet-min.js +1 -1
  30. package/lib/scripts/amplitude-min.js +1 -1
  31. package/lib/scripts/amplitude-min.js.gz +0 -0
  32. package/lib/scripts/amplitude-min.js.map +1 -1
  33. package/lib/scripts/amplitude-min.umd.js +1 -1
  34. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  35. package/lib/scripts/amplitude-snippet-instructions.html +1 -1
  36. package/lib/scripts/amplitude-snippet-min.js +1 -1
  37. package/lib/scripts/config/joined-config.d.ts +14 -1
  38. package/lib/scripts/config/joined-config.d.ts.map +1 -1
  39. package/lib/scripts/config.d.ts +1 -1
  40. package/lib/scripts/default-tracking.d.ts.map +1 -1
  41. package/lib/scripts/version.d.ts +1 -1
  42. package/package.json +7 -7
package/README.md CHANGED
@@ -53,7 +53,7 @@ This SDK is also available through CDN. Copy the script loader below and paste b
53
53
  <!-- README_SNIPPET_BLOCK -->
54
54
  ```html
55
55
  <script type="text/javascript">
56
- !function(){"use strict";!function(e,t){var r=e.amplitude||{_q:[],_iq:{}};if(r.invoked)e.console&&console.error&&console.error("Amplitude snippet has been loaded.");else{var n=function(e,t){e.prototype[t]=function(){return this._q.push({name:t,args:Array.prototype.slice.call(arguments,0)}),this}},s=function(e,t,r){return function(n){e._q.push({name:t,args:Array.prototype.slice.call(r,0),resolve:n})}},o=function(e,t,r){e[t]=function(){if(r)return{promise:new Promise(s(e,t,Array.prototype.slice.call(arguments)))};!function(e,t,r){e._q.push({name:t,args:Array.prototype.slice.call(r,0)})}(e,t,Array.prototype.slice.call(arguments))}},i=function(e){for(var t=0;t<y.length;t++)o(e,y[t],!1);for(var r=0;r<g.length;r++)o(e,g[r],!0)};r.invoked=!0;var c=t.createElement("script");c.type="text/javascript",c.integrity="sha384-sy02T8BbTcM0HiiSj/+O+v6QubNCIcXDLLjIjIpO8wVNILosyx6JYW+jx8qwkdGP",c.crossOrigin="anonymous",c.async=!0,c.src="https://cdn.amplitude.com/libs/analytics-browser-2.23.7-min.js.gz",c.onload=function(){e.amplitude.runQueuedFunctions||console.log("[Amplitude] Error: could not load SDK")};var a=t.getElementsByTagName("script")[0];a.parentNode.insertBefore(c,a);for(var u=function(){return this._q=[],this},p=["add","append","clearAll","prepend","set","setOnce","unset","preInsert","postInsert","remove","getUserProperties"],l=0;l<p.length;l++)n(u,p[l]);r.Identify=u;for(var d=function(){return this._q=[],this},f=["getEventProperties","setProductId","setQuantity","setPrice","setRevenue","setRevenueType","setReceipt","setReceiptSig","setCurrency","setEventProperties"],v=0;v<f.length;v++)n(d,f[v]);r.Revenue=d;var y=["getDeviceId","setDeviceId","getSessionId","setSessionId","getUserId","setUserId","setOptOut","setTransport","reset","extendSession"],g=["init","add","remove","track","logEvent","identify","groupIdentify","setGroup","revenue","flush"];i(r),r.createInstance=function(e){return r._iq[e]={_q:[]},i(r._iq[e]),r._iq[e]},e.amplitude=r}}(window,document)}();
56
+ !function(){"use strict";!function(e,t){var r=e.amplitude||{_q:[],_iq:{}};if(r.invoked)e.console&&console.error&&console.error("Amplitude snippet has been loaded.");else{var n=function(e,t){e.prototype[t]=function(){return this._q.push({name:t,args:Array.prototype.slice.call(arguments,0)}),this}},s=function(e,t,r){return function(n){e._q.push({name:t,args:Array.prototype.slice.call(r,0),resolve:n})}},o=function(e,t,r){e[t]=function(){if(r)return{promise:new Promise(s(e,t,Array.prototype.slice.call(arguments)))};!function(e,t,r){e._q.push({name:t,args:Array.prototype.slice.call(r,0)})}(e,t,Array.prototype.slice.call(arguments))}},i=function(e){for(var t=0;t<g.length;t++)o(e,g[t],!1);for(var r=0;r<y.length;r++)o(e,y[r],!0)};r.invoked=!0;var a=t.createElement("script");a.type="text/javascript",a.integrity="sha384-g0boD4ZdxQiuRVLIaZBv3B8QFR/0rP6K5M0UnGkGFim0O+cGLKkgoFl3dL0MLax+",a.crossOrigin="anonymous",a.async=!0,a.src="https://cdn.amplitude.com/libs/analytics-browser-2.24.1-min.js.gz",a.onload=function(){e.amplitude.runQueuedFunctions||console.log("[Amplitude] Error: could not load SDK")};var c=t.getElementsByTagName("script")[0];c.parentNode.insertBefore(a,c);for(var u=function(){return this._q=[],this},l=["add","append","clearAll","prepend","set","setOnce","unset","preInsert","postInsert","remove","getUserProperties"],p=0;p<l.length;p++)n(u,l[p]);r.Identify=u;for(var d=function(){return this._q=[],this},f=["getEventProperties","setProductId","setQuantity","setPrice","setRevenue","setRevenueType","setReceipt","setReceiptSig","setCurrency","setEventProperties"],v=0;v<f.length;v++)n(d,f[v]);r.Revenue=d;var g=["getDeviceId","setDeviceId","getSessionId","setSessionId","getUserId","setUserId","setOptOut","setTransport","reset","extendSession"],y=["init","add","remove","track","logEvent","identify","groupIdentify","setGroup","revenue","flush"];i(r),r.createInstance=function(e){return r._iq[e]={_q:[]},i(r._iq[e]),r._iq[e]},e.amplitude=r}}(window,document)}();
57
57
 
58
58
  amplitude.init("<YOUR_API_KEY>");
59
59
  </script>
@@ -1,6 +1,7 @@
1
- import { AutocaptureOptions, type ElementInteractionsOptions, BrowserConfig, RemoteConfig } from '@amplitude/analytics-core';
1
+ import { AutocaptureOptions, type ElementInteractionsOptions, BrowserConfig, RemoteConfig, NetworkTrackingOptions, NetworkCaptureRule } from '@amplitude/analytics-core';
2
2
  export interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {
3
3
  elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;
4
+ networkTracking?: boolean | NetworkTrackingOptionsRemoteConfig;
4
5
  }
5
6
  export interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {
6
7
  /**
@@ -8,6 +9,18 @@ export interface ElementInteractionsOptionsRemoteConfig extends ElementInteracti
8
9
  */
9
10
  pageUrlAllowlistRegex?: string[];
10
11
  }
12
+ export interface NetworkCaptureRuleRemoteConfig extends NetworkCaptureRule {
13
+ /**
14
+ * Related to urls but holds regex strings which will be initialized and appended to urls
15
+ */
16
+ urlsRegex?: string[];
17
+ }
18
+ export interface NetworkTrackingOptionsRemoteConfig extends NetworkTrackingOptions {
19
+ /**
20
+ * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist
21
+ */
22
+ captureRules?: NetworkCaptureRuleRemoteConfig[];
23
+ }
11
24
  /**
12
25
  * Performs a deep transformation of a remote config object so that
13
26
  * it matches the expected schema of the local config.
@@ -1 +1 @@
1
- {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,aAAa,EACb,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,mBAAmB,CAAC,EAAE,OAAO,GAAG,sCAAsC,CAAC;CACxE;AACD,MAAM,WAAW,sCAAuC,SAAQ,0BAA0B;IACxF;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QA2CxE;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CA2FN"}
1
+ {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,mBAAmB,CAAC,EAAE,OAAO,GAAG,sCAAsC,CAAC;IACvE,eAAe,CAAC,EAAE,OAAO,GAAG,kCAAkC,CAAC;CAChE;AACD,MAAM,WAAW,sCAAuC,SAAQ,0BAA0B;IACxF;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kCAAmC,SAAQ,sBAAsB;IAChF;;OAEG;IACH,YAAY,CAAC,EAAE,8BAA8B,EAAE,CAAC;CACjD;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAkExE;AAgBD;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CAqGN"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updateBrowserConfigWithRemoteConfig = exports.translateRemoteConfigToLocal = void 0;
4
4
  var tslib_1 = require("tslib");
5
+ var analytics_core_1 = require("@amplitude/analytics-core");
5
6
  /**
6
7
  * Performs a deep transformation of a remote config object so that
7
8
  * it matches the expected schema of the local config.
@@ -30,7 +31,8 @@ var tslib_1 = require("tslib");
30
31
  * @returns Transformed config object compatible with local schema
31
32
  */
32
33
  function translateRemoteConfigToLocal(config) {
33
- var e_1, _a;
34
+ var e_1, _a, e_2, _b, e_3, _c;
35
+ var _d, _e, _f, _g;
34
36
  // Disabling type checking rules because remote config comes from a remote source
35
37
  // and this function needs to handle any unexpected values
36
38
  /* eslint-disable @typescript-eslint/no-unsafe-member-access,
@@ -82,8 +84,75 @@ function translateRemoteConfigToLocal(config) {
82
84
  }
83
85
  finally { if (e_1) throw e_1.error; }
84
86
  }
87
+ // translate remote responseHeaders and requestHeaders to local responseHeaders and requestHeaders
88
+ try {
89
+ if ((_f = (_e = (_d = config.autocapture) === null || _d === void 0 ? void 0 : _d.networkTracking) === null || _e === void 0 ? void 0 : _e.captureRules) === null || _f === void 0 ? void 0 : _f.length) {
90
+ try {
91
+ for (var _h = tslib_1.__values(config.autocapture.networkTracking.captureRules), _j = _h.next(); !_j.done; _j = _h.next()) {
92
+ var rule = _j.value;
93
+ try {
94
+ for (var _k = (e_3 = void 0, tslib_1.__values(['responseHeaders', 'requestHeaders'])), _l = _k.next(); !_l.done; _l = _k.next()) {
95
+ var header = _l.value;
96
+ var _m = (_g = rule[header]) !== null && _g !== void 0 ? _g : {}, captureSafeHeaders = _m.captureSafeHeaders, allowlist = _m.allowlist;
97
+ if (!captureSafeHeaders && !allowlist) {
98
+ continue;
99
+ }
100
+ // if allowlist is not an array, remote config contract is violated, remove it
101
+ if (allowlist !== undefined && !Array.isArray(allowlist)) {
102
+ delete rule[header];
103
+ continue;
104
+ }
105
+ rule[header] = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read((captureSafeHeaders ? analytics_core_1.SAFE_HEADERS : [])), false), tslib_1.__read((allowlist !== null && allowlist !== void 0 ? allowlist : [])), false);
106
+ }
107
+ }
108
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
109
+ finally {
110
+ try {
111
+ if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
112
+ }
113
+ finally { if (e_3) throw e_3.error; }
114
+ }
115
+ }
116
+ }
117
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
118
+ finally {
119
+ try {
120
+ if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
121
+ }
122
+ finally { if (e_2) throw e_2.error; }
123
+ }
124
+ }
125
+ }
126
+ catch (e) {
127
+ /* istanbul ignore next */
128
+ // surprise exception, so don't translate it
129
+ }
85
130
  }
86
131
  exports.translateRemoteConfigToLocal = translateRemoteConfigToLocal;
132
+ function mergeUrls(urlsExact, urlsRegex, browserConfig) {
133
+ var e_4, _a;
134
+ // Convert string patterns to RegExp objects, warn on invalid patterns and skip them
135
+ var regexList = [];
136
+ try {
137
+ for (var _b = tslib_1.__values(urlsRegex !== null && urlsRegex !== void 0 ? urlsRegex : []), _c = _b.next(); !_c.done; _c = _b.next()) {
138
+ var pattern = _c.value;
139
+ try {
140
+ regexList.push(new RegExp(pattern));
141
+ }
142
+ catch (regexError) {
143
+ browserConfig.loggerProvider.warn("Invalid regex pattern: ".concat(pattern), regexError);
144
+ }
145
+ }
146
+ }
147
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
148
+ finally {
149
+ try {
150
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
151
+ }
152
+ finally { if (e_4) throw e_4.error; }
153
+ }
154
+ return urlsExact.concat(regexList);
155
+ }
87
156
  /**
88
157
  * Updates the browser config in place by applying remote configuration settings.
89
158
  * Primarily merges autocapture settings from the remote config into the browser config.
@@ -92,8 +161,8 @@ exports.translateRemoteConfigToLocal = translateRemoteConfigToLocal;
92
161
  * @param browserConfig - The browser config object to update (modified in place)
93
162
  */
94
163
  function updateBrowserConfigWithRemoteConfig(remoteConfig, browserConfig) {
95
- var e_2, _a;
96
- var _b, _c;
164
+ var e_5, _a;
165
+ var _b, _c, _d, _e, _f;
97
166
  if (!remoteConfig) {
98
167
  return;
99
168
  }
@@ -122,30 +191,35 @@ function updateBrowserConfigWithRemoteConfig(remoteConfig, browserConfig) {
122
191
  ((_b = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex) === null || _b === void 0 ? void 0 : _b.length)) {
123
192
  transformedAutocaptureRemoteConfig.elementInteractions = tslib_1.__assign({}, typedRemoteConfig.autocapture.elementInteractions);
124
193
  var transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;
194
+ // combine exact allow list and regex allow list into just 'pageUrlAllowlist'
125
195
  var exactAllowList = (_c = transformedRcElementInteractions.pageUrlAllowlist) !== null && _c !== void 0 ? _c : [];
126
- // Convert string patterns to RegExp objects, warn on invalid patterns and skip them
127
- var regexList = [];
196
+ var urlsRegex = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex;
197
+ transformedRcElementInteractions.pageUrlAllowlist = mergeUrls(exactAllowList, urlsRegex, browserConfig);
198
+ // clean up the regex allow list
199
+ delete transformedRcElementInteractions.pageUrlAllowlistRegex;
200
+ }
201
+ // Handle Network Tracking config initialization
202
+ if (typeof typedRemoteConfig.autocapture.networkTracking === 'object' &&
203
+ typedRemoteConfig.autocapture.networkTracking !== null &&
204
+ ((_d = typedRemoteConfig.autocapture.networkTracking.captureRules) === null || _d === void 0 ? void 0 : _d.length)) {
205
+ transformedAutocaptureRemoteConfig.networkTracking = tslib_1.__assign({}, typedRemoteConfig.autocapture.networkTracking);
206
+ var transformedRcNetworkTracking = transformedAutocaptureRemoteConfig.networkTracking;
207
+ /* istanbul ignore next */
208
+ var captureRules = (_e = transformedRcNetworkTracking.captureRules) !== null && _e !== void 0 ? _e : [];
128
209
  try {
129
- for (var _d = tslib_1.__values(typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex), _e = _d.next(); !_e.done; _e = _d.next()) {
130
- var pattern = _e.value;
131
- try {
132
- regexList.push(new RegExp(pattern));
133
- }
134
- catch (regexError) {
135
- browserConfig.loggerProvider.warn("Invalid regex pattern: ".concat(pattern), regexError);
136
- }
210
+ for (var captureRules_1 = tslib_1.__values(captureRules), captureRules_1_1 = captureRules_1.next(); !captureRules_1_1.done; captureRules_1_1 = captureRules_1.next()) {
211
+ var rule = captureRules_1_1.value;
212
+ rule.urls = mergeUrls((_f = rule.urls) !== null && _f !== void 0 ? _f : [], rule.urlsRegex, browserConfig);
213
+ delete rule.urlsRegex;
137
214
  }
138
215
  }
139
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
216
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
140
217
  finally {
141
218
  try {
142
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
219
+ if (captureRules_1_1 && !captureRules_1_1.done && (_a = captureRules_1.return)) _a.call(captureRules_1);
143
220
  }
144
- finally { if (e_2) throw e_2.error; }
221
+ finally { if (e_5) throw e_5.error; }
145
222
  }
146
- var combinedPageUrlAllowlist = exactAllowList.concat(regexList);
147
- transformedRcElementInteractions.pageUrlAllowlist = combinedPageUrlAllowlist;
148
- delete transformedRcElementInteractions.pageUrlAllowlistRegex;
149
223
  }
150
224
  if (typeof browserConfig.autocapture === 'boolean') {
151
225
  browserConfig.autocapture = tslib_1.__assign({ attribution: browserConfig.autocapture, fileDownloads: browserConfig.autocapture, formInteractions: browserConfig.autocapture, pageViews: browserConfig.autocapture, sessions: browserConfig.autocapture, elementInteractions: browserConfig.autocapture, webVitals: browserConfig.autocapture, frustrationInteractions: browserConfig.autocapture }, transformedAutocaptureRemoteConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"joined-config.js","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AutocaptureOptions,\n type ElementInteractionsOptions,\n BrowserConfig,\n RemoteConfig,\n} from '@amplitude/analytics-core';\n\nexport interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {\n elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;\n}\nexport interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n pageUrlAllowlistRegex?: string[];\n}\n\n// Type alias for the remote config structure we expect (this is what comes from the filtered browserSDK config)\ntype RemoteConfigBrowserSDK = {\n autocapture?: AutocaptureOptionsRemoteConfig | boolean;\n};\n\n/**\n * Performs a deep transformation of a remote config object so that\n * it matches the expected schema of the local config.\n *\n * Specifically, it normalizes nested `enabled` flags into concise union types.\n *\n * ### Transformation Rules:\n * - If an object has `enabled: true`, it is replaced by the same object without the `enabled` field.\n * - If it has only `enabled: true`, it is replaced with `true`.\n * - If it has `enabled: false`, it is replaced with `false` regardless of other fields.\n *\n * ### Examples:\n * Input: { prop: { enabled: true, hello: 'world' }}\n * Output: { prop: { hello: 'world' } }\n *\n * Input: { prop: { enabled: true }}\n * Output: { prop: true }\n *\n * Input: { prop: { enabled: false, hello: 'world' }}\n * Output: { prop: false }\n *\n * Input: { prop: { hello: 'world' }}\n * Output: { prop: { hello: 'world' } } // No change\n *\n * @param config Remote config object to be transformed\n * @returns Transformed config object compatible with local schema\n */\nexport function translateRemoteConfigToLocal(config?: Record<string, any>) {\n // Disabling type checking rules because remote config comes from a remote source\n // and this function needs to handle any unexpected values\n /* eslint-disable @typescript-eslint/no-unsafe-member-access,\n @typescript-eslint/no-unsafe-assignment,\n @typescript-eslint/no-unsafe-argument\n */\n if (typeof config !== 'object' || config === null) {\n return;\n }\n\n // translations are not applied on array properties\n if (Array.isArray(config)) {\n return;\n }\n\n const propertyNames = Object.keys(config);\n for (const propertyName of propertyNames) {\n try {\n const value = config[propertyName];\n // transform objects with { enabled } property to boolean | object\n if (typeof value?.enabled === 'boolean') {\n if (value.enabled) {\n // if enabled is true, set the value to the rest of the object\n // or true if the object has no other properties\n delete value.enabled;\n if (Object.keys(value).length === 0) {\n (config as any)[propertyName] = true;\n }\n } else {\n // If enabled is false, set the value to false\n (config as any)[propertyName] = false;\n }\n }\n\n // recursively translate properties of the value\n translateRemoteConfigToLocal(value as Record<string, any>);\n } catch (e) {\n // a failure here means that an accessor threw an error\n // so don't translate it\n // TODO(diagnostics): add a diagnostic event for this\n }\n }\n}\n\n/**\n * Updates the browser config in place by applying remote configuration settings.\n * Primarily merges autocapture settings from the remote config into the browser config.\n *\n * @param remoteConfig - The remote configuration to apply, or null if none available\n * @param browserConfig - The browser config object to update (modified in place)\n */\nexport function updateBrowserConfigWithRemoteConfig(\n remoteConfig: RemoteConfig | null,\n browserConfig: BrowserConfig,\n): void {\n if (!remoteConfig) {\n return;\n }\n\n // translate remote config to local compatible format\n translateRemoteConfigToLocal(remoteConfig);\n\n try {\n browserConfig.loggerProvider.debug(\n 'Update browser config with remote configuration:',\n JSON.stringify(remoteConfig),\n );\n\n // type cast error will be thrown if remoteConfig is not a valid RemoteConfigBrowserSDK\n // and it will be caught by the try-catch block\n const typedRemoteConfig = remoteConfig as RemoteConfigBrowserSDK;\n\n // merge remoteConfig.autocapture and browserConfig.autocapture\n // if a field is in remoteConfig.autocapture, use that value\n // if a field is not in remoteConfig.autocapture, use the value from browserConfig.autocapture\n if (typedRemoteConfig && 'autocapture' in typedRemoteConfig) {\n if (typeof typedRemoteConfig.autocapture === 'boolean') {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n if (typeof typedRemoteConfig.autocapture === 'object' && typedRemoteConfig.autocapture !== null) {\n const transformedAutocaptureRemoteConfig = { ...typedRemoteConfig.autocapture };\n\n if (browserConfig.autocapture === undefined) {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n // Handle Element Interactions config initialization\n if (\n typeof typedRemoteConfig.autocapture.elementInteractions === 'object' &&\n typedRemoteConfig.autocapture.elementInteractions !== null &&\n typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex?.length\n ) {\n transformedAutocaptureRemoteConfig.elementInteractions = {\n ...typedRemoteConfig.autocapture.elementInteractions,\n };\n const transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;\n\n const exactAllowList = transformedRcElementInteractions.pageUrlAllowlist ?? [];\n // Convert string patterns to RegExp objects, warn on invalid patterns and skip them\n const regexList = [];\n for (const pattern of typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex) {\n try {\n regexList.push(new RegExp(pattern));\n } catch (regexError) {\n browserConfig.loggerProvider.warn(`Invalid regex pattern: ${pattern}`, regexError);\n }\n }\n\n const combinedPageUrlAllowlist = exactAllowList.concat(regexList);\n\n transformedRcElementInteractions.pageUrlAllowlist = combinedPageUrlAllowlist;\n delete transformedRcElementInteractions.pageUrlAllowlistRegex;\n }\n\n if (typeof browserConfig.autocapture === 'boolean') {\n browserConfig.autocapture = {\n attribution: browserConfig.autocapture,\n fileDownloads: browserConfig.autocapture,\n formInteractions: browserConfig.autocapture,\n pageViews: browserConfig.autocapture,\n sessions: browserConfig.autocapture,\n elementInteractions: browserConfig.autocapture,\n webVitals: browserConfig.autocapture,\n frustrationInteractions: browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n\n if (typeof browserConfig.autocapture === 'object') {\n browserConfig.autocapture = {\n ...browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n }\n\n // Override default tracking options if autocapture is updated by remote config\n browserConfig.defaultTracking = browserConfig.autocapture;\n }\n\n browserConfig.loggerProvider.debug('Browser config after remote config update:', JSON.stringify(browserConfig));\n } catch (e) {\n browserConfig.loggerProvider.error('Failed to apply remote configuration because of error: ', e);\n }\n}\n"]}
1
+ {"version":3,"file":"joined-config.js","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":";;;;AAAA,4DAQmC;AAgCnC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,4BAA4B,CAAC,MAA4B;;;IACvE,iFAAiF;IACjF,0DAA0D;IAC1D;;;KAGC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;QACjD,OAAO;KACR;IAED,mDAAmD;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO;KACR;IAED,IAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;QAC1C,KAA2B,IAAA,kBAAA,iBAAA,aAAa,CAAA,4CAAA,uEAAE;YAArC,IAAM,YAAY,0BAAA;YACrB,IAAI;gBACF,IAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;gBACnC,kEAAkE;gBAClE,IAAI,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAA,KAAK,SAAS,EAAE;oBACvC,IAAI,KAAK,CAAC,OAAO,EAAE;wBACjB,8DAA8D;wBAC9D,gDAAgD;wBAChD,OAAO,KAAK,CAAC,OAAO,CAAC;wBACrB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;4BAClC,MAAc,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;yBACtC;qBACF;yBAAM;wBACL,8CAA8C;wBAC7C,MAAc,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;qBACvC;iBACF;gBAED,gDAAgD;gBAChD,4BAA4B,CAAC,KAA4B,CAAC,CAAC;aAC5D;YAAC,OAAO,CAAC,EAAE;gBACV,uDAAuD;gBACvD,wBAAwB;gBACxB,qDAAqD;aACtD;SACF;;;;;;;;;IAED,kGAAkG;IAClG,IAAI;QACF,IAAI,MAAA,MAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,eAAe,0CAAE,YAAY,0CAAE,MAAM,EAAE;;gBAC7D,KAAmB,IAAA,KAAA,iBAAA,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,CAAA,gBAAA,4BAAE;oBAA/D,IAAM,IAAI,WAAA;;wBACb,KAAqB,IAAA,oBAAA,iBAAA,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAA,CAAA,gBAAA,4BAAE;4BAAvD,IAAM,MAAM,WAAA;4BACT,IAAA,KAAoC,MAAA,IAAI,CAAC,MAAM,CAAC,mCAAI,EAAE,EAApD,kBAAkB,wBAAA,EAAE,SAAS,eAAuB,CAAC;4BAC7D,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE;gCACrC,SAAS;6BACV;4BACD,8EAA8E;4BAC9E,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gCACxD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;gCACpB,SAAS;6BACV;4BACD,IAAI,CAAC,MAAM,CAAC,kEAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,6BAAY,CAAC,CAAC,CAAC,EAAE,CAAC,0BAAK,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,SAAC,CAAC;yBACpF;;;;;;;;;iBACF;;;;;;;;;SACF;KACF;IAAC,OAAO,CAAC,EAAE;QACV,0BAA0B;QAC1B,4CAA4C;KAC7C;AACH,CAAC;AAlED,oEAkEC;AAED,SAAS,SAAS,CAAC,SAA8B,EAAE,SAA+B,EAAE,aAA4B;;IAC9G,oFAAoF;IACpF,IAAM,SAAS,GAAG,EAAE,CAAC;;QACrB,KAAsB,IAAA,KAAA,iBAAA,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAA,gBAAA,4BAAE;YAAlC,IAAM,OAAO,WAAA;YAChB,IAAI;gBACF,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;aACrC;YAAC,OAAO,UAAU,EAAE;gBACnB,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,iCAA0B,OAAO,CAAE,EAAE,UAAU,CAAC,CAAC;aACpF;SACF;;;;;;;;;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mCAAmC,CACjD,YAAiC,EACjC,aAA4B;;;IAE5B,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO;KACR;IAED,qDAAqD;IACrD,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAE3C,IAAI;QACF,aAAa,CAAC,cAAc,CAAC,KAAK,CAChC,kDAAkD,EAClD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAC7B,CAAC;QAEF,uFAAuF;QACvF,+CAA+C;QAC/C,IAAM,iBAAiB,GAAG,YAAsC,CAAC;QAEjE,+DAA+D;QAC/D,4DAA4D;QAC5D,8FAA8F;QAC9F,IAAI,iBAAiB,IAAI,aAAa,IAAI,iBAAiB,EAAE;YAC3D,IAAI,OAAO,iBAAiB,CAAC,WAAW,KAAK,SAAS,EAAE;gBACtD,aAAa,CAAC,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC;aAC3D;YAED,IAAI,OAAO,iBAAiB,CAAC,WAAW,KAAK,QAAQ,IAAI,iBAAiB,CAAC,WAAW,KAAK,IAAI,EAAE;gBAC/F,IAAM,kCAAkC,wBAAQ,iBAAiB,CAAC,WAAW,CAAE,CAAC;gBAEhF,IAAI,aAAa,CAAC,WAAW,KAAK,SAAS,EAAE;oBAC3C,aAAa,CAAC,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC;iBAC3D;gBAED,oDAAoD;gBACpD,IACE,OAAO,iBAAiB,CAAC,WAAW,CAAC,mBAAmB,KAAK,QAAQ;oBACrE,iBAAiB,CAAC,WAAW,CAAC,mBAAmB,KAAK,IAAI;qBAC1D,MAAA,iBAAiB,CAAC,WAAW,CAAC,mBAAmB,CAAC,qBAAqB,0CAAE,MAAM,CAAA,EAC/E;oBACA,kCAAkC,CAAC,mBAAmB,wBACjD,iBAAiB,CAAC,WAAW,CAAC,mBAAmB,CACrD,CAAC;oBACF,IAAM,gCAAgC,GAAG,kCAAkC,CAAC,mBAAmB,CAAC;oBAEhG,6EAA6E;oBAC7E,IAAM,cAAc,GAAG,MAAA,gCAAgC,CAAC,gBAAgB,mCAAI,EAAE,CAAC;oBAC/E,IAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,CAAC,mBAAmB,CAAC,qBAAqB,CAAC;oBAC1F,gCAAgC,CAAC,gBAAgB,GAAG,SAAS,CAAC,cAAc,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;oBAExG,gCAAgC;oBAChC,OAAO,gCAAgC,CAAC,qBAAqB,CAAC;iBAC/D;gBAED,gDAAgD;gBAChD,IACE,OAAO,iBAAiB,CAAC,WAAW,CAAC,eAAe,KAAK,QAAQ;oBACjE,iBAAiB,CAAC,WAAW,CAAC,eAAe,KAAK,IAAI;qBACtD,MAAA,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC,YAAY,0CAAE,MAAM,CAAA,EAClE;oBACA,kCAAkC,CAAC,eAAe,wBAC7C,iBAAiB,CAAC,WAAW,CAAC,eAAe,CACjD,CAAC;oBACF,IAAM,4BAA4B,GAAG,kCAAkC,CAAC,eAAe,CAAC;oBACxF,0BAA0B;oBAC1B,IAAM,YAAY,GAAG,MAAA,4BAA4B,CAAC,YAAY,mCAAI,EAAE,CAAC;;wBACrE,KAAmB,IAAA,iBAAA,iBAAA,YAAY,CAAA,0CAAA,oEAAE;4BAA5B,IAAM,IAAI,yBAAA;4BACb,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;4BACtE,OAAO,IAAI,CAAC,SAAS,CAAC;yBACvB;;;;;;;;;iBACF;gBAED,IAAI,OAAO,aAAa,CAAC,WAAW,KAAK,SAAS,EAAE;oBAClD,aAAa,CAAC,WAAW,sBACvB,WAAW,EAAE,aAAa,CAAC,WAAW,EACtC,aAAa,EAAE,aAAa,CAAC,WAAW,EACxC,gBAAgB,EAAE,aAAa,CAAC,WAAW,EAC3C,SAAS,EAAE,aAAa,CAAC,WAAW,EACpC,QAAQ,EAAE,aAAa,CAAC,WAAW,EACnC,mBAAmB,EAAE,aAAa,CAAC,WAAW,EAC9C,SAAS,EAAE,aAAa,CAAC,WAAW,EACpC,uBAAuB,EAAE,aAAa,CAAC,WAAW,IAC/C,kCAAkC,CACtC,CAAC;iBACH;gBAED,IAAI,OAAO,aAAa,CAAC,WAAW,KAAK,QAAQ,EAAE;oBACjD,aAAa,CAAC,WAAW,yCACpB,aAAa,CAAC,WAAW,GACzB,kCAAkC,CACtC,CAAC;iBACH;aACF;YAED,+EAA+E;YAC/E,aAAa,CAAC,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;SAC3D;QAED,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,4CAA4C,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;KACjH;IAAC,OAAO,CAAC,EAAE;QACV,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,CAAC,CAAC;KAClG;AACH,CAAC;AAxGD,kFAwGC","sourcesContent":["import {\n AutocaptureOptions,\n type ElementInteractionsOptions,\n BrowserConfig,\n RemoteConfig,\n NetworkTrackingOptions,\n NetworkCaptureRule,\n SAFE_HEADERS,\n} from '@amplitude/analytics-core';\n\nexport interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {\n elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;\n networkTracking?: boolean | NetworkTrackingOptionsRemoteConfig;\n}\nexport interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n pageUrlAllowlistRegex?: string[];\n}\n\nexport interface NetworkCaptureRuleRemoteConfig extends NetworkCaptureRule {\n /**\n * Related to urls but holds regex strings which will be initialized and appended to urls\n */\n urlsRegex?: string[];\n}\n\nexport interface NetworkTrackingOptionsRemoteConfig extends NetworkTrackingOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n captureRules?: NetworkCaptureRuleRemoteConfig[];\n}\n\n// Type alias for the remote config structure we expect (this is what comes from the filtered browserSDK config)\ntype RemoteConfigBrowserSDK = {\n autocapture?: AutocaptureOptionsRemoteConfig | boolean;\n};\n\n/**\n * Performs a deep transformation of a remote config object so that\n * it matches the expected schema of the local config.\n *\n * Specifically, it normalizes nested `enabled` flags into concise union types.\n *\n * ### Transformation Rules:\n * - If an object has `enabled: true`, it is replaced by the same object without the `enabled` field.\n * - If it has only `enabled: true`, it is replaced with `true`.\n * - If it has `enabled: false`, it is replaced with `false` regardless of other fields.\n *\n * ### Examples:\n * Input: { prop: { enabled: true, hello: 'world' }}\n * Output: { prop: { hello: 'world' } }\n *\n * Input: { prop: { enabled: true }}\n * Output: { prop: true }\n *\n * Input: { prop: { enabled: false, hello: 'world' }}\n * Output: { prop: false }\n *\n * Input: { prop: { hello: 'world' }}\n * Output: { prop: { hello: 'world' } } // No change\n *\n * @param config Remote config object to be transformed\n * @returns Transformed config object compatible with local schema\n */\nexport function translateRemoteConfigToLocal(config?: Record<string, any>) {\n // Disabling type checking rules because remote config comes from a remote source\n // and this function needs to handle any unexpected values\n /* eslint-disable @typescript-eslint/no-unsafe-member-access,\n @typescript-eslint/no-unsafe-assignment,\n @typescript-eslint/no-unsafe-argument\n */\n if (typeof config !== 'object' || config === null) {\n return;\n }\n\n // translations are not applied on array properties\n if (Array.isArray(config)) {\n return;\n }\n\n const propertyNames = Object.keys(config);\n for (const propertyName of propertyNames) {\n try {\n const value = config[propertyName];\n // transform objects with { enabled } property to boolean | object\n if (typeof value?.enabled === 'boolean') {\n if (value.enabled) {\n // if enabled is true, set the value to the rest of the object\n // or true if the object has no other properties\n delete value.enabled;\n if (Object.keys(value).length === 0) {\n (config as any)[propertyName] = true;\n }\n } else {\n // If enabled is false, set the value to false\n (config as any)[propertyName] = false;\n }\n }\n\n // recursively translate properties of the value\n translateRemoteConfigToLocal(value as Record<string, any>);\n } catch (e) {\n // a failure here means that an accessor threw an error\n // so don't translate it\n // TODO(diagnostics): add a diagnostic event for this\n }\n }\n\n // translate remote responseHeaders and requestHeaders to local responseHeaders and requestHeaders\n try {\n if (config.autocapture?.networkTracking?.captureRules?.length) {\n for (const rule of config.autocapture.networkTracking.captureRules) {\n for (const header of ['responseHeaders', 'requestHeaders']) {\n const { captureSafeHeaders, allowlist } = rule[header] ?? {};\n if (!captureSafeHeaders && !allowlist) {\n continue;\n }\n // if allowlist is not an array, remote config contract is violated, remove it\n if (allowlist !== undefined && !Array.isArray(allowlist)) {\n delete rule[header];\n continue;\n }\n rule[header] = [...(captureSafeHeaders ? SAFE_HEADERS : []), ...(allowlist ?? [])];\n }\n }\n }\n } catch (e) {\n /* istanbul ignore next */\n // surprise exception, so don't translate it\n }\n}\n\nfunction mergeUrls(urlsExact: (string | RegExp)[], urlsRegex: string[] | undefined, browserConfig: BrowserConfig) {\n // Convert string patterns to RegExp objects, warn on invalid patterns and skip them\n const regexList = [];\n for (const pattern of urlsRegex ?? []) {\n try {\n regexList.push(new RegExp(pattern));\n } catch (regexError) {\n browserConfig.loggerProvider.warn(`Invalid regex pattern: ${pattern}`, regexError);\n }\n }\n\n return urlsExact.concat(regexList);\n}\n\n/**\n * Updates the browser config in place by applying remote configuration settings.\n * Primarily merges autocapture settings from the remote config into the browser config.\n *\n * @param remoteConfig - The remote configuration to apply, or null if none available\n * @param browserConfig - The browser config object to update (modified in place)\n */\nexport function updateBrowserConfigWithRemoteConfig(\n remoteConfig: RemoteConfig | null,\n browserConfig: BrowserConfig,\n): void {\n if (!remoteConfig) {\n return;\n }\n\n // translate remote config to local compatible format\n translateRemoteConfigToLocal(remoteConfig);\n\n try {\n browserConfig.loggerProvider.debug(\n 'Update browser config with remote configuration:',\n JSON.stringify(remoteConfig),\n );\n\n // type cast error will be thrown if remoteConfig is not a valid RemoteConfigBrowserSDK\n // and it will be caught by the try-catch block\n const typedRemoteConfig = remoteConfig as RemoteConfigBrowserSDK;\n\n // merge remoteConfig.autocapture and browserConfig.autocapture\n // if a field is in remoteConfig.autocapture, use that value\n // if a field is not in remoteConfig.autocapture, use the value from browserConfig.autocapture\n if (typedRemoteConfig && 'autocapture' in typedRemoteConfig) {\n if (typeof typedRemoteConfig.autocapture === 'boolean') {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n if (typeof typedRemoteConfig.autocapture === 'object' && typedRemoteConfig.autocapture !== null) {\n const transformedAutocaptureRemoteConfig = { ...typedRemoteConfig.autocapture };\n\n if (browserConfig.autocapture === undefined) {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n // Handle Element Interactions config initialization\n if (\n typeof typedRemoteConfig.autocapture.elementInteractions === 'object' &&\n typedRemoteConfig.autocapture.elementInteractions !== null &&\n typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex?.length\n ) {\n transformedAutocaptureRemoteConfig.elementInteractions = {\n ...typedRemoteConfig.autocapture.elementInteractions,\n };\n const transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;\n\n // combine exact allow list and regex allow list into just 'pageUrlAllowlist'\n const exactAllowList = transformedRcElementInteractions.pageUrlAllowlist ?? [];\n const urlsRegex = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex;\n transformedRcElementInteractions.pageUrlAllowlist = mergeUrls(exactAllowList, urlsRegex, browserConfig);\n\n // clean up the regex allow list\n delete transformedRcElementInteractions.pageUrlAllowlistRegex;\n }\n\n // Handle Network Tracking config initialization\n if (\n typeof typedRemoteConfig.autocapture.networkTracking === 'object' &&\n typedRemoteConfig.autocapture.networkTracking !== null &&\n typedRemoteConfig.autocapture.networkTracking.captureRules?.length\n ) {\n transformedAutocaptureRemoteConfig.networkTracking = {\n ...typedRemoteConfig.autocapture.networkTracking,\n };\n const transformedRcNetworkTracking = transformedAutocaptureRemoteConfig.networkTracking;\n /* istanbul ignore next */\n const captureRules = transformedRcNetworkTracking.captureRules ?? [];\n for (const rule of captureRules) {\n rule.urls = mergeUrls(rule.urls ?? [], rule.urlsRegex, browserConfig);\n delete rule.urlsRegex;\n }\n }\n\n if (typeof browserConfig.autocapture === 'boolean') {\n browserConfig.autocapture = {\n attribution: browserConfig.autocapture,\n fileDownloads: browserConfig.autocapture,\n formInteractions: browserConfig.autocapture,\n pageViews: browserConfig.autocapture,\n sessions: browserConfig.autocapture,\n elementInteractions: browserConfig.autocapture,\n webVitals: browserConfig.autocapture,\n frustrationInteractions: browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n\n if (typeof browserConfig.autocapture === 'object') {\n browserConfig.autocapture = {\n ...browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n }\n\n // Override default tracking options if autocapture is updated by remote config\n browserConfig.defaultTracking = browserConfig.autocapture;\n }\n\n browserConfig.loggerProvider.debug('Browser config after remote config update:', JSON.stringify(browserConfig));\n } catch (e) {\n browserConfig.loggerProvider.error('Failed to apply remote configuration because of error: ', e);\n }\n}\n"]}
@@ -31,7 +31,7 @@ export declare class BrowserConfig extends Config implements IBrowserConfig {
31
31
  useBatch: boolean;
32
32
  fetchRemoteConfig: boolean;
33
33
  networkTrackingOptions?: NetworkTrackingOptions | undefined;
34
- readonly version = "2.23.7";
34
+ readonly version = "2.24.1";
35
35
  protected _cookieStorage: Storage<UserSession>;
36
36
  protected _deviceId?: string;
37
37
  protected _lastEventId?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"default-tracking.d.ts","sourceRoot":"","sources":["../../src/default-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EAEnB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,2BAA2B,CAAC;AA8BnC,eAAO,MAAM,4BAA4B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YACnD,CAAC;AAEhD,eAAO,MAAM,6BAA6B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAElD,eAAO,MAAM,gCAAgC,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAErD,eAAO,MAAM,yBAAyB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAE9C,eAAO,MAAM,wBAAwB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAS7F,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAapG,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAW1F,CAAC;AAEF,eAAO,MAAM,gCAAgC,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAcxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAAY,cAAc,KAAG,0BAA0B,GAAG,SASlG,CAAC;AAEF,eAAO,MAAM,gCAAgC,WACnC,cAAc,KACrB,8BAA8B,GAAG,SASnC,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAAY,cAAc,KAAG,sBAAsB,GAAG,SA2B1F,CAAC;AAEF,eAAO,MAAM,yBAAyB,WAAY,cAAc,KAAG,mBAqClE,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAAY,cAAc,KAAG,kBAcrE,CAAC"}
1
+ {"version":3,"file":"default-tracking.d.ts","sourceRoot":"","sources":["../../src/default-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EAEnB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,2BAA2B,CAAC;AA8BnC,eAAO,MAAM,4BAA4B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YACnD,CAAC;AAEhD,eAAO,MAAM,6BAA6B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAElD,eAAO,MAAM,gCAAgC,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAErD,eAAO,MAAM,yBAAyB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAE9C,eAAO,MAAM,wBAAwB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAClD,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,YAS7F,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAapG,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAW1F,CAAC;AAEF,eAAO,MAAM,gCAAgC,gBAAiB,kBAAkB,GAAG,OAAO,GAAG,SAAS,KAAG,OAaxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAAY,cAAc,KAAG,0BAA0B,GAAG,SASlG,CAAC;AAEF,eAAO,MAAM,gCAAgC,WACnC,cAAc,KACrB,8BAA8B,GAAG,SASnC,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAAY,cAAc,KAAG,sBAAsB,GAAG,SA2B1F,CAAC;AAEF,eAAO,MAAM,yBAAyB,WAAY,cAAc,KAAG,mBAqClE,CAAC;AAEF,eAAO,MAAM,4BAA4B,WAAY,cAAc,KAAG,kBAcrE,CAAC"}
@@ -85,10 +85,9 @@ var isWebVitalsEnabled = function (autocapture) {
85
85
  };
86
86
  exports.isWebVitalsEnabled = isWebVitalsEnabled;
87
87
  var isFrustrationInteractionsEnabled = function (autocapture) {
88
- // TODO restore this if statement when frustrationInteractions is GA
89
- // if (typeof autocapture === 'boolean') {
90
- // return autocapture;
91
- // }
88
+ if (typeof autocapture === 'boolean') {
89
+ return autocapture;
90
+ }
92
91
  if (typeof autocapture === 'object' &&
93
92
  (autocapture.frustrationInteractions === true || typeof autocapture.frustrationInteractions === 'object')) {
94
93
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"default-tracking.js","sourceRoot":"","sources":["../../src/default-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PageTrackingHistoryChanges,\n PageTrackingOptions,\n PageTrackingTrackOn,\n ElementInteractionsOptions,\n BrowserOptions,\n AutocaptureOptions,\n AttributionOptions,\n NetworkTrackingOptions,\n FrustrationInteractionsOptions,\n} from '@amplitude/analytics-core';\n\n/**\n * A subset of AutocaptureOptions that includes the autocapture features that\n * are made available to users by default (even if \"config.autocapture === undefined\")\n */\ntype AutocaptureOptionsDefaultAvailable = Pick<\n AutocaptureOptions,\n 'pageViews' | 'sessions' | 'fileDownloads' | 'formInteractions' | 'attribution'\n>;\n\n/**\n * Returns false if autocapture === false or if autocapture[event],\n * otherwise returns true (even if \"config.autocapture === undefined\")\n */\nconst isTrackingEnabled = (\n autocapture: AutocaptureOptionsDefaultAvailable | boolean | undefined,\n event: keyof AutocaptureOptionsDefaultAvailable,\n) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (autocapture?.[event] === false) {\n return false;\n }\n\n return true;\n};\n\nexport const isAttributionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'attribution');\n\nexport const isFileDownloadTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'fileDownloads');\n\nexport const isFormInteractionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'formInteractions');\n\nexport const isPageViewTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageViews');\n\nexport const isSessionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'sessions');\n\n/**\n * Returns true if\n * 1. if autocapture.networkTracking === true\n * 2. if autocapture.networkTracking === object\n * otherwise returns false\n */\nexport const isNetworkTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) => {\n if (\n typeof autocapture === 'object' &&\n (autocapture.networkTracking === true || typeof autocapture.networkTracking === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.elementInteractions === true\n * 3. if autocapture.elementInteractions === object\n * otherwise returns false\n */\nexport const isElementInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.elementInteractions === true || typeof autocapture.elementInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.webVitals === true\n * otherwise returns false\n */\nexport const isWebVitalsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n // TODO restore this if statement when webVitals is GA\n // if (typeof autocapture === 'boolean') {\n // return autocapture;\n // }\n\n if (typeof autocapture === 'object' && autocapture.webVitals === true) {\n return true;\n }\n\n return false;\n};\n\nexport const isFrustrationInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n // TODO restore this if statement when frustrationInteractions is GA\n // if (typeof autocapture === 'boolean') {\n // return autocapture;\n // }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.frustrationInteractions === true || typeof autocapture.frustrationInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const getElementInteractionsConfig = (config: BrowserOptions): ElementInteractionsOptions | undefined => {\n if (\n isElementInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.elementInteractions === 'object'\n ) {\n return config.autocapture.elementInteractions;\n }\n return undefined;\n};\n\nexport const getFrustrationInteractionsConfig = (\n config: BrowserOptions,\n): FrustrationInteractionsOptions | undefined => {\n if (\n isFrustrationInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.frustrationInteractions === 'object'\n ) {\n return config.autocapture.frustrationInteractions;\n }\n return undefined;\n};\n\nexport const getNetworkTrackingConfig = (config: BrowserOptions): NetworkTrackingOptions | undefined => {\n if (isNetworkTrackingEnabled(config.autocapture)) {\n let networkTrackingConfig;\n if (typeof config.autocapture === 'object' && typeof config.autocapture.networkTracking === 'object') {\n networkTrackingConfig = config.autocapture.networkTracking;\n } else if (config.networkTrackingOptions) {\n networkTrackingConfig = config.networkTrackingOptions;\n }\n return {\n ...networkTrackingConfig,\n captureRules: networkTrackingConfig?.captureRules?.map((rule) => {\n // if URLs and hosts are both set, URLs take precedence over hosts\n if (rule.urls && rule.hosts) {\n const hostsString = JSON.stringify(rule.hosts);\n const urlsString = JSON.stringify(rule.urls);\n /* istanbul ignore next */\n config.loggerProvider?.warn(\n `Found network capture rule with both urls='${urlsString}' and hosts='${hostsString}' set. ` +\n `Definition of urls takes precedence over hosts, so ignoring hosts.`,\n );\n return { ...rule, hosts: undefined };\n }\n return rule;\n }),\n };\n }\n return;\n};\n\nexport const getPageViewTrackingConfig = (config: BrowserOptions): PageTrackingOptions => {\n let trackOn: PageTrackingTrackOn | undefined = () => false;\n let trackHistoryChanges: PageTrackingHistoryChanges | undefined = undefined;\n let eventType: string | undefined;\n const pageCounter = config.pageCounter;\n\n const isDefaultPageViewTrackingEnabled = isPageViewTrackingEnabled(config.defaultTracking);\n if (isDefaultPageViewTrackingEnabled) {\n trackOn = undefined;\n eventType = undefined;\n\n if (\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.pageViews &&\n typeof config.defaultTracking.pageViews === 'object'\n ) {\n if ('trackOn' in config.defaultTracking.pageViews) {\n trackOn = config.defaultTracking.pageViews.trackOn;\n }\n\n if ('trackHistoryChanges' in config.defaultTracking.pageViews) {\n trackHistoryChanges = config.defaultTracking.pageViews.trackHistoryChanges;\n }\n\n if ('eventType' in config.defaultTracking.pageViews && config.defaultTracking.pageViews.eventType) {\n eventType = config.defaultTracking.pageViews.eventType;\n }\n }\n }\n\n return {\n trackOn,\n trackHistoryChanges,\n eventType,\n pageCounter,\n };\n};\n\nexport const getAttributionTrackingConfig = (config: BrowserOptions): AttributionOptions => {\n if (\n isAttributionTrackingEnabled(config.defaultTracking) &&\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.attribution &&\n typeof config.defaultTracking.attribution === 'object'\n ) {\n return {\n ...config.defaultTracking.attribution,\n };\n }\n\n return {};\n};\n"]}
1
+ {"version":3,"file":"default-tracking.js","sourceRoot":"","sources":["../../src/default-tracking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PageTrackingHistoryChanges,\n PageTrackingOptions,\n PageTrackingTrackOn,\n ElementInteractionsOptions,\n BrowserOptions,\n AutocaptureOptions,\n AttributionOptions,\n NetworkTrackingOptions,\n FrustrationInteractionsOptions,\n} from '@amplitude/analytics-core';\n\n/**\n * A subset of AutocaptureOptions that includes the autocapture features that\n * are made available to users by default (even if \"config.autocapture === undefined\")\n */\ntype AutocaptureOptionsDefaultAvailable = Pick<\n AutocaptureOptions,\n 'pageViews' | 'sessions' | 'fileDownloads' | 'formInteractions' | 'attribution'\n>;\n\n/**\n * Returns false if autocapture === false or if autocapture[event],\n * otherwise returns true (even if \"config.autocapture === undefined\")\n */\nconst isTrackingEnabled = (\n autocapture: AutocaptureOptionsDefaultAvailable | boolean | undefined,\n event: keyof AutocaptureOptionsDefaultAvailable,\n) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (autocapture?.[event] === false) {\n return false;\n }\n\n return true;\n};\n\nexport const isAttributionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'attribution');\n\nexport const isFileDownloadTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'fileDownloads');\n\nexport const isFormInteractionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'formInteractions');\n\nexport const isPageViewTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageViews');\n\nexport const isSessionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'sessions');\n\n/**\n * Returns true if\n * 1. if autocapture.networkTracking === true\n * 2. if autocapture.networkTracking === object\n * otherwise returns false\n */\nexport const isNetworkTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) => {\n if (\n typeof autocapture === 'object' &&\n (autocapture.networkTracking === true || typeof autocapture.networkTracking === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.elementInteractions === true\n * 3. if autocapture.elementInteractions === object\n * otherwise returns false\n */\nexport const isElementInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.elementInteractions === true || typeof autocapture.elementInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.webVitals === true\n * otherwise returns false\n */\nexport const isWebVitalsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n // TODO restore this if statement when webVitals is GA\n // if (typeof autocapture === 'boolean') {\n // return autocapture;\n // }\n\n if (typeof autocapture === 'object' && autocapture.webVitals === true) {\n return true;\n }\n\n return false;\n};\n\nexport const isFrustrationInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.frustrationInteractions === true || typeof autocapture.frustrationInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const getElementInteractionsConfig = (config: BrowserOptions): ElementInteractionsOptions | undefined => {\n if (\n isElementInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.elementInteractions === 'object'\n ) {\n return config.autocapture.elementInteractions;\n }\n return undefined;\n};\n\nexport const getFrustrationInteractionsConfig = (\n config: BrowserOptions,\n): FrustrationInteractionsOptions | undefined => {\n if (\n isFrustrationInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.frustrationInteractions === 'object'\n ) {\n return config.autocapture.frustrationInteractions;\n }\n return undefined;\n};\n\nexport const getNetworkTrackingConfig = (config: BrowserOptions): NetworkTrackingOptions | undefined => {\n if (isNetworkTrackingEnabled(config.autocapture)) {\n let networkTrackingConfig;\n if (typeof config.autocapture === 'object' && typeof config.autocapture.networkTracking === 'object') {\n networkTrackingConfig = config.autocapture.networkTracking;\n } else if (config.networkTrackingOptions) {\n networkTrackingConfig = config.networkTrackingOptions;\n }\n return {\n ...networkTrackingConfig,\n captureRules: networkTrackingConfig?.captureRules?.map((rule) => {\n // if URLs and hosts are both set, URLs take precedence over hosts\n if (rule.urls && rule.hosts) {\n const hostsString = JSON.stringify(rule.hosts);\n const urlsString = JSON.stringify(rule.urls);\n /* istanbul ignore next */\n config.loggerProvider?.warn(\n `Found network capture rule with both urls='${urlsString}' and hosts='${hostsString}' set. ` +\n `Definition of urls takes precedence over hosts, so ignoring hosts.`,\n );\n return { ...rule, hosts: undefined };\n }\n return rule;\n }),\n };\n }\n return;\n};\n\nexport const getPageViewTrackingConfig = (config: BrowserOptions): PageTrackingOptions => {\n let trackOn: PageTrackingTrackOn | undefined = () => false;\n let trackHistoryChanges: PageTrackingHistoryChanges | undefined = undefined;\n let eventType: string | undefined;\n const pageCounter = config.pageCounter;\n\n const isDefaultPageViewTrackingEnabled = isPageViewTrackingEnabled(config.defaultTracking);\n if (isDefaultPageViewTrackingEnabled) {\n trackOn = undefined;\n eventType = undefined;\n\n if (\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.pageViews &&\n typeof config.defaultTracking.pageViews === 'object'\n ) {\n if ('trackOn' in config.defaultTracking.pageViews) {\n trackOn = config.defaultTracking.pageViews.trackOn;\n }\n\n if ('trackHistoryChanges' in config.defaultTracking.pageViews) {\n trackHistoryChanges = config.defaultTracking.pageViews.trackHistoryChanges;\n }\n\n if ('eventType' in config.defaultTracking.pageViews && config.defaultTracking.pageViews.eventType) {\n eventType = config.defaultTracking.pageViews.eventType;\n }\n }\n }\n\n return {\n trackOn,\n trackHistoryChanges,\n eventType,\n pageCounter,\n };\n};\n\nexport const getAttributionTrackingConfig = (config: BrowserOptions): AttributionOptions => {\n if (\n isAttributionTrackingEnabled(config.defaultTracking) &&\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.attribution &&\n typeof config.defaultTracking.attribution === 'object'\n ) {\n return {\n ...config.defaultTracking.attribution,\n };\n }\n\n return {};\n};\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "2.23.7";
1
+ export declare const VERSION = "2.24.1";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '2.23.7';
4
+ exports.VERSION = '2.24.1';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '2.23.7';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '2.24.1';\n"]}
@@ -1,6 +1,7 @@
1
- import { AutocaptureOptions, type ElementInteractionsOptions, BrowserConfig, RemoteConfig } from '@amplitude/analytics-core';
1
+ import { AutocaptureOptions, type ElementInteractionsOptions, BrowserConfig, RemoteConfig, NetworkTrackingOptions, NetworkCaptureRule } from '@amplitude/analytics-core';
2
2
  export interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {
3
3
  elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;
4
+ networkTracking?: boolean | NetworkTrackingOptionsRemoteConfig;
4
5
  }
5
6
  export interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {
6
7
  /**
@@ -8,6 +9,18 @@ export interface ElementInteractionsOptionsRemoteConfig extends ElementInteracti
8
9
  */
9
10
  pageUrlAllowlistRegex?: string[];
10
11
  }
12
+ export interface NetworkCaptureRuleRemoteConfig extends NetworkCaptureRule {
13
+ /**
14
+ * Related to urls but holds regex strings which will be initialized and appended to urls
15
+ */
16
+ urlsRegex?: string[];
17
+ }
18
+ export interface NetworkTrackingOptionsRemoteConfig extends NetworkTrackingOptions {
19
+ /**
20
+ * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist
21
+ */
22
+ captureRules?: NetworkCaptureRuleRemoteConfig[];
23
+ }
11
24
  /**
12
25
  * Performs a deep transformation of a remote config object so that
13
26
  * it matches the expected schema of the local config.
@@ -1 +1 @@
1
- {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,aAAa,EACb,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,mBAAmB,CAAC,EAAE,OAAO,GAAG,sCAAsC,CAAC;CACxE;AACD,MAAM,WAAW,sCAAuC,SAAQ,0BAA0B;IACxF;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QA2CxE;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CA2FN"}
1
+ {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE,mBAAmB,CAAC,EAAE,OAAO,GAAG,sCAAsC,CAAC;IACvE,eAAe,CAAC,EAAE,OAAO,GAAG,kCAAkC,CAAC;CAChE;AACD,MAAM,WAAW,sCAAuC,SAAQ,0BAA0B;IACxF;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,8BAA+B,SAAQ,kBAAkB;IACxE;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kCAAmC,SAAQ,sBAAsB;IAChF;;OAEG;IACH,YAAY,CAAC,EAAE,8BAA8B,EAAE,CAAC;CACjD;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAkExE;AAgBD;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CAqGN"}
@@ -1,4 +1,5 @@
1
- import { __assign, __values } from "tslib";
1
+ import { __assign, __read, __spreadArray, __values } from "tslib";
2
+ import { SAFE_HEADERS, } from '@amplitude/analytics-core';
2
3
  /**
3
4
  * Performs a deep transformation of a remote config object so that
4
5
  * it matches the expected schema of the local config.
@@ -27,7 +28,8 @@ import { __assign, __values } from "tslib";
27
28
  * @returns Transformed config object compatible with local schema
28
29
  */
29
30
  export function translateRemoteConfigToLocal(config) {
30
- var e_1, _a;
31
+ var e_1, _a, e_2, _b, e_3, _c;
32
+ var _d, _e, _f, _g;
31
33
  // Disabling type checking rules because remote config comes from a remote source
32
34
  // and this function needs to handle any unexpected values
33
35
  /* eslint-disable @typescript-eslint/no-unsafe-member-access,
@@ -79,6 +81,73 @@ export function translateRemoteConfigToLocal(config) {
79
81
  }
80
82
  finally { if (e_1) throw e_1.error; }
81
83
  }
84
+ // translate remote responseHeaders and requestHeaders to local responseHeaders and requestHeaders
85
+ try {
86
+ if ((_f = (_e = (_d = config.autocapture) === null || _d === void 0 ? void 0 : _d.networkTracking) === null || _e === void 0 ? void 0 : _e.captureRules) === null || _f === void 0 ? void 0 : _f.length) {
87
+ try {
88
+ for (var _h = __values(config.autocapture.networkTracking.captureRules), _j = _h.next(); !_j.done; _j = _h.next()) {
89
+ var rule = _j.value;
90
+ try {
91
+ for (var _k = (e_3 = void 0, __values(['responseHeaders', 'requestHeaders'])), _l = _k.next(); !_l.done; _l = _k.next()) {
92
+ var header = _l.value;
93
+ var _m = (_g = rule[header]) !== null && _g !== void 0 ? _g : {}, captureSafeHeaders = _m.captureSafeHeaders, allowlist = _m.allowlist;
94
+ if (!captureSafeHeaders && !allowlist) {
95
+ continue;
96
+ }
97
+ // if allowlist is not an array, remote config contract is violated, remove it
98
+ if (allowlist !== undefined && !Array.isArray(allowlist)) {
99
+ delete rule[header];
100
+ continue;
101
+ }
102
+ rule[header] = __spreadArray(__spreadArray([], __read((captureSafeHeaders ? SAFE_HEADERS : [])), false), __read((allowlist !== null && allowlist !== void 0 ? allowlist : [])), false);
103
+ }
104
+ }
105
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
106
+ finally {
107
+ try {
108
+ if (_l && !_l.done && (_c = _k.return)) _c.call(_k);
109
+ }
110
+ finally { if (e_3) throw e_3.error; }
111
+ }
112
+ }
113
+ }
114
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
115
+ finally {
116
+ try {
117
+ if (_j && !_j.done && (_b = _h.return)) _b.call(_h);
118
+ }
119
+ finally { if (e_2) throw e_2.error; }
120
+ }
121
+ }
122
+ }
123
+ catch (e) {
124
+ /* istanbul ignore next */
125
+ // surprise exception, so don't translate it
126
+ }
127
+ }
128
+ function mergeUrls(urlsExact, urlsRegex, browserConfig) {
129
+ var e_4, _a;
130
+ // Convert string patterns to RegExp objects, warn on invalid patterns and skip them
131
+ var regexList = [];
132
+ try {
133
+ for (var _b = __values(urlsRegex !== null && urlsRegex !== void 0 ? urlsRegex : []), _c = _b.next(); !_c.done; _c = _b.next()) {
134
+ var pattern = _c.value;
135
+ try {
136
+ regexList.push(new RegExp(pattern));
137
+ }
138
+ catch (regexError) {
139
+ browserConfig.loggerProvider.warn("Invalid regex pattern: ".concat(pattern), regexError);
140
+ }
141
+ }
142
+ }
143
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
144
+ finally {
145
+ try {
146
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
147
+ }
148
+ finally { if (e_4) throw e_4.error; }
149
+ }
150
+ return urlsExact.concat(regexList);
82
151
  }
83
152
  /**
84
153
  * Updates the browser config in place by applying remote configuration settings.
@@ -88,8 +157,8 @@ export function translateRemoteConfigToLocal(config) {
88
157
  * @param browserConfig - The browser config object to update (modified in place)
89
158
  */
90
159
  export function updateBrowserConfigWithRemoteConfig(remoteConfig, browserConfig) {
91
- var e_2, _a;
92
- var _b, _c;
160
+ var e_5, _a;
161
+ var _b, _c, _d, _e, _f;
93
162
  if (!remoteConfig) {
94
163
  return;
95
164
  }
@@ -118,30 +187,35 @@ export function updateBrowserConfigWithRemoteConfig(remoteConfig, browserConfig)
118
187
  ((_b = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex) === null || _b === void 0 ? void 0 : _b.length)) {
119
188
  transformedAutocaptureRemoteConfig.elementInteractions = __assign({}, typedRemoteConfig.autocapture.elementInteractions);
120
189
  var transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;
190
+ // combine exact allow list and regex allow list into just 'pageUrlAllowlist'
121
191
  var exactAllowList = (_c = transformedRcElementInteractions.pageUrlAllowlist) !== null && _c !== void 0 ? _c : [];
122
- // Convert string patterns to RegExp objects, warn on invalid patterns and skip them
123
- var regexList = [];
192
+ var urlsRegex = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex;
193
+ transformedRcElementInteractions.pageUrlAllowlist = mergeUrls(exactAllowList, urlsRegex, browserConfig);
194
+ // clean up the regex allow list
195
+ delete transformedRcElementInteractions.pageUrlAllowlistRegex;
196
+ }
197
+ // Handle Network Tracking config initialization
198
+ if (typeof typedRemoteConfig.autocapture.networkTracking === 'object' &&
199
+ typedRemoteConfig.autocapture.networkTracking !== null &&
200
+ ((_d = typedRemoteConfig.autocapture.networkTracking.captureRules) === null || _d === void 0 ? void 0 : _d.length)) {
201
+ transformedAutocaptureRemoteConfig.networkTracking = __assign({}, typedRemoteConfig.autocapture.networkTracking);
202
+ var transformedRcNetworkTracking = transformedAutocaptureRemoteConfig.networkTracking;
203
+ /* istanbul ignore next */
204
+ var captureRules = (_e = transformedRcNetworkTracking.captureRules) !== null && _e !== void 0 ? _e : [];
124
205
  try {
125
- for (var _d = __values(typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex), _e = _d.next(); !_e.done; _e = _d.next()) {
126
- var pattern = _e.value;
127
- try {
128
- regexList.push(new RegExp(pattern));
129
- }
130
- catch (regexError) {
131
- browserConfig.loggerProvider.warn("Invalid regex pattern: ".concat(pattern), regexError);
132
- }
206
+ for (var captureRules_1 = __values(captureRules), captureRules_1_1 = captureRules_1.next(); !captureRules_1_1.done; captureRules_1_1 = captureRules_1.next()) {
207
+ var rule = captureRules_1_1.value;
208
+ rule.urls = mergeUrls((_f = rule.urls) !== null && _f !== void 0 ? _f : [], rule.urlsRegex, browserConfig);
209
+ delete rule.urlsRegex;
133
210
  }
134
211
  }
135
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
212
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
136
213
  finally {
137
214
  try {
138
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
215
+ if (captureRules_1_1 && !captureRules_1_1.done && (_a = captureRules_1.return)) _a.call(captureRules_1);
139
216
  }
140
- finally { if (e_2) throw e_2.error; }
217
+ finally { if (e_5) throw e_5.error; }
141
218
  }
142
- var combinedPageUrlAllowlist = exactAllowList.concat(regexList);
143
- transformedRcElementInteractions.pageUrlAllowlist = combinedPageUrlAllowlist;
144
- delete transformedRcElementInteractions.pageUrlAllowlistRegex;
145
219
  }
146
220
  if (typeof browserConfig.autocapture === 'boolean') {
147
221
  browserConfig.autocapture = __assign({ attribution: browserConfig.autocapture, fileDownloads: browserConfig.autocapture, formInteractions: browserConfig.autocapture, pageViews: browserConfig.autocapture, sessions: browserConfig.autocapture, elementInteractions: browserConfig.autocapture, webVitals: browserConfig.autocapture, frustrationInteractions: browserConfig.autocapture }, transformedAutocaptureRemoteConfig);