{"version":3,"file":"replaceVariables.js","sourceRoot":"","sources":["../../src/utilities/replaceVariables.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Values */\n\nimport type { Maybe } from '../jsutils/Maybe.ts';\n\nimport type {\n  ConstValueNode,\n  ObjectFieldNode,\n  ValueNode,\n} from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\n\nimport type { FragmentVariableValues } from '../execution/collectFields.ts';\nimport type { VariableValues } from '../execution/values.ts';\n\nimport { valueToLiteral } from './valueToLiteral.ts';\n\n/**\n * Replaces any Variables found within an AST Value literal with literals\n * supplied from a map of variable values, or removed if no variable replacement\n * exists, returning a constant value.\n *\n * Used primarily to ensure only complete constant values are used during input\n * coercion of custom scalars which accept complex literals.\n * @param valueNode - Value AST node in which variables should be replaced.\n * @param variableValues - Operation variable values returned by getVariableValues.\n * @param fragmentVariableValues - Fragment variable values for the current fragment scope.\n * @returns A constant value AST with variables replaced.\n * @example\n * ```ts\n * import assert from 'node:assert';\n * import { parse, parseValue, print } from 'graphql/language';\n * import { getVariableValues } from 'graphql/execution';\n * import { buildSchema, replaceVariables } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     review(stars: Int = 5): 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 * const literal = replaceVariables(\n *   parseValue('{ stars: $stars, comment: $missing }'),\n *   result.variableValues,\n * );\n *\n * print(literal); // => '{ stars: 4 }'\n * ```\n */\nexport function replaceVariables(\n  valueNode: ValueNode,\n  variableValues?: Maybe<VariableValues>,\n  fragmentVariableValues?: Maybe<FragmentVariableValues>,\n): ConstValueNode {\n  switch (valueNode.kind) {\n    case Kind.VARIABLE: {\n      const varName = valueNode.name.value;\n      const fragmentVariableValueSource =\n        fragmentVariableValues?.sources[varName];\n\n      if (fragmentVariableValueSource) {\n        const value = fragmentVariableValueSource.value;\n        if (value === undefined) {\n          const defaultValue = fragmentVariableValueSource.signature.default;\n          if (defaultValue !== undefined) {\n            return defaultValue.literal;\n          }\n          return { kind: Kind.NULL };\n        }\n        return replaceVariables(\n          value,\n          variableValues,\n          fragmentVariableValueSource.fragmentVariableValues,\n        );\n      }\n\n      const variableValueSource = variableValues?.sources[varName];\n      if (variableValueSource == null) {\n        return { kind: Kind.NULL };\n      }\n\n      if (variableValueSource.value === undefined) {\n        const defaultValue = variableValueSource.signature.default;\n        if (defaultValue !== undefined) {\n          return defaultValue.literal;\n        }\n      }\n\n      return valueToLiteral(\n        variableValueSource.value,\n        variableValueSource.signature.type,\n      ) as ConstValueNode;\n    }\n    case Kind.OBJECT: {\n      const newFields: Array<ObjectFieldNode> = [];\n      for (const field of valueNode.fields) {\n        if (field.value.kind === Kind.VARIABLE) {\n          const scopedVariableSource =\n            fragmentVariableValues?.sources[field.value.name.value] ??\n            variableValues?.sources[field.value.name.value];\n\n          if (\n            scopedVariableSource?.value === undefined &&\n            scopedVariableSource?.signature.default === undefined\n          ) {\n            continue;\n          }\n        }\n        const newFieldNodeValue = replaceVariables(\n          field.value,\n          variableValues,\n          fragmentVariableValues,\n        );\n        newFields.push({\n          ...field,\n          value: newFieldNodeValue,\n        });\n      }\n      return {\n        ...valueNode,\n        fields: newFields,\n      } as ConstValueNode;\n    }\n    case Kind.LIST: {\n      const newValues: Array<ValueNode> = [];\n      for (const value of valueNode.values) {\n        const newItemNodeValue = replaceVariables(\n          value,\n          variableValues,\n          fragmentVariableValues,\n        );\n        newValues.push(newItemNodeValue);\n      }\n      return {\n        ...valueNode,\n        values: newValues,\n      } as ConstValueNode;\n    }\n    default: {\n      return valueNode;\n    }\n  }\n}\n"]}