{"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/execution/values.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Values */\n\nimport { invariant } from '../jsutils/invariant.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\nimport type { ObjMap, ReadOnlyObjMap } from '../jsutils/ObjMap.ts';\nimport { printPathArray } from '../jsutils/printPathArray.ts';\n\nimport { ensureGraphQLError } from '../error/ensureGraphQLError.ts';\nimport { GraphQLError } from '../error/GraphQLError.ts';\n\nimport type {\n  ArgumentNode,\n  DirectiveNode,\n  FieldNode,\n  FragmentArgumentNode,\n  FragmentSpreadNode,\n  VariableDefinitionNode,\n} from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\n\nimport type { GraphQLArgument, GraphQLField } from '../type/definition.ts';\nimport {\n  isArgument,\n  isNonNullType,\n  isRequiredArgument,\n} from '../type/definition.ts';\nimport type { GraphQLDirective } from '../type/directives.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\nimport { validateDefaultInput } from '../type/validate.ts';\n\nimport {\n  coerceDefaultValue,\n  coerceInputLiteral,\n  coerceInputValue,\n} from '../utilities/coerceInputValue.ts';\nimport {\n  validateInputLiteral,\n  validateInputValue,\n} from '../utilities/validateInputValue.ts';\n\nimport type {\n  FragmentVariableValues,\n  FragmentVariableValueSource,\n} from './collectFields.ts';\nimport type { GraphQLVariableSignature } from './getVariableSignature.ts';\nimport { getVariableSignature } from './getVariableSignature.ts';\n\n/**\n * Coerced variable values prepared for execution.\n *\n * The `coerced` map contains runtime values keyed by variable name. The\n * `sources` map records whether each value came from request input, an operation\n * default, or a fragment-variable default so utilities can preserve defaults\n * when replacing variables in literals.\n */\nexport interface VariableValues {\n  /** Source metadata for each variable value keyed by variable name. */\n  readonly sources: ReadOnlyObjMap<VariableValueSource>;\n  /** Coerced runtime variable values keyed by variable name. */\n  readonly coerced: ReadOnlyObjMap<unknown>;\n}\n\ninterface VariableValueSource {\n  readonly signature: GraphQLVariableSignature;\n  readonly value?: unknown;\n}\n\ntype VariableValuesOrErrors =\n  | { variableValues: VariableValues; errors?: never }\n  | { errors: ReadonlyArray<GraphQLError>; variableValues?: never };\n\n/**\n * Prepares an object map of variableValues of the correct type based on the\n * provided variable definitions and arbitrary input. If the input cannot be\n * parsed to match the variable definitions, GraphQLError values are returned.\n *\n * Note: Returned maps use null prototypes to avoid collisions with\n * Object prototype properties.\n * @param schema - GraphQL schema to use.\n * @param varDefNodes - The variable definition AST nodes to coerce.\n * @param inputs - The runtime variable values keyed by variable name.\n * @param options - Optional configuration for this operation.\n * @param [options.maxErrors] - Maximum number of coercion errors to report.\n * @param [options.hideSuggestions] - Whether suggestion text should be omitted\n * from errors.\n * @returns Coerced variable values with source metadata, or request errors.\n * @example\n * ```ts\n * // Coerce provided variables and apply operation defaults.\n * import assert from 'node:assert';\n * import { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import { getVariableValues } from 'graphql/execution';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     reviews(stars: Int!, limit: Int = 10): [String]\n *   }\n * `);\n * const document = parse(`\n *   query ($stars: Int!, $limit: Int = 10) {\n *     reviews(stars: $stars, limit: $limit)\n *   }\n * `);\n * const operation = document.definitions[0];\n *\n * const result = getVariableValues(schema, operation.variableDefinitions, {\n *   stars: '5',\n * });\n *\n * assert('variableValues' in result);\n *\n * result.variableValues.coerced; // => { stars: 5, limit: 10 }\n * ```\n * @example\n * ```ts\n * // This variant uses maxErrors to cap reported coercion errors.\n * import assert from 'node:assert';\n * import { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import { getVariableValues } from 'graphql/execution';\n *\n * const schema = buildSchema(`\n *   input ReviewInput {\n *     stars: Int!\n *   }\n *\n *   type Query {\n *     review(input: ReviewInput!): String\n *   }\n * `);\n * const document = parse(`\n *   query ($first: ReviewInput!, $second: ReviewInput!) {\n *     first: review(input: $first)\n *     second: review(input: $second)\n *   }\n * `);\n * const operation = document.definitions[0];\n *\n * const result = getVariableValues(\n *   schema,\n *   operation.variableDefinitions,\n *   { first: { stars: 'bad' }, second: { stars: 'also bad' } },\n *   { maxErrors: 1 },\n * );\n *\n * assert('errors' in result);\n *\n * result.errors.length; // => 2\n * result.errors[1].message; // matches /error limit reached/\n * ```\n */\nexport function getVariableValues(\n  schema: GraphQLSchema,\n  varDefNodes: ReadonlyArray<VariableDefinitionNode>,\n  inputs: { readonly [variable: string]: unknown },\n  options?: { maxErrors?: number; hideSuggestions?: boolean },\n): VariableValuesOrErrors {\n  const errors: Array<GraphQLError> = [];\n  const maxErrors = options?.maxErrors;\n  try {\n    const variableValues = coerceVariableValues(\n      schema,\n      varDefNodes,\n      inputs,\n      (error) => {\n        if (maxErrors != null && errors.length >= maxErrors) {\n          throw new GraphQLError(\n            'Too many errors processing variables, error limit reached. Execution aborted.',\n          );\n        }\n        errors.push(error);\n      },\n      options?.hideSuggestions,\n    );\n\n    if (errors.length === 0) {\n      return { variableValues };\n    }\n  } catch (error) {\n    errors.push(ensureGraphQLError(error));\n  }\n\n  return { errors };\n}\n\nfunction coerceVariableValues(\n  schema: GraphQLSchema,\n  varDefNodes: ReadonlyArray<VariableDefinitionNode>,\n  inputs: { readonly [variable: string]: unknown },\n  onError: (error: GraphQLError) => void,\n  hideSuggestions?: Maybe<boolean>,\n): VariableValues {\n  const sources: ObjMap<VariableValueSource> = Object.create(null);\n  const coerced: ObjMap<unknown> = Object.create(null);\n  for (const varDefNode of varDefNodes) {\n    const varSignature = getVariableSignature(schema, varDefNode);\n\n    if (varSignature instanceof GraphQLError) {\n      onError(varSignature);\n      continue;\n    }\n\n    const { name: varName, type: varType } = varSignature;\n    const value = Object.hasOwn(inputs, varName) ? inputs[varName] : undefined;\n    if (value === undefined) {\n      sources[varName] = { signature: varSignature };\n      if (varDefNode.defaultValue) {\n        maybeUseDefaultValue(\n          coerced,\n          varName,\n          varSignature,\n          (error, path) => {\n            onError(\n              new GraphQLError(\n                `Variable \"$${varName}\" has invalid default value${printPathArray(path)}: ${error.message}`,\n                { nodes: varDefNode },\n              ),\n            );\n          },\n          hideSuggestions,\n        );\n        continue;\n      } else if (!isNonNullType(varType)) {\n        // Non-provided values for nullable variables are omitted.\n        continue;\n      }\n    } else {\n      sources[varName] = { signature: varSignature, value };\n    }\n\n    const coercedValue = coerceInputValue(value, varType);\n    if (coercedValue !== undefined) {\n      coerced[varName] = coercedValue;\n    } else {\n      validateInputValue(\n        value,\n        varType,\n        (error, path) => {\n          onError(\n            new GraphQLError(\n              `Variable \"$${varName}\" has invalid value${printPathArray(path)}: ${\n                error.message\n              }`,\n              { nodes: varDefNode, originalError: error },\n            ),\n          );\n        },\n        hideSuggestions,\n      );\n    }\n  }\n\n  return { sources, coerced };\n}\n\nfunction maybeUseDefaultValue(\n  coercedValues: ObjMap<unknown>,\n  name: string,\n  inputValue: GraphQLArgument | GraphQLVariableSignature,\n  onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void,\n  hideSuggestions?: Maybe<boolean>,\n): void {\n  try {\n    // coerceDefaultValue assumes validation has already rejected invalid\n    // defaults. If validation was skipped, invalid defaults or nested input\n    // field defaults can throw here; recover with validation-style errors below.\n    const coercedDefaultValue = coerceDefaultValue(inputValue);\n    if (coercedDefaultValue !== undefined) {\n      coercedValues[name] = coercedDefaultValue;\n    }\n  } catch (error) {\n    const defaultInput = inputValue.default;\n    // Defensive: coerceDefaultValue should only throw while coercing a default.\n    /* node:coverage ignore next 3 */\n    if (defaultInput === undefined) {\n      throw error;\n    }\n\n    // Prefer validation's user-facing errors for invalid defaults.\n    let reportedValidationError = false;\n    validateDefaultInput(\n      defaultInput,\n      inputValue.type,\n      (defaultError, path) => {\n        reportedValidationError = true;\n        onError(defaultError, path);\n      },\n      hideSuggestions,\n    );\n\n    if (!reportedValidationError) {\n      // The default itself validated, so coercion failed while applying a nested\n      // input field default. Surface the original coercion error.\n      onError(ensureGraphQLError(error), []);\n    }\n  }\n}\n\n/** @internal */\nexport function getFragmentVariableValues(\n  fragmentSpreadNode: FragmentSpreadNode,\n  fragmentSignatures: ReadOnlyObjMap<GraphQLVariableSignature>,\n  variableValues: VariableValues,\n  fragmentVariableValues?: Maybe<FragmentVariableValues>,\n  hideSuggestions?: Maybe<boolean>,\n): FragmentVariableValues {\n  const argumentNodes = fragmentSpreadNode.arguments ?? [];\n  const argNodeMap = new Map(argumentNodes.map((arg) => [arg.name.value, arg]));\n  const sources: ObjMap<FragmentVariableValueSource> = Object.create(null);\n  const coerced: ObjMap<unknown> = Object.create(null);\n  for (const [varName, varSignature] of Object.entries(fragmentSignatures)) {\n    const argumentNode = argNodeMap.get(varName);\n    if (argumentNode !== undefined) {\n      sources[varName] =\n        fragmentVariableValues == null\n          ? { signature: varSignature, value: argumentNode.value }\n          : {\n              signature: varSignature,\n              value: argumentNode.value,\n              fragmentVariableValues,\n            };\n    } else {\n      sources[varName] = {\n        signature: varSignature,\n      };\n    }\n\n    coerceArgument(\n      coerced,\n      fragmentSpreadNode,\n      varName,\n      varSignature,\n      argumentNode,\n      variableValues,\n      fragmentVariableValues,\n      hideSuggestions,\n    );\n  }\n\n  return { sources, coerced };\n}\n\n/**\n * Prepares an object map of argument values given a list of argument\n * definitions and list of argument AST nodes.\n *\n * Note: Returned value uses a null prototype to avoid collisions with\n * JavaScript's own property names.\n * @param def - Field or directive definition that declares the arguments.\n * @param node - Field or directive AST node supplying argument literals.\n * @param variableValues - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns A map of coerced argument values.\n * @example\n * ```ts\n * // Read literal argument values and defaults.\n * import { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import { getArgumentValues } from 'graphql/execution';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     reviews(stars: Int!, limit: Int = 10): [String]\n *   }\n * `);\n * const fieldDef = schema.getQueryType().getFields().reviews;\n * const document = parse('{ reviews(stars: 5) }');\n * const fieldNode = document.definitions[0].selectionSet.selections[0];\n *\n * getArgumentValues(fieldDef, fieldNode); // => { stars: 5, limit: 10 }\n * ```\n * @example\n * ```ts\n * // This variant resolves argument values from operation variables.\n * import assert from 'node:assert';\n * import { parse } from 'graphql/language';\n * import { buildSchema } from 'graphql/utilities';\n * import { getArgumentValues, getVariableValues } from 'graphql/execution';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     reviews(stars: Int!): [String]\n *   }\n * `);\n * const fieldDef = schema.getQueryType().getFields().reviews;\n * const document = parse('query ($stars: Int!) { reviews(stars: $stars) }');\n * const operation = document.definitions[0];\n * const fieldNode = document.definitions[0].selectionSet.selections[0];\n * const variables = getVariableValues(schema, operation.variableDefinitions, {\n *   stars: '5',\n * });\n *\n * assert('variableValues' in variables);\n *\n * getArgumentValues(fieldDef, fieldNode, variables.variableValues); // => { stars: 5 }\n * getArgumentValues(fieldDef, fieldNode); // throws an error\n * ```\n */\nexport function getArgumentValues(\n  def: GraphQLField<unknown, unknown> | GraphQLDirective,\n  node: FieldNode | DirectiveNode,\n  variableValues?: Maybe<VariableValues>,\n  fragmentVariableValues?: Maybe<FragmentVariableValues>,\n  hideSuggestions?: Maybe<boolean>,\n): ObjMap<unknown> {\n  const coercedValues: ObjMap<unknown> = Object.create(null);\n\n  const argumentNodes = node.arguments ?? [];\n  const argNodeMap = new Map(argumentNodes.map((arg) => [arg.name.value, arg]));\n\n  for (const argDef of def.args) {\n    const name = argDef.name;\n    coerceArgument(\n      coercedValues,\n      node,\n      name,\n      argDef,\n      argNodeMap.get(argDef.name),\n      variableValues,\n      fragmentVariableValues,\n      hideSuggestions,\n    );\n  }\n  return coercedValues;\n}\n\n/** @internal */\n// eslint-disable-next-line max-params\nfunction coerceArgument(\n  coercedValues: ObjMap<unknown>,\n  node: FieldNode | DirectiveNode | FragmentSpreadNode,\n  argName: string,\n  argDef: GraphQLArgument | GraphQLVariableSignature,\n  argumentNode: ArgumentNode | FragmentArgumentNode | undefined,\n  variableValues: Maybe<VariableValues>,\n  fragmentVariableValues: Maybe<FragmentVariableValues>,\n  hideSuggestions?: Maybe<boolean>,\n): void {\n  const argType = argDef.type;\n  const onArgDefaultValueError = (\n    error: GraphQLError,\n    path: ReadonlyArray<string | number>,\n  ): never => {\n    throw new GraphQLError(\n      `${printArgumentOrFragmentVariable(argDef, node)} has invalid default value${printPathArray(path)}: ${error.message}`,\n      { nodes: node },\n    );\n  };\n\n  if (!argumentNode) {\n    if (isRequiredArgument(argDef)) {\n      // Note: ProvidedRequiredArgumentsRule validation should catch this before\n      // execution. This is a runtime check to ensure execution does not\n      // continue with an invalid argument value.\n      throw new GraphQLError(\n        // TODO: clean up the naming of isRequiredArgument(), isArgument(), and argDef if/when experimental fragment variables are merged\n        `${printArgumentOrFragmentVariable(argDef, node)} of required type \"${argType}\" was not provided.`,\n        { nodes: node },\n      );\n    }\n    maybeUseDefaultValue(\n      coercedValues,\n      argName,\n      argDef,\n      onArgDefaultValueError,\n      hideSuggestions,\n    );\n    return;\n  }\n\n  const valueNode = argumentNode.value;\n\n  // Variables without a value are treated as if no argument was provided if\n  // the argument is not required.\n  if (valueNode.kind === Kind.VARIABLE) {\n    const variableName = valueNode.name.value;\n    const scopedVariableValues = fragmentVariableValues?.sources[variableName]\n      ? fragmentVariableValues\n      : variableValues;\n    if (\n      (scopedVariableValues == null ||\n        !Object.hasOwn(scopedVariableValues.coerced, variableName)) &&\n      !isRequiredArgument(argDef)\n    ) {\n      maybeUseDefaultValue(\n        coercedValues,\n        argName,\n        argDef,\n        onArgDefaultValueError,\n        hideSuggestions,\n      );\n      return;\n    }\n  }\n  const coercedValue = coerceInputLiteral(\n    valueNode,\n    argType,\n    variableValues,\n    fragmentVariableValues,\n  );\n  if (coercedValue === undefined) {\n    // Note: ValuesOfCorrectTypeRule validation should catch this before\n    // execution. This is a runtime check to ensure execution does not\n    // continue with an invalid argument value.\n    validateInputLiteral(\n      valueNode,\n      argType,\n      (error, path) => {\n        // TODO: clean up the naming of isRequiredArgument(), isArgument(), and argDef if/when experimental fragment variables are merged\n        error.message = `${printArgumentOrFragmentVariable(argDef, node)} has invalid value${printPathArray(\n          path,\n        )}: ${error.message}`;\n        throw error;\n      },\n      variableValues,\n      fragmentVariableValues,\n      hideSuggestions,\n    );\n    /* node:coverage ignore next */\n    invariant(false, 'Invalid argument');\n  }\n  coercedValues[argName] = coercedValue;\n}\n\n// TODO: clean up the naming of isRequiredArgument(), isArgument(), and argDef if/when experimental fragment variables are merged\nfunction printArgumentOrFragmentVariable(\n  argDef: GraphQLArgument | GraphQLVariableSignature,\n  node: FieldNode | DirectiveNode | FragmentSpreadNode,\n): string {\n  return isArgument(argDef)\n    ? `Argument \"${argDef}\"`\n    : `Variable \"$${argDef.name}\" defined by fragment \"${node.name.value}\"`;\n}\n\n/**\n * Prepares an object map of argument values given a directive definition\n * and a AST node which may contain directives. Optionally also accepts a map\n * of variable values.\n *\n * If the directive does not exist on the node, returns undefined.\n *\n * Note: Returned value uses a null prototype to avoid collisions with\n * JavaScript's own property names.\n * @param directiveDef - Directive definition to read argument definitions from.\n * @param node - AST node that may contain directives.\n * @param node.directives - The directives on the AST node.\n * @param variableValues - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @param hideSuggestions - Whether suggestion text should be omitted from errors.\n * @returns A map of coerced directive argument values, or undefined when absent.\n * @example\n * ```ts\n * // Read literal directive arguments from a node.\n * import { parse } from 'graphql/language';\n * import { GraphQLSkipDirective } from 'graphql/type';\n * import { getDirectiveValues } from 'graphql/execution';\n *\n * const document = parse('{ name @skip(if: true) }');\n * const fieldNode = document.definitions[0].selectionSet.selections[0];\n *\n * getDirectiveValues(GraphQLSkipDirective, fieldNode); // => { if: true }\n * ```\n * @example\n * ```ts\n * // This variant resolves directive arguments from variables and handles absent directives.\n * import assert from 'node:assert';\n * import { parse } from 'graphql/language';\n * import { GraphQLIncludeDirective } from 'graphql/type';\n * import { buildSchema } from 'graphql/utilities';\n * import { getDirectiveValues, getVariableValues } from 'graphql/execution';\n *\n * const schema = buildSchema('type Query { name: String }');\n * const document = parse(\n *   'query ($includeName: Boolean!) { name @include(if: $includeName) }',\n * );\n * const operation = document.definitions[0];\n * const fieldNode = document.definitions[0].selectionSet.selections[0];\n * const variables = getVariableValues(schema, operation.variableDefinitions, {\n *   includeName: false,\n * });\n *\n * assert('variableValues' in variables);\n *\n * getDirectiveValues(\n *   GraphQLIncludeDirective,\n *   fieldNode,\n *   variables.variableValues,\n * ); // => { if: false }\n * getDirectiveValues(GraphQLIncludeDirective, { directives: [] }); // => undefined\n * ```\n */\nexport function getDirectiveValues(\n  directiveDef: GraphQLDirective,\n  node: { readonly directives?: ReadonlyArray<DirectiveNode> | undefined },\n  variableValues?: Maybe<VariableValues>,\n  fragmentVariableValues?: Maybe<FragmentVariableValues>,\n  hideSuggestions?: Maybe<boolean>,\n): undefined | ObjMap<unknown> {\n  const directiveNode = node.directives?.find(\n    (directive) => directive.name.value === directiveDef.name,\n  );\n\n  if (directiveNode) {\n    return getArgumentValues(\n      directiveDef,\n      directiveNode,\n      variableValues,\n      fragmentVariableValues,\n      hideSuggestions,\n    );\n  }\n}\n"]}