UNPKG

graphql-yoga

Version:

<div align="center"><img src="./website/public/cover.png" width="720" /></div>

142 lines (141 loc) • 6.46 kB
import { ExecutionResult } from 'graphql'; import { GetEnvelopedFn, PromiseOrValue } from '@envelop/core'; import { LogLevel, YogaLogger } from '@graphql-yoga/logger'; import { MaybePromise } from '@whatwg-node/promise-helpers'; import { ServerAdapter, ServerAdapterBaseObject, ServerAdapterInitialContext, ServerAdapterOptions, ServerAdapterRequestHandler, useCORS } from '@whatwg-node/server'; import { ParamsHandler, Plugin } from './plugins/types.cjs'; import { GraphiQLOptions, GraphiQLOptionsOrFactory } from './plugins/use-graphiql.cjs'; import { ParserAndValidationCacheOptions } from './plugins/use-parser-and-validation-cache.cjs'; import { YogaSchemaDefinition } from './plugins/use-schema.cjs'; import { LandingPageRenderer } from './plugins/use-unhandled-route.cjs'; import { FetchAPI, GraphQLParams, YogaInitialContext, YogaMaskedErrorOpts } from './types.cjs'; /** * Configuration options for the server */ export type YogaServerOptions<TServerContext, TUserContext> = Omit<ServerAdapterOptions<TServerContext>, 'plugins'> & { /** * Enable/disable logging or provide a custom logger. * @default true */ logging?: boolean | YogaLogger | LogLevel | undefined; /** * Prevent leaking unexpected errors to the client. We highly recommend enabling this in production. * If you throw `EnvelopError`/`GraphQLError` within your GraphQL resolvers then that error will be sent back to the client. * * You can lean more about this here: * @see https://graphql-yoga.vercel.app/docs/features/error-masking * * @default true */ maskedErrors?: boolean | Partial<YogaMaskedErrorOpts> | undefined; /** * Context */ context?: ((initialContext: YogaInitialContext & TServerContext) => Promise<TUserContext> | TUserContext) | Promise<TUserContext> | TUserContext | undefined; cors?: Parameters<typeof useCORS>[0] | undefined; /** * GraphQL endpoint * So you need to define it explicitly if GraphQL API lives in a different path other than `/graphql` * * @default "/graphql" */ graphqlEndpoint?: string | undefined; /** * Readiness check endpoint * * @default "/health" */ healthCheckEndpoint?: string | undefined; /** * Whether the landing page should be shown. */ landingPage?: boolean | LandingPageRenderer | undefined; /** * GraphiQL options * * @default true */ graphiql?: GraphiQLOptionsOrFactory<TServerContext> | undefined; renderGraphiQL?: ((options?: GraphiQLOptions) => PromiseOrValue<BodyInit>) | undefined; schema?: YogaSchemaDefinition<TServerContext, TUserContext> | undefined; /** * Envelop Plugins * @see https://envelop.dev/plugins */ plugins?: Array<Plugin<TUserContext & TServerContext & YogaInitialContext> | Plugin | {}> | undefined; parserAndValidationCache?: boolean | ParserAndValidationCacheOptions | undefined; fetchAPI?: Partial<Record<keyof FetchAPI, any>> | undefined; /** * GraphQL Multipart Request spec support * * @see https://github.com/jaydenseric/graphql-multipart-request-spec * * @default true */ multipart?: boolean | undefined; id?: string | undefined; /** * Batching RFC Support configuration * * @see https://github.com/graphql/graphql-over-http/blob/main/rfcs/Batching.md * * @default false */ batching?: BatchingOptions | undefined; /** * By default, GraphQL Yoga does not allow parameters in the request body except `query`, `variables`, `extensions`, and `operationName`. * * This option allows you to specify additional parameters that are allowed in the request body. * * @default [] * * @example ['doc_id', 'id'] */ extraParamNames?: string[] | undefined; }; export type BatchingOptions = boolean | { /** * You can limit the number of batched operations per request. * * @default 10 */ limit?: number; }; /** * Base class that can be extended to create a GraphQL server with any HTTP server framework. * @internal */ export declare class YogaServer<TServerContext extends Record<string, any>, TUserContext extends Record<string, any>> implements ServerAdapterBaseObject<TServerContext> { /** * Instance of envelop */ readonly getEnveloped: GetEnvelopedFn<TUserContext & TServerContext & YogaInitialContext>; logger: YogaLogger; readonly graphqlEndpoint: string; fetchAPI: FetchAPI; protected plugins: Array<Plugin<TUserContext & TServerContext & YogaInitialContext, TServerContext, TUserContext>>; private instrumentation; private onRequestParseHooks; private onParamsHooks; private onExecutionResultHooks; private onResultProcessHooks; private maskedErrorsOpts; private id; readonly version = "__YOGA_VERSION__"; constructor(options?: YogaServerOptions<TServerContext, TUserContext>); handleParams: ParamsHandler<TServerContext>; getResultForParams: ({ params, request, }: { params: GraphQLParams; request: Request; }, context: TServerContext) => PromiseOrValue<import("@graphql-tools/utils").ExecutionResult<any, any> | ExecutionResult<import("graphql/jsutils/ObjMap.js").ObjMap<unknown>, import("graphql/jsutils/ObjMap.js").ObjMap<unknown>> | AsyncIterable<import("@graphql-tools/utils").ExecutionResult<any, any>> | AsyncIterable<ExecutionResult<import("graphql/jsutils/ObjMap.js").ObjMap<unknown>, import("graphql/jsutils/ObjMap.js").ObjMap<unknown>>>>; parseRequest: (request: Request, serverContext: TServerContext & ServerAdapterInitialContext) => MaybePromise<{ requestParserResult: GraphQLParams<Record<string, any>, Record<string, any>> | GraphQLParams<Record<string, any>, Record<string, any>>[]; response?: never; } | { requestParserResult?: never; response: Response; }>; handle: ServerAdapterRequestHandler<TServerContext>; } export type YogaServerInstance<TServerContext extends Record<string, any>, TUserContext extends Record<string, any>> = ServerAdapter<TServerContext, YogaServer<TServerContext, TUserContext>>; export declare function createYoga<TServerContext extends Record<string, any> = {}, TUserContext extends Record<string, any> = {}>(options: YogaServerOptions<TServerContext, TUserContext>): YogaServerInstance<TServerContext, TUserContext>;