import type { GraphQLError } from 'graphql' import type { JSONValue, FieldMeta } from '../../types' import type { DataGetter } from './dataGetter' import { getRootGraphQLFieldsFromFieldController } from './getRootGraphQLFieldsFromFieldController' export type ItemData = { id: string, [key: string]: any } export type DeserializedValue = Record< string, | { kind: 'error', errors: readonly [GraphQLError, ...GraphQLError[]] } | { kind: 'value', value: any } > export function deserializeValue ( fields: Record, itemGetter: DataGetter ) { const value: DeserializedValue = {} Object.keys(fields).forEach(fieldKey => { const field = fields[fieldKey] const itemForField: Record = {} const errors = new Set() for (const graphqlField of getRootGraphQLFieldsFromFieldController(field.controller)) { const fieldGetter = itemGetter.get(graphqlField) if (fieldGetter.errors) { fieldGetter.errors.forEach(error => { errors.add(error) }) } itemForField[graphqlField] = fieldGetter.data } if (errors.size) { value[fieldKey] = { kind: 'error', errors: [...errors] as any } } else { value[fieldKey] = { kind: 'value', value: field.controller.deserialize(itemForField) } } }) return value } export function serializeValueToObjByFieldKey ( fields: Record, value: DeserializedValue ) { const obj: Record> = {} Object.keys(fields).map(fieldKey => { const val = value[fieldKey] if (val.kind === 'value') { obj[fieldKey] = fields[fieldKey].controller.serialize(val.value) } }) return obj }