@apollo/server
Version:
Core engine for Apollo GraphQL server
160 lines (145 loc) • 6.48 kB
text/typescript
/**
* This file consists of types used to define the arguments to the ApolloServer
* constructor. The top-level and likely most interesting type exported from
* here is `ApolloServerOptions` which is used to define the input object to the
* `ApolloServer` constructor.
*/
import type { Logger } from '@apollo/utils.logger';
import type { IExecutableSchemaDefinition } from '@graphql-tools/schema';
import type {
DocumentNode,
FormattedExecutionResult,
GraphQLFieldResolver,
GraphQLFormattedError,
GraphQLSchema,
ParseOptions,
ValidationRule,
} from 'graphql';
import type { KeyValueCache } from '@apollo/utils.keyvaluecache';
import type { GatewayInterface } from '@apollo/server-gateway-interface';
import type { ApolloServerPlugin } from './plugins.js';
import type { BaseContext } from './index.js';
import type { GraphQLExperimentalIncrementalExecutionResults } from '../incrementalDeliveryPolyfill.js';
export type DocumentStore = KeyValueCache<DocumentNode>;
// Configuration for how Apollo Server talks to the Apollo registry, as passed
// to the ApolloServer constructor. Each field can also be provided as an
// environment variable.
export interface ApolloConfigInput {
// Your Apollo API key. Environment variable: APOLLO_KEY.
key?: string;
// The graph ref for your graph, eg `my-graph@my-variant` or `my-graph` to use
// your graph's default variant. Environment variable: APOLLO_GRAPH_REF. For
// backwards compatibility, may alternatively specify the ref as graphId and
// graphVariant separately.
graphRef?: string;
// The graph ID of your graph, eg `my-graph`. Environment variable:
// APOLLO_GRAPH_ID.
graphId?: string;
// Your graph's variant name, eg `my-variant`. Environment variable:
// APOLLO_GRAPH_VARIANT.
graphVariant?: string;
}
// some defaults filled in from the ApolloConfigInput passed to the constructor.
export interface ApolloConfig {
key?: string;
keyHash?: string;
graphRef?: string;
}
export interface PersistedQueryOptions {
cache?: KeyValueCache<string>;
/**
* Specified in **seconds**, this time-to-live (TTL) value limits the lifespan
* of how long the persisted query should be cached. To specify a desired
* lifespan of "infinite", set this to `null`, in which case the eviction will
* be determined by the cache's eviction policy, but the record will never
* simply expire.
*/
ttl?: number | null;
}
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[];
}
interface ApolloServerOptionsBase<TContext extends BaseContext> {
formatError?: (
formattedError: GraphQLFormattedError,
error: unknown,
) => GraphQLFormattedError;
rootValue?: ((parsedQuery: DocumentNode) => unknown) | unknown;
validationRules?: Array<ValidationRule>;
fieldResolver?: GraphQLFieldResolver<any, TContext>;
cache?: KeyValueCache<string> | 'bounded';
includeStacktraceInErrorResponses?: boolean;
logger?: Logger;
allowBatchedHttpRequests?: boolean;
stringifyResult?: (
value: FormattedExecutionResult,
) => string | Promise<string>;
introspection?: boolean;
maxRecursiveSelections?: boolean | number;
hideSchemaDetailsFromClientErrors?: boolean;
plugins?: ApolloServerPlugin<TContext>[];
persistedQueries?: PersistedQueryOptions | false;
stopOnTerminationSignals?: boolean;
apollo?: ApolloConfigInput;
nodeEnv?: string;
documentStore?: DocumentStore | null;
dangerouslyDisableValidation?: boolean;
csrfPrevention?: CSRFPreventionOptions | boolean;
// Used for parsing operations; unlike in AS3, this is not also used for
// parsing the schema.
parseOptions?: ParseOptions;
// TODO(AS6): remove this option. Configuration to `true` is default behavior
// and configuration to `false` is deprecated. If you depend on `false`
// behavior, we recommend migrating away from that at your earliest
// convenience since it won't be supported in the next major version.
/**
* @deprecated `true` is now the default behavior in AS5. `false` will not be
* supported in AS6 since this option will be removed.
*/
status400ForVariableCoercionErrors?: boolean;
// For testing only.
__testing_incrementalExecutionResults?: GraphQLExperimentalIncrementalExecutionResults;
}
export interface ApolloServerOptionsWithGateway<TContext extends BaseContext>
extends ApolloServerOptionsBase<TContext> {
gateway: GatewayInterface;
schema?: undefined;
typeDefs?: undefined;
resolvers?: undefined;
}
export interface ApolloServerOptionsWithSchema<TContext extends BaseContext>
extends ApolloServerOptionsBase<TContext> {
schema: GraphQLSchema;
gateway?: undefined;
typeDefs?: undefined;
resolvers?: undefined;
}
export interface ApolloServerOptionsWithTypeDefs<TContext extends BaseContext>
extends ApolloServerOptionsBase<TContext> {
// These two options are always only passed directly through to
// makeExecutableSchema. (If you don't want to use makeExecutableSchema, pass
// `schema` instead.)
typeDefs: IExecutableSchemaDefinition<TContext>['typeDefs'];
resolvers?: IExecutableSchemaDefinition<TContext>['resolvers'];
gateway?: undefined;
schema?: undefined;
}
// Used internally in ApolloServer.ts but not publicly exported.
export type ApolloServerOptionsWithStaticSchema<TContext extends BaseContext> =
| ApolloServerOptionsWithSchema<TContext>
| ApolloServerOptionsWithTypeDefs<TContext>;
export type ApolloServerOptions<TContext extends BaseContext> =
| ApolloServerOptionsWithGateway<TContext>
| ApolloServerOptionsWithStaticSchema<TContext>;