(error: unknown)
| 162 | } |
| 163 | |
| 164 | private toTraceError(error: unknown): TraceEventPayload['error'] { |
| 165 | if (!error) { |
| 166 | return undefined; |
| 167 | } |
| 168 | |
| 169 | if (typeof error === 'string') { |
| 170 | return { message: error }; |
| 171 | } |
| 172 | |
| 173 | if (typeof error === 'object' && error !== null) { |
| 174 | const errObj = error as Record<string, unknown>; |
| 175 | |
| 176 | // Extract fieldErrors if present and valid |
| 177 | let fieldErrors: Record<string, string[]> | undefined; |
| 178 | if ( |
| 179 | 'fieldErrors' in errObj && |
| 180 | errObj.fieldErrors !== null && |
| 181 | typeof errObj.fieldErrors === 'object' |
| 182 | ) { |
| 183 | const fieldErrorsObj = errObj.fieldErrors as Record<string, unknown>; |
| 184 | const isValidFieldErrors = Object.values(fieldErrorsObj).every( |
| 185 | (value) => Array.isArray(value) && value.every((item) => typeof item === 'string'), |
| 186 | ); |
| 187 | if (isValidFieldErrors) { |
| 188 | fieldErrors = fieldErrorsObj as Record<string, string[]>; |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | return { |
| 193 | message: typeof errObj.message === 'string' ? errObj.message : String(error), |
| 194 | type: typeof errObj.type === 'string' ? errObj.type : undefined, |
| 195 | stack: typeof errObj.stack === 'string' ? errObj.stack : undefined, |
| 196 | details: this.toRecord(errObj.details), |
| 197 | fieldErrors, |
| 198 | }; |
| 199 | } |
| 200 | |
| 201 | return { message: String(error) }; |
| 202 | } |
| 203 | |
| 204 | private parseMetadata(metadataRaw: unknown): TraceEventMetadata | undefined { |
| 205 | if (!metadataRaw || typeof metadataRaw !== 'object' || Array.isArray(metadataRaw)) { |
no test coverage detected