graphql-request
Version:
Minimal GraphQL client supporting Node and browsers for scripts or simple apps.
47 lines (40 loc) • 1.53 kB
text/typescript
import type { GraphQLFormattedError } from 'graphql'
import { type ExecutionResult, GraphQLError } from 'graphql'
import { isPlainObject } from './prelude.js'
export const parseExecutionResult = (result: unknown): ExecutionResult => {
if (typeof result !== `object` || result === null) {
throw new Error(`Invalid execution result: result is not object`)
}
let errors = undefined
let data = undefined
let extensions = undefined
if (`errors` in result) {
if (
!Array.isArray(result.errors)
|| result.errors.some(
error => !(isPlainObject(error) && `message` in error && typeof error[`message`] === `string`),
)
) {
throw new Error(`Invalid execution result: errors is not array of formatted errors`) // prettier-ignore
}
errors = result.errors.map((error: GraphQLFormattedError) =>
error instanceof GraphQLError ? error : new GraphQLError(error.message, error)
)
}
// todo add test coverage for case of null. @see https://github.com/jasonkuhrt/graphql-request/issues/739
if (`data` in result) {
if (!isPlainObject(result.data) && result.data !== null) {
throw new Error(`Invalid execution result: data is not plain object`) // prettier-ignore
}
data = result.data
}
if (`extensions` in result) {
if (!isPlainObject(result.extensions)) throw new Error(`Invalid execution result: extensions is not plain object`) // prettier-ignore
extensions = result.extensions
}
return {
data,
errors,
extensions,
}
}