diff --git a/packages/core/src/integration.ts b/packages/core/src/integration.ts index 500b717c3487..f0e2bdd8efbf 100644 --- a/packages/core/src/integration.ts +++ b/packages/core/src/integration.ts @@ -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'; @@ -58,7 +58,7 @@ export function getIntegrationsToSetup(options: Pick filesToInsert.includes(entry))) { return; } @@ -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; } diff --git a/packages/utils/src/array.ts b/packages/utils/src/array.ts index 15f08ba541b8..cc2247227d9b 100644 --- a/packages/utils/src/array.ts +++ b/packages/utils/src/array.ts @@ -1,6 +1,10 @@ -export type NestedArray = Array | T>; +type NestedArray = Array | 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(input: NestedArray): T[] { const result: T[] = []; diff --git a/packages/utils/src/buildPolyfills/types.ts b/packages/utils/src/buildPolyfills/types.ts index 806f302460a8..6eaf91afb368 100644 --- a/packages/utils/src/buildPolyfills/types.ts +++ b/packages/utils/src/buildPolyfills/types.ts @@ -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); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 2a89826313e8..fb269c050a68 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -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'; diff --git a/packages/utils/src/instrument/handlers.ts b/packages/utils/src/instrument/handlers.ts index 672c819e17a6..2f923172d907 100644 --- a/packages/utils/src/instrument/handlers.ts +++ b/packages/utils/src/instrument/handlers.ts @@ -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' @@ -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[] } = {}; diff --git a/packages/utils/src/memo.ts b/packages/utils/src/memo.ts index d76f60579bc4..70a2a9d58a25 100644 --- a/packages/utils/src/memo.ts +++ b/packages/utils/src/memo.ts @@ -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'; diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index ee48a2d60c2d..f07624cfb6f3 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -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(maybeArray: T | T[]): T[] { return Array.isArray(maybeArray) ? maybeArray : [maybeArray]; } diff --git a/packages/utils/src/node-stack-trace.ts b/packages/utils/src/node-stack-trace.ts index 7748046528a4..93d2242ab404 100644 --- a/packages/utils/src/node-stack-trace.ts +++ b/packages/utils/src/node-stack-trace.ts @@ -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? diff --git a/packages/utils/src/path.ts b/packages/utils/src/path.ts index ed14e85a3a92..ea5d8e060d1f 100644 --- a/packages/utils/src/path.ts +++ b/packages/utils/src/path.ts @@ -64,7 +64,7 @@ function splitPath(filename: string): string[] { // path.resolve([from ...], to) // posix version /** JSDoc */ -export function resolve(...args: string[]): string { +function resolve(...args: string[]): string { let resolvedPath = ''; let resolvedAbsolute = false; @@ -117,7 +117,7 @@ function trim(arr: string[]): string[] { // path.relative(from, to) // posix version /** JSDoc */ -export function relative(from: string, to: string): string { +function relative(from: string, to: string): string { /* eslint-disable no-param-reassign */ from = resolve(from).slice(1); to = resolve(to).slice(1); @@ -148,7 +148,7 @@ export function relative(from: string, to: string): string { // path.normalize(path) // posix version /** JSDoc */ -export function normalizePath(path: string): string { +function normalizePath(path: string): string { const isPathAbsolute = isAbsolute(path); const trailingSlash = path.slice(-1) === '/'; @@ -170,18 +170,18 @@ export function normalizePath(path: string): string { // posix version /** JSDoc */ -export function isAbsolute(path: string): boolean { +function isAbsolute(path: string): boolean { return path.charAt(0) === '/'; } // posix version /** JSDoc */ -export function join(...args: string[]): string { +function join(...args: string[]): string { return normalizePath(args.join('/')); } /** JSDoc */ -export function dirname(path: string): string { +function dirname(path: string): string { const result = splitPath(path); const root = result[0] || ''; let dir = result[1]; @@ -200,7 +200,7 @@ export function dirname(path: string): string { } /** JSDoc */ -export function basename(path: string, ext?: string): string { +function basename(path: string, ext?: string): string { let f = splitPath(path)[2] || ''; if (ext && f.slice(ext.length * -1) === ext) { f = f.slice(0, f.length - ext.length); diff --git a/packages/utils/src/url.ts b/packages/utils/src/url.ts index e324f41f82a3..788e60e8136b 100644 --- a/packages/utils/src/url.ts +++ b/packages/utils/src/url.ts @@ -13,6 +13,8 @@ type PartialURL = { * // intentionally using regex and not href parsing trick because React Native and other * // environments where DOM might not be available * @returns parsed URL object + * + * @deprecated Use URL instead */ export function parseUrl(url: string): PartialURL { if (!url) { diff --git a/packages/utils/src/worldwide.ts b/packages/utils/src/worldwide.ts index 2a1ca7b958d8..d7f35279ba96 100644 --- a/packages/utils/src/worldwide.ts +++ b/packages/utils/src/worldwide.ts @@ -48,7 +48,7 @@ type BackwardsCompatibleSentryCarrier = SentryCarrier & { }; /** Internal global with common properties and Sentry extensions */ -export type InternalGlobal = { +type InternalGlobal = { navigator?: { userAgent?: string }; console: Console; PerformanceObserver?: any; diff --git a/packages/utils/test/array.test.ts b/packages/utils/test/array.test.ts index ebf702508585..fce78de9f146 100644 --- a/packages/utils/test/array.test.ts +++ b/packages/utils/test/array.test.ts @@ -1,4 +1,3 @@ -import type { NestedArray } from '../src/array'; import { flatten } from '../src/array'; describe('flatten', () => { @@ -24,7 +23,7 @@ describe('flatten', () => { }); it('should flatten a nested array of objects', () => { - const input: NestedArray<{ a: number; b?: number } | { b: number; a?: number }> = [ + const input = [ [{ a: 1 }, { b: 2 }], [{ a: 3 }, { b: 4 }], ]; @@ -33,7 +32,7 @@ describe('flatten', () => { }); it('should flatten a mixed type array', () => { - const input: NestedArray = [['a', { b: 2 }, 'c'], 'd']; + const input = [['a', { b: 2 }, 'c'], 'd']; const expected = ['a', { b: 2 }, 'c', 'd']; expect(flatten(input)).toEqual(expected); }); diff --git a/packages/utils/test/misc.test.ts b/packages/utils/test/misc.test.ts index 14f3e88c0f0b..2273c1209a57 100644 --- a/packages/utils/test/misc.test.ts +++ b/packages/utils/test/misc.test.ts @@ -3,7 +3,6 @@ import type { Event, Mechanism, StackFrame } from '@sentry/types'; import { addContextToFrame, addExceptionMechanism, - arrayify, checkOrSetAlreadyCaught, getEventDescription, uuid4, @@ -363,19 +362,3 @@ describe('uuid4 generation', () => { } }); }); - -describe('arrayify()', () => { - it('returns arrays untouched', () => { - expect(arrayify([])).toEqual([]); - expect(arrayify(['dogs', 'are', 'great'])).toEqual(['dogs', 'are', 'great']); - }); - - it('wraps non-arrays with an array', () => { - expect(arrayify(1231)).toEqual([1231]); - expect(arrayify('dogs are great')).toEqual(['dogs are great']); - expect(arrayify(true)).toEqual([true]); - expect(arrayify({})).toEqual([{}]); - expect(arrayify(null)).toEqual([null]); - expect(arrayify(undefined)).toEqual([undefined]); - }); -}); diff --git a/packages/vue/src/integration.ts b/packages/vue/src/integration.ts index 900fa686dbcf..1bc19d4c6740 100644 --- a/packages/vue/src/integration.ts +++ b/packages/vue/src/integration.ts @@ -1,6 +1,6 @@ import { defineIntegration, hasTracingEnabled } from '@sentry/core'; import type { Client, IntegrationFn } from '@sentry/types'; -import { GLOBAL_OBJ, arrayify, consoleSandbox } from '@sentry/utils'; +import { GLOBAL_OBJ, consoleSandbox } from '@sentry/utils'; import { DEFAULT_HOOKS } from './constants'; import { DEBUG_BUILD } from './debug-build'; @@ -48,7 +48,7 @@ Update your \`Sentry.init\` call with an appropriate config option: } if (options.app) { - const apps = arrayify(options.app); + const apps = Array.isArray(options.app) ? options.app : [options.app]; apps.forEach(app => vueInit(app, options)); } else if (options.Vue) { vueInit(options.Vue, options); diff --git a/yarn.lock b/yarn.lock index 1e0aafbf7b8c..320f57f45de4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6747,13 +6747,6 @@ path-to-regexp "3.3.0" tslib "2.7.0" -"@nestjs/event-emitter@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nestjs/event-emitter/-/event-emitter-2.1.1.tgz#4e34edc487c507edbe6d02033e3dd014a19210f9" - integrity sha512-6L6fBOZTyfFlL7Ih/JDdqlCzZeCW0RjCX28wnzGyg/ncv5F/EOeT1dfopQr1loBRQ3LTgu8OWM7n4zLN4xigsg== - dependencies: - eventemitter2 "6.4.9" - "@nestjs/platform-express@10.4.6": version "10.4.6" resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-10.4.6.tgz#6c39c522fa66036b4256714fea203fbeb49fc4de" @@ -18124,11 +18117,6 @@ eventemitter-asyncresource@^1.0.0: resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== -eventemitter2@6.4.9: - version "6.4.9" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" - integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== - eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"