docs: public static Value astFromValue(Object value, GraphQLType type) {
          if (value == null) {
              return null;
          }
  
          if (isNonNull(type)) {
              return handleNonNull(value, (GraphQLNonNull) type);
          }
  
          // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but
          // the value is not an array, convert the value using the list's item type.
          if (isList(type)) {
              return handleList(value, (GraphQLList) type);
          }
  
          // Populate the fields of the input object by creating ASTs from each value
          // in the JavaScript object according to the fields in the input type.
          if (type instanceof GraphQLInputObjectType) {
              return handleInputObject(value, (GraphQLInputObjectType) type);
          }
  
          if (!(type instanceof GraphQLScalarType || type instanceof GraphQLEnumType)) {
              throw new AssertException("Must provide Input Type, cannot use: " + type.getClass());
          }
  
          // Since value is an internally represented value, it must be serialized
          // to an externally represented value before converting into an AST.
          final Object serialized = serialize(type, value);
          if (isNullish(serialized)) {
              return null;
          }
  
          // Others serialize based on their corresponding JavaScript scalar types.
          if (serialized instanceof Boolean) {
              return BooleanValue.newBooleanValue().value((Boolean) serialized).build();
          }
  
          String stringValue = serialized.toString();
          // numbers can be Int or Float values.
          if (serialized instanceof Number) {
              return handleNumber(stringValue);
          }
  
          if (serialized instanceof String) {
              // Enum types use Enum literals.
              if (type instanceof GraphQLEnumType) {
                  return EnumValue.newEnumValue().name(stringValue).build();
              }
  
              // ID types can use Int literals.
              if (type == Scalars.GraphQLID && stringValue.matches("^[0-9]+$")) {
                  return IntValue.newIntValue().value(new BigInteger(stringValue)).build();
              }
  
              // String types are just strings but JSON'ised
              return StringValue.newStringValue().value(jsonStringify(stringValue)).build();
          }
  
          throw new AssertException("'Cannot convert value to AST: " + serialized);
      }