{"version":3,"file":"astFromValue.js","sourceRoot":"","sources":["../../src/utilities/astFromValue.ts"],"names":[],"mappings":"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","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';\n\nimport type { ConstObjectFieldNode, ConstValueNode } from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\n\nimport type { GraphQLInputType } from '../type/definition.ts';\nimport {\n  isEnumType,\n  isInputObjectType,\n  isLeafType,\n  isListType,\n  isNonNullType,\n} from '../type/definition.ts';\nimport { GraphQLID } from '../type/scalars.ts';\n\n/**\n * Produces a GraphQL Value AST given a JavaScript object.\n * Function will match JavaScript/JSON values to GraphQL AST schema format\n * by using suggested GraphQLInputType.\n *\n * A GraphQL type must be provided, which will be used to interpret different\n * JavaScript values.\n *\n * This deprecated function will be removed in v18. Use `valueToLiteral()`\n * instead, and take care to operate on external values.\n *\n * | JSON Value    | GraphQL Value        |\n * | ------------- | -------------------- |\n * | Object        | Input Object         |\n * | Array         | List                 |\n * | Boolean       | Boolean              |\n * | String        | String / Enum Value  |\n * | Number        | Int / Float          |\n * | BigInt        | Int                  |\n * | Unknown       | Enum Value           |\n * | null          | NullValue            |\n * @param value - Runtime value to convert.\n * @param type - The GraphQL type to inspect.\n * @returns A GraphQL value AST for the provided JavaScript value, or null when no literal can represent it.\n * @example\n * ```ts\n * import { print } from 'graphql/language';\n * import {\n *   GraphQLInputObjectType,\n *   GraphQLInt,\n *   GraphQLList,\n *   GraphQLNonNull,\n *   GraphQLString,\n * } from 'graphql/type';\n * import { astFromValue } 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 * const valueNode = astFromValue(\n *   { stars: 5, tags: ['featured', 'verified'] },\n *   ReviewInput,\n * );\n *\n * print(valueNode); // => '{ stars: 5, tags: [\"featured\", \"verified\"] }'\n * astFromValue(undefined, GraphQLString); // => null\n * astFromValue(null, new GraphQLNonNull(GraphQLString)); // => null\n * ```\n * @deprecated use `valueToLiteral()` instead with care to operate on external values - `astFromValue()` will be removed in v18\n */\nexport function astFromValue(\n  value: unknown,\n  type: GraphQLInputType,\n): Maybe<ConstValueNode> {\n  if (isNonNullType(type)) {\n    const astValue = astFromValue(value, type.ofType);\n    if (astValue?.kind === Kind.NULL) {\n      return null;\n    }\n    return astValue;\n  }\n\n  // only explicit null, not undefined, NaN\n  if (value === null) {\n    return { kind: Kind.NULL };\n  }\n\n  // undefined\n  if (value === undefined) {\n    return null;\n  }\n\n  // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but\n  // the value is not an array, convert the value using the list's item type.\n  if (isListType(type)) {\n    const itemType = type.ofType;\n    if (isIterableObject(value)) {\n      const valuesNodes = [];\n      for (const item of value) {\n        const itemNode = astFromValue(item, itemType);\n        if (itemNode != null) {\n          valuesNodes.push(itemNode);\n        }\n      }\n      return { kind: Kind.LIST, values: valuesNodes };\n    }\n    return astFromValue(value, itemType);\n  }\n\n  // Populate the fields of the input object by creating ASTs from each value\n  // in the JavaScript object according to the fields in the input type.\n  if (isInputObjectType(type)) {\n    if (!isObjectLike(value)) {\n      return null;\n    }\n    const fieldNodes: Array<ConstObjectFieldNode> = [];\n    for (const field of Object.values(type.getFields())) {\n      const fieldValue = astFromValue(value[field.name], field.type);\n      if (fieldValue) {\n        fieldNodes.push({\n          kind: Kind.OBJECT_FIELD,\n          name: { kind: Kind.NAME, value: field.name },\n          value: fieldValue,\n        });\n      }\n    }\n    return { kind: Kind.OBJECT, fields: fieldNodes };\n  }\n\n  if (isLeafType(type)) {\n    // Since value is an internally represented value, it must be coerced\n    // to an externally represented value before converting into an AST.\n    const coerced = type.coerceOutputValue(value);\n    if (coerced == null) {\n      return null;\n    }\n\n    // Others coerce based on their corresponding JavaScript scalar types.\n    if (typeof coerced === 'boolean') {\n      return { kind: Kind.BOOLEAN, value: coerced };\n    }\n\n    // JavaScript numbers can be Int or Float values.\n    if (typeof coerced === 'number' && Number.isFinite(coerced)) {\n      const stringNum = String(coerced);\n      return integerStringRegExp.test(stringNum)\n        ? { kind: Kind.INT, value: stringNum }\n        : { kind: Kind.FLOAT, value: stringNum };\n    }\n\n    if (typeof coerced === 'bigint') {\n      return { kind: Kind.INT, value: String(coerced) };\n    }\n\n    if (typeof coerced === 'string') {\n      // Enum types use Enum literals.\n      if (isEnumType(type)) {\n        return { kind: Kind.ENUM, value: coerced };\n      }\n\n      // ID types can use Int literals.\n      if (type === GraphQLID && integerStringRegExp.test(coerced)) {\n        return { kind: Kind.INT, value: coerced };\n      }\n\n      return {\n        kind: Kind.STRING,\n        value: coerced,\n      };\n    }\n\n    throw new TypeError(`Cannot convert value to AST: ${inspect(coerced)}.`);\n    /* node:coverage ignore next 4 */\n  }\n  // Not reachable, all possible types have been considered.\n  invariant(false, 'Unexpected input type: ' + inspect(type));\n}\n\n/**\n * IntValue:\n *   - NegativeSign? 0\n *   - NegativeSign? NonZeroDigit ( Digit+ )?\n *\n * @internal\n */\nconst integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/;\n"]}