UNPKG

@subsquid/apollo-server-core

Version:
131 lines (111 loc) 4.91 kB
import type { GraphQLSchema, DocumentNode } from 'graphql'; import type { IMocks } from '@graphql-tools/mock'; import type { IExecutableSchemaDefinition } from '@graphql-tools/schema'; import type { ApolloConfig, ValueOrPromise, GraphQLExecutor, ApolloConfigInput, } from 'apollo-server-types'; import type { GraphQLServerOptions as GraphQLOptions, PersistedQueryOptions, ValidateOptions, } from './graphqlOptions'; import type { ApolloServerPlugin } from 'apollo-server-plugin-base'; import type { GraphQLSchemaModule } from '@apollographql/apollo-tools'; export type { GraphQLSchemaModule }; import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; export type { KeyValueCache }; export type Context<T = object> = T; export type ContextFunction<FunctionParams = any, ProducedContext = object> = ( context: FunctionParams, ) => ValueOrPromise<Context<ProducedContext>>; // A plugin can return an interface that matches `ApolloServerPlugin`, or a // factory function that returns `ApolloServerPlugin`. export type PluginDefinition = ApolloServerPlugin | (() => ApolloServerPlugin); type BaseConfig = Pick< GraphQLOptions<Context>, | 'formatError' | 'debug' | 'rootValue' | 'validationRules' | 'executor' | 'formatResponse' | 'fieldResolver' | 'dataSources' | 'logger' | 'allowBatchedHttpRequests' >; export type Unsubscriber = () => void; export type SchemaChangeCallback = (apiSchema: GraphQLSchema) => void; export type GraphQLServiceConfig = { schema: GraphQLSchema; executor: GraphQLExecutor | null; }; export interface GatewayInterface { load(options: { apollo: ApolloConfig }): Promise<GraphQLServiceConfig>; /** * @deprecated Use `onSchemaLoadOrUpdate` instead */ onSchemaChange?(callback: SchemaChangeCallback): Unsubscriber; // TODO: This is optional because older gateways may not have this method, // and we only need it in certain circumstances, so we just error in // those circumstances if we don't have it. onSchemaLoadOrUpdate?( callback: (schemaContext: { apiSchema: GraphQLSchema; coreSupergraphSdl: string; }) => void, ): Unsubscriber; stop(): Promise<void>; // Note: this interface used to have an `executor` method, and also return the // executor from `load()`. ApolloServer would only use the former. We dropped // this method and now use the latter, which allows you to make a "mock // gateway" that updates the schema over time but uses normal execution. } // This was the name used for GatewayInterface in AS2; continue to export it so // that older versions of `@apollo/gateway` build against AS3. export interface GraphQLService extends GatewayInterface {} export type DocumentStore = KeyValueCache<DocumentNode>; // This configuration is shared between all integrations and should include // fields that are not specific to a single integration export interface Config<ContextFunctionParams = any> extends BaseConfig { modules?: GraphQLSchemaModule[]; // These three options are always only passed directly through to // makeExecutableSchema. (If you don't want to use makeExecutableSchema, pass // `schema` instead.) typeDefs?: IExecutableSchemaDefinition['typeDefs']; resolvers?: IExecutableSchemaDefinition['resolvers']; parseOptions?: IExecutableSchemaDefinition['parseOptions']; validateOptions?: ValidateOptions; schema?: GraphQLSchema; context?: Context | ContextFunction<ContextFunctionParams>; introspection?: boolean; mocks?: boolean | IMocks; mockEntireSchema?: boolean; plugins?: PluginDefinition[]; persistedQueries?: PersistedQueryOptions | false; gateway?: GatewayInterface; stopOnTerminationSignals?: boolean; apollo?: ApolloConfigInput; nodeEnv?: string; dangerouslyDisableValidation?: boolean; documentStore?: DocumentStore | null; csrfPrevention?: CSRFPreventionOptions | boolean; cache?: KeyValueCache | 'bounded'; } export interface CSRFPreventionOptions { // CSRF prevention works by only processing operations from requests whose // structure indicates that if they were sent by a web browser, then the // browser would have had to send a preflight OPTIONS request already. We do // this by specifying some headers that a browser will never automatically set // and which will trigger the browser to preflight. Apollo Server will reject // any operation that does not set at least one of these headers *and* does // not set a content-type (to a header whose parsed type is not // application/x-www-form-urlencoded, multipart/form-data, or text/plain). If // CSRF prevention is enabled (eg, with `csrfPrevention: true`) this list // defaults to ['x-apollo-operation-name', 'apollo-require-preflight']. This // will allow POST operations from any client and GET operations from Apollo // Client Web, Apollo iOS, and Apollo Kotlin. requestHeaders?: string[]; }