{"version":3,"file":"coerceInputValue.js","sourceRoot":"","sources":["../../src/utilities/coerceInputValue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,+BAA8B;AAChD,OAAO,EAAE,SAAS,EAAE,iCAAgC;AACpD,OAAO,EAAE,gBAAgB,EAAE,wCAAuC;AAClE,OAAO,EAAE,YAAY,EAAE,oCAAmC;AAK1D,OAAO,EAAE,IAAI,EAAE,8BAA6B;AAM5C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,oBAAoB,GACrB,+BAA8B;AAK/B,OAAO,EAAE,gBAAgB,EAAE,+BAA8B;AAmCzD,MAAM,UAAU,gBAAgB,CAC9B,UAAmB,EACnB,IAAsB;IAEtB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,OAAO,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;YAElC,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,YAAY,GAAG,EAAE,CAAC;QACxB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,iBAAiB,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzC,OAAO;YACT,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,OAAO;gBACT,CAAC;gBACD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACtD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;oBACtC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC;gBACjD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,iBAAiB,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;IAElB,CAAC;AACH,CAAC;AA+DD,MAAM,UAAU,kBAAkB,CAChC,SAAoB,EACpB,IAAsB,EACtB,cAAsC,EACtC,sBAAsD;IAEtD,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,oBAAoB,GAAG,uBAAuB,CAClD,SAAS,EACT,cAAc,EACd,sBAAsB,CACvB,CAAC;QACF,IAAI,oBAAoB,IAAI,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAGD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QACD,OAAO,kBAAkB,CACvB,SAAS,EACT,IAAI,CAAC,MAAM,EACX,cAAc,EACd,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAEjC,MAAM,SAAS,GAAG,kBAAkB,CAClC,SAAS,EACT,IAAI,CAAC,MAAM,EACX,cAAc,EACd,sBAAsB,CACvB,CAAC;YACF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,SAAS,GAAG,kBAAkB,CAChC,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,cAAc,EACd,sBAAsB,CACvB,CAAC;YACF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IACE,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ;oBAC/B,uBAAuB,CACrB,QAAQ,EACR,cAAc,EACd,sBAAsB,CACvB,IAAI,IAAI;oBACT,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAC3B,CAAC;oBAED,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,OAAO;gBACT,CAAC;YACH,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAC3D,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IACE,CAAC,SAAS;gBACV,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ;oBACrC,iBAAiB,CACf,SAAS,CAAC,KAAK,EACf,cAAc,EACd,sBAAsB,CACvB,CAAC,EACJ,CAAC;gBACD,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,OAAO;gBACT,CAAC;gBACD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACtD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;oBACtC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC;gBACjD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,kBAAkB,CACnC,SAAS,CAAC,KAAK,EACf,KAAK,CAAC,IAAI,EACV,cAAc,EACd,sBAAsB,CACvB,CAAC;gBACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBACD,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;gBAChD,IACE,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;oBAClC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAI,EAChC,CAAC;oBACD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,kBAAkB;YAChC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CACzB,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,sBAAsB,CAAC,CACpE;YACH,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;IAElB,CAAC;AACH,CAAC;AAGD,SAAS,uBAAuB,CAC9B,YAA0B,EAC1B,cAAqC,EACrC,sBAAqD;IAErD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC,IAAI,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,iBAAiB,CACxB,YAA0B,EAC1B,cAAqC,EACrC,sBAAqD;IAErD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,YAAY,GAChB,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,SAAS;QACpD,CAAC,CAAC,sBAAsB,CAAC,OAAO;QAChC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC;IAC9B,OAAO,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAC/C,CAAC;AAkBD,MAAM,UAAU,kBAAkB,CAAC,UAAsB;IAEvD,IAAI,mBAAmB,GAAG,UAAU,CAAC,4BAA4B,CAAC;IAClE,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC;IACxC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,mBAAmB,GAAG,YAAY,CAAC,OAAO;YACxC,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;YAC3D,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;cAExD,mBAAmB,KAAK,SAAS;YADnC,SAAS,QAEP,2BAA2B,UAAU,CAAC,IAAI,yBAAyB,OAAO,CACxE,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,CAC3C,GAAG;QAEN,UAAU,CAAC,4BAA4B,GAAG,mBAAmB,CAAC;QAC9D,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;IAC7C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,UAAU,CAAC,4BAA4B,GAAG,YAAY,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["/** @category Values */\n\nimport { inspect } from '../jsutils/inspect.ts';\nimport { invariant } from '../jsutils/invariant.ts';\nimport { isIterableObject } from '../jsutils/isIterableObject.ts';\nimport { isObjectLike } from '../jsutils/isObjectLike.ts';\nimport type { Maybe } from '../jsutils/Maybe.ts';\nimport type { ObjMap } from '../jsutils/ObjMap.ts';\n\nimport type { ValueNode, VariableNode } from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\n\nimport type {\n  GraphQLDefaultInput,\n  GraphQLInputType,\n} from '../type/definition.ts';\nimport {\n  assertLeafType,\n  isInputObjectType,\n  isListType,\n  isNonNullType,\n  isRequiredInputField,\n} from '../type/definition.ts';\n\nimport type { FragmentVariableValues } from '../execution/collectFields.ts';\nimport type { VariableValues } from '../execution/values.ts';\n\nimport { replaceVariables } from './replaceVariables.ts';\n\n/**\n * Coerces a JavaScript value given a GraphQL Input Type.\n *\n * Returns `undefined` when the value could not be validly coerced according to\n * the provided type. Use `validateInputValue` when coercion diagnostics\n * are needed.\n * @param inputValue - JavaScript value to coerce.\n * @param type - GraphQL input type to coerce the value against.\n * @returns Coerced value, or undefined if coercion fails.\n * @example\n * ```ts\n * // Coerce runtime input values, returning undefined when coercion fails.\n * import {\n *   GraphQLInputObjectType,\n *   GraphQLInt,\n *   GraphQLList,\n *   GraphQLNonNull,\n *   GraphQLString,\n * } from 'graphql/type';\n * import { coerceInputValue } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n *   name: 'ReviewInput',\n *   fields: {\n *     stars: { type: new GraphQLNonNull(GraphQLInt) },\n *     tags: { type: new GraphQLList(GraphQLString) },\n *   },\n * });\n *\n * coerceInputValue({ stars: '5', tags: ['featured'] }, ReviewInput); // => { stars: 5, tags: ['featured'] }\n * coerceInputValue({ stars: 'bad' }, ReviewInput); // => undefined\n * ```\n */\nexport function coerceInputValue(\n  inputValue: unknown,\n  type: GraphQLInputType,\n): unknown {\n  if (isNonNullType(type)) {\n    if (inputValue == null) {\n      return; // Invalid: intentionally return no value.\n    }\n    return coerceInputValue(inputValue, type.ofType);\n  }\n\n  if (inputValue == null) {\n    return null; // Explicitly return the value null.\n  }\n\n  if (isListType(type)) {\n    if (!isIterableObject(inputValue)) {\n      // Lists accept a non-list value as a list of one.\n      const coercedItem = coerceInputValue(inputValue, type.ofType);\n      if (coercedItem === undefined) {\n        return; // Invalid: intentionally return no value.\n      }\n      return [coercedItem];\n    }\n    const coercedValue = [];\n    for (const itemValue of inputValue) {\n      const coercedItem = coerceInputValue(itemValue, type.ofType);\n      if (coercedItem === undefined) {\n        return; // Invalid: intentionally return no value.\n      }\n      coercedValue.push(coercedItem);\n    }\n    return coercedValue;\n  }\n\n  if (isInputObjectType(type)) {\n    if (!isObjectLike(inputValue) || Array.isArray(inputValue)) {\n      return; // Invalid: intentionally return no value.\n    }\n\n    const coercedValue: ObjMap<unknown> = Object.create(null);\n    const fieldDefs = type.getFields();\n    let definedFieldCount = 0;\n    for (const fieldName of Object.keys(inputValue)) {\n      if (inputValue[fieldName] === undefined) {\n        continue;\n      }\n      definedFieldCount++;\n      if (!Object.hasOwn(fieldDefs, fieldName)) {\n        return; // Invalid: intentionally return no value.\n      }\n    }\n    for (const field of Object.values(fieldDefs)) {\n      const fieldValue = inputValue[field.name];\n      if (fieldValue === undefined) {\n        if (isRequiredInputField(field)) {\n          return; // Invalid: intentionally return no value.\n        }\n        const coercedDefaultValue = coerceDefaultValue(field);\n        if (coercedDefaultValue !== undefined) {\n          coercedValue[field.name] = coercedDefaultValue;\n        }\n      } else {\n        const coercedField = coerceInputValue(fieldValue, field.type);\n        if (coercedField === undefined) {\n          return; // Invalid: intentionally return no value.\n        }\n        coercedValue[field.name] = coercedField;\n      }\n    }\n\n    if (type.isOneOf) {\n      const keys = Object.keys(coercedValue);\n      if (definedFieldCount !== 1 || keys.length !== 1) {\n        return; // Invalid: intentionally return no value.\n      }\n\n      const key = keys[0];\n      const value = coercedValue[key];\n      if (value === null) {\n        return; // Invalid: intentionally return no value.\n      }\n    }\n\n    return coercedValue;\n  }\n\n  const leafType = assertLeafType(type);\n\n  try {\n    return leafType.coerceInputValue(inputValue);\n  } catch (_error) {\n    // Invalid: ignore error and intentionally return no value.\n  }\n}\n\n/**\n * Produces a coerced \"internal\" JavaScript value given a GraphQL Value AST.\n *\n * Returns `undefined` when the value could not be validly coerced according to\n * the provided type.\n * @param valueNode - GraphQL value AST node to coerce.\n * @param type - GraphQL input type to coerce the literal against.\n * @param variableValues - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @returns Coerced value, or undefined if coercion fails.\n * @example\n * ```ts\n * // Coerce literal input values without variables.\n * import { parseValue } from 'graphql/language';\n * import {\n *   GraphQLInputObjectType,\n *   GraphQLInt,\n *   GraphQLNonNull,\n *   GraphQLString,\n * } from 'graphql/type';\n * import { coerceInputLiteral } from 'graphql/utilities';\n *\n * const ReviewInput = new GraphQLInputObjectType({\n *   name: 'ReviewInput',\n *   fields: {\n *     stars: { type: new GraphQLNonNull(GraphQLInt) },\n *     comment: { type: GraphQLString },\n *   },\n * });\n *\n * coerceInputLiteral(\n *   parseValue('{ stars: 5, comment: \"Loved it\" }'),\n *   ReviewInput,\n * ); // => { stars: 5, comment: 'Loved it' }\n * coerceInputLiteral(parseValue('{ comment: \"Missing\" }'), ReviewInput); // => undefined\n * ```\n * @example\n * ```ts\n * // This variant resolves variable references using VariableValues from getVariableValues().\n * import assert from 'node:assert';\n * import { parse, parseValue } from 'graphql/language';\n * import { GraphQLInt } from 'graphql/type';\n * import { getVariableValues } from 'graphql/execution';\n * import { buildSchema, coerceInputLiteral } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     review(stars: Int): String\n *   }\n * `);\n * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }');\n * const operation = document.definitions[0];\n * const result = getVariableValues(schema, operation.variableDefinitions, {\n *   stars: '4',\n * });\n *\n * assert('variableValues' in result);\n *\n * coerceInputLiteral(parseValue('$stars'), GraphQLInt, result.variableValues); // => 4\n * ```\n */\nexport function coerceInputLiteral(\n  valueNode: ValueNode,\n  type: GraphQLInputType,\n  variableValues?: Maybe<VariableValues>,\n  fragmentVariableValues?: Maybe<FragmentVariableValues>,\n): unknown {\n  if (valueNode.kind === Kind.VARIABLE) {\n    const coercedVariableValue = getCoercedVariableValue(\n      valueNode,\n      variableValues,\n      fragmentVariableValues,\n    );\n    if (coercedVariableValue == null && isNonNullType(type)) {\n      return; // Invalid: intentionally return no value.\n    }\n    // Note: This does no further checking that this variable is correct.\n    // This assumes validated has checked this variable is of the correct type.\n    return coercedVariableValue;\n  }\n\n  if (isNonNullType(type)) {\n    if (valueNode.kind === Kind.NULL) {\n      return; // Invalid: intentionally return no value.\n    }\n    return coerceInputLiteral(\n      valueNode,\n      type.ofType,\n      variableValues,\n      fragmentVariableValues,\n    );\n  }\n\n  if (valueNode.kind === Kind.NULL) {\n    return null; // Explicitly return the value null.\n  }\n\n  if (isListType(type)) {\n    if (valueNode.kind !== Kind.LIST) {\n      // Lists accept a non-list value as a list of one.\n      const itemValue = coerceInputLiteral(\n        valueNode,\n        type.ofType,\n        variableValues,\n        fragmentVariableValues,\n      );\n      if (itemValue === undefined) {\n        return; // Invalid: intentionally return no value.\n      }\n      return [itemValue];\n    }\n    const coercedValue: Array<unknown> = [];\n    for (const itemNode of valueNode.values) {\n      let itemValue = coerceInputLiteral(\n        itemNode,\n        type.ofType,\n        variableValues,\n        fragmentVariableValues,\n      );\n      if (itemValue === undefined) {\n        if (\n          itemNode.kind === Kind.VARIABLE &&\n          getCoercedVariableValue(\n            itemNode,\n            variableValues,\n            fragmentVariableValues,\n          ) == null &&\n          !isNonNullType(type.ofType)\n        ) {\n          // A missing variable within a list is coerced to null.\n          itemValue = null;\n        } else {\n          return; // Invalid: intentionally return no value.\n        }\n      }\n      coercedValue.push(itemValue);\n    }\n    return coercedValue;\n  }\n\n  if (isInputObjectType(type)) {\n    if (valueNode.kind !== Kind.OBJECT) {\n      return; // Invalid: intentionally return no value.\n    }\n\n    const coercedValue: ObjMap<unknown> = Object.create(null);\n    const fieldDefs = type.getFields();\n    const hasUndefinedField = valueNode.fields.some(\n      (field) => !Object.hasOwn(fieldDefs, field.name.value),\n    );\n    if (hasUndefinedField) {\n      return; // Invalid: intentionally return no value.\n    }\n    const fieldNodes = new Map(\n      valueNode.fields.map((field) => [field.name.value, field]),\n    );\n    for (const field of Object.values(fieldDefs)) {\n      const fieldNode = fieldNodes.get(field.name);\n      if (\n        !fieldNode ||\n        (fieldNode.value.kind === Kind.VARIABLE &&\n          isMissingVariable(\n            fieldNode.value,\n            variableValues,\n            fragmentVariableValues,\n          ))\n      ) {\n        if (isRequiredInputField(field)) {\n          return; // Invalid: intentionally return no value.\n        }\n        const coercedDefaultValue = coerceDefaultValue(field);\n        if (coercedDefaultValue !== undefined) {\n          coercedValue[field.name] = coercedDefaultValue;\n        }\n      } else {\n        const fieldValue = coerceInputLiteral(\n          fieldNode.value,\n          field.type,\n          variableValues,\n          fragmentVariableValues,\n        );\n        if (fieldValue === undefined) {\n          return; // Invalid: intentionally return no value.\n        }\n        coercedValue[field.name] = fieldValue;\n      }\n    }\n\n    if (type.isOneOf) {\n      const coercedKeys = Object.keys(coercedValue);\n      if (fieldNodes.size !== 1 || coercedKeys.length !== 1) {\n        return; // Invalid: not exactly one key, intentionally return no value.\n      }\n\n      for (const [fieldName, fieldNode] of fieldNodes) {\n        if (\n          fieldNode.value.kind === Kind.NULL ||\n          coercedValue[fieldName] === null\n        ) {\n          return; // Invalid: value not non-null, intentionally return no value.\n        }\n      }\n    }\n\n    return coercedValue;\n  }\n\n  const leafType = assertLeafType(type);\n  try {\n    return leafType.coerceInputLiteral\n      ? leafType.coerceInputLiteral(\n          replaceVariables(valueNode, variableValues, fragmentVariableValues),\n        )\n      : leafType.parseLiteral(valueNode, variableValues?.coerced);\n  } catch (_error) {\n    // Invalid: ignore error and intentionally return no value.\n  }\n}\n\n// Retrieves the variable value for the given variable node.\nfunction getCoercedVariableValue(\n  variableNode: VariableNode,\n  variableValues: Maybe<VariableValues>,\n  fragmentVariableValues: Maybe<FragmentVariableValues>,\n): unknown {\n  const varName = variableNode.name.value;\n  if (fragmentVariableValues?.sources[varName] !== undefined) {\n    return fragmentVariableValues.coerced[varName];\n  }\n\n  return variableValues?.coerced[varName];\n}\n\nfunction isMissingVariable(\n  variableNode: VariableNode,\n  variableValues: Maybe<VariableValues>,\n  fragmentVariableValues: Maybe<FragmentVariableValues>,\n): boolean {\n  const varName = variableNode.name.value;\n  const scopedValues =\n    fragmentVariableValues?.sources[varName] !== undefined\n      ? fragmentVariableValues.coerced\n      : variableValues?.coerced;\n  return scopedValues?.[varName] === undefined;\n}\n\ninterface InputValue {\n  type: GraphQLInputType;\n  default?: GraphQLDefaultInput | undefined;\n  defaultValue?: unknown;\n  /** @private */\n  _memoizedCoercedDefaultValue?: unknown;\n}\n\n/**\n * Returns the coerced default value for an input value definition, if it exists.\n *\n * If the default value is invalid, this will throw an error. Invalid default\n * values should be caught during validation, however, so this function assumes\n * that the default value is valid.\n * @internal\n */\nexport function coerceDefaultValue(inputValue: InputValue): unknown {\n  // Memoize the result of coercing the default value in a hidden field.\n  let coercedDefaultValue = inputValue._memoizedCoercedDefaultValue;\n  if (coercedDefaultValue !== undefined) {\n    return coercedDefaultValue;\n  }\n\n  const defaultInput = inputValue.default;\n  if (defaultInput !== undefined) {\n    coercedDefaultValue = defaultInput.literal\n      ? coerceInputLiteral(defaultInput.literal, inputValue.type)\n      : coerceInputValue(defaultInput.value, inputValue.type);\n    invariant(\n      coercedDefaultValue !== undefined,\n      `Expected value of type \"${inputValue.type}\" to be valid, found: ${inspect(\n        defaultInput.literal ?? defaultInput.value,\n      )}.`,\n    );\n    inputValue._memoizedCoercedDefaultValue = coercedDefaultValue;\n    return coercedDefaultValue;\n  }\n\n  const defaultValue = inputValue.defaultValue;\n  if (defaultValue !== undefined) {\n    inputValue._memoizedCoercedDefaultValue = defaultValue;\n  }\n  return defaultValue;\n}\n"]}