{"version":3,"file":"history.js","sources":["../../../src/instrument/history.ts"],"sourcesContent":["import type { HandlerDataHistory } from '@sentry/core';\nimport { addHandler, fill, maybeInstrument, supportsHistory, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nlet lastHref: string | undefined;\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addHistoryInstrumentationHandler(handler: (data: HandlerDataHistory) => void): void {\n const type = 'history';\n addHandler(type, handler);\n maybeInstrument(type, instrumentHistory);\n}\n\n/**\n * Exported just for testing\n */\nexport function instrumentHistory(): void {\n // The `popstate` event may also be triggered on `pushState`, but it may not always reliably be emitted by the browser\n // Which is why we also monkey-patch methods below, in addition to this\n WINDOW.addEventListener('popstate', () => {\n const to = WINDOW.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n const from = lastHref;\n lastHref = to;\n\n if (from === to) {\n return;\n }\n\n const handlerData = { from, to } satisfies HandlerDataHistory;\n triggerHandlers('history', handlerData);\n });\n\n // Just guard against this not being available, in weird environments\n if (!supportsHistory()) {\n return;\n }\n\n function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n return function (this: History, ...args: unknown[]): void {\n const url = args.length > 2 ? args[2] : undefined;\n if (url) {\n const from = lastHref;\n\n // Ensure the URL is absolute\n // this can be either a path, then it is relative to the current origin\n // or a full URL of the current origin - other origins are not allowed\n // See: https://developer.mozilla.org/en-US/docs/Web/API/History/pushState#url\n // coerce to string (this is what pushState does)\n const to = getAbsoluteUrl(String(url));\n\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n\n if (from === to) {\n return originalHistoryFunction.apply(this, args);\n }\n\n const handlerData = { from, to } satisfies HandlerDataHistory;\n triggerHandlers('history', handlerData);\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(WINDOW.history, 'pushState', historyReplacementFunction);\n fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n\nfunction getAbsoluteUrl(urlOrPath: string): string {\n try {\n const url = new URL(urlOrPath, WINDOW.location.origin);\n return url.toString();\n } catch {\n // fallback, just do nothing\n return urlOrPath;\n }\n}\n"],"names":["addHandler","maybeInstrument","WINDOW","triggerHandlers","supportsHistory","fill"],"mappings":";;;;;AAIA,IAAI,QAAA;AAUG,SAAS,iCAAiC,OAAA,EAAmD;AAClG,EAAA,MAAM,IAAA,GAAO,SAAA;AACb,EAAAA,eAAA,CAAW,MAAM,OAAO,CAAA;AACxB,EAAAC,oBAAA,CAAgB,MAAM,iBAAiB,CAAA;AACzC;AAKO,SAAS,iBAAA,GAA0B;AAGxC,EAAAC,YAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACxC,IAAA,MAAM,EAAA,GAAKA,aAAO,QAAA,CAAS,IAAA;AAE3B,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,QAAA,GAAW,EAAA;AAEX,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,EAAE,IAAA,EAAM,EAAA,EAAG;AAC/B,IAAAC,oBAAA,CAAgB,WAAW,WAAW,CAAA;AAAA,EACxC,CAAC,CAAA;AAGD,EAAA,IAAI,CAACC,sBAAgB,EAAG;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,SAAS,2BAA2B,uBAAA,EAAiD;AACnF,IAAA,OAAO,YAA4B,IAAA,EAAuB;AACxD,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AACxC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,IAAA,GAAO,QAAA;AAOb,QAAA,MAAM,EAAA,GAAK,cAAA,CAAe,MAAA,CAAO,GAAG,CAAC,CAAA;AAGrC,QAAA,QAAA,GAAW,EAAA;AAEX,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,OAAO,uBAAA,CAAwB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,QACjD;AAEA,QAAA,MAAM,WAAA,GAAc,EAAE,IAAA,EAAM,EAAA,EAAG;AAC/B,QAAAD,oBAAA,CAAgB,WAAW,WAAW,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,uBAAA,CAAwB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACjD,CAAA;AAAA,EACF;AAEA,EAAAE,SAAA,CAAKH,YAAA,CAAO,OAAA,EAAS,WAAA,EAAa,0BAA0B,CAAA;AAC5D,EAAAG,SAAA,CAAKH,YAAA,CAAO,OAAA,EAAS,cAAA,EAAgB,0BAA0B,CAAA;AACjE;AAEA,SAAS,eAAe,SAAA,EAA2B;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,SAAA,EAAWA,YAAA,CAAO,SAAS,MAAM,CAAA;AACrD,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;;;;;"}