UNPKG

graphql-request

Version:

Minimal GraphQL client supporting Node and browsers for scripts or simple apps.

68 lines (62 loc) 2.81 kB
import { isUnionType } from 'graphql' import { Code } from '../../../lib/Code.js' import { hasMutation, hasQuery, hasSubscription, unwrapToNamed } from '../../../lib/graphql.js' import { createCodeGenerator } from '../createCodeGenerator.js' import { moduleNameSchemaBuildtime } from './SchemaBuildtime.js' export const { generate: generateIndex, moduleName: moduleNameIndex } = createCodeGenerator( `Index`, (config) => { const namespace = `Schema` const code = [] code.push(`/* eslint-disable */\n`) code.push(`import type * as ${namespace} from './${moduleNameSchemaBuildtime}.js'\n`) code.push(Code.export$( Code.interface$( `Index`, Code.objectFrom({ name: Code.quote(config.name), Root: { type: Code.objectFrom({ Query: hasQuery(config.typeMapByKind) ? `${namespace}.Root.Query` : null, Mutation: hasMutation(config.typeMapByKind) ? `${namespace}.Root.Mutation` : null, Subscription: hasSubscription(config.typeMapByKind) ? `${namespace}.Root.Subscription` : null, }), }, objects: Code.objectFromEntries( config.typeMapByKind.GraphQLObjectType.map(_ => [_.name, `${namespace}.Object.${_.name}`]), ), unions: Code.objectFromEntries( config.typeMapByKind.GraphQLUnionType.map(_ => [_.name, `${namespace}.Union.${_.name}`]), ), interfaces: Code.objectFromEntries( config.typeMapByKind.GraphQLInterfaceType.map(_ => [_.name, `${namespace}.Interface.${_.name}`]), ), // todo jsdoc comment saying: // Objects that match this pattern name: /.../ error: Code.objectFrom({ objects: Code.objectFromEntries( config.error.objects.map(_ => [_.name, `${namespace}.Object.${_.name}`]), ), objectsTypename: Code.objectFromEntries( config.error.objects.map(_ => [_.name, `{ __typename: "${_.name}" }`]), ), rootResultFields: `{ ${ Object.entries(config.rootTypes).map(([rootTypeName, rootType]) => { if (!rootType) return `${rootTypeName}: {}` const resultFields = Object.values(rootType.getFields()).filter((field) => { const type = unwrapToNamed(field.type) return isUnionType(type) && type.getTypes().some(_ => config.error.objects.some(__ => __.name === _.name)) }).map((field) => field.name) return `${rootType.name}: {\n${resultFields.map(_ => `${_}: "${_}"`).join(`,\n`)} }` }).join(`\n`) } }`, }), }), ), )) return code.join(`\n`) }, )