@amplitude/analytics-browser 2.38.2-SR-3115-rc2.0 → 2.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +1 -1
  2. package/lib/cjs/attribution/helpers.d.ts +3 -1
  3. package/lib/cjs/attribution/helpers.d.ts.map +1 -1
  4. package/lib/cjs/attribution/helpers.js.map +1 -1
  5. package/lib/cjs/attribution/tracking-methods.d.ts +12 -0
  6. package/lib/cjs/attribution/tracking-methods.d.ts.map +1 -0
  7. package/lib/cjs/attribution/tracking-methods.js +31 -0
  8. package/lib/cjs/attribution/tracking-methods.js.map +1 -0
  9. package/lib/cjs/browser-client.d.ts.map +1 -1
  10. package/lib/cjs/browser-client.js +36 -25
  11. package/lib/cjs/browser-client.js.map +1 -1
  12. package/lib/cjs/config/joined-config.d.ts.map +1 -1
  13. package/lib/cjs/config/joined-config.js +5 -1
  14. package/lib/cjs/config/joined-config.js.map +1 -1
  15. package/lib/cjs/config.d.ts +1 -1
  16. package/lib/cjs/config.d.ts.map +1 -1
  17. package/lib/cjs/index.d.ts +1 -0
  18. package/lib/cjs/index.d.ts.map +1 -1
  19. package/lib/cjs/index.js +3 -1
  20. package/lib/cjs/index.js.map +1 -1
  21. package/lib/cjs/version.d.ts +1 -1
  22. package/lib/cjs/version.d.ts.map +1 -1
  23. package/lib/cjs/version.js +1 -1
  24. package/lib/cjs/version.js.map +1 -1
  25. package/lib/cjs/video-capture/video-capture.d.ts +72 -0
  26. package/lib/cjs/video-capture/video-capture.d.ts.map +1 -0
  27. package/lib/cjs/video-capture/video-capture.js +152 -0
  28. package/lib/cjs/video-capture/video-capture.js.map +1 -0
  29. package/lib/esm/attribution/helpers.d.ts +3 -1
  30. package/lib/esm/attribution/helpers.d.ts.map +1 -1
  31. package/lib/esm/attribution/helpers.js.map +1 -1
  32. package/lib/esm/attribution/tracking-methods.d.ts +12 -0
  33. package/lib/esm/attribution/tracking-methods.d.ts.map +1 -0
  34. package/lib/esm/attribution/tracking-methods.js +24 -0
  35. package/lib/esm/attribution/tracking-methods.js.map +1 -0
  36. package/lib/esm/browser-client.d.ts.map +1 -1
  37. package/lib/esm/browser-client.js +36 -25
  38. package/lib/esm/browser-client.js.map +1 -1
  39. package/lib/esm/config/joined-config.d.ts.map +1 -1
  40. package/lib/esm/config/joined-config.js +5 -1
  41. package/lib/esm/config/joined-config.js.map +1 -1
  42. package/lib/esm/config.d.ts +1 -1
  43. package/lib/esm/config.d.ts.map +1 -1
  44. package/lib/esm/index.d.ts +1 -0
  45. package/lib/esm/index.d.ts.map +1 -1
  46. package/lib/esm/index.js +1 -0
  47. package/lib/esm/index.js.map +1 -1
  48. package/lib/esm/version.d.ts +1 -1
  49. package/lib/esm/version.d.ts.map +1 -1
  50. package/lib/esm/version.js +1 -1
  51. package/lib/esm/version.js.map +1 -1
  52. package/lib/esm/video-capture/video-capture.d.ts +72 -0
  53. package/lib/esm/video-capture/video-capture.d.ts.map +1 -0
  54. package/lib/esm/video-capture/video-capture.js +148 -0
  55. package/lib/esm/video-capture/video-capture.js.map +1 -0
  56. package/lib/scripts/amplitude-bookmarklet-snippet-min.js +1 -1
  57. package/lib/scripts/amplitude-bookmarklet.html +1 -1
  58. package/lib/scripts/amplitude-gtm-min.js +1 -1
  59. package/lib/scripts/amplitude-gtm-min.js.gz +0 -0
  60. package/lib/scripts/amplitude-gtm-min.js.map +1 -1
  61. package/lib/scripts/amplitude-gtm-snippet-min.js +1 -1
  62. package/lib/scripts/amplitude-min.js +1 -1
  63. package/lib/scripts/amplitude-min.js.gz +0 -0
  64. package/lib/scripts/amplitude-min.js.map +1 -1
  65. package/lib/scripts/amplitude-min.umd.js +1 -1
  66. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  67. package/lib/scripts/amplitude-snippet-instructions.html +1 -1
  68. package/lib/scripts/amplitude-snippet-min.js +1 -1
  69. package/lib/scripts/attribution/helpers.d.ts +3 -1
  70. package/lib/scripts/attribution/helpers.d.ts.map +1 -1
  71. package/lib/scripts/attribution/tracking-methods.d.ts +12 -0
  72. package/lib/scripts/attribution/tracking-methods.d.ts.map +1 -0
  73. package/lib/scripts/browser-client.d.ts.map +1 -1
  74. package/lib/scripts/config/joined-config.d.ts.map +1 -1
  75. package/lib/scripts/config.d.ts +1 -1
  76. package/lib/scripts/config.d.ts.map +1 -1
  77. package/lib/scripts/index.d.ts +1 -0
  78. package/lib/scripts/index.d.ts.map +1 -1
  79. package/lib/scripts/version.d.ts +1 -1
  80. package/lib/scripts/version.d.ts.map +1 -1
  81. package/lib/scripts/video-capture/video-capture.d.ts +72 -0
  82. package/lib/scripts/video-capture/video-capture.d.ts.map +1 -0
  83. package/package.json +9 -8
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-OWS4dEYjTOJvBt1U+WAZRyh+xGZ92vKChP78d9lMLgQrcB+lV+1rxBmO5/g3OEQk",c.crossOrigin="anonymous",c.async=!0,c.src="https://cdn.amplitude.com/libs/analytics-browser-2.38.2-SR-3115-rc2.0-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},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},v=["getEventProperties","setProductId","setQuantity","setPrice","setRevenue","setRevenueType","setReceipt","setReceiptSig","setCurrency","setEventProperties"],f=0;f<v.length;f++)n(d,v[f]);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<v.length;t++)o(e,v[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-4O8lKNFNgd/jP8qyPyPo+hGxkbqZ9dQ/DUufAi9GWr0ZryDdHu+46n/uC5ZmwffP",c.crossOrigin="anonymous",c.async=!0,c.src="https://cdn.amplitude.com/libs/analytics-browser-2.40.0-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},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"],y=0;y<f.length;y++)n(d,f[y]);r.Revenue=d;var v=["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)}();
57
57
 
58
58
  amplitude.init("<YOUR_API_KEY>");
59
59
  </script>
@@ -1,10 +1,12 @@
1
- import { ILogger, Campaign } from '@amplitude/analytics-core';
1
+ import { ILogger, Campaign, TrackingMethod } from '@amplitude/analytics-core';
2
2
  import { ExcludeInternalReferrersOptions } from '../types';
3
3
  export interface Options {
4
4
  excludeReferrers?: (string | RegExp)[];
5
5
  excludeInternalReferrers?: true | false | ExcludeInternalReferrersOptions;
6
6
  initialEmptyValue?: string;
7
7
  resetSessionOnNewCampaign?: boolean;
8
+ trackingMethod?: TrackingMethod | TrackingMethod[];
9
+ fallbackAttributionEvent?: boolean;
8
10
  optOut?: boolean;
9
11
  }
10
12
  export declare const isNewCampaign: (current: Campaign, previous: Campaign | undefined, options: Options, logger: ILogger, isNewSession?: boolean, topLevelDomain?: string) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/attribution/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACP,QAAQ,EAGT,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,+BAA+B,EAAyC,MAAM,UAAU,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACvC,wBAAwB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,+BAA+B,CAAC;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsBD,eAAO,MAAM,aAAa,YACf,QAAQ,YACP,QAAQ,GAAG,SAAS,WACrB,OAAO,UACR,OAAO,2CAEE,MAAM,YAiDxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,sCAIvE,CAAC;AAEF,eAAO,MAAM,aAAa,cAAe,MAAM,UAAU,MAAM,YAK9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAc,QAAQ,WAAW,OAAO,sDAgBvE,CAAC;AAEF,eAAO,MAAM,2BAA2B,iBAAkB,MAAM,GAAG,SAAS,aAS3E,CAAC;AAqDF,eAAO,MAAM,UAAU,UAmHtB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAAoB,MAAM,WAiB/C,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/attribution/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACP,QAAQ,EAGR,cAAc,EACf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,+BAA+B,EAAyC,MAAM,UAAU,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACvC,wBAAwB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,+BAA+B,CAAC;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IACnD,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsBD,eAAO,MAAM,aAAa,YACf,QAAQ,YACP,QAAQ,GAAG,SAAS,WACrB,OAAO,UACR,OAAO,2CAEE,MAAM,YAiDxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,sCAIvE,CAAC;AAEF,eAAO,MAAM,aAAa,cAAe,MAAM,UAAU,MAAM,YAK9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAc,QAAQ,WAAW,OAAO,sDAgBvE,CAAC;AAEF,eAAO,MAAM,2BAA2B,iBAAkB,MAAM,GAAG,SAAS,aAS3E,CAAC;AAqDF,eAAO,MAAM,UAAU,UAmHtB,CAAC;AAEF,eAAO,MAAM,SAAS,mBAAoB,MAAM,WAiB/C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/attribution/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createIdentifyEvent,\n Identify,\n ILogger,\n Campaign,\n BASE_CAMPAIGN,\n getGlobalScope,\n} from '@amplitude/analytics-core';\n\nimport { ExcludeInternalReferrersOptions, EXCLUDE_INTERNAL_REFERRERS_CONDITIONS } from '../types';\n\nexport interface Options {\n excludeReferrers?: (string | RegExp)[];\n excludeInternalReferrers?: true | false | ExcludeInternalReferrersOptions;\n initialEmptyValue?: string;\n resetSessionOnNewCampaign?: boolean;\n optOut?: boolean;\n}\n\nconst domainWithoutSubdomain = (domain: string) => {\n const parts = domain.split('.');\n\n if (parts.length <= 2) {\n return domain;\n }\n\n return parts.slice(parts.length - 2, parts.length).join('.');\n};\n\n//Direct traffic mean no external referral, no UTMs, no click-ids, and no other customer identified marketing campaign url params.\nconst isDirectTraffic = (current: Campaign) => {\n return Object.values(current).every((value) => !value);\n};\n\nconst isEmptyCampaign = (campaign: Campaign) => {\n const campaignWithoutReferrer = { ...campaign, referring_domain: undefined, referrer: undefined };\n return Object.values(campaignWithoutReferrer).every((value) => !value);\n};\n\nexport const isNewCampaign = (\n current: Campaign,\n previous: Campaign | undefined,\n options: Options,\n logger: ILogger,\n isNewSession = true,\n topLevelDomain?: string,\n) => {\n const { referrer, referring_domain, ...currentCampaign } = current;\n const { referrer: _previous_referrer, referring_domain: prevReferringDomain, ...previousCampaign } = previous || {};\n\n const { excludeInternalReferrers } = options;\n\n if (excludeInternalReferrers) {\n const condition = getExcludeInternalReferrersCondition(excludeInternalReferrers, logger);\n if (\n !(condition instanceof TypeError) &&\n current.referring_domain &&\n isInternalReferrer(current.referring_domain, topLevelDomain)\n ) {\n if (condition === 'always') {\n debugLogInternalReferrerExclude(condition, current.referring_domain, logger);\n return false;\n } else if (condition === 'ifEmptyCampaign' && isEmptyCampaign(current)) {\n debugLogInternalReferrerExclude(condition, current.referring_domain, logger);\n return false;\n }\n }\n }\n\n if (isExcludedReferrer(options.excludeReferrers, current.referring_domain)) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n logger.debug(`This is not a new campaign because ${current.referring_domain} is in the exclude referrer list.`);\n return false;\n }\n\n //In the same session, direct traffic should not override or unset any persisting query params\n if (!isNewSession && isDirectTraffic(current) && previous) {\n logger.debug('This is not a new campaign because this is a direct traffic in the same session.');\n return false;\n }\n\n const hasNewCampaign = JSON.stringify(currentCampaign) !== JSON.stringify(previousCampaign);\n const hasNewDomain =\n domainWithoutSubdomain(referring_domain || '') !== domainWithoutSubdomain(prevReferringDomain || '');\n\n const result = !previous || hasNewCampaign || hasNewDomain;\n\n if (!result) {\n logger.debug(\"This is not a new campaign because it's the same as the previous one.\");\n } else {\n logger.debug(`This is a new campaign. An $identify event will be sent.`);\n }\n\n return result;\n};\n\nexport const isExcludedReferrer = (excludeReferrers: (string | RegExp)[] = [], referringDomain = '') => {\n return excludeReferrers.some((value) =>\n value instanceof RegExp ? value.test(referringDomain) : value === referringDomain,\n );\n};\n\nexport const isSubdomainOf = (subDomain: string, domain: string) => {\n const cookieDomainWithLeadingDot = domain.startsWith('.') ? domain : `.${domain}`;\n const subDomainWithLeadingDot = subDomain.startsWith('.') ? subDomain : `.${subDomain}`;\n if (subDomainWithLeadingDot.endsWith(cookieDomainWithLeadingDot)) return true;\n return false;\n};\n\nexport const createCampaignEvent = (campaign: Campaign, options: Options) => {\n const campaignParameters: Campaign = {\n // This object definition allows undefined keys to be iterated on\n // in .reduce() to build indentify object\n ...BASE_CAMPAIGN,\n ...campaign,\n };\n const identifyEvent = Object.entries(campaignParameters).reduce((identify, [key, value]) => {\n identify.setOnce(`initial_${key}`, value ?? options.initialEmptyValue ?? 'EMPTY');\n if (value) {\n return identify.set(key, value);\n }\n return identify.unset(key);\n }, new Identify());\n\n return createIdentifyEvent(identifyEvent);\n};\n\nexport const getDefaultExcludedReferrers = (cookieDomain: string | undefined) => {\n let domain = cookieDomain;\n if (domain) {\n if (domain.startsWith('.')) {\n domain = domain.substring(1);\n }\n return [new RegExp(`${domain.replace('.', '\\\\.')}$`)];\n }\n return [];\n};\n\n/**\n * Parses the excludeInternalReferrers configuration to determine the condition on which to\n * exclude internal referrers for campaign attribution.\n *\n * If the config is invalid type, log and return a TypeError.\n *\n * (this does explicit type checking so don't have to rely on TS compiler to catch invalid types)\n *\n * @param excludeInternalReferrers - attribution.excludeInternalReferrers configuration\n * @param logger - logger instance to log error when TypeError\n * @returns The condition if the config is valid, TypeError if the config is invalid.\n */\nconst getExcludeInternalReferrersCondition = (\n excludeInternalReferrers: ExcludeInternalReferrersOptions | boolean,\n logger: ILogger,\n): ExcludeInternalReferrersOptions['condition'] | TypeError => {\n if (excludeInternalReferrers === true) {\n return EXCLUDE_INTERNAL_REFERRERS_CONDITIONS.always;\n }\n if (typeof excludeInternalReferrers === 'object') {\n const { condition } = excludeInternalReferrers;\n if (typeof condition === 'string' && Object.keys(EXCLUDE_INTERNAL_REFERRERS_CONDITIONS).includes(condition)) {\n return condition;\n } else if (typeof condition === 'undefined') {\n return EXCLUDE_INTERNAL_REFERRERS_CONDITIONS.always;\n }\n }\n const errorMessage = `Invalid configuration provided for attribution.excludeInternalReferrers: ${JSON.stringify(\n excludeInternalReferrers,\n )}`;\n logger.error(errorMessage);\n return new TypeError(errorMessage);\n};\n\n// helper function to log debug message when internal referrer is excluded\n// (added this to prevent code duplication and improve readability)\nfunction debugLogInternalReferrerExclude(\n condition: ExcludeInternalReferrersOptions['condition'],\n referringDomain: string,\n logger: ILogger,\n) {\n const baseMessage = `This is not a new campaign because referring_domain=${referringDomain} is on the same domain as the current page and it is configured to exclude internal referrers`;\n if (condition === 'always') {\n logger.debug(baseMessage);\n } else if (condition === 'ifEmptyCampaign') {\n logger.debug(`${baseMessage} with empty campaign parameters`);\n }\n}\n\n// list of domains that are known ccTLDs that are commonly used\n// and are in the Public Suffix List (https://publicsuffix.org/)\nexport const KNOWN_2LDS = [\n 'ac.in',\n 'ac.jp',\n 'ac.kr',\n 'ac.th',\n 'ac.uk',\n 'ac.za',\n 'appspot.com',\n 'asn.au',\n 'azurewebsites.net',\n 'cloudfront.net',\n 'myshopify.com',\n 'blogspot.com',\n 'co.ca',\n 'co.in',\n 'co.jp',\n 'co.kr',\n 'co.nz',\n 'co.th',\n 'co.uk',\n 'co.za',\n 'com.ar',\n 'com.au',\n 'com.br',\n 'com.cn',\n 'com.hk',\n 'com.in',\n 'com.jp',\n 'com.kr',\n 'com.mx',\n 'com.pl',\n 'com.sg',\n 'com.tr',\n 'com.tw',\n 'ed.jp',\n 'edu.au',\n 'edu.br',\n 'edu.cn',\n 'edu.hk',\n 'edu.sg',\n 'edu.th',\n 'edu.tr',\n 'edu.tw',\n 'firebaseapp.com',\n 'fly.dev',\n 'gc.ca',\n 'geek.nz',\n 'github.io',\n 'gitlab.io',\n 'go.jp',\n 'go.kr',\n 'go.th',\n 'gob.ar',\n 'gob.mx',\n 'gov.au',\n 'gov.br',\n 'gov.cn',\n 'gov.hk',\n 'gov.in',\n 'gov.pl',\n 'gov.sg',\n 'gov.tr',\n 'gov.tw',\n 'gov.uk',\n 'gov.za',\n 'govt.nz',\n 'gr.jp',\n 'herokuapp.com',\n 'id.au',\n 'idv.hk',\n 'iwi.nz',\n 'lg.jp',\n 'ltd.uk',\n 'maori.nz',\n 'me.uk',\n 'mil.kr',\n 'ne.jp',\n 'ne.kr',\n 'net.au',\n 'net.br',\n 'net.cn',\n 'net.hk',\n 'net.in',\n 'net.nz',\n 'net.pl',\n 'net.sg',\n 'net.tr',\n 'net.tw',\n 'net.za',\n 'onrender.com',\n 'or.jp',\n 'or.kr',\n 'or.th',\n 'org.ar',\n 'org.au',\n 'org.br',\n 'org.cn',\n 'org.hk',\n 'org.in',\n 'org.mx',\n 'org.nz',\n 'org.pl',\n 'org.sg',\n 'org.tw',\n 'org.uk',\n 'org.za',\n 'pages.dev',\n 'pe.kr',\n 'plc.uk',\n 're.kr',\n 'res.in',\n 'sch.uk',\n 'vercel.app',\n 'netlify.app',\n 'workers.dev',\n];\n\nexport const getDomain = (hostnameParam?: string) => {\n /* istanbul ignore next */\n const hostname = hostnameParam || getGlobalScope()?.location?.hostname;\n if (!hostname) {\n return '';\n }\n const parts = hostname.split('.');\n let tld = parts[parts.length - 1];\n let name = parts[parts.length - 2];\n if (KNOWN_2LDS.find((tld) => hostname.endsWith(`.${tld}`))) {\n tld = parts[parts.length - 2] + '.' + parts[parts.length - 1];\n name = parts[parts.length - 3];\n }\n\n if (!name) return tld;\n\n return `${name}.${tld}`;\n};\n\nconst isInternalReferrer = (referringDomain: string, topLevelDomain?: string) => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope) return false;\n // if referring domain is subdomain of config.cookieDomain, return true\n const internalDomain = (topLevelDomain || '').trim() || getDomain(globalScope.location.hostname);\n return isSubdomainOf(referringDomain, internalDomain);\n};\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/attribution/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createIdentifyEvent,\n Identify,\n ILogger,\n Campaign,\n BASE_CAMPAIGN,\n getGlobalScope,\n TrackingMethod,\n} from '@amplitude/analytics-core';\n\nimport { ExcludeInternalReferrersOptions, EXCLUDE_INTERNAL_REFERRERS_CONDITIONS } from '../types';\n\nexport interface Options {\n excludeReferrers?: (string | RegExp)[];\n excludeInternalReferrers?: true | false | ExcludeInternalReferrersOptions;\n initialEmptyValue?: string;\n resetSessionOnNewCampaign?: boolean;\n trackingMethod?: TrackingMethod | TrackingMethod[];\n fallbackAttributionEvent?: boolean;\n optOut?: boolean;\n}\n\nconst domainWithoutSubdomain = (domain: string) => {\n const parts = domain.split('.');\n\n if (parts.length <= 2) {\n return domain;\n }\n\n return parts.slice(parts.length - 2, parts.length).join('.');\n};\n\n//Direct traffic mean no external referral, no UTMs, no click-ids, and no other customer identified marketing campaign url params.\nconst isDirectTraffic = (current: Campaign) => {\n return Object.values(current).every((value) => !value);\n};\n\nconst isEmptyCampaign = (campaign: Campaign) => {\n const campaignWithoutReferrer = { ...campaign, referring_domain: undefined, referrer: undefined };\n return Object.values(campaignWithoutReferrer).every((value) => !value);\n};\n\nexport const isNewCampaign = (\n current: Campaign,\n previous: Campaign | undefined,\n options: Options,\n logger: ILogger,\n isNewSession = true,\n topLevelDomain?: string,\n) => {\n const { referrer, referring_domain, ...currentCampaign } = current;\n const { referrer: _previous_referrer, referring_domain: prevReferringDomain, ...previousCampaign } = previous || {};\n\n const { excludeInternalReferrers } = options;\n\n if (excludeInternalReferrers) {\n const condition = getExcludeInternalReferrersCondition(excludeInternalReferrers, logger);\n if (\n !(condition instanceof TypeError) &&\n current.referring_domain &&\n isInternalReferrer(current.referring_domain, topLevelDomain)\n ) {\n if (condition === 'always') {\n debugLogInternalReferrerExclude(condition, current.referring_domain, logger);\n return false;\n } else if (condition === 'ifEmptyCampaign' && isEmptyCampaign(current)) {\n debugLogInternalReferrerExclude(condition, current.referring_domain, logger);\n return false;\n }\n }\n }\n\n if (isExcludedReferrer(options.excludeReferrers, current.referring_domain)) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n logger.debug(`This is not a new campaign because ${current.referring_domain} is in the exclude referrer list.`);\n return false;\n }\n\n //In the same session, direct traffic should not override or unset any persisting query params\n if (!isNewSession && isDirectTraffic(current) && previous) {\n logger.debug('This is not a new campaign because this is a direct traffic in the same session.');\n return false;\n }\n\n const hasNewCampaign = JSON.stringify(currentCampaign) !== JSON.stringify(previousCampaign);\n const hasNewDomain =\n domainWithoutSubdomain(referring_domain || '') !== domainWithoutSubdomain(prevReferringDomain || '');\n\n const result = !previous || hasNewCampaign || hasNewDomain;\n\n if (!result) {\n logger.debug(\"This is not a new campaign because it's the same as the previous one.\");\n } else {\n logger.debug(`This is a new campaign. An $identify event will be sent.`);\n }\n\n return result;\n};\n\nexport const isExcludedReferrer = (excludeReferrers: (string | RegExp)[] = [], referringDomain = '') => {\n return excludeReferrers.some((value) =>\n value instanceof RegExp ? value.test(referringDomain) : value === referringDomain,\n );\n};\n\nexport const isSubdomainOf = (subDomain: string, domain: string) => {\n const cookieDomainWithLeadingDot = domain.startsWith('.') ? domain : `.${domain}`;\n const subDomainWithLeadingDot = subDomain.startsWith('.') ? subDomain : `.${subDomain}`;\n if (subDomainWithLeadingDot.endsWith(cookieDomainWithLeadingDot)) return true;\n return false;\n};\n\nexport const createCampaignEvent = (campaign: Campaign, options: Options) => {\n const campaignParameters: Campaign = {\n // This object definition allows undefined keys to be iterated on\n // in .reduce() to build indentify object\n ...BASE_CAMPAIGN,\n ...campaign,\n };\n const identifyEvent = Object.entries(campaignParameters).reduce((identify, [key, value]) => {\n identify.setOnce(`initial_${key}`, value ?? options.initialEmptyValue ?? 'EMPTY');\n if (value) {\n return identify.set(key, value);\n }\n return identify.unset(key);\n }, new Identify());\n\n return createIdentifyEvent(identifyEvent);\n};\n\nexport const getDefaultExcludedReferrers = (cookieDomain: string | undefined) => {\n let domain = cookieDomain;\n if (domain) {\n if (domain.startsWith('.')) {\n domain = domain.substring(1);\n }\n return [new RegExp(`${domain.replace('.', '\\\\.')}$`)];\n }\n return [];\n};\n\n/**\n * Parses the excludeInternalReferrers configuration to determine the condition on which to\n * exclude internal referrers for campaign attribution.\n *\n * If the config is invalid type, log and return a TypeError.\n *\n * (this does explicit type checking so don't have to rely on TS compiler to catch invalid types)\n *\n * @param excludeInternalReferrers - attribution.excludeInternalReferrers configuration\n * @param logger - logger instance to log error when TypeError\n * @returns The condition if the config is valid, TypeError if the config is invalid.\n */\nconst getExcludeInternalReferrersCondition = (\n excludeInternalReferrers: ExcludeInternalReferrersOptions | boolean,\n logger: ILogger,\n): ExcludeInternalReferrersOptions['condition'] | TypeError => {\n if (excludeInternalReferrers === true) {\n return EXCLUDE_INTERNAL_REFERRERS_CONDITIONS.always;\n }\n if (typeof excludeInternalReferrers === 'object') {\n const { condition } = excludeInternalReferrers;\n if (typeof condition === 'string' && Object.keys(EXCLUDE_INTERNAL_REFERRERS_CONDITIONS).includes(condition)) {\n return condition;\n } else if (typeof condition === 'undefined') {\n return EXCLUDE_INTERNAL_REFERRERS_CONDITIONS.always;\n }\n }\n const errorMessage = `Invalid configuration provided for attribution.excludeInternalReferrers: ${JSON.stringify(\n excludeInternalReferrers,\n )}`;\n logger.error(errorMessage);\n return new TypeError(errorMessage);\n};\n\n// helper function to log debug message when internal referrer is excluded\n// (added this to prevent code duplication and improve readability)\nfunction debugLogInternalReferrerExclude(\n condition: ExcludeInternalReferrersOptions['condition'],\n referringDomain: string,\n logger: ILogger,\n) {\n const baseMessage = `This is not a new campaign because referring_domain=${referringDomain} is on the same domain as the current page and it is configured to exclude internal referrers`;\n if (condition === 'always') {\n logger.debug(baseMessage);\n } else if (condition === 'ifEmptyCampaign') {\n logger.debug(`${baseMessage} with empty campaign parameters`);\n }\n}\n\n// list of domains that are known ccTLDs that are commonly used\n// and are in the Public Suffix List (https://publicsuffix.org/)\nexport const KNOWN_2LDS = [\n 'ac.in',\n 'ac.jp',\n 'ac.kr',\n 'ac.th',\n 'ac.uk',\n 'ac.za',\n 'appspot.com',\n 'asn.au',\n 'azurewebsites.net',\n 'cloudfront.net',\n 'myshopify.com',\n 'blogspot.com',\n 'co.ca',\n 'co.in',\n 'co.jp',\n 'co.kr',\n 'co.nz',\n 'co.th',\n 'co.uk',\n 'co.za',\n 'com.ar',\n 'com.au',\n 'com.br',\n 'com.cn',\n 'com.hk',\n 'com.in',\n 'com.jp',\n 'com.kr',\n 'com.mx',\n 'com.pl',\n 'com.sg',\n 'com.tr',\n 'com.tw',\n 'ed.jp',\n 'edu.au',\n 'edu.br',\n 'edu.cn',\n 'edu.hk',\n 'edu.sg',\n 'edu.th',\n 'edu.tr',\n 'edu.tw',\n 'firebaseapp.com',\n 'fly.dev',\n 'gc.ca',\n 'geek.nz',\n 'github.io',\n 'gitlab.io',\n 'go.jp',\n 'go.kr',\n 'go.th',\n 'gob.ar',\n 'gob.mx',\n 'gov.au',\n 'gov.br',\n 'gov.cn',\n 'gov.hk',\n 'gov.in',\n 'gov.pl',\n 'gov.sg',\n 'gov.tr',\n 'gov.tw',\n 'gov.uk',\n 'gov.za',\n 'govt.nz',\n 'gr.jp',\n 'herokuapp.com',\n 'id.au',\n 'idv.hk',\n 'iwi.nz',\n 'lg.jp',\n 'ltd.uk',\n 'maori.nz',\n 'me.uk',\n 'mil.kr',\n 'ne.jp',\n 'ne.kr',\n 'net.au',\n 'net.br',\n 'net.cn',\n 'net.hk',\n 'net.in',\n 'net.nz',\n 'net.pl',\n 'net.sg',\n 'net.tr',\n 'net.tw',\n 'net.za',\n 'onrender.com',\n 'or.jp',\n 'or.kr',\n 'or.th',\n 'org.ar',\n 'org.au',\n 'org.br',\n 'org.cn',\n 'org.hk',\n 'org.in',\n 'org.mx',\n 'org.nz',\n 'org.pl',\n 'org.sg',\n 'org.tw',\n 'org.uk',\n 'org.za',\n 'pages.dev',\n 'pe.kr',\n 'plc.uk',\n 're.kr',\n 'res.in',\n 'sch.uk',\n 'vercel.app',\n 'netlify.app',\n 'workers.dev',\n];\n\nexport const getDomain = (hostnameParam?: string) => {\n /* istanbul ignore next */\n const hostname = hostnameParam || getGlobalScope()?.location?.hostname;\n if (!hostname) {\n return '';\n }\n const parts = hostname.split('.');\n let tld = parts[parts.length - 1];\n let name = parts[parts.length - 2];\n if (KNOWN_2LDS.find((tld) => hostname.endsWith(`.${tld}`))) {\n tld = parts[parts.length - 2] + '.' + parts[parts.length - 1];\n name = parts[parts.length - 3];\n }\n\n if (!name) return tld;\n\n return `${name}.${tld}`;\n};\n\nconst isInternalReferrer = (referringDomain: string, topLevelDomain?: string) => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope) return false;\n // if referring domain is subdomain of config.cookieDomain, return true\n const internalDomain = (topLevelDomain || '').trim() || getDomain(globalScope.location.hostname);\n return isSubdomainOf(referringDomain, internalDomain);\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import { AttributionOptions, TrackingMethod } from '@amplitude/analytics-core';
2
+ export declare const USER_PROPERTY_TRACKING_METHOD: TrackingMethod;
3
+ export declare const EVENT_PROPERTY_TRACKING_METHOD: TrackingMethod;
4
+ /**
5
+ * Normalizes attribution tracking methods from runtime config, drops unsupported values,
6
+ * and falls back to the legacy default when nothing valid is provided.
7
+ */
8
+ export declare const normalizeTrackingMethod: (trackingMethod?: unknown) => TrackingMethod[];
9
+ export declare const hasTrackingMethod: (options: AttributionOptions, trackingMethod: TrackingMethod) => boolean;
10
+ export declare const isUserPropertyAttributionEnabled: (options: AttributionOptions) => boolean;
11
+ export declare const isEventPropertyAttributionEnabled: (options: AttributionOptions) => boolean;
12
+ //# sourceMappingURL=tracking-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking-methods.d.ts","sourceRoot":"","sources":["../../../src/attribution/tracking-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE/E,eAAO,MAAM,6BAA6B,EAAE,cAA+B,CAAC;AAC5E,eAAO,MAAM,8BAA8B,EAAE,cAAgC,CAAC;AAK9E;;;GAGG;AACH,eAAO,MAAM,uBAAuB,oBAAqB,OAAO,KAAG,cAAc,EAMhF,CAAC;AAEF,eAAO,MAAM,iBAAiB,YAAa,kBAAkB,kBAAkB,cAAc,YACnB,CAAC;AAE3E,eAAO,MAAM,gCAAgC,YAAa,kBAAkB,YACjB,CAAC;AAE5D,eAAO,MAAM,iCAAiC,YAAa,kBAAkB,YACjB,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEventPropertyAttributionEnabled = exports.isUserPropertyAttributionEnabled = exports.hasTrackingMethod = exports.normalizeTrackingMethod = exports.EVENT_PROPERTY_TRACKING_METHOD = exports.USER_PROPERTY_TRACKING_METHOD = void 0;
4
+ var tslib_1 = require("tslib");
5
+ exports.USER_PROPERTY_TRACKING_METHOD = 'userProperty';
6
+ exports.EVENT_PROPERTY_TRACKING_METHOD = 'eventProperty';
7
+ var isTrackingMethod = function (value) {
8
+ return value === exports.USER_PROPERTY_TRACKING_METHOD || value === exports.EVENT_PROPERTY_TRACKING_METHOD;
9
+ };
10
+ /**
11
+ * Normalizes attribution tracking methods from runtime config, drops unsupported values,
12
+ * and falls back to the legacy default when nothing valid is provided.
13
+ */
14
+ var normalizeTrackingMethod = function (trackingMethod) {
15
+ var normalized = tslib_1.__spreadArray([], tslib_1.__read(new Set((Array.isArray(trackingMethod) ? trackingMethod : [trackingMethod]).filter(isTrackingMethod))), false);
16
+ return normalized.length > 0 ? normalized : [exports.USER_PROPERTY_TRACKING_METHOD];
17
+ };
18
+ exports.normalizeTrackingMethod = normalizeTrackingMethod;
19
+ var hasTrackingMethod = function (options, trackingMethod) {
20
+ return (0, exports.normalizeTrackingMethod)(options.trackingMethod).includes(trackingMethod);
21
+ };
22
+ exports.hasTrackingMethod = hasTrackingMethod;
23
+ var isUserPropertyAttributionEnabled = function (options) {
24
+ return (0, exports.hasTrackingMethod)(options, exports.USER_PROPERTY_TRACKING_METHOD);
25
+ };
26
+ exports.isUserPropertyAttributionEnabled = isUserPropertyAttributionEnabled;
27
+ var isEventPropertyAttributionEnabled = function (options) {
28
+ return (0, exports.hasTrackingMethod)(options, exports.EVENT_PROPERTY_TRACKING_METHOD);
29
+ };
30
+ exports.isEventPropertyAttributionEnabled = isEventPropertyAttributionEnabled;
31
+ //# sourceMappingURL=tracking-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking-methods.js","sourceRoot":"","sources":["../../../src/attribution/tracking-methods.ts"],"names":[],"mappings":";;;;AAEa,QAAA,6BAA6B,GAAmB,cAAc,CAAC;AAC/D,QAAA,8BAA8B,GAAmB,eAAe,CAAC;AAE9E,IAAM,gBAAgB,GAAG,UAAC,KAAc;IACtC,OAAA,KAAK,KAAK,qCAA6B,IAAI,KAAK,KAAK,sCAA8B;AAAnF,CAAmF,CAAC;AAEtF;;;GAGG;AACI,IAAM,uBAAuB,GAAG,UAAC,cAAwB;IAC9D,IAAM,UAAU,4CACX,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SACzG,CAAC;IAEF,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qCAA6B,CAAC,CAAC;AAC9E,CAAC,CAAC;AANW,QAAA,uBAAuB,2BAMlC;AAEK,IAAM,iBAAiB,GAAG,UAAC,OAA2B,EAAE,cAA8B;IAC3F,OAAA,IAAA,+BAAuB,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;AAAxE,CAAwE,CAAC;AAD9D,QAAA,iBAAiB,qBAC6C;AAEpE,IAAM,gCAAgC,GAAG,UAAC,OAA2B;IAC1E,OAAA,IAAA,yBAAiB,EAAC,OAAO,EAAE,qCAA6B,CAAC;AAAzD,CAAyD,CAAC;AAD/C,QAAA,gCAAgC,oCACe;AAErD,IAAM,iCAAiC,GAAG,UAAC,OAA2B;IAC3E,OAAA,IAAA,yBAAiB,EAAC,OAAO,EAAE,sCAA8B,CAAC;AAA1D,CAA0D,CAAC;AADhD,QAAA,iCAAiC,qCACe","sourcesContent":["import { AttributionOptions, TrackingMethod } from '@amplitude/analytics-core';\n\nexport const USER_PROPERTY_TRACKING_METHOD: TrackingMethod = 'userProperty';\nexport const EVENT_PROPERTY_TRACKING_METHOD: TrackingMethod = 'eventProperty';\n\nconst isTrackingMethod = (value: unknown): value is TrackingMethod =>\n value === USER_PROPERTY_TRACKING_METHOD || value === EVENT_PROPERTY_TRACKING_METHOD;\n\n/**\n * Normalizes attribution tracking methods from runtime config, drops unsupported values,\n * and falls back to the legacy default when nothing valid is provided.\n */\nexport const normalizeTrackingMethod = (trackingMethod?: unknown): TrackingMethod[] => {\n const normalized = [\n ...new Set((Array.isArray(trackingMethod) ? trackingMethod : [trackingMethod]).filter(isTrackingMethod)),\n ];\n\n return normalized.length > 0 ? normalized : [USER_PROPERTY_TRACKING_METHOD];\n};\n\nexport const hasTrackingMethod = (options: AttributionOptions, trackingMethod: TrackingMethod) =>\n normalizeTrackingMethod(options.trackingMethod).includes(trackingMethod);\n\nexport const isUserPropertyAttributionEnabled = (options: AttributionOptions) =>\n hasTrackingMethod(options, USER_PROPERTY_TRACKING_METHOD);\n\nexport const isEventPropertyAttributionEnabled = (options: AttributionOptions) =>\n hasTrackingMethod(options, EVENT_PROPERTY_TRACKING_METHOD);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"browser-client.d.ts","sourceRoot":"","sources":["../../src/browser-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAYb,KAAK,EACL,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,sBAAsB,EAEtB,MAAM,EACN,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EAUlB,MAAM,2BAA2B,CAAC;AAgCnC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQ/D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,aAAc,YAAW,aAAa,EAAE,eAAe;IAG3F,MAAM,EAAE,aAAa,CAAC;IACtB,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAI3C,sBAAsB,SAAK;IAI3B,8CAA8C,UAAS;IAEvD,IAAI,CAAC,MAAM,SAAK,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,YAAY,CAAC,EAAE,cAAc;cAiB1E,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAqRlE,SAAS;IAIT,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAcpC,WAAW;IAIX,WAAW,CAAC,QAAQ,EAAE,MAAM;IAc5B,KAAK;IAML,WAAW;;;;;;;IAQX,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC;IA6BhD,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,YAAY;IAIZ,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IA8E1C,aAAa;IAQb,YAAY,CAAC,SAAS,EAAE,sBAAsB;IAQ9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,YAAY;IAezD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,YAAY;IAS/G,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,YAAY;IAStD,OAAO,CAAC,0BAA0B;IAe5B,OAAO,CAAC,KAAK,EAAE,KAAK;IA0B1B,OAAO,CAAC,iBAAiB;IAgBzB;;;;;;;OAOG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWnD;;;;OAIG;IACH,yCAAyC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAOlE"}
1
+ {"version":3,"file":"browser-client.d.ts","sourceRoot":"","sources":["../../src/browser-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAYb,KAAK,EACL,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,sBAAsB,EAEtB,MAAM,EACN,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EAUlB,MAAM,2BAA2B,CAAC;AAgCnC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAU/D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,aAAc,YAAW,aAAa,EAAE,eAAe;IAG3F,MAAM,EAAE,aAAa,CAAC;IACtB,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAI3C,sBAAsB,SAAK;IAI3B,8CAA8C,UAAS;IAEvD,IAAI,CAAC,MAAM,SAAK,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,YAAY,CAAC,EAAE,cAAc;cAiB1E,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAgSlE,SAAS;IAIT,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAcpC,WAAW;IAIX,WAAW,CAAC,QAAQ,EAAE,MAAM;IAc5B,KAAK;IAML,WAAW;;;;;;;IAQX,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC;IA6BhD,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,YAAY;IAIZ,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IA8E1C,aAAa;IAQb,YAAY,CAAC,SAAS,EAAE,sBAAsB;IAQ9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,YAAY;IAezD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,YAAY;IAS/G,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,YAAY;IAStD,OAAO,CAAC,0BAA0B;IAmB5B,OAAO,CAAC,KAAK,EAAE,KAAK;IA0B1B,OAAO,CAAC,iBAAiB;IAgBzB;;;;;;;OAOG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAWnD;;;;OAIG;IACH,yCAAyC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAOlE"}
@@ -18,10 +18,12 @@ var plugin_autocapture_browser_1 = require("@amplitude/plugin-autocapture-browse
18
18
  var plugin_network_capture_browser_1 = require("@amplitude/plugin-network-capture-browser");
19
19
  var plugin_web_vitals_browser_1 = require("@amplitude/plugin-web-vitals-browser");
20
20
  var web_attribution_1 = require("./attribution/web-attribution");
21
+ var plugin_event_property_attribution_browser_1 = require("@amplitude/plugin-event-property-attribution-browser");
21
22
  var lib_prefix_1 = require("./lib-prefix");
22
23
  var version_1 = require("./version");
23
24
  var plugin_page_url_enrichment_browser_1 = require("@amplitude/plugin-page-url-enrichment-browser");
24
25
  var plugin_custom_enrichment_browser_1 = require("@amplitude/plugin-custom-enrichment-browser");
26
+ var tracking_methods_1 = require("./attribution/tracking-methods");
25
27
  var UNSPECIFIED_SESSION_ID = -1;
26
28
  /**
27
29
  * Exported for `@amplitude/unified` or integration with blade plugins.
@@ -154,16 +156,16 @@ var AmplitudeBrowser = /** @class */ (function (_super) {
154
156
  _j.sent();
155
157
  this.logBrowserOptions(browserOptions);
156
158
  this.config.remoteConfigClient = remoteConfigClient;
157
- if (!(0, default_tracking_1.isAttributionTrackingEnabled)(this.config.defaultTracking)) return [3 /*break*/, 8];
159
+ attributionTrackingOptions = (0, default_tracking_1.getAttributionTrackingConfig)(this.config);
160
+ if (!((0, default_tracking_1.isAttributionTrackingEnabled)(this.config.defaultTracking) &&
161
+ (0, tracking_methods_1.isUserPropertyAttributionEnabled)(attributionTrackingOptions))) return [3 /*break*/, 8];
158
162
  if (this.config.optOut) {
159
163
  this.timeline.addOptOutListener(function (optOut) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
160
- var attributionTrackingOptions_1;
161
164
  return tslib_1.__generator(this, function (_a) {
162
165
  switch (_a.label) {
163
166
  case 0:
164
167
  if (!!optOut) return [3 /*break*/, 2];
165
- attributionTrackingOptions_1 = (0, default_tracking_1.getAttributionTrackingConfig)(this.config);
166
- this.webAttribution = new web_attribution_1.WebAttribution(attributionTrackingOptions_1, this.config);
168
+ this.webAttribution = new web_attribution_1.WebAttribution(attributionTrackingOptions, this.config);
167
169
  return [4 /*yield*/, this.webAttribution.init()];
168
170
  case 1:
169
171
  _a.sent();
@@ -173,7 +175,6 @@ var AmplitudeBrowser = /** @class */ (function (_super) {
173
175
  });
174
176
  }); });
175
177
  }
176
- attributionTrackingOptions = (0, default_tracking_1.getAttributionTrackingConfig)(this.config);
177
178
  this.webAttribution = new web_attribution_1.WebAttribution(attributionTrackingOptions, this.config);
178
179
  // Fetch the current campaign, check if need to track web attribution later
179
180
  return [4 /*yield*/, this.webAttribution.init()];
@@ -269,52 +270,60 @@ var AmplitudeBrowser = /** @class */ (function (_super) {
269
270
  }); });
270
271
  _j.label = 20;
271
272
  case 20:
272
- if (!(0, default_tracking_1.isElementInteractionsEnabled)(this.config.autocapture)) return [3 /*break*/, 22];
273
- this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');
274
- return [4 /*yield*/, this.add((0, plugin_autocapture_browser_1.autocapturePlugin)((0, default_tracking_1.getElementInteractionsConfig)(this.config), { diagnosticsClient: diagnosticsClient })).promise];
273
+ if (!((0, default_tracking_1.isAttributionTrackingEnabled)(this.config.defaultTracking) &&
274
+ (0, tracking_methods_1.isEventPropertyAttributionEnabled)(attributionTrackingOptions))) return [3 /*break*/, 22];
275
+ this.config.loggerProvider.debug('Adding event property attribution plugin');
276
+ return [4 /*yield*/, this.add((0, plugin_event_property_attribution_browser_1.eventPropertyTrackingPlugin)(attributionTrackingOptions)).promise];
275
277
  case 21:
276
278
  _j.sent();
277
279
  _j.label = 22;
278
280
  case 22:
279
- if (!(0, default_tracking_1.isFrustrationInteractionsEnabled)(this.config.autocapture)) return [3 /*break*/, 24];
280
- this.config.loggerProvider.debug('Adding frustration interactions plugin');
281
- return [4 /*yield*/, this.add((0, plugin_autocapture_browser_1.frustrationPlugin)((0, default_tracking_1.getFrustrationInteractionsConfig)(this.config))).promise];
281
+ if (!(0, default_tracking_1.isElementInteractionsEnabled)(this.config.autocapture)) return [3 /*break*/, 24];
282
+ this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');
283
+ return [4 /*yield*/, this.add((0, plugin_autocapture_browser_1.autocapturePlugin)((0, default_tracking_1.getElementInteractionsConfig)(this.config), { diagnosticsClient: diagnosticsClient })).promise];
282
284
  case 23:
283
285
  _j.sent();
284
286
  _j.label = 24;
285
287
  case 24:
286
- if (!(0, default_tracking_1.isNetworkTrackingEnabled)(this.config.autocapture)) return [3 /*break*/, 26];
287
- this.config.loggerProvider.debug('Adding network tracking plugin');
288
- return [4 /*yield*/, this.add((0, plugin_network_capture_browser_1.plugin)((0, default_tracking_1.getNetworkTrackingConfig)(this.config))).promise];
288
+ if (!(0, default_tracking_1.isFrustrationInteractionsEnabled)(this.config.autocapture)) return [3 /*break*/, 26];
289
+ this.config.loggerProvider.debug('Adding frustration interactions plugin');
290
+ return [4 /*yield*/, this.add((0, plugin_autocapture_browser_1.frustrationPlugin)((0, default_tracking_1.getFrustrationInteractionsConfig)(this.config))).promise];
289
291
  case 25:
290
292
  _j.sent();
291
293
  _j.label = 26;
292
294
  case 26:
293
- if (!(0, default_tracking_1.isWebVitalsEnabled)(this.config.autocapture)) return [3 /*break*/, 28];
294
- this.config.loggerProvider.debug('Adding web vitals plugin');
295
- return [4 /*yield*/, this.add((0, plugin_web_vitals_browser_1.webVitalsPlugin)()).promise];
295
+ if (!(0, default_tracking_1.isNetworkTrackingEnabled)(this.config.autocapture)) return [3 /*break*/, 28];
296
+ this.config.loggerProvider.debug('Adding network tracking plugin');
297
+ return [4 /*yield*/, this.add((0, plugin_network_capture_browser_1.plugin)((0, default_tracking_1.getNetworkTrackingConfig)(this.config))).promise];
296
298
  case 27:
297
299
  _j.sent();
298
300
  _j.label = 28;
299
301
  case 28:
300
- if (!(0, default_tracking_1.isPageUrlEnrichmentEnabled)(this.config.autocapture)) return [3 /*break*/, 30];
301
- this.config.loggerProvider.debug('Adding referrer page url plugin');
302
- return [4 /*yield*/, this.add((0, plugin_page_url_enrichment_browser_1.pageUrlEnrichmentPlugin)()).promise];
302
+ if (!(0, default_tracking_1.isWebVitalsEnabled)(this.config.autocapture)) return [3 /*break*/, 30];
303
+ this.config.loggerProvider.debug('Adding web vitals plugin');
304
+ return [4 /*yield*/, this.add((0, plugin_web_vitals_browser_1.webVitalsPlugin)()).promise];
303
305
  case 29:
304
306
  _j.sent();
305
307
  _j.label = 30;
306
308
  case 30:
307
- if (!(0, default_tracking_1.isCustomEnrichmentEnabled)(this.config.customEnrichment)) return [3 /*break*/, 32];
308
- this.config.loggerProvider.debug('Adding custom enrichment plugin');
309
- return [4 /*yield*/, this.add((0, plugin_custom_enrichment_browser_1.customEnrichmentPlugin)()).promise];
309
+ if (!(0, default_tracking_1.isPageUrlEnrichmentEnabled)(this.config.autocapture)) return [3 /*break*/, 32];
310
+ this.config.loggerProvider.debug('Adding referrer page url plugin');
311
+ return [4 /*yield*/, this.add((0, plugin_page_url_enrichment_browser_1.pageUrlEnrichmentPlugin)()).promise];
310
312
  case 31:
311
313
  _j.sent();
312
314
  _j.label = 32;
313
315
  case 32:
316
+ if (!(0, default_tracking_1.isCustomEnrichmentEnabled)(this.config.customEnrichment)) return [3 /*break*/, 34];
317
+ this.config.loggerProvider.debug('Adding custom enrichment plugin');
318
+ return [4 /*yield*/, this.add((0, plugin_custom_enrichment_browser_1.customEnrichmentPlugin)()).promise];
319
+ case 33:
320
+ _j.sent();
321
+ _j.label = 34;
322
+ case 34:
314
323
  this.initializing = false;
315
324
  // Step 6: Run queued dispatch functions
316
325
  return [4 /*yield*/, this.runQueuedFunctions('dispatchQ')];
317
- case 33:
326
+ case 35:
318
327
  // Step 6: Run queued dispatch functions
319
328
  _j.sent();
320
329
  // Step 7: Add the event receiver after running remaining queued functions.
@@ -529,7 +538,9 @@ var AmplitudeBrowser = /** @class */ (function (_super) {
529
538
  return _super.prototype.revenue.call(this, revenue, eventOptions);
530
539
  };
531
540
  AmplitudeBrowser.prototype.trackCampaignEventIfNeeded = function (lastEventId, promises) {
532
- if (!this.webAttribution || !this.webAttribution.shouldTrackNewCampaign) {
541
+ if (!this.webAttribution ||
542
+ !this.webAttribution.shouldTrackNewCampaign ||
543
+ !(0, tracking_methods_1.isUserPropertyAttributionEnabled)(this.webAttribution.options)) {
533
544
  return false;
534
545
  }
535
546
  var campaignEvent = this.webAttribution.generateCampaignEvent(lastEventId);
@@ -1 +1 @@
1
- {"version":3,"file":"browser-client.js","sourceRoot":"","sources":["../../src/browser-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AmplitudeCore,\n Destination,\n Identify,\n returnWrapper,\n Revenue,\n UUID,\n getAnalyticsConnector,\n setConnectorDeviceId,\n setConnectorUserId,\n isNewSession,\n IdentityEventSender,\n getQueryParams,\n Event,\n EventOptions,\n IIdentify,\n IRevenue,\n TransportTypeOrOptions,\n OfflineDisabled,\n Result,\n BrowserOptions,\n BrowserConfig,\n BrowserClient,\n AnalyticsClient,\n AnalyticsIdentity,\n IRemoteConfigClient,\n RemoteConfigClient,\n RemoteConfig,\n Source,\n DiagnosticsClient,\n createIdentifyEvent,\n Logger,\n safeJsonStringify,\n LogLevel,\n} from '@amplitude/analytics-core';\nimport {\n getAttributionTrackingConfig,\n getPageViewTrackingConfig,\n getElementInteractionsConfig,\n getNetworkTrackingConfig,\n isAttributionTrackingEnabled,\n isSessionTrackingEnabled,\n isFileDownloadTrackingEnabled,\n isFormInteractionTrackingEnabled,\n isElementInteractionsEnabled,\n isPageViewTrackingEnabled,\n isNetworkTrackingEnabled,\n isWebVitalsEnabled,\n isFrustrationInteractionsEnabled,\n getFrustrationInteractionsConfig,\n isPageUrlEnrichmentEnabled,\n isCustomEnrichmentEnabled,\n} from './default-tracking';\nimport { convertProxyObjectToRealObject, isInstanceProxy } from './utils/snippet-helper';\nimport { Context } from './plugins/context';\nimport { useBrowserConfig, createTransport, shouldFetchRemoteConfig } from './config';\nimport { pageViewTrackingPlugin } from '@amplitude/plugin-page-view-tracking-browser';\nimport { formInteractionTracking } from './plugins/form-interaction-tracking';\nimport { fileDownloadTracking } from './plugins/file-download-tracking';\nimport { DEFAULT_SESSION_END_EVENT, DEFAULT_SESSION_START_EVENT, DEFAULT_SERVER_ZONE } from './constants';\nimport { detNotify } from './det-notification';\nimport { networkConnectivityCheckerPlugin } from './plugins/network-connectivity-checker';\nimport { updateBrowserConfigWithRemoteConfig } from './config/joined-config';\nimport { autocapturePlugin, frustrationPlugin } from '@amplitude/plugin-autocapture-browser';\nimport { plugin as networkCapturePlugin } from '@amplitude/plugin-network-capture-browser';\nimport { webVitalsPlugin } from '@amplitude/plugin-web-vitals-browser';\nimport { WebAttribution } from './attribution/web-attribution';\nimport { LIBPREFIX } from './lib-prefix';\nimport { VERSION } from './version';\nimport { pageUrlEnrichmentPlugin } from '@amplitude/plugin-page-url-enrichment-browser';\nimport { customEnrichmentPlugin } from '@amplitude/plugin-custom-enrichment-browser';\n\nconst UNSPECIFIED_SESSION_ID = -1;\n\n/**\n * Exported for `@amplitude/unified` or integration with blade plugins.\n * If you only use `@amplitude/analytics-browser`, use `amplitude.init()` or `amplitude.createInstance()` instead.\n */\nexport class AmplitudeBrowser extends AmplitudeCore implements BrowserClient, AnalyticsClient {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n previousSessionDeviceId: string | undefined;\n previousSessionUserId: string | undefined;\n webAttribution: WebAttribution | undefined;\n\n // Backdoor to set diagnostics sample rate\n // by calling amplitude._setDiagnosticsSampleRate(1); before amplitude.init()\n _diagnosticsSampleRate = 0;\n\n // Backdoor to test request body compression\n // by calling amplitude._enableRequestBodyCompressionExperimental(true); before amplitude.init()\n _enableRequestBodyCompressionExperimentalValue = false;\n\n init(apiKey = '', userIdOrOptions?: string | BrowserOptions, maybeOptions?: BrowserOptions) {\n let userId: string | undefined;\n let options: BrowserOptions | undefined;\n if (arguments.length > 2) {\n userId = userIdOrOptions as string | undefined;\n options = maybeOptions;\n } else {\n if (typeof userIdOrOptions === 'string') {\n userId = userIdOrOptions;\n options = undefined;\n } else {\n userId = userIdOrOptions?.userId;\n options = userIdOrOptions;\n }\n }\n return returnWrapper(this._init({ ...options, userId, apiKey }));\n }\n protected async _init(options: BrowserOptions & { apiKey: string }) {\n // Step 1: Block concurrent initialization\n if (this.initializing) {\n return;\n }\n this.initializing = true;\n\n // Step 2: Create browser config\n // Step 2.1: Determine if we should fetch remote config BEFORE creating browser config\n // This allows us to get diagnostics settings before creating the DiagnosticsClient\n const fetchRemoteConfig = shouldFetchRemoteConfig(options);\n\n // Set up early dependencies needed for remote config client\n // These use options directly or fall back to defaults\n const loggerProvider = options.loggerProvider ?? new Logger();\n if (!options.loggerProvider) {\n loggerProvider.enable(options.logLevel ?? LogLevel.Warn);\n }\n const serverZone = options.serverZone ?? DEFAULT_SERVER_ZONE;\n\n let remoteConfigClient: IRemoteConfigClient | undefined;\n let diagnosticsSampleRate = this._diagnosticsSampleRate;\n let enableDiagnostics = options.enableDiagnostics ?? true;\n\n // Step 2.2: Fetch diagnostics config FIRST to get sample rate for DiagnosticsClient\n // We want to create DiagnosticsClient as early as possible so it can track more data\n /* istanbul ignore next */\n if (fetchRemoteConfig) {\n remoteConfigClient = new RemoteConfigClient(\n options.apiKey,\n loggerProvider,\n serverZone,\n /* istanbul ignore next */ options.remoteConfig?.serverUrl,\n );\n\n // Fetch diagnostics config first to get sample rate\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.diagnostics.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n loggerProvider.debug(\n 'Diagnostics remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n // Validate and set sampleRate (must be a valid number)\n const sampleRate = remoteConfig.sampleRate as number;\n if (typeof sampleRate === 'number' && !isNaN(sampleRate)) {\n diagnosticsSampleRate = sampleRate;\n }\n\n // Validate and set enabled (must be a boolean)\n const enabled = remoteConfig.enabled as boolean;\n if (typeof enabled === 'boolean') {\n enableDiagnostics = enabled;\n }\n }\n resolve();\n },\n );\n });\n }\n\n // Step 2.3: Initialize diagnostics client as early as possible\n // Now we have the sample rate from remote config (if fetched)\n const diagnosticsClient = new DiagnosticsClient(options.apiKey, loggerProvider, serverZone, {\n enabled: enableDiagnostics,\n sampleRate: diagnosticsSampleRate,\n });\n diagnosticsClient.setTag('library', `${LIBPREFIX}/${VERSION}`);\n if (typeof navigator !== 'undefined') {\n diagnosticsClient.setTag('user_agent', navigator.userAgent);\n }\n\n // Step 2.4: Create browser config with diagnosticsClient and earlyConfig\n // earlyConfig ensures consistent logger/serverZone/diagnostics settings across all components\n const browserOptions = await useBrowserConfig(options.apiKey, options, this, diagnosticsClient, {\n loggerProvider,\n serverZone,\n enableDiagnostics,\n diagnosticsSampleRate,\n });\n\n // Step 2.5: Fetch analytics SDK remote config\n // This is fetched after DiagnosticsClient is created so diagnostics can track any issues\n /* istanbul ignore next */\n if (fetchRemoteConfig && remoteConfigClient) {\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.analyticsSDK.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n browserOptions.loggerProvider.debug(\n 'Remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n updateBrowserConfigWithRemoteConfig(remoteConfig, browserOptions);\n }\n // Resolve the promise on first callback (initial config)\n resolve();\n },\n );\n });\n }\n\n await super._init(browserOptions);\n this.logBrowserOptions(browserOptions);\n\n this.config.remoteConfigClient = remoteConfigClient;\n\n // Add web attribution plugin\n if (isAttributionTrackingEnabled(this.config.defaultTracking)) {\n if (this.config.optOut) {\n this.timeline.addOptOutListener(async (optOut) => {\n if (!optOut) {\n const attributionTrackingOptions = getAttributionTrackingConfig(this.config);\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n await this.webAttribution.init();\n }\n });\n }\n const attributionTrackingOptions = getAttributionTrackingConfig(this.config);\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n // Fetch the current campaign, check if need to track web attribution later\n await this.webAttribution.init();\n }\n\n // Step 3: Set session ID\n // Priority 1: `options.sessionId`\n // Priority 2: sessionId from url if it's Number and ampTimestamp is valid\n // Priority 3: last known sessionId from user identity storage\n // Default: `Date.now()`\n // Session ID is handled differently than device ID and user ID due to session events\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // check if we need to set the sessionId\n const querySessionId =\n isWithinTimeLimit && !Number.isNaN(Number(queryParams.ampSessionId))\n ? Number(queryParams.ampSessionId)\n : undefined;\n\n let deferredSessionId = this.config.deferredSessionId;\n if (deferredSessionId === UNSPECIFIED_SESSION_ID && !this.config.optOut) {\n deferredSessionId = Date.now();\n }\n\n this.setSessionId(options.sessionId ?? querySessionId ?? deferredSessionId ?? this.config.sessionId);\n\n if (this.config.optOut) {\n this.timeline.addOptOutListener(async (optOut) => {\n if (!optOut && this.config.deferredSessionId) {\n if (this.config.deferredSessionId === UNSPECIFIED_SESSION_ID) {\n this.setSessionId(undefined);\n } else {\n this.setSessionId(this.config.deferredSessionId);\n }\n }\n });\n }\n\n // Set up the analytics connector to integrate with the experiment SDK.\n // Send events from the experiment SDK and forward identifies to the\n // identity store.\n const connector = getAnalyticsConnector(options.instanceName);\n connector.identityStore.setIdentity({\n userId: this.config.userId,\n deviceId: this.config.deviceId,\n });\n\n // Step 4: Install plugins\n // Do not track any events before this\n if (this.config.offline !== OfflineDisabled) {\n await this.add(networkConnectivityCheckerPlugin()).promise;\n }\n await this.add(new Destination({ diagnosticsClient })).promise;\n await this.add(new Context()).promise;\n await this.add(new IdentityEventSender()).promise;\n\n // Notify if DET is enabled\n detNotify(this.config);\n\n if (isFileDownloadTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding file download tracking plugin');\n await this.add(fileDownloadTracking()).promise;\n }\n\n if (isFormInteractionTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding form interaction plugin');\n await this.add(formInteractionTracking()).promise;\n }\n\n // Add page view plugin\n if (isPageViewTrackingEnabled(this.config.defaultTracking)) {\n if (!this.config.optOut) {\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n } else {\n this.timeline.addOptOutListener(async (optOut) => {\n /* istanbul ignore if */\n if (optOut) {\n return;\n }\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n });\n }\n }\n\n if (isElementInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');\n await this.add(autocapturePlugin(getElementInteractionsConfig(this.config), { diagnosticsClient })).promise;\n }\n\n if (isFrustrationInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding frustration interactions plugin');\n await this.add(frustrationPlugin(getFrustrationInteractionsConfig(this.config))).promise;\n }\n\n if (isNetworkTrackingEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding network tracking plugin');\n await this.add(networkCapturePlugin(getNetworkTrackingConfig(this.config))).promise;\n }\n\n if (isWebVitalsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding web vitals plugin');\n await this.add(webVitalsPlugin()).promise;\n }\n\n if (isPageUrlEnrichmentEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding referrer page url plugin');\n await this.add(pageUrlEnrichmentPlugin()).promise;\n }\n\n if (isCustomEnrichmentEnabled(this.config.customEnrichment)) {\n this.config.loggerProvider.debug('Adding custom enrichment plugin');\n await this.add(customEnrichmentPlugin()).promise;\n }\n\n this.initializing = false;\n\n // Step 6: Run queued dispatch functions\n await this.runQueuedFunctions('dispatchQ');\n\n // Step 7: Add the event receiver after running remaining queued functions.\n connector.eventBridge.setEventReceiver((event) => {\n const { time, ...cleanEventProperties } = event.eventProperties || {};\n const eventOptions = typeof time === 'number' ? { time } : undefined;\n void this.track(event.eventType, cleanEventProperties, eventOptions);\n });\n }\n\n getUserId() {\n return this.config?.userId;\n }\n\n setUserId(userId: string | undefined) {\n if (!this.config) {\n this.q.push(this.setUserId.bind(this, userId));\n return;\n }\n this.config.loggerProvider.debug('function setUserId: ', userId);\n if (userId !== this.config.userId || userId === undefined) {\n this.config.userId = userId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ userId: userId });\n setConnectorUserId(userId, this.config.instanceName);\n }\n }\n\n getDeviceId() {\n return this.config?.deviceId;\n }\n\n setDeviceId(deviceId: string) {\n if (!this.config) {\n this.q.push(this.setDeviceId.bind(this, deviceId));\n return;\n }\n this.config.loggerProvider.debug('function setDeviceId: ', deviceId);\n if (deviceId !== this.config.deviceId) {\n this.config.deviceId = deviceId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ deviceId: deviceId });\n setConnectorDeviceId(deviceId, this.config.instanceName);\n }\n }\n\n reset() {\n this.setDeviceId(UUID());\n this.setUserId(undefined);\n this.timeline.onReset();\n }\n\n getIdentity() {\n return {\n deviceId: this.config?.deviceId,\n userId: this.config?.userId,\n userProperties: this.userProperties,\n };\n }\n\n setIdentity(identity: Partial<AnalyticsIdentity>) {\n // Handle userId change\n if ('userId' in identity) {\n this.setUserId(identity.userId);\n }\n\n // Handle deviceId change\n if ('deviceId' in identity && identity.deviceId) {\n this.setDeviceId(identity.deviceId);\n }\n\n // Handle userProperties change - auto-send identify\n if ('userProperties' in identity) {\n this.userProperties = identity.userProperties;\n // Auto-send identify event with $set operations\n const identifyObj = new Identify();\n // istanbul ignore next\n const userProperties = identity.userProperties ?? {};\n for (const [key, value] of Object.entries(userProperties)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n identifyObj.set(key, value);\n }\n // The identify event processing in core-client already calls onIdentityChanged,\n // so we don't need to call it explicitly here to avoid duplicate notifications.\n this.identify(identifyObj);\n }\n }\n\n getOptOut(): boolean | undefined {\n return this.config?.optOut;\n }\n\n getSessionId() {\n return this.config?.sessionId;\n }\n\n setSessionId(sessionId: number | undefined) {\n const promises: Promise<Result>[] = [];\n if (!this.config) {\n this.q.push(this.setSessionId.bind(this, sessionId));\n return returnWrapper(Promise.resolve());\n }\n // do not start a new session if optOut is true\n if (this.config.optOut) {\n // save the sessionId to storage to be used when optOut is false\n this.config.deferredSessionId = sessionId ?? UNSPECIFIED_SESSION_ID;\n return returnWrapper(Promise.resolve());\n }\n\n // default sessionId to current time\n if (sessionId === undefined) {\n sessionId = Date.now();\n }\n\n // Prevents starting a new session with the same session ID\n if (sessionId === this.config.sessionId) {\n return returnWrapper(Promise.resolve());\n }\n\n this.config.loggerProvider.debug('function setSessionId: ', sessionId);\n\n const previousSessionId = this.getSessionId();\n if (previousSessionId !== sessionId) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onSessionIdChanged(sessionId);\n }\n\n const lastEventTime = this.config.lastEventTime;\n let lastEventId = this.config.lastEventId ?? -1;\n\n this.config.sessionId = sessionId;\n this.config.lastEventTime = undefined;\n this.config.pageCounter = 0;\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n if (previousSessionId && lastEventTime) {\n promises.push(\n this.track(DEFAULT_SESSION_END_EVENT, undefined, {\n device_id: this.previousSessionDeviceId,\n event_id: ++lastEventId,\n session_id: previousSessionId,\n time: lastEventTime + 1,\n user_id: this.previousSessionUserId,\n }).promise,\n );\n }\n this.config.lastEventTime = this.config.sessionId;\n }\n\n // Fire web attribution event when enable webAttribution tracking\n // 1. has new campaign (call setSessionId from init function)\n // 2. or shouldTrackNewCampaign (call setSessionId from async process(event) when there has new campaign and resetSessionOnNewCampaign = true )\n const isCampaignEventTracked = this.trackCampaignEventIfNeeded(++lastEventId, promises);\n\n // track the identify event if an Identify object is provided in the config\n if (this.config.identify) {\n promises.push(this.track(createIdentifyEvent(this.config.identify)).promise);\n }\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n promises.push(\n this.track(DEFAULT_SESSION_START_EVENT, undefined, {\n event_id: isCampaignEventTracked ? ++lastEventId : lastEventId,\n session_id: this.config.sessionId,\n time: this.config.lastEventTime,\n }).promise,\n );\n }\n\n this.previousSessionDeviceId = this.config.deviceId;\n this.previousSessionUserId = this.config.userId;\n return returnWrapper(Promise.all(promises));\n }\n\n extendSession() {\n if (!this.config) {\n this.q.push(this.extendSession.bind(this));\n return;\n }\n this.config.lastEventTime = Date.now();\n }\n\n setTransport(transport: TransportTypeOrOptions) {\n if (!this.config) {\n this.q.push(this.setTransport.bind(this, transport));\n return;\n }\n this.config.transportProvider = createTransport(transport);\n }\n\n identify(identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n if (eventOptions?.user_id) {\n this.setUserId(eventOptions.user_id);\n }\n if (eventOptions?.device_id) {\n this.setDeviceId(eventOptions.device_id);\n }\n return super.identify(identify, eventOptions);\n }\n\n groupIdentify(groupType: string, groupName: string | string[], identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n return super.groupIdentify(groupType, groupName, identify, eventOptions);\n }\n\n revenue(revenue: IRevenue, eventOptions?: EventOptions) {\n if (isInstanceProxy(revenue)) {\n const queue = revenue._q;\n revenue._q = [];\n revenue = convertProxyObjectToRealObject(new Revenue(), queue);\n }\n return super.revenue(revenue, eventOptions);\n }\n\n private trackCampaignEventIfNeeded(lastEventId?: number, promises?: Promise<Result>[]) {\n if (!this.webAttribution || !this.webAttribution.shouldTrackNewCampaign) {\n return false;\n }\n\n const campaignEvent = this.webAttribution.generateCampaignEvent(lastEventId);\n if (promises) {\n promises.push(this.track(campaignEvent).promise);\n } else {\n this.track(campaignEvent);\n }\n this.config.loggerProvider.log('Tracking attribution.');\n return true;\n }\n\n async process(event: Event) {\n const currentTime = Date.now();\n const isEventInNewSession = isNewSession(this.config.sessionTimeout, this.config.lastEventTime);\n const shouldSetSessionIdOnNewCampaign =\n this.webAttribution && this.webAttribution.shouldSetSessionIdOnNewCampaign();\n\n if (\n event.event_type !== DEFAULT_SESSION_START_EVENT &&\n event.event_type !== DEFAULT_SESSION_END_EVENT &&\n (!event.session_id || event.session_id === this.getSessionId())\n ) {\n if (isEventInNewSession || shouldSetSessionIdOnNewCampaign) {\n this.setSessionId(currentTime);\n if (shouldSetSessionIdOnNewCampaign) {\n this.config.loggerProvider.log('Created a new session for new campaign.');\n }\n } else if (!isEventInNewSession) {\n // Web attribution should be tracked during the middle of a session\n // if there has been a chance in the campaign information.\n this.trackCampaignEventIfNeeded();\n }\n }\n\n return super.process(event);\n }\n\n private logBrowserOptions(browserConfig: BrowserOptions & { apiKey: string }) {\n try {\n const browserConfigCopy = {\n ...browserConfig,\n apiKey: browserConfig.apiKey.substring(0, 10) + '********',\n };\n this.config.loggerProvider.debug(\n 'Initialized Amplitude with BrowserConfig:',\n safeJsonStringify(browserConfigCopy),\n );\n } catch (e) {\n /* istanbul ignore next */\n this.config.loggerProvider.error('Error logging browser config', e);\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n *\n * Sets the diagnostics sample rate before amplitude.init()\n * @param sampleRate - The sample rate to set\n */\n _setDiagnosticsSampleRate(sampleRate: number): void {\n if (sampleRate > 1 || sampleRate < 0) {\n return;\n }\n // Set diagnostics sample rate before initializing the config\n if (!this.config) {\n this._diagnosticsSampleRate = sampleRate;\n return;\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n */\n _enableRequestBodyCompressionExperimental(enabled: boolean): void {\n // Set request body compression experimental config before initializing the config\n if (!this.config) {\n this._enableRequestBodyCompressionExperimentalValue = enabled;\n return;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"browser-client.js","sourceRoot":"","sources":["../../src/browser-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AmplitudeCore,\n Destination,\n Identify,\n returnWrapper,\n Revenue,\n UUID,\n getAnalyticsConnector,\n setConnectorDeviceId,\n setConnectorUserId,\n isNewSession,\n IdentityEventSender,\n getQueryParams,\n Event,\n EventOptions,\n IIdentify,\n IRevenue,\n TransportTypeOrOptions,\n OfflineDisabled,\n Result,\n BrowserOptions,\n BrowserConfig,\n BrowserClient,\n AnalyticsClient,\n AnalyticsIdentity,\n IRemoteConfigClient,\n RemoteConfigClient,\n RemoteConfig,\n Source,\n DiagnosticsClient,\n createIdentifyEvent,\n Logger,\n safeJsonStringify,\n LogLevel,\n} from '@amplitude/analytics-core';\nimport {\n getAttributionTrackingConfig,\n getPageViewTrackingConfig,\n getElementInteractionsConfig,\n getNetworkTrackingConfig,\n isAttributionTrackingEnabled,\n isSessionTrackingEnabled,\n isFileDownloadTrackingEnabled,\n isFormInteractionTrackingEnabled,\n isElementInteractionsEnabled,\n isPageViewTrackingEnabled,\n isNetworkTrackingEnabled,\n isWebVitalsEnabled,\n isFrustrationInteractionsEnabled,\n getFrustrationInteractionsConfig,\n isPageUrlEnrichmentEnabled,\n isCustomEnrichmentEnabled,\n} from './default-tracking';\nimport { convertProxyObjectToRealObject, isInstanceProxy } from './utils/snippet-helper';\nimport { Context } from './plugins/context';\nimport { useBrowserConfig, createTransport, shouldFetchRemoteConfig } from './config';\nimport { pageViewTrackingPlugin } from '@amplitude/plugin-page-view-tracking-browser';\nimport { formInteractionTracking } from './plugins/form-interaction-tracking';\nimport { fileDownloadTracking } from './plugins/file-download-tracking';\nimport { DEFAULT_SESSION_END_EVENT, DEFAULT_SESSION_START_EVENT, DEFAULT_SERVER_ZONE } from './constants';\nimport { detNotify } from './det-notification';\nimport { networkConnectivityCheckerPlugin } from './plugins/network-connectivity-checker';\nimport { updateBrowserConfigWithRemoteConfig } from './config/joined-config';\nimport { autocapturePlugin, frustrationPlugin } from '@amplitude/plugin-autocapture-browser';\nimport { plugin as networkCapturePlugin } from '@amplitude/plugin-network-capture-browser';\nimport { webVitalsPlugin } from '@amplitude/plugin-web-vitals-browser';\nimport { WebAttribution } from './attribution/web-attribution';\nimport { eventPropertyTrackingPlugin } from '@amplitude/plugin-event-property-attribution-browser';\nimport { LIBPREFIX } from './lib-prefix';\nimport { VERSION } from './version';\nimport { pageUrlEnrichmentPlugin } from '@amplitude/plugin-page-url-enrichment-browser';\nimport { customEnrichmentPlugin } from '@amplitude/plugin-custom-enrichment-browser';\nimport { isEventPropertyAttributionEnabled, isUserPropertyAttributionEnabled } from './attribution/tracking-methods';\n\nconst UNSPECIFIED_SESSION_ID = -1;\n\n/**\n * Exported for `@amplitude/unified` or integration with blade plugins.\n * If you only use `@amplitude/analytics-browser`, use `amplitude.init()` or `amplitude.createInstance()` instead.\n */\nexport class AmplitudeBrowser extends AmplitudeCore implements BrowserClient, AnalyticsClient {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n previousSessionDeviceId: string | undefined;\n previousSessionUserId: string | undefined;\n webAttribution: WebAttribution | undefined;\n\n // Backdoor to set diagnostics sample rate\n // by calling amplitude._setDiagnosticsSampleRate(1); before amplitude.init()\n _diagnosticsSampleRate = 0;\n\n // Backdoor to test request body compression\n // by calling amplitude._enableRequestBodyCompressionExperimental(true); before amplitude.init()\n _enableRequestBodyCompressionExperimentalValue = false;\n\n init(apiKey = '', userIdOrOptions?: string | BrowserOptions, maybeOptions?: BrowserOptions) {\n let userId: string | undefined;\n let options: BrowserOptions | undefined;\n if (arguments.length > 2) {\n userId = userIdOrOptions as string | undefined;\n options = maybeOptions;\n } else {\n if (typeof userIdOrOptions === 'string') {\n userId = userIdOrOptions;\n options = undefined;\n } else {\n userId = userIdOrOptions?.userId;\n options = userIdOrOptions;\n }\n }\n return returnWrapper(this._init({ ...options, userId, apiKey }));\n }\n protected async _init(options: BrowserOptions & { apiKey: string }) {\n // Step 1: Block concurrent initialization\n if (this.initializing) {\n return;\n }\n this.initializing = true;\n\n // Step 2: Create browser config\n // Step 2.1: Determine if we should fetch remote config BEFORE creating browser config\n // This allows us to get diagnostics settings before creating the DiagnosticsClient\n const fetchRemoteConfig = shouldFetchRemoteConfig(options);\n\n // Set up early dependencies needed for remote config client\n // These use options directly or fall back to defaults\n const loggerProvider = options.loggerProvider ?? new Logger();\n if (!options.loggerProvider) {\n loggerProvider.enable(options.logLevel ?? LogLevel.Warn);\n }\n const serverZone = options.serverZone ?? DEFAULT_SERVER_ZONE;\n\n let remoteConfigClient: IRemoteConfigClient | undefined;\n let diagnosticsSampleRate = this._diagnosticsSampleRate;\n let enableDiagnostics = options.enableDiagnostics ?? true;\n\n // Step 2.2: Fetch diagnostics config FIRST to get sample rate for DiagnosticsClient\n // We want to create DiagnosticsClient as early as possible so it can track more data\n /* istanbul ignore next */\n if (fetchRemoteConfig) {\n remoteConfigClient = new RemoteConfigClient(\n options.apiKey,\n loggerProvider,\n serverZone,\n /* istanbul ignore next */ options.remoteConfig?.serverUrl,\n );\n\n // Fetch diagnostics config first to get sample rate\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.diagnostics.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n loggerProvider.debug(\n 'Diagnostics remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n // Validate and set sampleRate (must be a valid number)\n const sampleRate = remoteConfig.sampleRate as number;\n if (typeof sampleRate === 'number' && !isNaN(sampleRate)) {\n diagnosticsSampleRate = sampleRate;\n }\n\n // Validate and set enabled (must be a boolean)\n const enabled = remoteConfig.enabled as boolean;\n if (typeof enabled === 'boolean') {\n enableDiagnostics = enabled;\n }\n }\n resolve();\n },\n );\n });\n }\n\n // Step 2.3: Initialize diagnostics client as early as possible\n // Now we have the sample rate from remote config (if fetched)\n const diagnosticsClient = new DiagnosticsClient(options.apiKey, loggerProvider, serverZone, {\n enabled: enableDiagnostics,\n sampleRate: diagnosticsSampleRate,\n });\n diagnosticsClient.setTag('library', `${LIBPREFIX}/${VERSION}`);\n if (typeof navigator !== 'undefined') {\n diagnosticsClient.setTag('user_agent', navigator.userAgent);\n }\n\n // Step 2.4: Create browser config with diagnosticsClient and earlyConfig\n // earlyConfig ensures consistent logger/serverZone/diagnostics settings across all components\n const browserOptions = await useBrowserConfig(options.apiKey, options, this, diagnosticsClient, {\n loggerProvider,\n serverZone,\n enableDiagnostics,\n diagnosticsSampleRate,\n });\n\n // Step 2.5: Fetch analytics SDK remote config\n // This is fetched after DiagnosticsClient is created so diagnostics can track any issues\n /* istanbul ignore next */\n if (fetchRemoteConfig && remoteConfigClient) {\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.analyticsSDK.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n browserOptions.loggerProvider.debug(\n 'Remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n updateBrowserConfigWithRemoteConfig(remoteConfig, browserOptions);\n }\n // Resolve the promise on first callback (initial config)\n resolve();\n },\n );\n });\n }\n\n await super._init(browserOptions);\n this.logBrowserOptions(browserOptions);\n\n this.config.remoteConfigClient = remoteConfigClient;\n\n const attributionTrackingOptions = getAttributionTrackingConfig(this.config);\n\n // Add web attribution plugin\n if (\n isAttributionTrackingEnabled(this.config.defaultTracking) &&\n isUserPropertyAttributionEnabled(attributionTrackingOptions)\n ) {\n if (this.config.optOut) {\n this.timeline.addOptOutListener(async (optOut) => {\n if (!optOut) {\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n await this.webAttribution.init();\n }\n });\n }\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n // Fetch the current campaign, check if need to track web attribution later\n await this.webAttribution.init();\n }\n\n // Step 3: Set session ID\n // Priority 1: `options.sessionId`\n // Priority 2: sessionId from url if it's Number and ampTimestamp is valid\n // Priority 3: last known sessionId from user identity storage\n // Default: `Date.now()`\n // Session ID is handled differently than device ID and user ID due to session events\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // check if we need to set the sessionId\n const querySessionId =\n isWithinTimeLimit && !Number.isNaN(Number(queryParams.ampSessionId))\n ? Number(queryParams.ampSessionId)\n : undefined;\n\n let deferredSessionId = this.config.deferredSessionId;\n if (deferredSessionId === UNSPECIFIED_SESSION_ID && !this.config.optOut) {\n deferredSessionId = Date.now();\n }\n\n this.setSessionId(options.sessionId ?? querySessionId ?? deferredSessionId ?? this.config.sessionId);\n\n if (this.config.optOut) {\n this.timeline.addOptOutListener(async (optOut) => {\n if (!optOut && this.config.deferredSessionId) {\n if (this.config.deferredSessionId === UNSPECIFIED_SESSION_ID) {\n this.setSessionId(undefined);\n } else {\n this.setSessionId(this.config.deferredSessionId);\n }\n }\n });\n }\n\n // Set up the analytics connector to integrate with the experiment SDK.\n // Send events from the experiment SDK and forward identifies to the\n // identity store.\n const connector = getAnalyticsConnector(options.instanceName);\n connector.identityStore.setIdentity({\n userId: this.config.userId,\n deviceId: this.config.deviceId,\n });\n\n // Step 4: Install plugins\n // Do not track any events before this\n if (this.config.offline !== OfflineDisabled) {\n await this.add(networkConnectivityCheckerPlugin()).promise;\n }\n await this.add(new Destination({ diagnosticsClient })).promise;\n await this.add(new Context()).promise;\n await this.add(new IdentityEventSender()).promise;\n\n // Notify if DET is enabled\n detNotify(this.config);\n\n if (isFileDownloadTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding file download tracking plugin');\n await this.add(fileDownloadTracking()).promise;\n }\n\n if (isFormInteractionTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding form interaction plugin');\n await this.add(formInteractionTracking()).promise;\n }\n\n // Add page view plugin\n if (isPageViewTrackingEnabled(this.config.defaultTracking)) {\n if (!this.config.optOut) {\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n } else {\n this.timeline.addOptOutListener(async (optOut) => {\n /* istanbul ignore if */\n if (optOut) {\n return;\n }\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n });\n }\n }\n\n if (\n isAttributionTrackingEnabled(this.config.defaultTracking) &&\n isEventPropertyAttributionEnabled(attributionTrackingOptions)\n ) {\n this.config.loggerProvider.debug('Adding event property attribution plugin');\n await this.add(eventPropertyTrackingPlugin(attributionTrackingOptions)).promise;\n }\n\n if (isElementInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');\n await this.add(autocapturePlugin(getElementInteractionsConfig(this.config), { diagnosticsClient })).promise;\n }\n\n if (isFrustrationInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding frustration interactions plugin');\n await this.add(frustrationPlugin(getFrustrationInteractionsConfig(this.config))).promise;\n }\n\n if (isNetworkTrackingEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding network tracking plugin');\n await this.add(networkCapturePlugin(getNetworkTrackingConfig(this.config))).promise;\n }\n\n if (isWebVitalsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding web vitals plugin');\n await this.add(webVitalsPlugin()).promise;\n }\n\n if (isPageUrlEnrichmentEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding referrer page url plugin');\n await this.add(pageUrlEnrichmentPlugin()).promise;\n }\n\n if (isCustomEnrichmentEnabled(this.config.customEnrichment)) {\n this.config.loggerProvider.debug('Adding custom enrichment plugin');\n await this.add(customEnrichmentPlugin()).promise;\n }\n\n this.initializing = false;\n\n // Step 6: Run queued dispatch functions\n await this.runQueuedFunctions('dispatchQ');\n\n // Step 7: Add the event receiver after running remaining queued functions.\n connector.eventBridge.setEventReceiver((event) => {\n const { time, ...cleanEventProperties } = event.eventProperties || {};\n const eventOptions = typeof time === 'number' ? { time } : undefined;\n void this.track(event.eventType, cleanEventProperties, eventOptions);\n });\n }\n\n getUserId() {\n return this.config?.userId;\n }\n\n setUserId(userId: string | undefined) {\n if (!this.config) {\n this.q.push(this.setUserId.bind(this, userId));\n return;\n }\n this.config.loggerProvider.debug('function setUserId: ', userId);\n if (userId !== this.config.userId || userId === undefined) {\n this.config.userId = userId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ userId: userId });\n setConnectorUserId(userId, this.config.instanceName);\n }\n }\n\n getDeviceId() {\n return this.config?.deviceId;\n }\n\n setDeviceId(deviceId: string) {\n if (!this.config) {\n this.q.push(this.setDeviceId.bind(this, deviceId));\n return;\n }\n this.config.loggerProvider.debug('function setDeviceId: ', deviceId);\n if (deviceId !== this.config.deviceId) {\n this.config.deviceId = deviceId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ deviceId: deviceId });\n setConnectorDeviceId(deviceId, this.config.instanceName);\n }\n }\n\n reset() {\n this.setDeviceId(UUID());\n this.setUserId(undefined);\n this.timeline.onReset();\n }\n\n getIdentity() {\n return {\n deviceId: this.config?.deviceId,\n userId: this.config?.userId,\n userProperties: this.userProperties,\n };\n }\n\n setIdentity(identity: Partial<AnalyticsIdentity>) {\n // Handle userId change\n if ('userId' in identity) {\n this.setUserId(identity.userId);\n }\n\n // Handle deviceId change\n if ('deviceId' in identity && identity.deviceId) {\n this.setDeviceId(identity.deviceId);\n }\n\n // Handle userProperties change - auto-send identify\n if ('userProperties' in identity) {\n this.userProperties = identity.userProperties;\n // Auto-send identify event with $set operations\n const identifyObj = new Identify();\n // istanbul ignore next\n const userProperties = identity.userProperties ?? {};\n for (const [key, value] of Object.entries(userProperties)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n identifyObj.set(key, value);\n }\n // The identify event processing in core-client already calls onIdentityChanged,\n // so we don't need to call it explicitly here to avoid duplicate notifications.\n this.identify(identifyObj);\n }\n }\n\n getOptOut(): boolean | undefined {\n return this.config?.optOut;\n }\n\n getSessionId() {\n return this.config?.sessionId;\n }\n\n setSessionId(sessionId: number | undefined) {\n const promises: Promise<Result>[] = [];\n if (!this.config) {\n this.q.push(this.setSessionId.bind(this, sessionId));\n return returnWrapper(Promise.resolve());\n }\n // do not start a new session if optOut is true\n if (this.config.optOut) {\n // save the sessionId to storage to be used when optOut is false\n this.config.deferredSessionId = sessionId ?? UNSPECIFIED_SESSION_ID;\n return returnWrapper(Promise.resolve());\n }\n\n // default sessionId to current time\n if (sessionId === undefined) {\n sessionId = Date.now();\n }\n\n // Prevents starting a new session with the same session ID\n if (sessionId === this.config.sessionId) {\n return returnWrapper(Promise.resolve());\n }\n\n this.config.loggerProvider.debug('function setSessionId: ', sessionId);\n\n const previousSessionId = this.getSessionId();\n if (previousSessionId !== sessionId) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onSessionIdChanged(sessionId);\n }\n\n const lastEventTime = this.config.lastEventTime;\n let lastEventId = this.config.lastEventId ?? -1;\n\n this.config.sessionId = sessionId;\n this.config.lastEventTime = undefined;\n this.config.pageCounter = 0;\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n if (previousSessionId && lastEventTime) {\n promises.push(\n this.track(DEFAULT_SESSION_END_EVENT, undefined, {\n device_id: this.previousSessionDeviceId,\n event_id: ++lastEventId,\n session_id: previousSessionId,\n time: lastEventTime + 1,\n user_id: this.previousSessionUserId,\n }).promise,\n );\n }\n this.config.lastEventTime = this.config.sessionId;\n }\n\n // Fire web attribution event when enable webAttribution tracking\n // 1. has new campaign (call setSessionId from init function)\n // 2. or shouldTrackNewCampaign (call setSessionId from async process(event) when there has new campaign and resetSessionOnNewCampaign = true )\n const isCampaignEventTracked = this.trackCampaignEventIfNeeded(++lastEventId, promises);\n\n // track the identify event if an Identify object is provided in the config\n if (this.config.identify) {\n promises.push(this.track(createIdentifyEvent(this.config.identify)).promise);\n }\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n promises.push(\n this.track(DEFAULT_SESSION_START_EVENT, undefined, {\n event_id: isCampaignEventTracked ? ++lastEventId : lastEventId,\n session_id: this.config.sessionId,\n time: this.config.lastEventTime,\n }).promise,\n );\n }\n\n this.previousSessionDeviceId = this.config.deviceId;\n this.previousSessionUserId = this.config.userId;\n return returnWrapper(Promise.all(promises));\n }\n\n extendSession() {\n if (!this.config) {\n this.q.push(this.extendSession.bind(this));\n return;\n }\n this.config.lastEventTime = Date.now();\n }\n\n setTransport(transport: TransportTypeOrOptions) {\n if (!this.config) {\n this.q.push(this.setTransport.bind(this, transport));\n return;\n }\n this.config.transportProvider = createTransport(transport);\n }\n\n identify(identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n if (eventOptions?.user_id) {\n this.setUserId(eventOptions.user_id);\n }\n if (eventOptions?.device_id) {\n this.setDeviceId(eventOptions.device_id);\n }\n return super.identify(identify, eventOptions);\n }\n\n groupIdentify(groupType: string, groupName: string | string[], identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n return super.groupIdentify(groupType, groupName, identify, eventOptions);\n }\n\n revenue(revenue: IRevenue, eventOptions?: EventOptions) {\n if (isInstanceProxy(revenue)) {\n const queue = revenue._q;\n revenue._q = [];\n revenue = convertProxyObjectToRealObject(new Revenue(), queue);\n }\n return super.revenue(revenue, eventOptions);\n }\n\n private trackCampaignEventIfNeeded(lastEventId?: number, promises?: Promise<Result>[]) {\n if (\n !this.webAttribution ||\n !this.webAttribution.shouldTrackNewCampaign ||\n !isUserPropertyAttributionEnabled(this.webAttribution.options)\n ) {\n return false;\n }\n\n const campaignEvent = this.webAttribution.generateCampaignEvent(lastEventId);\n if (promises) {\n promises.push(this.track(campaignEvent).promise);\n } else {\n this.track(campaignEvent);\n }\n this.config.loggerProvider.log('Tracking attribution.');\n return true;\n }\n\n async process(event: Event) {\n const currentTime = Date.now();\n const isEventInNewSession = isNewSession(this.config.sessionTimeout, this.config.lastEventTime);\n const shouldSetSessionIdOnNewCampaign =\n this.webAttribution && this.webAttribution.shouldSetSessionIdOnNewCampaign();\n\n if (\n event.event_type !== DEFAULT_SESSION_START_EVENT &&\n event.event_type !== DEFAULT_SESSION_END_EVENT &&\n (!event.session_id || event.session_id === this.getSessionId())\n ) {\n if (isEventInNewSession || shouldSetSessionIdOnNewCampaign) {\n this.setSessionId(currentTime);\n if (shouldSetSessionIdOnNewCampaign) {\n this.config.loggerProvider.log('Created a new session for new campaign.');\n }\n } else if (!isEventInNewSession) {\n // Web attribution should be tracked during the middle of a session\n // if there has been a chance in the campaign information.\n this.trackCampaignEventIfNeeded();\n }\n }\n\n return super.process(event);\n }\n\n private logBrowserOptions(browserConfig: BrowserOptions & { apiKey: string }) {\n try {\n const browserConfigCopy = {\n ...browserConfig,\n apiKey: browserConfig.apiKey.substring(0, 10) + '********',\n };\n this.config.loggerProvider.debug(\n 'Initialized Amplitude with BrowserConfig:',\n safeJsonStringify(browserConfigCopy),\n );\n } catch (e) {\n /* istanbul ignore next */\n this.config.loggerProvider.error('Error logging browser config', e);\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n *\n * Sets the diagnostics sample rate before amplitude.init()\n * @param sampleRate - The sample rate to set\n */\n _setDiagnosticsSampleRate(sampleRate: number): void {\n if (sampleRate > 1 || sampleRate < 0) {\n return;\n }\n // Set diagnostics sample rate before initializing the config\n if (!this.config) {\n this._diagnosticsSampleRate = sampleRate;\n return;\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n */\n _enableRequestBodyCompressionExperimental(enabled: boolean): void {\n // Set request body compression experimental config before initializing the config\n if (!this.config) {\n this._enableRequestBodyCompressionExperimentalValue = enabled;\n return;\n }\n }\n}\n"]}
@@ -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,EAEb,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;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QA+GxE;AAgBD;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CAyGN"}
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,EAEb,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;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QA+GxE;AAgBD;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,aAAa,GAC3B,IAAI,CA6GN"}
@@ -275,7 +275,11 @@ function updateBrowserConfigWithRemoteConfig(remoteConfig, browserConfig) {
275
275
  browserConfig.defaultTracking = browserConfig.autocapture;
276
276
  }
277
277
  if ('customEnrichment' in typedRemoteConfig && typedRemoteConfig.customEnrichment !== null) {
278
- browserConfig.customEnrichment = typedRemoteConfig.customEnrichment;
278
+ // Respect a locally-explicit false: if the user disabled custom enrichment at init time,
279
+ // remote config must not re-enable it.
280
+ if (browserConfig.customEnrichment !== false) {
281
+ browserConfig.customEnrichment = typedRemoteConfig.customEnrichment;
282
+ }
279
283
  }
280
284
  browserConfig.loggerProvider.debug('Browser config after remote config update:', JSON.stringify(browserConfig));
281
285
  }