Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/core/src/integration.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Client, Event, EventHint, Integration, IntegrationFn, Options } from '@sentry/types';
import { arrayify, logger } from '@sentry/utils';
import { logger } from '@sentry/utils';
import { getClient } from './currentScopes';

import { DEBUG_BUILD } from './debug-build';
Expand Down Expand Up @@ -58,7 +58,7 @@ export function getIntegrationsToSetup(options: Pick<Options, 'defaultIntegratio
if (Array.isArray(userIntegrations)) {
integrations = [...defaultIntegrations, ...userIntegrations];
} else if (typeof userIntegrations === 'function') {
integrations = arrayify(userIntegrations(defaultIntegrations));
integrations = userIntegrations(defaultIntegrations);
} else {
integrations = defaultIntegrations;
}
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/utils/applyScopeDataToEvent.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Breadcrumb, Event, ScopeData, Span } from '@sentry/types';
import { arrayify, dropUndefinedKeys } from '@sentry/utils';
import { dropUndefinedKeys } from '@sentry/utils';
import { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';
import { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';

Expand Down Expand Up @@ -184,7 +184,11 @@ function applySpanToEvent(event: Event, span: Span): void {
*/
function applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {
// Make sure it's an array first and we actually have something in place
event.fingerprint = event.fingerprint ? arrayify(event.fingerprint) : [];
event.fingerprint = event.fingerprint
? Array.isArray(event.fingerprint)
? event.fingerprint
: [event.fingerprint]
: [];

// If we have something on the scope, then merge it with event
if (fingerprint) {
Expand Down
7 changes: 4 additions & 3 deletions packages/nextjs/src/config/webpack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import * as fs from 'fs';
import * as path from 'path';
import { getSentryRelease } from '@sentry/node';
import { arrayify, escapeStringForRegex, loadModule, logger } from '@sentry/utils';
import { escapeStringForRegex, loadModule, logger } from '@sentry/utils';
import * as chalk from 'chalk';
import { sync as resolveSync } from 'resolve';

Expand Down Expand Up @@ -491,7 +491,8 @@ function addFilesToWebpackEntryPoint(
let newEntryPoint = currentEntryPoint;

if (typeof currentEntryPoint === 'string' || Array.isArray(currentEntryPoint)) {
newEntryPoint = arrayify(currentEntryPoint);
newEntryPoint = Array.isArray(currentEntryPoint) ? currentEntryPoint : [currentEntryPoint];

if (newEntryPoint.some(entry => filesToInsert.includes(entry))) {
return;
}
Expand All @@ -507,7 +508,7 @@ function addFilesToWebpackEntryPoint(
// descriptor object (webpack 5+)
else if (typeof currentEntryPoint === 'object' && 'import' in currentEntryPoint) {
const currentImportValue = currentEntryPoint.import;
const newImportValue = arrayify(currentImportValue);
const newImportValue = Array.isArray(currentImportValue) ? currentImportValue : [currentImportValue];
if (newImportValue.some(entry => filesToInsert.includes(entry))) {
return;
}
Expand Down
8 changes: 6 additions & 2 deletions packages/utils/src/array.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
export type NestedArray<T> = Array<NestedArray<T> | T>;
type NestedArray<T> = Array<NestedArray<T> | T>;

/** Flattens a multi-dimensional array */
/**
* Flattens a multi-dimensional array
*
* @deprecated This function will be removed in the next major version.
*/
export function flatten<T>(input: NestedArray<T>): T[] {
const result: T[] = [];

Expand Down
2 changes: 0 additions & 2 deletions packages/utils/src/buildPolyfills/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,3 @@ import type { Primitive } from '@sentry/types';
export type GenericObject = { [key: string]: Value };
export type GenericFunction = (...args: unknown[]) => Value;
export type Value = Primitive | GenericFunction | GenericObject;

export type RequireResult = GenericObject | (GenericFunction & GenericObject);
242 changes: 200 additions & 42 deletions packages/utils/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,201 @@
export * from './aggregate-errors';
export * from './array';
export * from './breadcrumb-log-level';
export * from './browser';
export * from './dsn';
export * from './error';
export * from './worldwide';
export * from './instrument';
export * from './is';
export * from './isBrowser';
export * from './logger';
export * from './memo';
export * from './misc';
export * from './node';
export * from './normalize';
export * from './object';
export * from './path';
export * from './promisebuffer';
export { applyAggregateErrorsToEvent } from './aggregate-errors';
// eslint-disable-next-line deprecation/deprecation
export { flatten } from './array';
export { getBreadcrumbLogLevelFromHttpStatusCode } from './breadcrumb-log-level';
export { getComponentName, getDomElement, getLocationHref, htmlTreeAsString } from './browser';
export { dsnFromString, dsnToString, makeDsn } from './dsn';
export { SentryError } from './error';
export { GLOBAL_OBJ, getGlobalSingleton } from './worldwide';
export type { InternalGlobal } from './worldwide';
export { addConsoleInstrumentationHandler } from './instrument/console';
export { addFetchEndInstrumentationHandler, addFetchInstrumentationHandler } from './instrument/fetch';
export { addGlobalErrorInstrumentationHandler } from './instrument/globalError';
export { addGlobalUnhandledRejectionInstrumentationHandler } from './instrument/globalUnhandledRejection';
export {
addHandler,
maybeInstrument,
resetInstrumentationHandlers,
triggerHandlers,
} from './instrument/handlers';
export {
isDOMError,
isDOMException,
isElement,
isError,
isErrorEvent,
isEvent,
isInstanceOf,
isParameterizedString,
isPlainObject,
isPrimitive,
isRegExp,
isString,
isSyntheticEvent,
isThenable,
isVueViewModel,
} from './is';
export { isBrowser } from './isBrowser';
export { CONSOLE_LEVELS, consoleSandbox, logger, originalConsoleMethods } from './logger';
export { memoBuilder } from './memo';
export {
addContextToFrame,
addExceptionMechanism,
addExceptionTypeValue,
// eslint-disable-next-line deprecation/deprecation
arrayify,
checkOrSetAlreadyCaught,
getEventDescription,
parseSemver,
uuid4,
} from './misc';
export { dynamicRequire, isNodeEnv, loadModule } from './node';
export { normalize, normalizeToSize, normalizeUrlToBase } from './normalize';
export {
addNonEnumerableProperty,
convertToPlainObject,
dropUndefinedKeys,
extractExceptionKeysForMessage,
fill,
getOriginalFunction,
markFunctionWrapped,
objectify,
urlEncode,
} from './object';
export { basename, dirname, isAbsolute, join, normalizePath, relative, resolve } from './path';
export { makePromiseBuffer } from './promisebuffer';
export type { PromiseBuffer } from './promisebuffer';

// TODO: Remove requestdata export once equivalent integration is used everywhere
export * from './requestdata';
export * from './severity';
export * from './stacktrace';
export * from './node-stack-trace';
export * from './string';
export * from './supports';
export * from './syncpromise';
export * from './time';
export * from './tracing';
export * from './env';
export * from './envelope';
export * from './clientreport';
export * from './ratelimit';
export * from './baggage';
export * from './url';
export * from './cache';
export * from './eventbuilder';
export * from './anr';
export * from './lru';
export * from './buildPolyfills';
export * from './propagationContext';
export * from './vercelWaitUntil';
export * from './version';
export * from './debug-ids';
export {
DEFAULT_USER_INCLUDES,
addNormalizedRequestDataToEvent,
addRequestDataToEvent,
// eslint-disable-next-line deprecation/deprecation
extractPathForTransaction,
extractRequestData,
winterCGHeadersToDict,
winterCGRequestToRequestData,
} from './requestdata';

export type {
AddRequestDataToEventOptions,
// eslint-disable-next-line deprecation/deprecation
TransactionNamingScheme,
} from './requestdata';

export {
severityLevelFromString,
// TODO(v9): Don't export
validSeverityLevels,
} from './severity';

export {
UNKNOWN_FUNCTION,
createStackParser,
getFramesFromEvent,
getFunctionName,
stackParserFromStackParserOptions,
stripSentryFramesAndReverse,
} from './stacktrace';
export { filenameIsInApp, node, nodeStackLineParser } from './node-stack-trace';
export { isMatchingPattern, safeJoin, snipLine, stringMatchesSomePattern, truncate } from './string';
export {
isNativeFunction,
supportsDOMError,
supportsDOMException,
supportsErrorEvent,
supportsFetch,
supportsNativeFetch,
supportsReferrerPolicy,
supportsReportingObserver,
} from './supports';
export { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';
export {
// TODO(v9): Don't export
_browserPerformanceTimeOriginMode,
browserPerformanceTimeOrigin,
dateTimestampInSeconds,
timestampInSeconds,
} from './time';
export {
TRACEPARENT_REGEXP,
extractTraceparentData,
generateSentryTraceHeader,
propagationContextFromHeaders,
} from './tracing';
export { getSDKSource, isBrowserBundle } from './env';
export type { SdkSource } from './env';
export {
addItemToEnvelope,
createAttachmentEnvelopeItem,
createEnvelope,
createEventEnvelopeHeaders,
createSpanEnvelopeItem,
envelopeContainsItemType,
envelopeItemTypeToDataCategory,
forEachEnvelopeItem,
getSdkMetadataForEnvelopeHeader,
parseEnvelope,
serializeEnvelope,
} from './envelope';
export { createClientReportEnvelope } from './clientreport';
export {
DEFAULT_RETRY_AFTER,
disabledUntil,
isRateLimited,
parseRetryAfterHeader,
updateRateLimits,
} from './ratelimit';
export type { RateLimits } from './ratelimit';
export {
// TODO(v9): Don't export
BAGGAGE_HEADER_NAME,
// TODO(v9): Don't export
MAX_BAGGAGE_STRING_LENGTH,
SENTRY_BAGGAGE_KEY_PREFIX,
// TODO(v9): Don't export
SENTRY_BAGGAGE_KEY_PREFIX_REGEX,
baggageHeaderToDynamicSamplingContext,
dynamicSamplingContextToSentryBaggageHeader,
parseBaggageHeader,
} from './baggage';

export {
// TODO(v9): Hoist into RR6
getNumberOfUrlSegments,
getSanitizedUrlString,
// TODO(v9): Remove
// eslint-disable-next-line deprecation/deprecation
parseUrl,
stripUrlQueryAndFragment,
} from './url';

// TODO(v9): Remove
export { makeFifoCache } from './cache';

export { eventFromMessage, eventFromUnknownInput, exceptionFromError, parseStackFrames } from './eventbuilder';

export { callFrameToStackFrame, watchdogTimer } from './anr';

export { LRUMap } from './lru';

export { generatePropagationContext } from './propagationContext';

export { vercelWaitUntil } from './vercelWaitUntil';

export { SDK_VERSION } from './version';

export { getDebugImagesForResources, getFilenameToDebugIdMap } from './debug-ids';

export { escapeStringForRegex } from './vendor/escapeStringForRegex';

// TODO(v9): Hoist this into browser-utils
export { supportsHistory } from './vendor/supportsHistory';

// TODO(v9): Delete these
export { _asyncNullishCoalesce } from './buildPolyfills/_asyncNullishCoalesce';
export { _asyncOptionalChain } from './buildPolyfills/_asyncOptionalChain';
export { _asyncOptionalChainDelete } from './buildPolyfills/_asyncOptionalChainDelete';
export { _nullishCoalesce } from './buildPolyfills/_nullishCoalesce';
export { _optionalChain } from './buildPolyfills/_optionalChain';
export { _optionalChainDelete } from './buildPolyfills/_optionalChainDelete';
5 changes: 3 additions & 2 deletions packages/utils/src/instrument/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { DEBUG_BUILD } from '../debug-build';
import { logger } from '../logger';
import { getFunctionName } from '../stacktrace';

export type InstrumentHandlerType =
type InstrumentHandlerType =
| 'console'
| 'dom'
| 'fetch'
Expand All @@ -11,8 +11,9 @@ export type InstrumentHandlerType =
| 'xhr'
| 'error'
| 'unhandledrejection';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type InstrumentHandlerCallback = (data: any) => void;
type InstrumentHandlerCallback = (data: any) => void;

// We keep the handlers globally
const handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};
Expand Down
2 changes: 2 additions & 0 deletions packages/utils/src/memo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ export type MemoFunc = [

/**
* Helper to decycle json objects
*
* @deprecated This function will be removed in the next major version
*/
export function memoBuilder(): MemoFunc {
const hasWeakSet = typeof WeakSet === 'function';
Expand Down
3 changes: 3 additions & 0 deletions packages/utils/src/misc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,10 @@ export function checkOrSetAlreadyCaught(exception: unknown): boolean {
*
* @param maybeArray Input to turn into an array, if necessary
* @returns The input, if already an array, or an array with the input as the only element, if not
*
* @deprecated This function is going to be removed
*/
// TODO(v9): Remove this function
export function arrayify<T = unknown>(maybeArray: T | T[]): T[] {
return Array.isArray(maybeArray) ? maybeArray : [maybeArray];
}
2 changes: 1 addition & 1 deletion packages/utils/src/node-stack-trace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import type { StackLineParser, StackLineParserFn } from '@sentry/types';
import { UNKNOWN_FUNCTION } from './stacktrace';

export type GetModuleFn = (filename: string | undefined) => string | undefined;
type GetModuleFn = (filename: string | undefined) => string | undefined;

/**
* Does this filename look like it's part of the app code?
Expand Down
Loading