graphql-typed-client
Version:
A tool that generates a strongly typed client library for any GraphQL endpoint. The client allows writing GraphQL queries as plain JS objects (with type safety, awesome code completion experience, custom scalar type mapping, type guards and more)
71 lines (54 loc) • 1.66 kB
text/typescript
import { TypeMap } from '../render/typeMap/renderTypeMap'
export interface LinkedArgMap {
[arg: string]: [string, LinkedType] | undefined
}
export interface LinkedField {
type: LinkedType
args?: LinkedArgMap
}
export interface LinkedFieldMap {
[field: string]: LinkedField | undefined
}
export interface LinkedType {
name: string
fields?: LinkedFieldMap
scalar?: string[]
}
export interface LinkedTypeMap {
[type: string]: LinkedType | undefined
}
export const linkTypeMap = (typeMap: TypeMap) => {
const linkedTypeMap = <LinkedTypeMap>JSON.parse(JSON.stringify(typeMap))
Object.keys(linkedTypeMap).forEach(t => {
const type = <LinkedType>linkedTypeMap[t]
if (type.fields) {
const fields = type.fields
Object.keys(fields).forEach(f => {
const field = <LinkedField>fields[f]
if (field.args) {
const args = field.args
Object.keys(args).forEach(key => {
const arg = args[key]
if (arg) {
const [, typeName] = arg
if (typeof typeName === 'string') {
if (!linkedTypeMap[typeName]) {
linkedTypeMap[typeName] = { name: typeName }
}
arg[1] = <LinkedType>linkedTypeMap[typeName]
}
}
})
}
const typeName = <LinkedType | string>field.type
if (typeof typeName === 'string') {
if (!linkedTypeMap[typeName]) {
linkedTypeMap[typeName] = { name: typeName }
}
field.type = <LinkedType>linkedTypeMap[typeName]
}
})
}
})
return linkedTypeMap
}