type Fruit implements Node {
  """The Globally Unique ID of this object"""
  id: ID!
  name: String!
  color: String!
}

"""A connection to a list of items."""
type FruitConnection {
  """Pagination data for this connection"""
  pageInfo: PageInfo!

  """Contains the nodes in this connection"""
  edges: [FruitEdge!]!

  """Total quantity of existing nodes."""
  totalCount: Int
}

"""An edge in a connection."""
type FruitEdge {
  """A cursor for use in pagination"""
  cursor: String!

  """The item at the end of the edge"""
  node: Fruit!
}

input FruitFilter {
  name: StrFilterLookup
  color: StrFilterLookup
  AND: FruitFilter
  OR: FruitFilter
  NOT: FruitFilter
  DISTINCT: Boolean
}

input FruitOrder {
  name: Ordering
  color: Ordering
}

"""An object with a Globally Unique ID"""
interface Node {
  """The Globally Unique ID of this object"""
  id: ID!
}

enum Ordering {
  ASC
  ASC_NULLS_FIRST
  ASC_NULLS_LAST
  DESC
  DESC_NULLS_FIRST
  DESC_NULLS_LAST
}

"""Information to aid in pagination."""
type PageInfo {
  """When paginating forwards, are there more items?"""
  hasNextPage: Boolean!

  """When paginating backwards, are there more items?"""
  hasPreviousPage: Boolean!

  """When paginating backwards, the cursor to continue."""
  startCursor: String

  """When paginating forwards, the cursor to continue."""
  endCursor: String
}

type Query {
  node(
    """The ID of the object."""
    id: ID!
  ): Node!
  nodeWithAsyncPermissions(
    """The ID of the object."""
    id: ID!
  ): Node!
  nodes(
    """The IDs of the objects."""
    ids: [ID!]!
  ): [Node!]!
  nodeOptional(
    """The ID of the object."""
    id: ID!
  ): Node
  nodesOptional(
    """The IDs of the objects."""
    ids: [ID!]!
  ): [Node]!
  fruits(
    """Returns the items in the list that come before the specified cursor."""
    before: String = null

    """Returns the items in the list that come after the specified cursor."""
    after: String = null

    """Returns the first n items from the list."""
    first: Int = null

    """Returns the items in the list that come after the specified cursor."""
    last: Int = null
  ): FruitConnection!
  fruitsLazy(
    """Returns the items in the list that come before the specified cursor."""
    before: String = null

    """Returns the items in the list that come after the specified cursor."""
    after: String = null

    """Returns the first n items from the list."""
    first: Int = null

    """Returns the items in the list that come after the specified cursor."""
    last: Int = null
  ): FruitConnection!
  fruitsWithFiltersAndOrder(
    filters: FruitFilter
    order: FruitOrder

    """Returns the items in the list that come before the specified cursor."""
    before: String = null

    """Returns the items in the list that come after the specified cursor."""
    after: String = null

    """Returns the first n items from the list."""
    first: Int = null

    """Returns the items in the list that come after the specified cursor."""
    last: Int = null
  ): FruitConnection!
  fruitsCustomResolver(
    """Returns the items in the list that come before the specified cursor."""
    before: String = null

    """Returns the items in the list that come after the specified cursor."""
    after: String = null

    """Returns the first n items from the list."""
    first: Int = null

    """Returns the items in the list that come after the specified cursor."""
    last: Int = null
  ): FruitConnection!
  fruitsCustomResolverWithFiltersAndOrder(
    filters: FruitFilter
    order: FruitOrder

    """Returns the items in the list that come before the specified cursor."""
    before: String = null

    """Returns the items in the list that come after the specified cursor."""
    after: String = null

    """Returns the first n items from the list."""
    first: Int = null

    """Returns the items in the list that come after the specified cursor."""
    last: Int = null
  ): FruitConnection!
}

input StrFilterLookup {
  """Exact match. Filter will be skipped on `null` value"""
  exact: String

  """Assignment test. Filter will be skipped on `null` value"""
  isNull: Boolean

  """
  Exact match of items in a given list. Filter will be skipped on `null` value
  """
  inList: [String!]

  """Case-insensitive exact match. Filter will be skipped on `null` value"""
  iExact: String

  """
  Case-sensitive containment test. Filter will be skipped on `null` value
  """
  contains: String

  """
  Case-insensitive containment test. Filter will be skipped on `null` value
  """
  iContains: String

  """Case-sensitive starts-with. Filter will be skipped on `null` value"""
  startsWith: String

  """Case-insensitive starts-with. Filter will be skipped on `null` value"""
  iStartsWith: String

  """Case-sensitive ends-with. Filter will be skipped on `null` value"""
  endsWith: String

  """Case-insensitive ends-with. Filter will be skipped on `null` value"""
  iEndsWith: String

  """
  Case-sensitive regular expression match. Filter will be skipped on `null` value
  """
  regex: String

  """
  Case-insensitive regular expression match. Filter will be skipped on `null` value
  """
  iRegex: String
}