summaryrefslogtreecommitdiff
path: root/shared/logger/node_modules/@amp-metrics/sentrykit
diff options
context:
space:
mode:
Diffstat (limited to 'shared/logger/node_modules/@amp-metrics/sentrykit')
-rw-r--r--shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs815
1 files changed, 815 insertions, 0 deletions
diff --git a/shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs b/shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs
new file mode 100644
index 0000000..5755983
--- /dev/null
+++ b/shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs
@@ -0,0 +1,815 @@
+var __defProp = Object.defineProperty;
+var __defProps = Object.defineProperties;
+var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
+var __getOwnPropSymbols = Object.getOwnPropertySymbols;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __propIsEnum = Object.prototype.propertyIsEnumerable;
+var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+var __spreadValues = (a, b) => {
+ for (var prop in b || (b = {}))
+ if (__hasOwnProp.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ if (__getOwnPropSymbols)
+ for (var prop of __getOwnPropSymbols(b)) {
+ if (__propIsEnum.call(b, prop))
+ __defNormalProp(a, prop, b[prop]);
+ }
+ return a;
+};
+var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
+
+// src/config.ts
+import { SDK_VERSION as SDK_VERSION2 } from "@sentry/browser";
+
+// src/transports/fetch.ts
+import { rejectedSyncPromise } from "@sentry/utils";
+
+// src/transports/base.ts
+import {
+ createEnvelope,
+ envelopeItemTypeToDataCategory,
+ forEachEnvelopeItem,
+ isRateLimited,
+ logger,
+ makePromiseBuffer,
+ resolvedSyncPromise,
+ SentryError,
+ serializeEnvelope,
+ updateRateLimits
+} from "@sentry/utils";
+var DEFAULT_TRANSPORT_BUFFER_SIZE = 30;
+function createTransport(options, makeRequest, buffer = makePromiseBuffer(
+ options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE
+)) {
+ let rateLimits = {};
+ const flush = (timeout) => buffer.drain(timeout);
+ function send(envelope) {
+ const filteredEnvelopeItems = [];
+ forEachEnvelopeItem(envelope, (item, type) => {
+ const envelopeItemDataCategory = envelopeItemTypeToDataCategory(type);
+ if (isRateLimited(rateLimits, envelopeItemDataCategory)) {
+ const event = getEventForEnvelopeItem(item, type);
+ options.recordDroppedEvent("ratelimit_backoff", envelopeItemDataCategory, event);
+ } else {
+ filteredEnvelopeItems.push(item);
+ }
+ });
+ if (filteredEnvelopeItems.length === 0) {
+ return resolvedSyncPromise();
+ }
+ const filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems);
+ const recordEnvelopeLoss = (reason) => {
+ forEachEnvelopeItem(filteredEnvelope, (item, type) => {
+ const event = getEventForEnvelopeItem(item, type);
+ options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type), event);
+ });
+ };
+ const getRequest = options.getRequest || ((envelope2) => ({
+ body: serializeEnvelope(envelope2, options.textEncoder)
+ }));
+ const request = getRequest(filteredEnvelope);
+ if (!request) {
+ return resolvedSyncPromise();
+ }
+ const requestTask = () => makeRequest(request).then(
+ (response) => {
+ if (response.statusCode !== void 0 && (response.statusCode < 200 || response.statusCode >= 300)) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);
+ }
+ rateLimits = updateRateLimits(rateLimits, response);
+ return response;
+ },
+ (error) => {
+ recordEnvelopeLoss("network_error");
+ throw error;
+ }
+ );
+ return buffer.add(requestTask).then(
+ (result) => result,
+ (error) => {
+ if (error instanceof SentryError) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && logger.error("Skipped sending event because buffer is full.");
+ recordEnvelopeLoss("queue_overflow");
+ return resolvedSyncPromise();
+ } else {
+ throw error;
+ }
+ }
+ );
+ }
+ send.__sentry__baseTransport__ = true;
+ return {
+ send,
+ flush
+ };
+}
+function getEventForEnvelopeItem(item, type) {
+ if (type !== "event" && type !== "transaction") {
+ return void 0;
+ }
+ return Array.isArray(item) ? item[1] : void 0;
+}
+
+// src/transports/utils.ts
+import { isNativeFetch, logger as logger2 } from "@sentry/utils";
+import { GLOBAL_OBJ } from "@sentry/utils";
+var WINDOW = GLOBAL_OBJ;
+var cachedFetchImpl = void 0;
+function getNativeFetchImplementation() {
+ if (cachedFetchImpl) {
+ return cachedFetchImpl;
+ }
+ if (isNativeFetch(WINDOW.fetch)) {
+ return cachedFetchImpl = WINDOW.fetch.bind(WINDOW);
+ }
+ const document = WINDOW.document;
+ let fetchImpl = WINDOW.fetch;
+ if (document && typeof document.createElement === "function") {
+ try {
+ const sandbox = document.createElement("iframe");
+ sandbox.hidden = true;
+ document.head.appendChild(sandbox);
+ const contentWindow = sandbox.contentWindow;
+ if (contentWindow && contentWindow.fetch) {
+ fetchImpl = contentWindow.fetch;
+ }
+ document.head.removeChild(sandbox);
+ } catch (e) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && logger2.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ", e);
+ }
+ }
+ return cachedFetchImpl = fetchImpl.bind(WINDOW);
+}
+function clearCachedFetchImplementation() {
+ cachedFetchImpl = void 0;
+}
+
+// src/transports/fetch.ts
+function makeFetchTransport(options, nativeFetch = getNativeFetchImplementation()) {
+ let pendingBodySize = 0;
+ let pendingCount = 0;
+ function makeRequest(request) {
+ const requestSize = request.body.length;
+ pendingBodySize += requestSize;
+ pendingCount++;
+ const requestOptions = __spreadValues({
+ body: request.body,
+ method: "POST",
+ referrerPolicy: "origin",
+ headers: request.headers,
+ keepalive: pendingBodySize <= 6e4 && pendingCount < 15
+ }, options.fetchOptions);
+ try {
+ return nativeFetch(request.url, requestOptions).then((response) => {
+ pendingBodySize -= requestSize;
+ pendingCount--;
+ return {
+ statusCode: response.status,
+ headers: {
+ "x-sentry-rate-limits": response.headers.get("X-Sentry-Rate-Limits"),
+ "retry-after": response.headers.get("Retry-After")
+ }
+ };
+ });
+ } catch (e) {
+ clearCachedFetchImplementation();
+ pendingBodySize -= requestSize;
+ pendingCount--;
+ return rejectedSyncPromise(e);
+ }
+ }
+ return createTransport(options, makeRequest);
+}
+
+// src/transports/xhr.ts
+import { SyncPromise } from "@sentry/utils";
+var XHR_READYSTATE_DONE = 4;
+function makeXHRTransport(options) {
+ function makeRequest(request) {
+ return new SyncPromise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+ xhr.onerror = reject;
+ xhr.onreadystatechange = () => {
+ if (xhr.readyState === XHR_READYSTATE_DONE) {
+ resolve({
+ statusCode: xhr.status,
+ headers: {
+ "x-sentry-rate-limits": xhr.getResponseHeader("X-Sentry-Rate-Limits"),
+ "retry-after": xhr.getResponseHeader("Retry-After")
+ }
+ });
+ }
+ };
+ xhr.open("POST", request.url);
+ for (const header in request.headers) {
+ if (Object.prototype.hasOwnProperty.call(request.headers, header)) {
+ xhr.setRequestHeader(header, request.headers[header]);
+ }
+ }
+ xhr.send(request.body);
+ });
+ }
+ return createTransport(options, makeRequest);
+}
+
+// src/transport.ts
+import { supportsFetch } from "@sentry/utils";
+
+// src/ingestion-event.ts
+function envelopeToIngestionEvents(envelope, options) {
+ const [_envelopeHeader, items] = envelope;
+ delete _envelopeHeader.dsn;
+ const sharedFields = {
+ _envelopeHeader,
+ project: options.project,
+ v: 4
+ };
+ return items.map((item) => {
+ const itemType = item[0].type;
+ if (itemType !== "event" && itemType !== "transaction") {
+ return __spreadProps(__spreadValues({}, sharedFields), {
+ _itemHeader: item[0],
+ _debugLogs: [
+ `Items of type "${itemType}" are not supported yet. Dropped the item.`
+ ]
+ });
+ }
+ const [_itemHeader, payload] = item;
+ return __spreadValues(__spreadProps(__spreadValues({}, sharedFields), {
+ _itemHeader
+ }), payload);
+ });
+}
+
+// src/utils.ts
+import { getCurrentHub, SDK_VERSION } from "@sentry/browser";
+function isHeadlessBrowser() {
+ return navigator.userAgent === void 0 || navigator.appVersion === void 0 || navigator.plugins === void 0 || navigator.languages === void 0 || navigator.languages.length === 0 || navigator.language === "" || navigator.webdriver || navigator.plugins.length === 0 || /HeadlessChrome/.test(navigator.userAgent) || /headless/i.test(navigator.appVersion);
+}
+function versionMismatchErrorMessage(sdkVersion) {
+ sdkVersion || (sdkVersion = "unknown");
+ return `Version mismatch between the installed Sentry SDK version (${sdkVersion}) and supported SDK version (${SUPPORTED_SENTRY_VERSION}) by SentryKit. Make sure to use supported version of the Sentry SDK (${SUPPORTED_SENTRY_VERSION}).`;
+}
+function checkSentryKitIsCompatibleWith(sdkVersion) {
+ if (sdkVersion !== SUPPORTED_SENTRY_VERSION) {
+ console.error(
+ `[SentryKit Versioning Error] ${versionMismatchErrorMessage(
+ sdkVersion
+ )} All sent data will be discarded.`
+ );
+ return false;
+ }
+ return true;
+}
+function checkSentrySDKCompatibility() {
+ return checkSentryKitIsCompatibleWith(SDK_VERSION);
+}
+function checkEnvelopeSentrySDKCompatibility(envelope) {
+ var _a;
+ const sdkVersion = (_a = envelope[0].sdk) == null ? void 0 : _a.version;
+ return checkSentryKitIsCompatibleWith(sdkVersion);
+}
+var correctSetupGuide = `The correct way to use SentryKit is as follows:
+
+import {createSentryConfig} from '@amp-metrics/sentrykit'
+
+Sentry.init(createSentryConfig({
+ // all your configs
+}))`;
+function monitorSentryConfig(config) {
+ ;
+ config.__sentrykit_original_config = __spreadValues({}, config);
+ return config;
+}
+function monitorSentryHubBindClient() {
+ const hub = getCurrentHub();
+ const originalBindClient = hub.bindClient;
+ hub.bindClient = (client) => {
+ assertCorrectSentryKitConfiguration(client.getOptions());
+ originalBindClient.call(hub, client);
+ };
+}
+function assertCorrectSentryKitConfiguration(config) {
+ var _a, _b;
+ const sdkVersion = (_b = (_a = config._metadata) == null ? void 0 : _a.sdk) == null ? void 0 : _b.version;
+ if (sdkVersion !== SUPPORTED_SENTRY_VERSION) {
+ throw new Error(
+ `[SentryKit Initialization Error] ${versionMismatchErrorMessage(
+ sdkVersion
+ )}`
+ );
+ }
+ const originalConfig = config.__sentrykit_original_config;
+ if (!originalConfig) {
+ throw new Error(
+ `[SentryKit Initialization Error] Configuration has to be generated through \`createSentryConfig\` function. ${correctSetupGuide}`
+ );
+ }
+ for (const key in originalConfig) {
+ if (key === "integrations") {
+ continue;
+ }
+ if (originalConfig[key] !== config[key]) {
+ throw new Error(
+ `[SentryKit Initialization Error] Configuration generated through \`createSentryConfig\` function has been changed. ${correctSetupGuide}`
+ );
+ }
+ }
+}
+
+// src/logger.ts
+var originalLog = console.log;
+var enabled = false;
+var enableLogger = () => {
+ enabled = true;
+};
+var createLogger = (prefix) => (...args) => {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && enabled && originalLog(prefix, ...args);
+};
+
+// src/privacy/rules.ts
+var debug = /* @__PURE__ */ createLogger("[SentryKit Privacy rules]");
+function visit(obj, callback, parentContext) {
+ const parentPath = (parentContext == null ? void 0 : parentContext.path) ? parentContext.path + "." : "";
+ const _visit = (key) => {
+ const path = parentPath + key;
+ const value = obj[key];
+ const action = callback({
+ obj,
+ key,
+ value,
+ path,
+ parentContext
+ });
+ if (action === "remove") {
+ return action;
+ }
+ if (value !== null && typeof value === "object") {
+ visit(value, callback, {
+ obj,
+ key,
+ value,
+ path,
+ parentContext
+ });
+ }
+ };
+ if (Array.isArray(obj)) {
+ for (let i = 0; i < obj.length; i++) {
+ const action = _visit(i.toString());
+ if (action === "remove") {
+ obj.splice(i, 1);
+ i--;
+ }
+ }
+ } else {
+ for (const key in obj) {
+ const action = _visit(key);
+ if (action === "remove") {
+ delete obj[key];
+ }
+ }
+ }
+}
+var matchesPath = (rule, eventType, context) => {
+ if ((rule.type === "url" || rule.type === "url-query") && typeof context.obj[context.key] !== "string") {
+ return false;
+ }
+ if (rule.type === "timestamp" && typeof context.obj[context.key] !== "number") {
+ return false;
+ }
+ if (!rule.matchPath) {
+ if (rule.type === "url" || rule.type === "url-query") {
+ return isURLField(context);
+ }
+ if (rule.type === "timestamp") {
+ return isTimestampField(context);
+ }
+ return true;
+ }
+ return typeof rule.matchPath === "function" ? rule.matchPath({
+ eventType,
+ path: context.path,
+ key: context.key,
+ value: context.value
+ }) : rule.matchPath.test(context.path);
+};
+var matchesQuery = (rule, eventType, context, queryName, queryValue) => {
+ if (rule.type !== "url-query") {
+ return false;
+ }
+ if (!rule.matchQueryName) {
+ return true;
+ }
+ return typeof rule.matchQueryName === "function" ? rule.matchQueryName({
+ eventType,
+ path: context.path,
+ key: context.key,
+ url: context.value,
+ queryName,
+ queryValue
+ }) : rule.matchQueryName.test(queryName);
+};
+var KnownURLFields = [
+ (context) => /^spans\.\d+\.data\.url$/.test(context.path) && context.parentContext.obj.op === "http.client" && (Object.defineProperty(context.obj, "_url", {
+ enumerable: false,
+ value: context.value
+ }) || true),
+ (context) => /^spans\.\d+\.description$/.test(context.path) && context.obj.op === "http.client" && context.obj.data && context.obj.description === `${context.obj.data.method} ${context.obj.data._url || context.obj.data.url}`,
+ (context) => /^breadcrumbs\.\d+\.data\.url$/.test(context.path) && (context.parentContext.obj.category === "fetch" || context.parentContext.obj.category === "xhr"),
+ (context) => /^breadcrumbs\.\d+\.data\.from$/.test(context.path) && context.parentContext.obj.category === "navigation",
+ (context) => /^breadcrumbs\.\d+\.data\.to$/.test(context.path) && context.parentContext.obj.category === "navigation",
+ (context) => /^request\.url$/.test(context.path),
+ (context) => /^request\.headers\.Referer$/.test(context.path)
+];
+var isURLField = (context) => KnownURLFields.some((test) => test(context));
+var isTimestampField = (context) => {
+ return typeof context.value === "number" && context.path.toLowerCase().endsWith("timestamp");
+};
+var processForPrivacy = (event, rules) => {
+ const eventType = event._itemHeader.type === "transaction" ? "transaction" : "error";
+ visit(event, (context) => {
+ const { path, key, obj } = context;
+ for (const [i, rule] of rules.entries()) {
+ if (!matchesPath(rule, eventType, context)) {
+ continue;
+ }
+ if ("action" in rule && rule.action === "keep") {
+ continue;
+ }
+ if (rule.type === "timestamp") {
+ const timestamp = obj[key];
+ const timestampOrPrecision = typeof rule.precision === "function" ? rule.precision({
+ eventType,
+ path,
+ key,
+ timestamp
+ }) : rule.precision;
+ if (typeof timestampOrPrecision === "number") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && timestamp !== timestampOrPrecision && debug(
+ `Setting timestamp to a new value of "${timestampOrPrecision}" for path: "${path}"`
+ );
+ obj[key] = timestampOrPrecision;
+ } else if (timestampOrPrecision === "seconds") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Reducing timestamp to "${timestampOrPrecision}" for path: "${path}"`
+ );
+ obj[key] = Math.round(timestamp);
+ } else if (timestampOrPrecision === "minutes") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Reducing timestamp to "${timestampOrPrecision}" for path: "${path}"`
+ );
+ obj[key] = Math.round(timestamp / 60) * 60;
+ }
+ } else if (rule.type === "url-query") {
+ const url = obj[key];
+ const [base, oldQuery = ""] = url.split("?");
+ const queryParams = new URLSearchParams(oldQuery);
+ const entries = [...queryParams.entries()];
+ entries.forEach(([queryName, queryValue]) => {
+ if (matchesQuery(rule, eventType, context, queryName, queryValue)) {
+ const hasActionAfterwards = rules.slice(i + 1).some(
+ (r) => matchesPath(r, eventType, context) && matchesQuery(r, eventType, context, queryName, queryValue)
+ );
+ if (hasActionAfterwards) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Skipping the active rule as there is an overriding rule for the query "${queryName}" in the url "${url}" in path "${path}".`
+ );
+ return;
+ }
+ if (rule.action === "remove") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Removing query "${queryName}" from the url "${url}" in the path: "${path}" (value was: "${queryValue}")`
+ );
+ queryParams.delete(queryName);
+ } else if (rule.action === "replace") {
+ const newValue = typeof rule.replace === "function" ? rule.replace({
+ key,
+ path,
+ url,
+ queryName,
+ queryValue,
+ eventType
+ }) : rule.replace;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && newValue !== queryValue && debug(
+ `Setting query "${queryName}" in the url "${url}" to a new value of "${newValue}" for path: "${path}" (value was: "${queryValue}")`
+ );
+ queryParams.set(queryName, newValue);
+ }
+ }
+ });
+ const query = queryParams.toString();
+ obj[key] = base + (query ? `?${query}` : "");
+ } else if (rule.type === "url") {
+ const hasActionAfterwards = rules.slice(i + 1).some((r) => matchesPath(r, eventType, context) && r.type === "url");
+ if (hasActionAfterwards) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Skipping the active rule as there is an overriding rule for the url "${obj[key]}" in path "${path}".`
+ );
+ continue;
+ }
+ if (rule.action === "remove") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(`Removing the url "${obj[key]}" in the path: "${path}"`);
+ return "remove";
+ } else if (rule.action === "replace") {
+ const newValue = typeof rule.replace === "function" ? rule.replace({
+ key,
+ path,
+ url: obj[key],
+ eventType
+ }) : rule.replace;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && newValue !== obj[key] && debug(
+ `Setting the url"${obj[key]}" to a new value of "${newValue}" for path: "${path}" (value was: "${obj[key]}")`
+ );
+ obj[key] = newValue;
+ }
+ } else if (rule.type === "any" && "action" in rule) {
+ const hasActionAfterwards = rules.slice(i + 1).some((r) => matchesPath(r, eventType, context) && r.type === "any");
+ if (hasActionAfterwards) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(
+ `Skipping the active rule as there is an overriding rule for the path "${path}".`
+ );
+ continue;
+ }
+ if (rule.action === "remove") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug(`Removing the path "${path}" (value was: "${obj[key]}")`);
+ return "remove";
+ } else if (rule.action === "replace") {
+ const newValue = typeof rule.replace === "function" ? rule.replace({
+ key,
+ path,
+ value: obj[key],
+ eventType
+ }) : rule.replace;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && newValue !== obj[key] && debug(
+ `Setting a new value of "${newValue}" for path: "${path}" (value was: "${obj[key]}")`
+ );
+ obj[key] = newValue;
+ }
+ }
+ }
+ });
+ return event;
+};
+
+// src/transport.ts
+function createTransportUrl(ingestUrl, topic) {
+ const url = new URL(ingestUrl);
+ url.pathname = "/report/2/" + topic;
+ return url.toString();
+}
+function makeTransport(options) {
+ options.getRequest = (envelope) => {
+ if (!checkEnvelopeSentrySDKCompatibility(envelope)) {
+ return false;
+ }
+ const events = envelopeToIngestionEvents(
+ envelope,
+ options.sentryKitConfig
+ ).map(
+ (event) => processForPrivacy(
+ JSON.parse(JSON.stringify(event)),
+ options.sentryKitConfig.privacyRules
+ )
+ );
+ const topic = events[0]._itemHeader.type === "transaction" ? "traces" : "error";
+ const url = createTransportUrl(
+ options.sentryKitConfig.ingestUrl,
+ options.sentryKitConfig.topic[topic]
+ );
+ return {
+ url,
+ body: JSON.stringify({ events }),
+ headers: {
+ "Content-type": "application/json"
+ }
+ };
+ };
+ return supportsFetch() ? makeFetchTransport(options) : makeXHRTransport(options);
+}
+
+// src/privacy/settings.ts
+var debug2 = /* @__PURE__ */ createLogger("[SentryKit Privacy settings]");
+function createPrivacyRulesFrom({
+ allowQueryParams,
+ allowExtra,
+ allowTags,
+ timestampPrecision
+}) {
+ const privacyRules = [];
+ if (allowTags) {
+ privacyRules.push({
+ type: "any",
+ matchPath: ({ path, key }) => {
+ const shouldKeep = path === `tags.${key}` && allowTags.includes(key);
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && shouldKeep && debug2(`Keeping the tag "${key}" for path: "${path}"`);
+ return shouldKeep;
+ },
+ action: "keep"
+ });
+ }
+ if (allowExtra) {
+ privacyRules.push({
+ type: "any",
+ matchPath: ({ path, key }) => {
+ const shouldKeep = path === `extra.${key}` && allowExtra.includes(key);
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && shouldKeep && debug2(`Keeping the extra "${key}" for path: "${path}"`);
+ return shouldKeep;
+ },
+ action: "keep"
+ });
+ }
+ if (allowQueryParams) {
+ privacyRules.push({
+ type: "url-query",
+ matchQueryName: ({ url, queryName, path }) => {
+ const params = typeof allowQueryParams === "function" ? allowQueryParams(url) : allowQueryParams;
+ const shouldKeep = params.includes(queryName);
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && shouldKeep && debug2(`Keeping the query name "${queryName}" for path: "${path}"`);
+ return shouldKeep;
+ },
+ action: "keep"
+ });
+ }
+ if (timestampPrecision) {
+ privacyRules.push({
+ type: "timestamp",
+ precision: ({ eventType, timestamp, path }) => {
+ if (eventType === "error") {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug2(
+ `Reducing timestamp to "${timestampPrecision}" for path: "${path}"`
+ );
+ return timestampPrecision;
+ }
+ return timestamp;
+ }
+ });
+ }
+ return privacyRules;
+}
+
+// src/config.ts
+var debug3 = /* @__PURE__ */ createLogger("[SentryKit Config]");
+var SUPPORTED_SENTRY_VERSION = "7.57.0";
+var ENVIRONMENTS = {
+ prod: "prod",
+ qa: "qa"
+};
+var INGEST_URLS = {
+ prod: "https://xp.apple.com",
+ qa: "https://xp-qa.apple.com"
+};
+var defaultPrivacyRules = [
+ {
+ type: "any",
+ matchPath: /tags\..+$/,
+ action: "remove"
+ },
+ {
+ type: "any",
+ matchPath: /tags\.(http\.status_code|visibilitychange|effectiveConnectionType|connectionType|deviceMemory|hardwareConcurrency|lcp\..+)$/,
+ action: "keep"
+ },
+ {
+ type: "any",
+ matchPath: /^extra\.[^.]+$/,
+ action: "remove"
+ },
+ {
+ type: "any",
+ matchPath: /^extra\.arguments$/,
+ action: "keep"
+ },
+ {
+ type: "any",
+ matchPath: /^user\.[^.]+$/,
+ action: "remove"
+ },
+ {
+ type: "url-query",
+ action: "replace",
+ replace: "REMOVED"
+ }
+];
+function baseConfig(userOptions) {
+ const privacyRules = typeof userOptions.privacyRules === "function" ? userOptions.privacyRules(defaultPrivacyRules) : userOptions.privacyRules === false ? [] : [...defaultPrivacyRules, ...userOptions.privacyRules || []];
+ if (userOptions.privacySettings) {
+ privacyRules.push(...createPrivacyRulesFrom(userOptions.privacySettings));
+ }
+ const config = __spreadProps(__spreadValues({
+ transport: makeTransport,
+ ingestUrl: "",
+ topic: "xp_amp_web_error_log",
+ environment: "qa",
+ filterHeadless: true,
+ maxBreadcrumbs: 0,
+ release: void 0,
+ redactKeys: void 0,
+ sampleRate: void 0,
+ tracesSampleRate: void 0,
+ tracesSampler: void 0
+ }, userOptions), {
+ privacyRules,
+ dsn: "https://dsn@bypass/1",
+ autoSessionTracking: false,
+ sendClientReports: false,
+ replaysSessionSampleRate: void 0,
+ replaysOnErrorSampleRate: void 0
+ });
+ if (typeof config.topic === "string") {
+ config.topic = {
+ error: config.topic,
+ traces: ""
+ };
+ }
+ const $config = config;
+ $config.transportOptions = __spreadProps(__spreadValues({}, $config.transportOptions), {
+ sentryKitConfig: $config
+ });
+ if (!$config.ingestUrl) {
+ $config.ingestUrl = $config.environment === ENVIRONMENTS.prod ? INGEST_URLS.prod : INGEST_URLS.qa;
+ }
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug3(
+ `Initialized with environment "${$config.environment}" and ingestUrl "${$config.ingestUrl}".`
+ );
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && debug3(
+ $config.topic.traces ? `Tracing topic is set to "${$config.topic.traces}".` : `No tracing topic is set.`
+ );
+ return $config;
+}
+function beforeHooksOptions(config) {
+ const IS_SUPPORTED_SDK = SDK_VERSION2 === SUPPORTED_SENTRY_VERSION;
+ const shouldSkipEvent = !IS_SUPPORTED_SDK || config.environment === ENVIRONMENTS.prod && config.filterHeadless && isHeadlessBrowser();
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && shouldSkipEvent && debug3("Events and transactions will not be sent to sentry.");
+ return {
+ beforeSend: (event, hint) => {
+ if (shouldSkipEvent) {
+ return null;
+ }
+ return config.beforeSend ? config.beforeSend(event, hint) : event;
+ },
+ beforeSendTransaction(event, hint) {
+ if (shouldSkipEvent) {
+ return null;
+ }
+ return config.beforeSendTransaction ? config.beforeSendTransaction(event, hint) : event;
+ },
+ beforeBreadcrumb(breadcrumb, hint) {
+ if (breadcrumb.category === "console") {
+ return null;
+ }
+ return config.beforeBreadcrumb ? config.beforeBreadcrumb(breadcrumb, hint) : breadcrumb;
+ }
+ };
+}
+
+// src/index.ts
+checkSentrySDKCompatibility();
+(typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && monitorSentryHubBindClient();
+function createSentryConfig(userOptions) {
+ ;
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && (userOptions == null ? void 0 : userOptions.debug) && enableLogger();
+ const config = baseConfig(userOptions || {});
+ if (!config.project) {
+ throw new Error(
+ "[SentryKit Configuration Error]: The required `project` field is not set."
+ );
+ }
+ const hasTracesConfig = config.tracesSampleRate || config.tracesSampler;
+ const hasTracesTopic = config.topic.traces;
+ if (hasTracesConfig && !hasTracesTopic) {
+ throw new Error(
+ "[SentryKit Configuration Error]: The `topic.traces` field is not set while trace sampling is configured."
+ );
+ }
+ if (hasTracesTopic && !hasTracesConfig) {
+ throw new Error(
+ "[SentryKit Configuration Error]: Trace sampling is configured but `topic.traces` is not set."
+ );
+ }
+ const originalConfig = __spreadValues(__spreadValues({}, config), beforeHooksOptions(config));
+ (typeof __SENTRY_DEBUG__ === "undefined" || __SENTRY_DEBUG__) && monitorSentryConfig(originalConfig);
+ return originalConfig;
+}
+var SentryKit = { createSentryConfig };
+var src_default = SentryKit;
+export {
+ SentryKit,
+ createSentryConfig,
+ src_default as default
+};