@apollo/client
Version:
A fully-featured caching GraphQL client.
1 lines • 114 kB
Source Map (JSON)
{"version":3,"file":"LocalState.cjs","sources":["../../../src/local-state/LocalState.ts"],"sourcesContent":["import type {\n ASTNode,\n DirectiveNode,\n DocumentNode,\n ExecutableDefinitionNode,\n FieldNode,\n FormattedExecutionResult,\n FragmentSpreadNode,\n GraphQLError,\n GraphQLFormattedError,\n OperationDefinitionNode,\n SelectionNode,\n SelectionSetNode,\n} from \"graphql\";\nimport { isSelectionNode, Kind, visit } from \"graphql\";\n\nimport type {\n ApolloCache,\n ApolloClient,\n Cache,\n DefaultContext,\n ErrorLike,\n OperationVariables,\n TypedDocumentNode,\n} from \"@apollo/client\";\nimport { cacheSlot } from \"@apollo/client/cache\";\nimport { LocalStateError, toErrorLike } from \"@apollo/client/errors\";\nimport { stripTypename } from \"@apollo/client/utilities\";\nimport { __DEV__ } from \"@apollo/client/utilities/environment\";\nimport type {\n FragmentMap,\n NoInfer,\n RemoveIndexSignature,\n} from \"@apollo/client/utilities/internal\";\nimport {\n argumentsObjectFromField,\n createFragmentMap,\n dealias,\n getFragmentDefinitions,\n getMainDefinition,\n hasDirectives,\n mergeDeep,\n mergeDeepArray,\n resultKeyNameFromField,\n shouldInclude,\n} from \"@apollo/client/utilities/internal\";\nimport {\n invariant,\n newInvariantError,\n} from \"@apollo/client/utilities/invariant\";\n\ninterface ExecContext {\n client: ApolloClient;\n operationDefinition: OperationDefinitionNode;\n fragmentMap: FragmentMap;\n context: unknown;\n variables: OperationVariables;\n exportedVariables: OperationVariables;\n onlyRunForcedResolvers: boolean;\n selectionsToResolve: Set<SelectionNode>;\n errors: GraphQLFormattedError[];\n phase: \"exports\" | \"resolve\";\n exportedVariableDefs: Record<string, ExportedVariable>;\n diff: Cache.DiffResult<any>;\n returnPartialData: boolean;\n}\n\n/**\n * Information about an exported variable defined by an `@export` directive.\n */\ninterface ExportedVariable {\n /**\n * Defines whether an exported variable is a required variable (i.e. a non-null variable)\n */\n required: boolean;\n /**\n * The `FieldNode` where the exported variable is defined.\n */\n field?: FieldNode;\n\n /**\n * Ancestor nodes (parent, grandparent, etc.) that contain the `@export`\n * directive node. This is useful to get access to nested fields that contain\n * an `@export` directive if a parent resolver throws or returns\n * `null`/`undefined` that would otherwise prevent us from traversing the\n * node.\n */\n ancestors: WeakSet<ASTNode>;\n}\n\n/**\n * Tracks and caches information related to a GraphQL document by traversing the\n * document the first time its seen and collecting information about it.\n */\ninterface TraverseCacheEntry {\n /**\n * Tracks information about the variable definition for any variables defined\n * by an `@export` directive.\n */\n exportedVariableDefs: Record<string, ExportedVariable>;\n\n /**\n * SelectionNodes that either directly contain or include an `@export` field\n * in its selection set. This allows us to avoid traversing subtrees that do\n * not contain `@export` fields.\n */\n exportsToResolve: Set<SelectionNode>;\n\n /**\n * SelectionNodes that either directly contain or include an `@client` field\n * in its selection set. This allows us to avoid traversing subtrees that do\n * not contain `@client` fields.\n */\n selectionsToResolve: Set<SelectionNode>;\n}\n\ntype InferContextValueFromResolvers<TResolvers> =\n TResolvers extends { [typename: string]: infer TFieldResolvers } ?\n TFieldResolvers extends (\n { [field: string]: LocalState.Resolver<any, any, infer TContext, any> }\n ) ?\n unknown extends TContext ?\n DefaultContext\n : TContext\n : DefaultContext\n : DefaultContext;\n\ntype MaybeRequireContextFunction<TContext> =\n {} extends RemoveIndexSignature<TContext> ? {}\n : { context: LocalState.ContextFunction<TContext> };\n\nexport declare namespace LocalState {\n // `rootValue` can be any value, but using `any` or `unknown` does not allow\n // the ability to add a function signature to this definition. The generic\n // allows us to provide the function signature while allowing any value.\n\n /**\n * Configuration options for LocalState.\n *\n * @template TResolvers - The type of resolvers map to use for type checking\n * @template TContext - The type of context value returned by the context function. Defaults to `DefaultContext` when not provided.\n */\n export type Options<\n TResolvers extends Resolvers = Resolvers,\n TContext = DefaultContext,\n > = {\n context?: ContextFunction<TContext>;\n\n /**\n * The map of resolvers used to provide values for `@local` fields.\n */\n resolvers?: TResolvers;\n } & MaybeRequireContextFunction<TContext>;\n\n export interface RootValueFunctionContext {\n document: DocumentNode;\n client: ApolloClient;\n context: DefaultContext;\n phase: \"exports\" | \"resolve\";\n variables: OperationVariables;\n }\n\n export type ContextFunction<TContext> = (\n options: ContextFunctionOptions\n ) => TContext;\n\n export interface ContextFunctionOptions {\n document: DocumentNode;\n client: ApolloClient;\n phase: \"exports\" | \"resolve\";\n variables: OperationVariables;\n requestContext: DefaultContext;\n }\n\n export type RootValueFunction<TRootValue> = (\n context: RootValueFunctionContext\n ) => TRootValue;\n\n /**\n * A map of GraphQL types to their field resolvers.\n *\n * @example\n *\n * ```ts\n * const resolvers: Resolvers = {\n * Query: {\n * isLoggedIn: () => !!localStorage.getItem(\"token\"),\n * },\n * Mutation: {\n * login: (_, { token }) => {\n * localStorage.setItem(\"token\", token);\n * return true;\n * },\n * },\n * };\n * ```\n */\n export interface Resolvers<TContext = any> {\n [typename: string]: {\n [field: string]: Resolver<any, any, TContext, any>;\n };\n }\n\n /**\n * A function that resolves the value for a single GraphQL field marked with `@client`.\n *\n * Resolver functions receive four parameters:\n *\n * - `rootValue`: The parent object containing the result from the resolver on the parent field\n * - `args`: Arguments passed to the field\n * - `context`: Contains `requestContext`, `client`, and `phase` properties\n * - `info`: Information about the field being resolved\n *\n * @template TResult - The type of value returned by the resolver\n * @template TParent - The type of the parent object\n * @template TContext - The type of the request context\n * @template TArgs - The type of the field arguments\n *\n * @example\n *\n * ```ts\n * const isLoggedInResolver: Resolver<boolean> = () => {\n * return !!localStorage.getItem(\"token\");\n * };\n * ```\n */\n export type Resolver<\n TResult = unknown,\n TParent = unknown,\n TContext = DefaultContext,\n TArgs = Record<string, unknown>,\n > = (\n rootValue: TParent,\n args: TArgs,\n context: {\n requestContext: TContext;\n client: ApolloClient;\n phase: \"exports\" | \"resolve\";\n },\n info: {\n field: FieldNode;\n fragmentMap: FragmentMap;\n path: Path;\n }\n ) => TResult | Promise<TResult>;\n\n export type Path = Array<string | number>;\n}\n\n/**\n * LocalState enables the use of `@client` fields in GraphQL operations.\n *\n * `@client` fields are resolved locally using resolver functions rather than\n * being sent to the GraphQL server. This allows you to mix local and remote\n * data in a single query.\n *\n * @example\n *\n * ```ts\n * import { LocalState } from \"@apollo/client/local-state\";\n *\n * const localState = new LocalState({\n * resolvers: {\n * Query: {\n * isLoggedIn: () => !!localStorage.getItem(\"token\"),\n * },\n * },\n * });\n *\n * const client = new ApolloClient({\n * cache: new InMemoryCache(),\n * localState,\n * });\n * ```\n *\n * @template TResolvers - The type of resolvers map for type checking\n * @template TContext - The type of context value for resolvers\n */\nexport class LocalState<\n TResolvers extends\n LocalState.Resolvers = LocalState.Resolvers<DefaultContext>,\n TContext = InferContextValueFromResolvers<TResolvers>,\n> {\n private context?: LocalState.ContextFunction<TContext>;\n private resolvers: LocalState.Resolvers = {};\n private traverseCache = new WeakMap<\n ExecutableDefinitionNode,\n TraverseCacheEntry\n >();\n\n constructor(\n ...[options]: {} extends TResolvers ?\n [options?: LocalState.Options<TResolvers, NoInfer<TContext>>]\n : [\n options: LocalState.Options<TResolvers, NoInfer<TContext>> & {\n resolvers: TResolvers;\n },\n ]\n ) {\n this.context = options?.context;\n\n if (options?.resolvers) {\n this.addResolvers(options.resolvers);\n }\n }\n\n /**\n * Add resolvers to the local state. New resolvers will be merged with\n * existing ones, with new resolvers taking precedence over existing ones\n * for the same field.\n *\n * @param resolvers - The resolvers to add\n *\n * @example\n *\n * ```ts\n * localState.addResolvers({\n * Query: {\n * newField: () => \"Hello World\",\n * },\n * });\n * ```\n */\n public addResolvers(resolvers: TResolvers) {\n this.resolvers = mergeDeep(this.resolvers, resolvers);\n }\n\n public async execute<\n TData = unknown,\n TVariables extends OperationVariables = OperationVariables,\n >({\n document,\n client,\n context,\n remoteResult,\n variables = {} as TVariables,\n onlyRunForcedResolvers = false,\n returnPartialData = false,\n }: {\n document: DocumentNode | TypedDocumentNode<TData, TVariables>;\n client: ApolloClient;\n context: DefaultContext | undefined;\n // undefined is meant for client-only queries where there is no remote result\n remoteResult: FormattedExecutionResult<any> | undefined;\n variables: TVariables | undefined;\n onlyRunForcedResolvers?: boolean;\n returnPartialData?: boolean;\n }): Promise<FormattedExecutionResult<TData>> {\n if (__DEV__) {\n invariant(\n hasDirectives([\"client\"], document),\n \"Expected document to contain `@client` fields.\"\n );\n\n validateCacheImplementation(client.cache);\n }\n\n // note: if `remoteResult` is `undefined`, we will execute resolvers since\n // undefined remote data reflects a client-only query. We specifically want\n // to avoid trying to run local resolvers if the server returned `data` as\n // `null`.\n if (remoteResult?.data === null) {\n return remoteResult;\n }\n\n const {\n selectionsToResolve,\n exportedVariableDefs,\n operationDefinition,\n fragmentMap,\n } = this.collectQueryDetail(document);\n\n const rootValue = remoteResult ? remoteResult.data : {};\n\n const diff = client.cache.diff<Record<string, any>>({\n query: toQueryOperation(document),\n variables,\n returnPartialData: true,\n optimistic: false,\n });\n\n const requestContext = { ...client.defaultContext, ...context };\n const execContext: ExecContext = {\n client,\n operationDefinition,\n fragmentMap,\n context:\n this.context?.({\n requestContext,\n document,\n client,\n phase: \"resolve\",\n variables: variables ?? {},\n }) ?? (requestContext as TContext),\n variables,\n exportedVariables: {},\n selectionsToResolve,\n onlyRunForcedResolvers,\n errors: [],\n phase: \"resolve\",\n exportedVariableDefs,\n diff,\n returnPartialData,\n };\n\n const localResult = await this.resolveSelectionSet(\n operationDefinition.selectionSet,\n false,\n rootValue,\n execContext,\n []\n );\n\n const errors = (remoteResult?.errors ?? []).concat(execContext.errors);\n\n const result: FormattedExecutionResult<any> = {\n ...remoteResult,\n data: mergeDeep(rootValue, localResult),\n };\n\n if (errors.length > 0) {\n result.errors = errors;\n }\n\n return result;\n }\n\n public async getExportedVariables<\n TVariables extends OperationVariables = OperationVariables,\n >({\n document,\n client,\n context,\n variables,\n }: {\n document: DocumentNode | TypedDocumentNode<any, TVariables>;\n client: ApolloClient;\n context: DefaultContext | undefined;\n variables: Partial<NoInfer<TVariables>>;\n }): Promise<TVariables> {\n if (__DEV__) {\n invariant(\n hasDirectives([\"client\"], document),\n \"Expected document to contain `@client` fields.\"\n );\n validateCacheImplementation(client.cache);\n }\n const {\n exportsToResolve,\n exportedVariableDefs,\n fragmentMap,\n operationDefinition,\n } = this.collectQueryDetail(document);\n\n const diff = client.cache.diff<Record<string, any>>({\n query: toQueryOperation(document),\n variables,\n returnPartialData: true,\n optimistic: false,\n });\n\n const requestContext = { ...client.defaultContext, ...context };\n const execContext: ExecContext = {\n client,\n operationDefinition,\n fragmentMap,\n context:\n this.context?.({\n requestContext,\n document,\n client,\n phase: \"resolve\",\n variables: variables ?? {},\n }) ?? (requestContext as TContext),\n variables,\n exportedVariables: {},\n selectionsToResolve: exportsToResolve,\n onlyRunForcedResolvers: false,\n errors: [],\n phase: \"exports\",\n exportedVariableDefs,\n diff,\n returnPartialData: false,\n };\n\n await this.resolveSelectionSet(\n operationDefinition.selectionSet,\n false,\n diff.result,\n execContext,\n []\n );\n\n return stripTypename({\n ...variables,\n ...execContext.exportedVariables,\n }) as TVariables;\n }\n\n private async resolveSelectionSet(\n selectionSet: SelectionSetNode,\n isClientFieldDescendant: boolean,\n rootValue: Record<string, any> | null | undefined,\n execContext: ExecContext,\n path: LocalState.Path\n ) {\n const { client, fragmentMap, variables, operationDefinition } = execContext;\n const { cache } = client;\n const resultsToMerge: Array<Record<string, any>> = [];\n\n const execute = async (selection: SelectionNode): Promise<void> => {\n if (\n !isClientFieldDescendant &&\n !execContext.selectionsToResolve.has(selection)\n ) {\n // Skip selections without @client directives\n // (still processing if one of the ancestors or one of the child fields has @client directive)\n return;\n }\n if (!shouldInclude(selection, variables)) {\n // Skip this entirely.\n return;\n }\n\n if (selection.kind === Kind.FIELD) {\n const isRootField = selectionSet === operationDefinition.selectionSet;\n const isClientField =\n isClientFieldDescendant ||\n (selection.directives?.some((d) => d.name.value === \"client\") ??\n false);\n\n const fieldResult =\n isClientField ?\n await this.resolveClientField(\n selection,\n isClientFieldDescendant,\n rootValue,\n execContext,\n selectionSet,\n path.concat(selection.name.value)\n )\n : await this.resolveServerField(\n selection,\n rootValue,\n execContext,\n path.concat(selection.name.value)\n );\n\n // Don't attempt to merge the client field result if the server result\n // was null\n if (fieldResult !== undefined && (!isRootField || rootValue !== null)) {\n resultsToMerge.push({\n [resultKeyNameFromField(selection)]: fieldResult,\n });\n }\n\n return;\n }\n\n if (\n selection.kind === Kind.INLINE_FRAGMENT &&\n selection.typeCondition &&\n rootValue?.__typename &&\n cache.fragmentMatches(selection, rootValue.__typename)\n ) {\n const fragmentResult = await this.resolveSelectionSet(\n selection.selectionSet,\n isClientFieldDescendant,\n rootValue,\n execContext,\n path\n );\n\n if (fragmentResult) {\n resultsToMerge.push(fragmentResult);\n }\n\n return;\n }\n\n if (selection.kind === Kind.FRAGMENT_SPREAD) {\n const fragment = fragmentMap[selection.name.value];\n invariant(fragment, \"No fragment named %s\", selection.name.value);\n\n const typename = rootValue?.__typename;\n const typeCondition = fragment.typeCondition.name.value;\n\n const matches =\n typename === typeCondition ||\n cache.fragmentMatches(fragment, typename ?? \"\");\n\n if (matches) {\n const fragmentResult = await this.resolveSelectionSet(\n fragment.selectionSet,\n isClientFieldDescendant,\n rootValue,\n execContext,\n path\n );\n\n if (fragmentResult) {\n resultsToMerge.push(fragmentResult);\n }\n }\n\n return;\n }\n };\n\n await Promise.all(selectionSet.selections.map(execute));\n\n return resultsToMerge.length > 0 ?\n mergeDeepArray(resultsToMerge)\n : rootValue;\n }\n\n private resolveServerField(\n field: FieldNode,\n rootValue: Record<string, any> | null | undefined,\n execContext: ExecContext,\n path: LocalState.Path\n ) {\n const result = rootValue?.[field.name.value];\n\n if (!field.selectionSet) {\n return result;\n }\n\n if (result == null) {\n if (execContext.phase === \"exports\") {\n for (const [name, def] of Object.entries(\n execContext.exportedVariableDefs\n )) {\n if (def.ancestors.has(field) && def.required) {\n throw new LocalStateError(\n `${\"Field\"} '${field.name.value}' is \\`${result}\\` which contains exported required variable '${name}'. Ensure this value is in the cache or make the variable optional.`,\n { path }\n );\n }\n }\n }\n\n return result;\n }\n\n if (Array.isArray(result)) {\n return this.resolveSubSelectedArray(\n field,\n false,\n result,\n execContext,\n path\n );\n }\n\n return this.resolveSelectionSet(\n field.selectionSet,\n false,\n result,\n execContext,\n path\n );\n }\n\n private async resolveClientField(\n field: FieldNode,\n isClientFieldDescendant: boolean,\n rootValue: Record<string, any> | null | undefined,\n execContext: ExecContext,\n parentSelectionSet: SelectionSetNode,\n path: LocalState.Path\n ): Promise<any> {\n const {\n client,\n diff,\n variables,\n operationDefinition,\n phase,\n returnPartialData,\n onlyRunForcedResolvers,\n } = execContext;\n const isRootField = parentSelectionSet === operationDefinition.selectionSet;\n const fieldName = field.name.value;\n const typename =\n isRootField ?\n rootValue?.__typename || inferRootTypename(operationDefinition)\n : rootValue?.__typename;\n const resolverName = `${typename}.${fieldName}`;\n\n function readField() {\n const fieldResult = rootValue?.[fieldName];\n\n if (fieldResult !== undefined) {\n return fieldResult;\n }\n\n return getCacheResultAtPath(diff, path);\n }\n\n const defaultResolver =\n isClientFieldDescendant ? readField\n // We expect a resolver to be defined for all `@client` root fields.\n // Warn when a resolver is not defined.\n : (\n () => {\n const fieldFromCache = getCacheResultAtPath(diff, path);\n\n if (fieldFromCache !== undefined) {\n return fieldFromCache;\n }\n\n if (!returnPartialData) {\n return null;\n }\n }\n );\n\n const resolver = this.getResolver(typename, fieldName);\n let result: unknown;\n\n try {\n // Avoid running the resolver if we are only trying to run forced\n // resolvers. Fallback to read the value from the root field or the cache\n // value\n if (!onlyRunForcedResolvers || isForcedResolver(field)) {\n result =\n resolver ?\n await Promise.resolve(\n // In case the resolve function accesses reactive variables,\n // set cacheSlot to the current cache instance.\n cacheSlot.withValue(client.cache, resolver, [\n rootValue ? dealias(rootValue, parentSelectionSet) : {},\n (argumentsObjectFromField(field, variables) ?? {}) as Record<\n string,\n unknown\n >,\n { requestContext: execContext.context as any, client, phase },\n { field, fragmentMap: execContext.fragmentMap, path },\n ])\n )\n : defaultResolver();\n } else {\n result = readField();\n }\n } catch (e) {\n if (phase === \"exports\") {\n for (const [name, def] of Object.entries(\n execContext.exportedVariableDefs\n )) {\n if (def.ancestors.has(field)) {\n throw new LocalStateError(\n `An error was thrown from resolver '${resolverName}' while resolving ${\n def.required ? \"required\" : \"optional\"\n } variable '${name}'. Use a try/catch and return \\`undefined\\` to suppress this error and omit the variable from the request.`,\n { path, sourceError: e }\n );\n }\n }\n }\n\n this.addError(toErrorLike(e), path, execContext, {\n resolver: resolverName,\n cause: e,\n });\n return null;\n }\n\n if (phase === \"exports\") {\n field.directives?.forEach((directive) => {\n if (directive.name.value !== \"export\") {\n return;\n }\n\n const name = getExportedVariableName(directive);\n\n if (!name) {\n return;\n }\n\n if (result !== undefined) {\n execContext.exportedVariables[name] = result;\n }\n });\n\n if (result == null) {\n for (const [name, def] of Object.entries(\n execContext.exportedVariableDefs\n )) {\n if (def.ancestors.has(field) && def.required) {\n throw new LocalStateError(\n `${\n resolver ? \"Resolver\" : \"Field\"\n } '${resolverName}' returned \\`${result}\\` ${\n def.field === field ? \"for\" : \"which contains exported\"\n } required variable '${name}'.`,\n { path }\n );\n }\n }\n }\n }\n\n if (result === undefined && !returnPartialData) {\n if (__DEV__ && phase === \"resolve\") {\n if (resolver && !onlyRunForcedResolvers) {\n invariant.warn(\n \"The '%s' resolver returned `undefined` instead of a value. This is likely a bug in the resolver. If you didn't mean to return a value, return `null` instead.\",\n resolverName\n );\n } else if (onlyRunForcedResolvers) {\n invariant.warn(\n \"The '%s' field had no cached value and only forced resolvers were run. The value was set to `null`.\",\n resolverName\n );\n } else {\n invariant.warn(\n \"The '%s' field on object %o returned `undefined` instead of a value. The parent resolver did not include the property in the returned value and there was no resolver defined for the field.\",\n fieldName,\n rootValue\n );\n }\n }\n\n result = null;\n }\n\n if (result == null || !field.selectionSet) {\n return result;\n }\n\n if (Array.isArray(result)) {\n return this.resolveSubSelectedArray(\n field,\n true,\n result,\n execContext,\n path\n );\n }\n\n if (phase === \"resolve\" && !(result as any).__typename) {\n this.addError(\n newInvariantError(\n \"Could not resolve __typename on object %o returned from resolver '%s'. '__typename' needs to be returned to properly resolve child fields.\",\n result,\n resolverName\n ),\n path,\n execContext,\n { resolver: resolverName }\n );\n\n return null;\n }\n\n return this.resolveSelectionSet(\n field.selectionSet,\n true,\n result,\n execContext,\n path\n );\n }\n\n private addError(\n error: ErrorLike,\n path: LocalState.Path,\n execContext: ExecContext,\n meta: { [key: string]: any; resolver: string }\n ) {\n execContext.errors.push(\n addExtension(\n isGraphQLError(error) ?\n { ...error.toJSON(), path }\n : { message: error.message, path },\n meta\n )\n );\n }\n\n private getResolver(\n typename: string,\n fieldName: string\n ): LocalState.Resolver | undefined {\n return this.resolvers[typename]?.[fieldName];\n }\n\n private resolveSubSelectedArray(\n field: FieldNode,\n isClientFieldDescendant: boolean,\n result: any[],\n execContext: ExecContext,\n path: LocalState.Path\n ): any {\n return Promise.all(\n result.map((item, idx) => {\n if (item === null) {\n return null;\n }\n\n // This is a nested array, recurse.\n if (Array.isArray(item)) {\n return this.resolveSubSelectedArray(\n field,\n isClientFieldDescendant,\n item,\n execContext,\n path.concat(idx)\n );\n }\n\n // This is an object, run the selection set on it.\n if (field.selectionSet) {\n return this.resolveSelectionSet(\n field.selectionSet,\n isClientFieldDescendant,\n item,\n execContext,\n path.concat(idx)\n );\n }\n })\n );\n }\n\n // Collect selection nodes on paths from document root down to all @client directives.\n // This function takes into account transitive fragment spreads.\n // Complexity equals to a single `visit` over the full document.\n private collectQueryDetail(document: DocumentNode): TraverseCacheEntry & {\n operationDefinition: OperationDefinitionNode;\n fragmentMap: FragmentMap;\n } {\n const operationDefinition = getMainDefinition(\n document\n ) as OperationDefinitionNode;\n const fragments = getFragmentDefinitions(document);\n const fragmentMap = createFragmentMap(fragments);\n\n const isSingleASTNode = (\n node: ASTNode | readonly ASTNode[]\n ): node is ASTNode => !Array.isArray(node);\n const fields: Array<FieldNode> = [];\n let rootClientField: FieldNode | undefined;\n\n function getCurrentPath() {\n return fields.map((field) => field.name.value);\n }\n\n const traverse = (definitionNode: ExecutableDefinitionNode) => {\n if (this.traverseCache.has(definitionNode)) {\n return this.traverseCache.get(definitionNode)!;\n }\n\n // Track a separate list of all variable definitions since not all variable\n // definitions are used as exports of an `@export` field.\n const allVariableDefinitions: TraverseCacheEntry[\"exportedVariableDefs\"] =\n {};\n\n const cache: TraverseCacheEntry = {\n exportedVariableDefs: {},\n exportsToResolve: new Set<SelectionNode>(),\n selectionsToResolve: new Set<SelectionNode>(),\n };\n this.traverseCache.set(definitionNode, cache);\n\n visit(definitionNode, {\n VariableDefinition: (definition) => {\n allVariableDefinitions[definition.variable.name.value] = {\n required: definition.type.kind === Kind.NON_NULL_TYPE,\n ancestors: new WeakSet(),\n };\n },\n Field: {\n enter(field) {\n fields.push(field);\n },\n leave() {\n const removed = fields.pop();\n\n if (removed === rootClientField) {\n rootClientField = undefined;\n }\n },\n },\n Directive(node: DirectiveNode, _, __, ___, ancestors) {\n const field = fields.at(-1);\n\n if (!field) {\n return;\n }\n\n if (\n node.name.value === \"export\" &&\n // Ignore export directives that aren't inside client fields.\n // These will get sent to the server\n rootClientField\n ) {\n const fieldName = field.name.value;\n const variableName = getExportedVariableName(node);\n if (!variableName) {\n throw new LocalStateError(\n `Cannot determine the variable name from the \\`@export\\` directive used on field '${fieldName}'. Perhaps you forgot the \\`as\\` argument?`,\n { path: getCurrentPath() }\n );\n }\n if (!allVariableDefinitions[variableName]) {\n throw new LocalStateError(\n `\\`@export\\` directive on field '${fieldName}' cannot export the '$${variableName}' variable as it is missing in the ${operationDefinition.operation} definition.`,\n { path: getCurrentPath() }\n );\n }\n cache.exportedVariableDefs[variableName] = {\n ...allVariableDefinitions[variableName],\n field,\n };\n ancestors.forEach((node) => {\n if (isSingleASTNode(node) && isSelectionNode(node)) {\n cache.exportsToResolve.add(node);\n cache.exportedVariableDefs[variableName].ancestors.add(node);\n }\n });\n }\n if (node.name.value === \"client\") {\n rootClientField ??= field;\n ancestors.forEach((node) => {\n if (isSingleASTNode(node) && isSelectionNode(node)) {\n cache.selectionsToResolve.add(node);\n }\n });\n }\n },\n FragmentSpread(spread: FragmentSpreadNode, _, __, ___, ancestors) {\n const fragment = fragmentMap[spread.name.value];\n invariant(fragment, `No fragment named %s`, spread.name.value);\n\n const { selectionsToResolve: fragmentSelections } =\n traverse(fragment);\n\n if (fragmentSelections.size > 0) {\n // Fragment for this spread contains @client directive (either directly or transitively)\n // Collect selection nodes on paths from the root down to fields with the @client directive\n ancestors.forEach((node) => {\n if (isSingleASTNode(node) && isSelectionNode(node)) {\n cache.selectionsToResolve.add(node);\n }\n });\n cache.selectionsToResolve.add(spread);\n fragmentSelections.forEach((selection) => {\n cache.selectionsToResolve.add(selection);\n });\n }\n },\n });\n\n return cache;\n };\n\n return {\n ...traverse(operationDefinition),\n operationDefinition,\n fragmentMap,\n };\n }\n}\n\nfunction inferRootTypename({ operation }: OperationDefinitionNode) {\n return operation.charAt(0).toUpperCase() + operation.slice(1);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-restricted-types\nfunction isGraphQLError(error: ErrorLike): error is GraphQLError {\n return (\n error.name === \"GraphQLError\" &&\n // Check to see if the error contains keys returned in toJSON. The values\n // might be `undefined` if not set, but we don't care about those as we\n // can be reasonably sure this is a GraphQLError if all of these properties\n // exist on the error\n \"path\" in error &&\n \"locations\" in error &&\n \"extensions\" in error\n );\n}\n\nfunction addExtension(error: GraphQLFormattedError, meta: Record<string, any>) {\n return {\n ...error,\n extensions: {\n ...error.extensions,\n localState: meta,\n },\n };\n}\n\nfunction getExportedVariableName(directive: DirectiveNode) {\n if (directive.arguments) {\n for (const arg of directive.arguments) {\n if (arg.name.value === \"as\" && arg.value.kind === Kind.STRING) {\n return arg.value.value;\n }\n }\n }\n}\n\nfunction validateCacheImplementation(cache: ApolloCache) {\n invariant(\n cache.fragmentMatches,\n \"The configured cache does not support fragment matching which will lead to incorrect results when executing local resolvers. Please use a cache that implements `fragmetMatches`.\"\n );\n}\n\nfunction getCacheResultAtPath(\n diff: Cache.DiffResult<any>,\n path: LocalState.Path\n) {\n if (diff.result === null) {\n // Intentionally return undefined to signal we have no cache data\n return;\n }\n\n return path.reduce((value, segment) => value?.[segment], diff.result);\n}\n\nfunction isForcedResolver(field: FieldNode) {\n return (\n field.directives?.some((directive) => {\n if (directive.name.value !== \"client\" || !directive.arguments) {\n return false;\n }\n\n return directive.arguments.some(\n (arg) =>\n arg.name.value === \"always\" &&\n arg.value.kind === \"BooleanValue\" &&\n arg.value.value === true\n );\n }) ?? false\n );\n}\n\n// If the incoming document is a query, return it as is. Otherwise, build a\n// new document containing a query operation based on the selection set\n// of the previous main operation.\nfunction toQueryOperation(document: DocumentNode): DocumentNode {\n const definition = getMainDefinition(document);\n const definitionOperation = (definition as OperationDefinitionNode).operation;\n\n if (definitionOperation === \"query\") {\n // Already a query, so return the existing document.\n return document;\n }\n\n // Build a new query using the selection set of the main operation.\n const modifiedDoc = visit(document, {\n OperationDefinition: {\n enter(node) {\n return {\n ...node,\n operation: \"query\",\n };\n },\n },\n });\n return modifiedDoc;\n}\n"],"names":[],"mappings":";;;;;;;AAcA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAWA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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