diff --git a/CHANGELOG.md b/CHANGELOG.md index 511695aca..67f45166b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,12 @@ Breaking changes coming with Faro version 2 - Chore (`@grafana/faro-*`): Remove Node.js 23 from build and test matrix as it's EoL (#1343) - Chore (`@grafana/faro-*`): upgrade to yarn 4 +- chore(`@grafana/faro web-sdk`): Move the stackFrames from the errors instrumentation package to the utils package (#1316) +- improvement (`@grafana/faro-web-sdk`): Allow users to configure the stackTraceParser in the BrowserConfig (#1316) +- improvement (`@grafana/faro-web-sdk`): Add `createStacktraceParser` function to create parsers with custom options (#1316) +- chore(`@grafana/faro-web-sdk`): remove the setStackTraceParser function (#1316) +- **BREAKING**: Remove `newStackTraceParser` function and `StacktraceParser` interface. Use `parseStacktrace` function directly or `createStacktraceParser` for custom options. Also simplified ExceptionsAPI by replacing `getStacktraceParser()` with direct `parseStacktrace` property (#1316) + ## 1.18.2 - Improvement (`@grafana/faro-web-sdk`): don't attach user action context to http request when in halt mode (#1249) diff --git a/docs/sources/developer/architecture/components/api.md b/docs/sources/developer/architecture/components/api.md index 1a5226cac..b49edfb3a 100644 --- a/docs/sources/developer/architecture/components/api.md +++ b/docs/sources/developer/architecture/components/api.md @@ -24,7 +24,6 @@ like `web-sdk` or by the user. Methods: -- `changeStacktraceParser` - replaces the existing stacktrace parser with a new one - `getStacktraceParser` - returns the current stacktrace parser - `pushError` - sends an exception diff --git a/packages/core/src/api/exceptions/index.ts b/packages/core/src/api/exceptions/index.ts index ed9d7d86d..bc249689e 100644 --- a/packages/core/src/api/exceptions/index.ts +++ b/packages/core/src/api/exceptions/index.ts @@ -9,7 +9,6 @@ export type { ExtendedError, PushErrorOptions, Stacktrace, - StacktraceParser, ErrorWithIndexProperties, ExceptionEventExtended, } from './types'; diff --git a/packages/core/src/api/exceptions/initialize.ts b/packages/core/src/api/exceptions/initialize.ts index d53186e90..096fbab80 100644 --- a/packages/core/src/api/exceptions/initialize.ts +++ b/packages/core/src/api/exceptions/initialize.ts @@ -21,9 +21,7 @@ import type { UserActionsAPI } from '../userActions'; import { shouldIgnoreEvent } from '../utils'; import { defaultExceptionType } from './const'; -import type { ErrorWithIndexProperties, ExceptionEvent, ExceptionsAPI, StacktraceParser } from './types'; - -let stacktraceParser: StacktraceParser | undefined; +import type { ErrorWithIndexProperties, ExceptionEvent, ExceptionsAPI } from './types'; export function initializeExceptionsAPI({ internalLogger, @@ -45,15 +43,7 @@ export function initializeExceptionsAPI({ let lastPayload: Pick | null = null; - stacktraceParser = config.parseStacktrace ?? stacktraceParser; - - const changeStacktraceParser: ExceptionsAPI['changeStacktraceParser'] = (newStacktraceParser) => { - internalLogger.debug('Changing stacktrace parser'); - - stacktraceParser = newStacktraceParser ?? stacktraceParser; - }; - - const getStacktraceParser: ExceptionsAPI['getStacktraceParser'] = () => stacktraceParser; + const parseStacktrace = config.parseStacktrace; const { ignoreErrors = [], preserveOriginalError } = config; @@ -87,8 +77,7 @@ export function initializeExceptionsAPI({ }, type: TransportItemType.EXCEPTION, }; - - stackFrames = stackFrames ?? (error.stack ? stacktraceParser?.(error).frames : undefined); + stackFrames = stackFrames ?? (error.stack ? parseStacktrace?.(error).frames : undefined); if (stackFrames?.length) { item.payload.stacktrace = { @@ -124,11 +113,8 @@ export function initializeExceptionsAPI({ } }; - changeStacktraceParser(config.parseStacktrace); - return { - changeStacktraceParser, - getStacktraceParser, + parseStacktrace, pushError, }; } diff --git a/packages/core/src/api/exceptions/types.ts b/packages/core/src/api/exceptions/types.ts index 63c53661e..ce3375963 100644 --- a/packages/core/src/api/exceptions/types.ts +++ b/packages/core/src/api/exceptions/types.ts @@ -3,8 +3,6 @@ import type { SpanContext } from '@opentelemetry/api'; import type { TraceContext } from '../traces'; import type { UserAction } from '../types'; -export type StacktraceParser = (err: ExtendedError) => Stacktrace; - export interface ExceptionStackFrame { filename: string; function: string; @@ -72,7 +70,6 @@ export type ErrorWithIndexProperties = Error & { }; export interface ExceptionsAPI { - changeStacktraceParser: (stacktraceParser: StacktraceParser) => void; - getStacktraceParser: () => StacktraceParser | undefined; + parseStacktrace: ((err: ExtendedError) => Stacktrace) | undefined; pushError: (value: ErrorWithIndexProperties, options?: PushErrorOptions) => void; } diff --git a/packages/core/src/api/index.ts b/packages/core/src/api/index.ts index 8b02e39f4..13dba268f 100644 --- a/packages/core/src/api/index.ts +++ b/packages/core/src/api/index.ts @@ -11,7 +11,6 @@ export type { ExtendedError, PushErrorOptions, Stacktrace, - StacktraceParser, ExceptionEventExtended, } from './exceptions'; diff --git a/packages/core/src/api/initialize.test.ts b/packages/core/src/api/initialize.test.ts index cac5ef356..eb3fa2a52 100644 --- a/packages/core/src/api/initialize.test.ts +++ b/packages/core/src/api/initialize.test.ts @@ -14,11 +14,10 @@ describe('initialize', () => { expect(api).toHaveProperty('pushMeasurement'); expect(api).toHaveProperty('pushTraces'); expect(api).toHaveProperty('pushEvent'); - expect(api).toHaveProperty('changeStacktraceParser'); expect(api).toHaveProperty('getOTEL'); expect(api).toHaveProperty('getPage'); expect(api).toHaveProperty('getSession'); - expect(api).toHaveProperty('getStacktraceParser'); + expect(api).toHaveProperty('parseStacktrace'); expect(api).toHaveProperty('getTraceContext'); expect(api).toHaveProperty('getView'); expect(api).toHaveProperty('initOTEL'); diff --git a/packages/core/src/config/types.ts b/packages/core/src/config/types.ts index 25bfbf84e..34b7a4d1a 100644 --- a/packages/core/src/config/types.ts +++ b/packages/core/src/config/types.ts @@ -1,4 +1,4 @@ -import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api'; +import type { APIEvent, ExtendedError, LogArgsSerializer, Stacktrace } from '../api'; import type { Instrumentation } from '../instrumentations'; import type { InternalLoggerLevel } from '../internalLogger'; import type { Meta, MetaApp, MetaItem, MetaPage, MetaSession, MetaUser, MetaView } from '../metas'; @@ -57,9 +57,9 @@ export interface Config

{ metas: MetaItem[]; /** - * Custom function used to parse stack traces + * The stacktrace parser to use for parsing stack traces. */ - parseStacktrace: StacktraceParser; + parseStacktrace?: (err: ExtendedError) => Stacktrace; /** * Pause sending data (default: false) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1c4f110f8..6d932d07a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -30,7 +30,6 @@ export type { PushLogOptions, PushMeasurementOptions, Stacktrace, - StacktraceParser, TraceContext, TraceEvent, TracesAPI, diff --git a/packages/core/src/testUtils/mockStacktraceParser.ts b/packages/core/src/testUtils/mockStacktraceParser.ts index e966a5efa..4b68d0de3 100644 --- a/packages/core/src/testUtils/mockStacktraceParser.ts +++ b/packages/core/src/testUtils/mockStacktraceParser.ts @@ -1,6 +1,6 @@ -import type { ExceptionStackFrame, StacktraceParser } from '../api'; +import type { ExceptionStackFrame, ExtendedError, Stacktrace } from '../api'; -export const mockStacktraceParser: StacktraceParser = (err) => { +export const mockStacktraceParser = (err: ExtendedError): Stacktrace => { const frames: ExceptionStackFrame[] = []; const stack = err.stack ?? err.stacktrace; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 9178a1e00..c8a5410e3 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -182,7 +182,6 @@ export type { PushLogOptions, PushMeasurementOptions, Stacktrace, - StacktraceParser, TraceContext, TraceEvent, TracesAPI, diff --git a/packages/web-sdk/src/config/makeCoreConfig.ts b/packages/web-sdk/src/config/makeCoreConfig.ts index df6286f5d..b88e919df 100644 --- a/packages/web-sdk/src/config/makeCoreConfig.ts +++ b/packages/web-sdk/src/config/makeCoreConfig.ts @@ -12,13 +12,13 @@ import { import type { Config, Instrumentation, MetaItem, MetaSession, Transport } from '@grafana/faro-core'; import { defaultEventDomain } from '../consts'; -import { parseStacktrace } from '../instrumentations'; import { defaultSessionTrackingConfig } from '../instrumentations/session'; import { userActionDataAttribute } from '../instrumentations/userActions/const'; import { browserMeta } from '../metas'; import { k6Meta } from '../metas/k6'; import { createPageMeta } from '../metas/page'; import { FetchTransport } from '../transports'; +import { parseStacktrace } from '../utils'; import { getWebInstrumentations } from './getWebInstrumentations'; import type { BrowserConfig } from './types'; @@ -79,7 +79,8 @@ export function makeCoreConfig(browserConfig: BrowserConfig): Config { isolate, logArgsSerializer, metas, - parseStacktrace, + // Use browser-provided parser or use parseStacktrace as default + parseStacktrace: browserConfig.parseStacktrace ?? parseStacktrace, paused, preventGlobalExposure, transports, diff --git a/packages/web-sdk/src/config/types.ts b/packages/web-sdk/src/config/types.ts index 8bf9123ea..52252aad0 100644 --- a/packages/web-sdk/src/config/types.ts +++ b/packages/web-sdk/src/config/types.ts @@ -1,6 +1,6 @@ import type { Config } from '@grafana/faro-core'; -export interface BrowserConfig extends Partial>, Pick { +export interface BrowserConfig extends Partial>, Pick { url?: string; apiKey?: string; } diff --git a/packages/web-sdk/src/index.ts b/packages/web-sdk/src/index.ts index 7eabc8abf..cd4f91184 100644 --- a/packages/web-sdk/src/index.ts +++ b/packages/web-sdk/src/index.ts @@ -6,12 +6,16 @@ export { defaultEventDomain } from './consts'; export { initializeFaro } from './initialize'; export { - buildStackFrame, - ConsoleInstrumentation, - ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, + createStacktraceParser, + buildStackFrame, +} from './utils'; + +export { + ConsoleInstrumentation, + ErrorsInstrumentation, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, @@ -151,7 +155,6 @@ export type { PushLogOptions, PushMeasurementOptions, Stacktrace, - StacktraceParser, TraceContext, TraceEvent, TracesAPI, diff --git a/packages/web-sdk/src/instrumentations/errors/getErrorDetails.ts b/packages/web-sdk/src/instrumentations/errors/getErrorDetails.ts index 51c84bad7..9355e3c97 100644 --- a/packages/web-sdk/src/instrumentations/errors/getErrorDetails.ts +++ b/packages/web-sdk/src/instrumentations/errors/getErrorDetails.ts @@ -1,12 +1,16 @@ import { isDomError, isDomException, isError, isErrorEvent, isEvent, isObject, isString } from '@grafana/faro-core'; -import type { ExceptionStackFrame, LogArgsSerializer } from '@grafana/faro-core'; +import type { ExceptionStackFrame, ExtendedError, LogArgsSerializer, Stacktrace } from '@grafana/faro-core'; + +import { buildStackFrame, parseStacktrace } from '../../utils/stackFrames'; import { domErrorType, domExceptionType, objectEventValue, unknownSymbolString } from './const'; import { getValueAndTypeFromMessage } from './getValueAndTypeFromMessage'; -import { buildStackFrame, getStackFramesFromError } from './stackFrames'; import type { ErrorEvent } from './types'; -export function getErrorDetails(evt: ErrorEvent): [string | undefined, string | undefined, ExceptionStackFrame[]] { +export function getErrorDetails( + evt: ErrorEvent, + stacktraceParser: (error: ExtendedError) => Stacktrace = parseStacktrace +): [string | undefined, string | undefined, ExceptionStackFrame[]] { let value: string | undefined; let type: string | undefined; let stackFrames: ExceptionStackFrame[] = []; @@ -16,15 +20,16 @@ export function getErrorDetails(evt: ErrorEvent): [string | undefined, string | if (isErrorEvent(evt) && evt.error) { value = evt.error.message; type = evt.error.name; - stackFrames = getStackFramesFromError(evt.error); + const { frames } = stacktraceParser(evt.error); + stackFrames = frames; } else if ((isDomErrorRes = isDomError(evt)) || isDomException(evt)) { const { name, message } = evt; - type = name ?? (isDomErrorRes ? domErrorType : domExceptionType); value = message ? `${type}: ${message}` : type; } else if (isError(evt)) { value = evt.message; - stackFrames = getStackFramesFromError(evt); + const { frames } = stacktraceParser(evt); + stackFrames = frames; } else if (isObject(evt) || (isEventRes = isEvent(evt))) { type = isEventRes ? evt.constructor.name : undefined; value = `${objectEventValue} ${Object.keys(evt)}`; @@ -39,7 +44,10 @@ export interface ErrorDetails { stackFrames?: ExceptionStackFrame[]; } -export function getDetailsFromErrorArgs(args: [any?, ...any[]]): ErrorDetails { +export function getDetailsFromErrorArgs( + args: [any?, ...any[]], + stacktraceParser: (error: ExtendedError) => Stacktrace = parseStacktrace +): ErrorDetails { const [evt, source, lineno, colno, error] = args; let value: string | undefined; @@ -49,7 +57,7 @@ export function getDetailsFromErrorArgs(args: [any?, ...any[]]): ErrorDetails { const initialStackFrame = buildStackFrame(source, unknownSymbolString, lineno, colno); if (error || !eventIsString) { - [value, type, stackFrames] = getErrorDetails((error ?? evt) as Error | Event); + [value, type, stackFrames] = getErrorDetails((error ?? evt) as Error | Event, stacktraceParser); if (stackFrames.length === 0) { stackFrames = [initialStackFrame]; diff --git a/packages/web-sdk/src/instrumentations/errors/index.ts b/packages/web-sdk/src/instrumentations/errors/index.ts index 903343a78..391c6fdbf 100644 --- a/packages/web-sdk/src/instrumentations/errors/index.ts +++ b/packages/web-sdk/src/instrumentations/errors/index.ts @@ -1,5 +1,3 @@ export { ErrorsInstrumentation } from './instrumentation'; -export { buildStackFrame, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace } from './stackFrames'; - export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './types'; diff --git a/packages/web-sdk/src/instrumentations/errors/registerOnerror.ts b/packages/web-sdk/src/instrumentations/errors/registerOnerror.ts index 609a0c3ae..c7e6b5274 100644 --- a/packages/web-sdk/src/instrumentations/errors/registerOnerror.ts +++ b/packages/web-sdk/src/instrumentations/errors/registerOnerror.ts @@ -7,7 +7,7 @@ export function registerOnerror(api: API): void { window.onerror = (...args) => { try { - const { value, type, stackFrames } = getDetailsFromErrorArgs(args); + const { value, type, stackFrames } = getDetailsFromErrorArgs(args, api.parseStacktrace); const originalError = args[4]; if (value) { diff --git a/packages/web-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts b/packages/web-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts index f5d1ebc0a..87cc02ee0 100644 --- a/packages/web-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts +++ b/packages/web-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts @@ -22,7 +22,7 @@ export function registerOnunhandledrejection(api: API): void { value = `${primitiveUnhandledValue} ${String(error)}`; type = primitiveUnhandledType; } else { - [value, type, stackFrames] = getErrorDetails(error); + [value, type, stackFrames] = getErrorDetails(error, api.parseStacktrace); } if (value) { diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts b/packages/web-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts deleted file mode 100644 index 353855c94..000000000 --- a/packages/web-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ExtendedError, Stacktrace } from '@grafana/faro-core'; - -import { getStackFramesFromError } from './getStackFramesFromError'; - -export function parseStacktrace(error: ExtendedError): Stacktrace { - return { - frames: getStackFramesFromError(error), - }; -} diff --git a/packages/web-sdk/src/instrumentations/index.ts b/packages/web-sdk/src/instrumentations/index.ts index faf396fb8..f2346206d 100644 --- a/packages/web-sdk/src/instrumentations/index.ts +++ b/packages/web-sdk/src/instrumentations/index.ts @@ -2,13 +2,8 @@ export { SessionInstrumentation } from './session'; export { ConsoleInstrumentation } from './console'; -export { - buildStackFrame, - ErrorsInstrumentation, - getDataFromSafariExtensions, - getStackFramesFromError, - parseStacktrace, -} from './errors'; +export { ErrorsInstrumentation } from './errors'; + export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors'; export { ViewInstrumentation } from './view'; diff --git a/packages/web-sdk/src/utils/index.ts b/packages/web-sdk/src/utils/index.ts index 643b7db23..39c788229 100644 --- a/packages/web-sdk/src/utils/index.ts +++ b/packages/web-sdk/src/utils/index.ts @@ -11,3 +11,11 @@ export { export { throttle } from './throttle'; export { getIgnoreUrls, getUrlFromResource } from './url'; + +export { + buildStackFrame, + getDataFromSafariExtensions, + getStackFramesFromError, + parseStacktrace, + createStacktraceParser, +} from './stackFrames'; diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts b/packages/web-sdk/src/utils/stackFrames/buildStackFrame.ts similarity index 100% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts rename to packages/web-sdk/src/utils/stackFrames/buildStackFrame.ts diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/const.ts b/packages/web-sdk/src/utils/stackFrames/const.ts similarity index 100% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/const.ts rename to packages/web-sdk/src/utils/stackFrames/const.ts diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts b/packages/web-sdk/src/utils/stackFrames/getDataFromSafariExtensions.ts similarity index 100% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts rename to packages/web-sdk/src/utils/stackFrames/getDataFromSafariExtensions.ts diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.test.ts b/packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.test.ts similarity index 98% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.test.ts rename to packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.test.ts index a43c9a1a4..a4b1839bd 100644 --- a/packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.test.ts +++ b/packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.test.ts @@ -181,6 +181,11 @@ describe('getStackFramesFromError', () => { buildStackFrame('http://path/to/file.js', 'bar', 108, 168), ]); }); + + it('should correctly skip lines if configured to', () => { + const result = getStackFramesFromError(CapturedExceptions.OPERA_25, { maximumLineLength: 36 }); + expect(result).toEqual([buildStackFrame('http://path/to/file.js', undefined, 47, 22)]); + }); }); /* Taken from: https://github.com/stacktracejs/error-stack-parser/blob/master/spec/fixtures/captured-errors.js */ diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts b/packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.ts similarity index 84% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts rename to packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.ts index e18627d96..28fcf8cbe 100644 --- a/packages/web-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts +++ b/packages/web-sdk/src/utils/stackFrames/getStackFramesFromError.ts @@ -16,8 +16,12 @@ import { webkitLineRegex, } from './const'; import { getDataFromSafariExtensions } from './getDataFromSafariExtensions'; +import type { StackframeParserOptions } from './types'; -export function getStackFramesFromError(error: ExtendedError): ExceptionStackFrame[] { +export function getStackFramesFromError( + error: ExtendedError, + options: StackframeParserOptions = {} +): ExceptionStackFrame[] { let lines: string[] = []; if (error.stacktrace) { @@ -33,6 +37,13 @@ export function getStackFramesFromError(error: ExtendedError): ExceptionStackFra let lineno: string | undefined; let colno: string | undefined; + // skip attempting to parse stack frames over the limit, if it is set and above 0 + if (options.maximumLineLength !== undefined && options.maximumLineLength > 0) { + if (line.length > options.maximumLineLength) { + return acc; + } + } + if ((parts = webkitLineRegex.exec(line))) { func = parts[1]; filename = parts[2]; diff --git a/packages/web-sdk/src/instrumentations/errors/stackFrames/index.ts b/packages/web-sdk/src/utils/stackFrames/index.ts similarity index 72% rename from packages/web-sdk/src/instrumentations/errors/stackFrames/index.ts rename to packages/web-sdk/src/utils/stackFrames/index.ts index 57049b8f8..9e84befeb 100644 --- a/packages/web-sdk/src/instrumentations/errors/stackFrames/index.ts +++ b/packages/web-sdk/src/utils/stackFrames/index.ts @@ -4,4 +4,4 @@ export { getDataFromSafariExtensions } from './getDataFromSafariExtensions'; export { getStackFramesFromError } from './getStackFramesFromError'; -export { parseStacktrace } from './parseStacktrace'; +export { parseStacktrace, createStacktraceParser } from './parseStacktrace'; diff --git a/packages/web-sdk/src/utils/stackFrames/parseStacktrace.ts b/packages/web-sdk/src/utils/stackFrames/parseStacktrace.ts new file mode 100644 index 000000000..604fc6760 --- /dev/null +++ b/packages/web-sdk/src/utils/stackFrames/parseStacktrace.ts @@ -0,0 +1,16 @@ +import type { ExtendedError, Stacktrace } from '@grafana/faro-core'; + +import { getStackFramesFromError } from './getStackFramesFromError'; +import type { StackframeParserOptions } from './types'; + +export function createStacktraceParser(options?: StackframeParserOptions): (error: ExtendedError) => Stacktrace { + return (error: ExtendedError) => ({ + frames: getStackFramesFromError(error, options), + }); +} + +export function parseStacktrace(error: ExtendedError, options?: StackframeParserOptions): Stacktrace { + return { + frames: getStackFramesFromError(error, options), + }; +} diff --git a/packages/web-sdk/src/utils/stackFrames/types.ts b/packages/web-sdk/src/utils/stackFrames/types.ts new file mode 100644 index 000000000..193cf31c5 --- /dev/null +++ b/packages/web-sdk/src/utils/stackFrames/types.ts @@ -0,0 +1,3 @@ +export interface StackframeParserOptions { + maximumLineLength?: number; +}