1
1
/* eslint-disable max-lines */
2
2
/* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { ExtendedError , WrappedFunction } from '@sentry/types' ;
3
+ import { WrappedFunction } from '@sentry/types' ;
4
4
5
5
import { htmlTreeAsString } from './browser' ;
6
6
import { isElement , isError , isEvent , isInstanceOf , isPlainObject , isPrimitive } from './is' ;
@@ -92,50 +92,32 @@ export function urlEncode(object: { [key: string]: any }): string {
92
92
}
93
93
94
94
/**
95
- * Transforms any object into an object literal with all its attributes
96
- * attached to it .
95
+ * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their
96
+ * non-enumerable properties attached .
97
97
*
98
98
* @param value Initial source that we have to transform in order for it to be usable by the serializer
99
+ * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor
100
+ * an Error.
99
101
*/
100
- export function convertToPlainObject ( value : unknown ) : {
101
- [ key : string ] : unknown ;
102
- } {
103
- let newObj = value as {
104
- [ key : string ] : unknown ;
105
- } ;
106
-
102
+ export function convertToPlainObject < V extends unknown > ( value : V ) : Record < string , unknown > | V {
107
103
if ( isError ( value ) ) {
108
- newObj = {
104
+ return {
109
105
message : value . message ,
110
106
name : value . name ,
111
107
stack : value . stack ,
112
- ...getOwnProperties ( value as ExtendedError ) ,
108
+ ...getOwnProperties ( value ) ,
113
109
} ;
114
110
} else if ( isEvent ( value ) ) {
115
- /**
116
- * Event-like interface that's usable in browser and node
117
- */
118
- interface SimpleEvent {
119
- [ key : string ] : unknown ;
120
- type : string ;
121
- target ?: unknown ;
122
- currentTarget ?: unknown ;
123
- }
124
-
125
- const event = value as SimpleEvent ;
126
-
127
- newObj = {
128
- type : event . type ,
129
- target : serializeEventTarget ( event . target ) ,
130
- currentTarget : serializeEventTarget ( event . currentTarget ) ,
131
- ...getOwnProperties ( event ) ,
111
+ return {
112
+ type : value . type ,
113
+ target : serializeEventTarget ( value . target ) ,
114
+ currentTarget : serializeEventTarget ( value . currentTarget ) ,
115
+ ...getOwnProperties ( value ) ,
116
+ detail : typeof CustomEvent !== 'undefined' && isInstanceOf ( value , CustomEvent ) ? value . detail : undefined ,
132
117
} ;
133
-
134
- if ( typeof CustomEvent !== 'undefined' && isInstanceOf ( value , CustomEvent ) ) {
135
- newObj . detail = event . detail ;
136
- }
118
+ } else {
119
+ return value ;
137
120
}
138
- return newObj ;
139
121
}
140
122
141
123
/** Creates a string representation of the target of an `Event` object */
@@ -148,23 +130,26 @@ function serializeEventTarget(target: unknown): string {
148
130
}
149
131
150
132
/** Filters out all but an object's own properties */
151
- function getOwnProperties ( obj : { [ key : string ] : unknown } ) : { [ key : string ] : unknown } {
152
- const extractedProps : { [ key : string ] : unknown } = { } ;
153
- for ( const property in obj ) {
154
- if ( Object . prototype . hasOwnProperty . call ( obj , property ) ) {
155
- extractedProps [ property ] = obj [ property ] ;
133
+ function getOwnProperties ( obj : unknown ) : { [ key : string ] : unknown } {
134
+ if ( typeof obj === 'object' && obj !== null ) {
135
+ const extractedProps : { [ key : string ] : unknown } = { } ;
136
+ for ( const property in obj ) {
137
+ if ( Object . prototype . hasOwnProperty . call ( obj , property ) ) {
138
+ extractedProps [ property ] = ( obj as Record < string , unknown > ) [ property ] ;
139
+ }
156
140
}
141
+ return extractedProps ;
142
+ } else {
143
+ return { } ;
157
144
}
158
- return extractedProps ;
159
145
}
160
146
161
147
/**
162
148
* Given any captured exception, extract its keys and create a sorted
163
149
* and truncated list that will be used inside the event message.
164
150
* eg. `Non-error exception captured with keys: foo, bar, baz`
165
151
*/
166
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
167
- export function extractExceptionKeysForMessage ( exception : any , maxLength : number = 40 ) : string {
152
+ export function extractExceptionKeysForMessage ( exception : Record < string , unknown > , maxLength : number = 40 ) : string {
168
153
const keys = Object . keys ( convertToPlainObject ( exception ) ) ;
169
154
keys . sort ( ) ;
170
155
0 commit comments