UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 7.17 kB
{"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"]}