{"version":3,"file":"valueToLiteral.js","sourceRoot":"","sources":["../../src/utilities/valueToLiteral.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Values */\n\nimport { inspect } from '../jsutils/inspect.ts';\nimport { isIterableObject } from '../jsutils/isIterableObject.ts';\nimport { isObjectLike } from '../jsutils/isObjectLike.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  assertLeafType,\n  isInputObjectType,\n  isListType,\n  isNonNullType,\n  isRequiredInputField,\n} from '../type/definition.ts';\n\n/**\n * Produces a GraphQL Value AST given a JavaScript value and a GraphQL type.\n *\n * Scalar types are converted by calling the `valueToLiteral` method on that\n * type, otherwise the default scalar `valueToLiteral` method is used, defined\n * below.\n *\n * Provided value is a non-coerced \"input\" value. This function does not\n * perform any coercion, however it does perform validation. Provided values\n * which are invalid for the given type will result in an `undefined` return\n * value.\n * @param value - JavaScript value to convert.\n * @param type - GraphQL input type to convert the value against.\n * @returns A GraphQL value AST, or undefined if the value is invalid.\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 { valueToLiteral } 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 literal = valueToLiteral({ stars: 5, tags: ['featured'] }, ReviewInput);\n *\n * print(literal); // => '{ stars: 5, tags: [\"featured\"] }'\n * valueToLiteral({ tags: ['missing stars'] }, ReviewInput); // => undefined\n * ```\n */\nexport function valueToLiteral(\n  value: unknown,\n  type: GraphQLInputType,\n): ConstValueNode | undefined {\n  if (isNonNullType(type)) {\n    if (value == null) {\n      return; // Invalid: intentionally return no value.\n    }\n    return valueToLiteral(value, type.ofType);\n  }\n\n  // Like JSON, a null literal is produced for both null and undefined.\n  if (value == null) {\n    return { kind: Kind.NULL };\n  }\n\n  if (isListType(type)) {\n    if (!isIterableObject(value)) {\n      return valueToLiteral(value, type.ofType);\n    }\n    const values: Array<ConstValueNode> = [];\n    for (const itemValue of value) {\n      const itemNode = valueToLiteral(itemValue, type.ofType);\n      if (!itemNode) {\n        return; // Invalid: intentionally return no value.\n      }\n      values.push(itemNode);\n    }\n    return { kind: Kind.LIST, values };\n  }\n\n  if (isInputObjectType(type)) {\n    if (!isObjectLike(value)) {\n      return; // Invalid: intentionally return no value.\n    }\n    const fields: Array<ConstObjectFieldNode> = [];\n    const fieldDefs = type.getFields();\n    const hasUndefinedField = Object.keys(value).some(\n      (name) => value[name] !== undefined && !Object.hasOwn(fieldDefs, name),\n    );\n    if (hasUndefinedField) {\n      return; // Invalid: intentionally return no value.\n    }\n    for (const field of Object.values(type.getFields())) {\n      const fieldValue = value[field.name];\n      if (fieldValue === undefined) {\n        if (isRequiredInputField(field)) {\n          return; // Invalid: intentionally return no value.\n        }\n      } else {\n        const fieldNode = valueToLiteral(value[field.name], field.type);\n        if (!fieldNode) {\n          return; // Invalid: intentionally return no value.\n        }\n        fields.push({\n          kind: Kind.OBJECT_FIELD,\n          name: { kind: Kind.NAME, value: field.name },\n          value: fieldNode,\n        });\n      }\n    }\n    return { kind: Kind.OBJECT, fields };\n  }\n\n  const leafType = assertLeafType(type);\n\n  if (leafType.valueToLiteral) {\n    try {\n      return leafType.valueToLiteral(value);\n    } catch (_error) {\n      return; // Invalid: intentionally ignore error and return no value.\n    }\n  }\n\n  return defaultScalarValueToLiteral(value);\n}\n\n/**\n * The default implementation to convert scalar values to literals.\n *\n * | JavaScript Value  | GraphQL Value        |\n * | ----------------- | -------------------- |\n * | Object            | Input Object         |\n * | Array             | List                 |\n * | Boolean           | Boolean              |\n * | String            | String               |\n * | Number            | Int / Float          |\n * | BigInt            | Int                  |\n * | null / undefined  | Null                 |\n *\n * @internal\n */\nexport function defaultScalarValueToLiteral(value: unknown): ConstValueNode {\n  // Like JSON, a null literal is produced for both null and undefined.\n  if (value == null) {\n    return { kind: Kind.NULL };\n  }\n\n  // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n  switch (typeof value) {\n    case 'boolean':\n      return { kind: Kind.BOOLEAN, value };\n    case 'string':\n      return { kind: Kind.STRING, value, block: false };\n    case 'bigint':\n      return { kind: Kind.INT, value: value.toString() };\n    case 'number': {\n      if (!Number.isFinite(value)) {\n        // Like JSON, a null literal is produced for non-finite values.\n        return { kind: Kind.NULL };\n      }\n      const stringValue = String(value);\n      // Will parse as an IntValue.\n      return /^-?(?:0|[1-9][0-9]*)$/.test(stringValue)\n        ? { kind: Kind.INT, value: stringValue }\n        : { kind: Kind.FLOAT, value: stringValue };\n    }\n    case 'object': {\n      if (isIterableObject(value)) {\n        return {\n          kind: Kind.LIST,\n          values: Array.from(value, defaultScalarValueToLiteral),\n        };\n      }\n      const objValue = value as { [prop: string]: unknown };\n      const fields: Array<ConstObjectFieldNode> = [];\n      for (const fieldName of Object.keys(objValue)) {\n        const fieldValue = objValue[fieldName];\n        // Like JSON, undefined fields are not included in the literal result.\n        if (fieldValue !== undefined) {\n          fields.push({\n            kind: Kind.OBJECT_FIELD,\n            name: { kind: Kind.NAME, value: fieldName },\n            value: defaultScalarValueToLiteral(fieldValue),\n          });\n        }\n      }\n      return { kind: Kind.OBJECT, fields };\n    }\n  }\n\n  throw new TypeError(`Cannot convert value to AST: ${inspect(value)}.`);\n}\n"]}