forked from off-topic/apps.apple.com
init commit
This commit is contained in:
815
shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs
generated
vendored
Normal file
815
shared/logger/node_modules/@amp-metrics/sentrykit/dist/index.mjs
generated
vendored
Normal file
@@ -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
|
||||
};
|
||||
Reference in New Issue
Block a user