"""
Directs the executor to include this field or fragment only when the user is not logged in.
"""
directive @includeIfLoggedIn on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

"""
Directs the executor to skip this field or fragment when the user is not logged in.
"""
directive @skipIfLoggedIn on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

interface Node {
  """The ID of the object"""
  id: ID!
}

type PublicKey implements Node {
  """The ID of the object"""
  id: ID!
  owner: User!
  keyId: String!
  key: String!
  revokedAt: DateTime
  uploadedAt: DateTime!
  verifyingSignature: Signature
  revoked: Boolean!
}

type User implements Node & PackageOwner & Owner {
  firstName: String!
  lastName: String!
  email: String!
  dateJoined: DateTime!

  """Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."""
  username: String!
  registerIntent: String
  isEmailValidated: Boolean!
  bio: String
  location: String
  websiteUrl: String
  wasmerInternal: Boolean!

  """The ID of the object"""
  id: ID!
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
  avatar(size: Int = 80): String!
  isViewer: Boolean!
  hasUsablePassword: Boolean
  fullName: String!
  githubUrl: String
  twitterUrl: String
  companyRole: String
  companyDescription: String
  publicActivity(offset: Int, before: String, after: String, first: Int, last: Int): ActivityEventConnection!
  billing: Billing
  waitlist(name: String!): WaitlistMember
  namespaces(role: GrapheneRole, offset: Int, before: String, after: String, first: Int, last: Int): NamespaceConnection!
  packages(collaborating: Boolean = false, offset: Int, before: String, after: String, first: Int, last: Int): PackageConnection!
  apps(collaborating: Boolean = false, sortBy: DeployAppsSortBy, offset: Int, before: String, after: String, first: Int, last: Int): DeployAppConnection!
  usageMetrics(forRange: MetricRange!, variant: MetricType!): [UsageMetric]!
  domains(offset: Int, before: String, after: String, first: Int, last: Int): DNSDomainConnection!
  isStaff: Boolean
  packageVersions(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
  packageTransfersIncoming(offset: Int, before: String, after: String, first: Int, last: Int): PackageTransferRequestConnection!
  packageInvitesIncoming(offset: Int, before: String, after: String, first: Int, last: Int): PackageCollaboratorInviteConnection!
  namespaceInvitesIncoming(offset: Int, before: String, after: String, first: Int, last: Int): NamespaceCollaboratorInviteConnection!
  apiTokens(before: String, after: String, first: Int, last: Int): APITokenConnection!
  notifications(before: String, after: String, first: Int, last: Int): UserNotificationConnection!
  dashboardActivity(offset: Int, before: String, after: String, first: Int, last: Int): ActivityEventConnection!
  loginMethods: [LoginMethod!]!
  githubUser: SocialAuth
  githubScopes: [String]!
  githubRepositories: [GithubRepository]!
}

"""Setup for backwards compatibility with existing frontends."""
interface PackageOwner {
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
}

enum OwnerAction {
  DEPLOY_APP
  PUBLISH_PACKAGE
}

"""An owner of a package."""
interface Owner {
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
}

"""
The `DateTime` scalar type represents a DateTime
value as specified by
[iso8601](https://en.wikipedia.org/wiki/ISO_8601).
"""
scalar DateTime

type ActivityEventConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""
The Relay compliant `PageInfo` type, containing data necessary to paginate this connection.
"""
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
}

"""A Relay edge containing a `ActivityEvent` and its cursor."""
type ActivityEventEdge {
  """The item at the end of the edge"""
  node: ActivityEvent

  """A cursor for use in pagination"""
  cursor: String!
}

type ActivityEvent implements Node {
  """The ID of the object"""
  id: ID!
  body: EventBody!
  actorIcon: String!
  createdAt: DateTime!
}

type EventBody {
  text: String!
  ranges: [NodeBodyRange!]!
}

type NodeBodyRange {
  entity: Node!
  offset: Int!
  length: Int!
}

type WaitlistMember implements Node {
  waitlist: Waitlist!
  joinedAt: DateTime!
  approvedAt: DateTime

  """The ID of the object"""
  id: ID!
  member: Owner!
  approved: Boolean!
}

type Waitlist implements Node {
  name: String!
  createdAt: DateTime!
  updatedAt: DateTime!

  """The ID of the object"""
  id: ID!
}

type NamespaceConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `Namespace` and its cursor."""
type NamespaceEdge {
  """The item at the end of the edge"""
  node: Namespace

  """A cursor for use in pagination"""
  cursor: String!
}

type Namespace implements Node & PackageOwner & Owner {
  """The ID of the object"""
  id: ID!
  name: String!
  displayName: String
  description: String!
  avatarUpdatedAt: DateTime
  twitterHandle: String
  githubHandle: String
  websiteUrl: String
  createdAt: DateTime!
  updatedAt: DateTime!
  wasmerInternal: Boolean!
  maintainerInvites(offset: Int, before: String, after: String, first: Int, last: Int): NamespaceCollaboratorInviteConnection!
  userSet(offset: Int, before: String, after: String, first: Int, last: Int): UserConnection!
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
  avatar: String!
  packages(offset: Int, before: String, after: String, first: Int, last: Int): PackageConnection!
  apps(sortBy: DeployAppsSortBy, offset: Int, before: String, after: String, first: Int, last: Int): DeployAppConnection!
  packageVersions(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
  collaborators(offset: Int, before: String, after: String, first: Int, last: Int): NamespaceCollaboratorConnection!
  publicActivity(before: String, after: String, first: Int, last: Int): ActivityEventConnection!
  pendingInvites(offset: Int, before: String, after: String, first: Int, last: Int): NamespaceCollaboratorInviteConnection!
  viewerHasRole(role: GrapheneRole!): Boolean!
  viewerAsCollaborator(role: GrapheneRole): NamespaceCollaborator

  """Whether the current user is invited to the namespace"""
  viewerIsInvited: Boolean!

  """The invitation for the current user to the namespace"""
  viewerInvitation: NamespaceCollaboratorInvite
  packageTransfersIncoming(offset: Int, before: String, after: String, first: Int, last: Int): PackageTransferRequestConnection!
  usageMetrics(forRange: MetricRange!, variant: MetricType!): [UsageMetric]!
  domains(offset: Int, before: String, after: String, first: Int, last: Int): DNSDomainConnection!
}

type NamespaceCollaboratorInviteConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""
A Relay edge containing a `NamespaceCollaboratorInvite` and its cursor.
"""
type NamespaceCollaboratorInviteEdge {
  """The item at the end of the edge"""
  node: NamespaceCollaboratorInvite

  """A cursor for use in pagination"""
  cursor: String!
}

type NamespaceCollaboratorInvite implements Node {
  """The ID of the object"""
  id: ID!
  requestedBy: User!
  user: User
  inviteEmail: String
  namespace: Namespace!
  role: RegistryNamespaceMaintainerInviteRoleChoices!
  accepted: NamespaceCollaborator
  approvedBy: User
  declinedBy: User
  createdAt: DateTime!
  expiresAt: DateTime!
  closedAt: DateTime
}

enum RegistryNamespaceMaintainerInviteRoleChoices {
  """Owner"""
  OWNER

  """Admin"""
  ADMIN

  """Editor"""
  EDITOR

  """Viewer"""
  VIEWER
}

type NamespaceCollaborator implements Node {
  """The ID of the object"""
  id: ID!
  user: User!
  role: RegistryNamespaceMaintainerRoleChoices!
  namespace: Namespace!
  createdAt: DateTime!
  updatedAt: DateTime!
  invite: NamespaceCollaboratorInvite
}

enum RegistryNamespaceMaintainerRoleChoices {
  """Owner"""
  OWNER

  """Admin"""
  ADMIN

  """Editor"""
  EDITOR

  """Viewer"""
  VIEWER
}

type UserConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `User` and its cursor."""
type UserEdge {
  """The item at the end of the edge"""
  node: User

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `Package` and its cursor."""
type PackageEdge {
  """The item at the end of the edge"""
  node: Package

  """A cursor for use in pagination"""
  cursor: String!
}

type Package implements Likeable & Node & PackageOwner {
  """The ID of the object"""
  id: ID!
  name: String!
  namespace: String!
  private: Boolean!
  createdAt: DateTime!
  updatedAt: DateTime!
  maintainers: [User]! @deprecated(reason: "Please use collaborators instead")
  curated: Boolean!
  ownerObjectId: Int!
  lastVersion: PackageVersion

  """The app icon. It should be formatted in the same way as Apple icons"""
  icon: String!
  totalDownloads: Int!
  iconUpdatedAt: DateTime
  likersCount: Int!
  watchersCount: Int!
  webcs(offset: Int, before: String, after: String, first: Int, last: Int): WebcImageConnection!

  """List of app templates for this package"""
  appTemplates(offset: Int, before: String, after: String, first: Int, last: Int): AppTemplateConnection!
  packagewebcSet(offset: Int, before: String, after: String, first: Int, last: Int): PackageWebcConnection!
  versions: [PackageVersion]
  collectionSet: [Collection!]!
  categories(offset: Int, before: String, after: String, first: Int, last: Int): CategoryConnection!
  keywords(offset: Int, before: String, after: String, first: Int, last: Int): PackageKeywordConnection!
  viewerHasLiked: Boolean!
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
  alias: String
  displayName: String!

  """The name of the package without the owner"""
  packageName: String!

  """The app icon. It should be formatted in the same way as Apple icons"""
  appIcon: String! @deprecated(reason: "Please use icon instead")

  """The total number of downloads of the package"""
  downloadsCount: Int

  """The public keys for all the published versions"""
  publicKeys: [PublicKey!]!
  collaborators(offset: Int, before: String, after: String, first: Int, last: Int): PackageCollaboratorConnection!
  pendingInvites(offset: Int, before: String, after: String, first: Int, last: Int): PackageCollaboratorInviteConnection!
  viewerHasRole(role: GrapheneRole!): Boolean!
  viewerAsCollaborator(role: GrapheneRole): PackageCollaborator
  owner: PackageOwner!
  isTransferring: Boolean!
  activeTransferRequest: PackageTransferRequest
  isArchived: Boolean!
  viewerIsWatching: Boolean!
  showDeployButton: Boolean!
  similarPackageVersions(before: String, after: String, first: Int, last: Int): PackageSearchConnection!

  """Whether the current user is invited to the package"""
  viewerIsInvited: Boolean!

  """The invitation for the current user to the package"""
  viewerInvitation: PackageCollaboratorInvite
}

interface Likeable {
  id: ID!
  likersCount: Int!
  viewerHasLiked: Boolean!
}

type PackageVersion implements Node & PackageReleaseInterface & PackageInstance {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  package: Package!
  webc: WebcImage
  webcV3: WebcImage

  """List of direct dependencies of this package version"""
  dependencies(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
  publishedBy: User!
  tag: String!
  clientName: String
  webcGenerationErrors: String
  version: String!
  description: String!
  manifest: String!
  license: String
  licenseFile: String
  readme: String
  witMd: String
  repository: String
  homepage: String
  staticObjectsCompiled: Boolean!
  nativeExecutablesCompiled: Boolean!
  signature: Signature
  isArchived: Boolean!
  file: String!

  """"""
  fileSize: BigInt!
  totalDownloads: Int!
  bindingsState: RegistryPackageVersionBindingsStateChoices!
  nativeExecutablesState: RegistryPackageVersionNativeExecutablesStateChoices!
  packagewebcSet(offset: Int, before: String, after: String, first: Int, last: Int): PackageWebcConnection!
  lastversionPackage(offset: Int, before: String, after: String, first: Int, last: Int): PackageConnection!
  commands: [Command!]!
  nativeexecutableSet(offset: Int, before: String, after: String, first: Int, last: Int): NativeExecutableConnection!
  bindingsgeneratorSet(offset: Int, before: String, after: String, first: Int, last: Int): BindingsGeneratorConnection!
  javascriptlanguagebindingSet(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionNPMBindingConnection!
  pythonlanguagebindingSet(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionPythonBindingConnection!
  deployappversionSet(offset: Int, before: String, after: String, first: Int, last: Int): DeployAppVersionConnection!
  piritaManifest: JSONString
  piritaOffsets: JSONString
  piritaVolumes: JSONString
  piritaFile: String @deprecated(reason: "Please use distribution.piritaDownloadUrl instead.")
  piritaFileSize: Int @deprecated(reason: "Please use distribution.piritaSize instead.")
  pirita256hash: String @deprecated(reason: "Please use distribution.piritaSha256Hash instead.")
  distribution(version: WebcVersion): PackageDistribution!
  filesystem: [PackageVersionFilesystem]!
  isLastVersion: Boolean!
  witFile: String
  isSigned: Boolean!
  moduleInterfaces: [InterfaceVersion!]!
  modules: [PackageVersionModule!]!
  getPiritaContents(volume: String! = "atom", base: String! = ""): [PiritaFilesystemItem!]!
  getWebcContents(volume: String! = "atom", base: String! = "/"): [WEBCFilesystemItem!]!
  nativeExecutables(triple: String, wasmerCompilerVersion: String): [NativeExecutable]
  bindings: [PackageVersionLanguageBinding]!
  npmBindings: PackageVersionNPMBinding
  pythonBindings: PackageVersionPythonBinding
  bindingsSet(before: String, after: String, first: Int, last: Int): PackageVersionBindingConnection
  hasBindings: Boolean!
  hasCommands: Boolean!
  showDeployButton: Boolean!
  isCorrupt: Boolean!
}

interface PackageReleaseInterface {
  piritaManifest: JSONString
  piritaOffsets: JSONString
  piritaVolumes: JSONString
  isArchived: Boolean!
  clientName: String
  publishedBy: User!
  createdAt: DateTime!
  updatedAt: DateTime!
  package: Package!
  webc: WebcImage
  webcV3: WebcImage
  tag: String!
}

"""
Allows use of a JSON String for input / output from the GraphQL schema.

Use of this type is *not recommended* as you lose the benefits of having a defined, static
schema (one of the key benefits of GraphQL).
"""
scalar JSONString

type WebcImage implements Node {
  """The ID of the object"""
  id: ID!

  """The version of the webc image, defaults to v2."""
  version: WebcVersion!

  """"""
  fileSize: BigInt!
  manifest: JSONString!
  volumes: JSONString!
  offsets: JSONString!
  webcSha256: String!
  targzSha256: String
  createdAt: DateTime!
  updatedAt: DateTime!
  webcUrl: String!
}

enum WebcVersion {
  V2
  V3
}

"""
The `BigInt` scalar type represents non-fractional whole numeric values.
`BigInt` is not constrained to 32-bit like the `Int` type and thus is a less
compatible type.
"""
scalar BigInt

type PackageVersionConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageVersion` and its cursor."""
type PackageVersionEdge {
  """The item at the end of the edge"""
  node: PackageVersion

  """A cursor for use in pagination"""
  cursor: String!
}

enum RegistryPackageVersionBindingsStateChoices {
  """Bindings are not detected"""
  NOT_PRESENT

  """Bindings are being built"""
  GENERATING

  """Bindings generation has failed"""
  ERROR

  """Bindings are built and present"""
  GENERATED_AND_PRESENT
}

enum RegistryPackageVersionNativeExecutablesStateChoices {
  """Native Executables are not detected"""
  NOT_PRESENT

  """Native Executables are being built"""
  GENERATING

  """Native Executables generation has failed"""
  ERROR

  """Native Executables are built and present"""
  GENERATED_AND_PRESENT
}

type PackageWebcConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageWebc` and its cursor."""
type PackageWebcEdge {
  """The item at the end of the edge"""
  node: PackageWebc

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageWebc implements Node & PackageReleaseInterface & PackageInstance {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  package: Package!
  webc: WebcImage
  piritaManifest: JSONString
  piritaOffsets: JSONString
  piritaVolumes: JSONString
  isArchived: Boolean!
  clientName: String
  publishedBy: User!
  webcV3: WebcImage
  tag: String!
  webcUrl: String!
}

type Command {
  command: String!
  packageVersion: PackageVersion!
  module: PackageVersionModule!
}

type PackageVersionModule {
  name: String!
  source: String!
  abi: String
  publicUrl: String!
  atom: PiritaFilesystemFile!
  rangeHeader: String!
}

type PiritaFilesystemFile {
  name(display: PiritaFilesystemNameDisplay): String!
  size: Int!
  offset: Int!
}

enum PiritaFilesystemNameDisplay {
  RELATIVE
  ABSOLUTE
}

type NativeExecutableConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `NativeExecutable` and its cursor."""
type NativeExecutableEdge {
  """The item at the end of the edge"""
  node: NativeExecutable

  """A cursor for use in pagination"""
  cursor: String!
}

type NativeExecutable implements Node {
  """The ID of the object"""
  id: ID!
  module: String! @deprecated(reason: "Use filename instead")
  filename: String!
  filesize: Int!
  targetTriple: String!
  downloadUrl: String!
}

type BindingsGeneratorConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `BindingsGenerator` and its cursor."""
type BindingsGeneratorEdge {
  """The item at the end of the edge"""
  node: BindingsGenerator

  """A cursor for use in pagination"""
  cursor: String!
}

type BindingsGenerator implements Node {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  packageVersion: PackageVersion!
  active: Boolean!
  commandName: String!
  registryJavascriptlanguagebindings(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionNPMBindingConnection!
  registryPythonlanguagebindings(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionPythonBindingConnection!
}

type PackageVersionNPMBindingConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageVersionNPMBinding` and its cursor."""
type PackageVersionNPMBindingEdge {
  """The item at the end of the edge"""
  node: PackageVersionNPMBinding

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageVersionNPMBinding implements PackageVersionLanguageBinding & Node {
  """The ID of the object"""
  id: ID!
  language: ProgrammingLanguage!

  """The URL of the generated artifacts on Wasmer CDN."""
  url: String!

  """When the binding was generated"""
  createdAt: DateTime!

  """Package version used to generate this binding"""
  generator: BindingsGenerator!
  name: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
  kind: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")

  """Name of package source"""
  packageName: String!

  """Name of the package to import"""
  importablePackageName: String!

  """Code snippet example to use the package"""
  codeSnippetExample: String!
  module: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
  npmDefaultInstallPackageName(url: String): String! @deprecated(reason: "Please use packageName instead")
}

interface PackageVersionLanguageBinding {
  id: ID!
  language: ProgrammingLanguage!

  """The URL of the generated artifacts on Wasmer CDN."""
  url: String!

  """When the binding was generated"""
  createdAt: DateTime!

  """Package version used to generate this binding"""
  generator: BindingsGenerator!
  name: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
  kind: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")

  """Name of package source"""
  packageName: String!

  """Name of the package to import"""
  importablePackageName: String!

  """Code snippet example to use the package"""
  codeSnippetExample: String!
  module: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
}

enum ProgrammingLanguage {
  PYTHON
  JAVASCRIPT
}

type PackageVersionPythonBindingConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""
A Relay edge containing a `PackageVersionPythonBinding` and its cursor.
"""
type PackageVersionPythonBindingEdge {
  """The item at the end of the edge"""
  node: PackageVersionPythonBinding

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageVersionPythonBinding implements PackageVersionLanguageBinding & Node {
  """The ID of the object"""
  id: ID!
  language: ProgrammingLanguage!

  """The URL of the generated artifacts on Wasmer CDN."""
  url: String!

  """When the binding was generated"""
  createdAt: DateTime!

  """Package version used to generate this binding"""
  generator: BindingsGenerator!
  name: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
  kind: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")

  """Name of package source"""
  packageName: String!

  """Name of the package to import"""
  importablePackageName: String!

  """Code snippet example to use the package"""
  codeSnippetExample: String!
  module: String! @deprecated(reason: "Do not use this field, since bindings for all modules are generated at once now.")
  pythonDefaultInstallPackageName(url: String): String!
}

type DeployAppVersionConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `DeployAppVersion` and its cursor."""
type DeployAppVersionEdge {
  """The item at the end of the edge"""
  node: DeployAppVersion

  """A cursor for use in pagination"""
  cursor: String!
}

type DeployAppVersion implements Node {
  """The ID of the object"""
  id: ID!
  app: DeployApp!
  yamlConfig: String!
  userYamlConfig: String!
  clientName: String!
  signature: String
  description: String
  publishedBy: User!
  disabledAt: DateTime
  disabledReason: String
  createdAt: DateTime!
  updatedAt: DateTime!
  configWebc: String @deprecated(reason: "webc support has been deprecated for apps")
  config: String! @deprecated(reason: "Please use jsonConfig instead")
  jsonConfig: String!
  url: String!
  permalink: String!
  urls: [String]!
  version: String!
  isActive: Boolean!
  manifest: String!
  logs(
    """
    Get logs starting from this timestamp. Takes EPOCH timestamp in seconds.
    """
    startingFrom: Float

    """Get logs starting from this timestamp. Takes ISO timestamp."""
    startingFromISO: DateTime

    """Fetch logs until this timestamp. Takes EPOCH timestamp in seconds."""
    until: Float

    """List of streams to fetch logs from. e.g. stdout, stderr."""
    streams: [LogStream]

    """List of instance ids to fetch logs from."""
    instanceIds: [String]

    """Filter for this request id in logs"""
    requestId: String
    before: String
    after: String
    first: Int
    last: Int
  ): LogConnection!
  usageMetrics(forRange: MetricRange!, variant: MetricType!): [UsageMetric]!
  sourcePackageVersion: PackageVersion
  sourcePackageRelease: PackageWebc
  sourcePackage: Package!
  aggregateMetrics: AggregateMetrics!
  volumes: [AppVersionVolume]
  gitSource: AutobuildRepository
  favicon: URL
  screenshot(viewportSize: AppScreenshotViewportSize, appearance: AppScreenshotAppearance): URL
}

type DeployApp implements Node & Owner {
  """The ID of the object"""
  id: ID!
  forceHttps: Boolean!
  createdBy: User!
  createdAt: DateTime!
  updatedAt: DateTime!
  activeVersion: DeployAppVersion
  globalName: String!
  globalId: ID!
  viewerCan(action: OwnerAction!): Boolean!
  url: String!
  adminUrl: String!
  permalink: String!
  urls: [String]!
  description: String
  name: String!
  owner: Owner!
  versions(sortBy: DeployAppVersionsSortBy, createdAfter: DateTime, offset: Int, before: String, after: String, first: Int, last: Int): DeployAppVersionConnection!
  aggregateMetrics: AggregateMetrics!
  aliases(offset: Int, before: String, after: String, first: Int, last: Int): AppAliasConnection!
  secrets(offset: Int, before: String, after: String, first: Int, last: Int): SecretConnection!
  databases(offset: Int, before: String, after: String, first: Int, last: Int): AppDatabaseConnection!
  usageMetrics(forRange: MetricRange!, variant: MetricType!): [UsageMetric]!
  s3Url: URL
  s3Credentials: S3Credentials
  deleted: Boolean!
  favicon: URL
  screenshot(viewportSize: AppScreenshotViewportSize, appearance: AppScreenshotAppearance): URL
  deployments(before: String, after: String, first: Int, last: Int): DeploymentConnection
}

enum DeployAppVersionsSortBy {
  NEWEST
  OLDEST
}

type AggregateMetrics {
  cpuTime: String!
  memoryTime: String!
  ingress: String!
  egress: String!
  noRequests: String!
  noFailedRequests: String!
  monthlyCost: String!
}

type AppAliasConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `AppAlias` and its cursor."""
type AppAliasEdge {
  """The item at the end of the edge"""
  node: AppAlias

  """A cursor for use in pagination"""
  cursor: String!
}

type AppAlias implements Node {
  name: String!
  app: DeployApp!
  isDefault: Boolean!
  hostname: String!
  text: String!
  kind: DeployAppAliasKindChoices!

  """The ID of the object"""
  id: ID!
  url: String!
}

enum DeployAppAliasKindChoices {
  """Deployment"""
  DEPLOYMENT

  """Domain"""
  DOMAIN
}

type SecretConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `Secret` and its cursor."""
type SecretEdge {
  """The item at the end of the edge"""
  node: Secret

  """A cursor for use in pagination"""
  cursor: String!
}

type Secret implements Node {
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String!

  """The ID of the object"""
  id: ID!
}

type AppDatabaseConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `AppDatabase` and its cursor."""
type AppDatabaseEdge {
  """The item at the end of the edge"""
  node: AppDatabase

  """A cursor for use in pagination"""
  cursor: String!
}

type AppDatabase implements Node {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  name: String!
  username: String!
  app: DeployApp!

  """The ID of the object"""
  id: ID!
  host: String!
}

type UsageMetric {
  variant: MetricType!
  value: Float!
  unit: MetricUnit!
  timestamp: DateTime!
}

enum MetricType {
  cpu_time
  memory_time
  network_egress
  network_ingress
  no_of_requests
  no_of_failed_requests
  cost
}

"""Units for metrics"""
enum MetricUnit {
  """represents the unit of "seconds"."""
  SEC

  """represents the unit of "milliseconds"."""
  MS

  """represents the unit of "kilobytes"."""
  KB

  """represents the unit of "kilobytes per second"."""
  KBS

  """represents the unit of "number of requests"."""
  NO_REQUESTS

  """represents the unit of "cost" in USD."""
  DOLLARS
}

enum MetricRange {
  LAST_24_HOURS
  LAST_30_DAYS
  LAST_1_HOUR
}

"""
The `URL` scalar type represents a URL as text, represented as UTF-8
character sequences.
"""
scalar URL

type S3Credentials {
  accessKey: String!
  secretKey: String!
  endpoint: String!
}

enum AppScreenshotViewportSize {
  MOBILE
  DESKTOP
}

enum AppScreenshotAppearance {
  LIGHT
  DARK
}

type DeploymentConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [DeploymentEdge]!
}

"""A Relay edge containing a `Deployment` and its cursor."""
type DeploymentEdge {
  """The item at the end of the edge"""
  node: Deployment

  """A cursor for use in pagination"""
  cursor: String!
}

union Deployment = NakedDeployment | AutobuildRepository

type NakedDeployment implements Node {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  appVersion: DeployAppVersion
}

type AutobuildRepository implements Node {
  """The ID of the object"""
  id: ID!
  user: User!
  name: String!
  namespace: String!
  createdAt: DateTime!
  updatedAt: DateTime!
  appName: String
  appVersion: DeployAppVersion
  buildId: UUID!
  buildCmd: String!
  installCmd: String!
  repoUrl: String!
  prevCommitHash: String!
  commitHash: String!
  commitMessage: String!
  commitAuthorUsername: String!
  status: StatusEnum!
  logUrl: String
}

"""
Leverages the internal Python implementation of UUID (uuid.UUID) to provide native UUID objects
in fields, resolvers and input.
"""
scalar UUID

enum StatusEnum {
  SUCCESS
  WORKING
  RUNNING
  FAILURE
  QUEUED
  TIMEOUT
  INTERNAL_ERROR
  CANCELLED
}

type LogConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [LogEdge]!
}

"""A Relay edge containing a `Log` and its cursor."""
type LogEdge {
  """The item at the end of the edge"""
  node: Log

  """A cursor for use in pagination"""
  cursor: String!
}

enum LogStream {
  STDOUT
  STDERR
  RUNTIME
}

type AppVersionVolume {
  id: ID!
  name: String!
  s3Url: String!
  mountPaths: [AppVersionVolumeMountPath]!
  size: BigInt
  usedSize: BigInt
}

type AppVersionVolumeMountPath {
  path: String!
  subpath: String
}

type PackageDistribution {
  """
  Download URL of the tar.gz file.
  If the package was published with webc only,this will contain download URL for webc file instead.
  """
  downloadUrl: String!
  expiresInSeconds: Int
  size: Int
  piritaDownloadUrl: String
  piritaExpiresInSeconds: Int
  piritaSize: Int
  piritaSha256Hash: String
  webcDownloadUrl: String
  webcExpiresInSeconds: Int
  webcSize: Int
  webcSha256Hash: String
  webcVersion: WebcVersion
  webcManifest: JSONString
}

type PackageVersionFilesystem {
  wasm: String!
  host: String!
}

type InterfaceVersion implements Node {
  """The ID of the object"""
  id: ID!
  interface: Interface!
  version: String!
  content: String!
  createdAt: DateTime!
  updatedAt: DateTime!
  publishedBy: User!
  packageVersions(offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
}

type Interface implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
  displayName: String!
  description: String!
  homepage: String
  icon: String
  createdAt: DateTime!
  updatedAt: DateTime!
  versions(offset: Int, before: String, after: String, first: Int, last: Int): InterfaceVersionConnection!
  lastVersion: InterfaceVersion
}

type InterfaceVersionConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `InterfaceVersion` and its cursor."""
type InterfaceVersionEdge {
  """The item at the end of the edge"""
  node: InterfaceVersion

  """A cursor for use in pagination"""
  cursor: String!
}

union PiritaFilesystemItem = PiritaFilesystemFile | PiritaFilesystemDir

type PiritaFilesystemDir {
  name(display: PiritaFilesystemNameDisplay): String!
}

type WEBCFilesystemItem {
  name: String!
  checksum: String!
  size: Int!
  offset: Int!
}

type PackageVersionBindingConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageVersionBinding` and its cursor."""
type PackageVersionBindingEdge {
  """The item at the end of the edge"""
  node: PackageVersionBinding

  """A cursor for use in pagination"""
  cursor: String!
}

union PackageVersionBinding = PackageVersionNPMBinding | PackageVersionPythonBinding

type WebcImageConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `WebcImage` and its cursor."""
type WebcImageEdge {
  """The item at the end of the edge"""
  node: WebcImage

  """A cursor for use in pagination"""
  cursor: String!
}

type AppTemplateConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `AppTemplate` and its cursor."""
type AppTemplateEdge {
  """The item at the end of the edge"""
  node: AppTemplate

  """A cursor for use in pagination"""
  cursor: String!
}

type AppTemplate implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
  slug: String!
  description: String!
  demoUrl: String!
  repoUrl: String!
  category: AppTemplateCategory!
  isPublic: Boolean!
  createdAt: DateTime!
  updatedAt: DateTime!
  readme: String!
  useCases: JSONString!
  repoLicense: String!
  usingPackage: Package
  defaultImage: String
  framework: String!
  templateFramework: TemplateFramework
  language: String!
  templateLanguage: TemplateLanguage
}

type AppTemplateCategory implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
  slug: String!
  description: String!
  createdAt: DateTime!
  updatedAt: DateTime!
  appTemplates(offset: Int, before: String, after: String, first: Int, last: Int): AppTemplateConnection!
}

type TemplateFramework implements Node {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String!
  slug: String!
}

type TemplateLanguage implements Node {
  """The ID of the object"""
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String!
  slug: String!
}

type Collection {
  slug: String!
  displayName: String!
  description: String!
  createdAt: DateTime!
  banner: String!
  packages(before: String, after: String, first: Int, last: Int): PackageConnection!
}

type CategoryConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `Category` and its cursor."""
type CategoryEdge {
  """The item at the end of the edge"""
  node: Category

  """A cursor for use in pagination"""
  cursor: String!
}

type Category implements Node {
  """The ID of the object"""
  id: ID!

  """A category is a label that can be attached to a package."""
  name: String!
  packages(offset: Int, before: String, after: String, first: Int, last: Int): PackageConnection
}

type PackageKeywordConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageKeyword` and its cursor."""
type PackageKeywordEdge {
  """The item at the end of the edge"""
  node: PackageKeyword

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageKeyword implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
}

type PackageCollaboratorConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageCollaborator` and its cursor."""
type PackageCollaboratorEdge {
  """The item at the end of the edge"""
  node: PackageCollaborator

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageCollaborator implements Node {
  """The ID of the object"""
  id: ID!
  user: User!
  role: RegistryPackageMaintainerRoleChoices!
  package: Package!
  createdAt: DateTime!
  updatedAt: DateTime!
  invite: PackageCollaboratorInvite
}

enum RegistryPackageMaintainerRoleChoices {
  """Owner"""
  OWNER

  """Admin"""
  ADMIN

  """Editor"""
  EDITOR

  """Viewer"""
  VIEWER
}

type PackageCollaboratorInvite implements Node {
  """The ID of the object"""
  id: ID!
  requestedBy: User!
  user: User
  inviteEmail: String
  package: Package!
  role: RegistryPackageMaintainerInviteRoleChoices!
  accepted: PackageCollaborator
  approvedBy: User
  declinedBy: User
  createdAt: DateTime!
  expiresAt: DateTime!
  closedAt: DateTime
}

enum RegistryPackageMaintainerInviteRoleChoices {
  """Owner"""
  OWNER

  """Admin"""
  ADMIN

  """Editor"""
  EDITOR

  """Viewer"""
  VIEWER
}

type PackageCollaboratorInviteConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageCollaboratorInvite` and its cursor."""
type PackageCollaboratorInviteEdge {
  """The item at the end of the edge"""
  node: PackageCollaboratorInvite

  """A cursor for use in pagination"""
  cursor: String!
}

enum GrapheneRole {
  OWNER
  ADMIN
  EDITOR
  VIEWER
}

type PackageTransferRequest implements Node {
  """The ID of the object"""
  id: ID!
  requestedBy: User!
  previousOwnerObjectId: Int!
  newOwnerObjectId: Int!
  package: Package!
  approvedBy: User
  declinedBy: User
  createdAt: DateTime!
  expiresAt: DateTime!
  closedAt: DateTime
  previousOwner: PackageOwner!
  newOwner: PackageOwner!
}

type PackageSearchConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [PackageSearchEdge]!
  totalCount: Int
}

"""A Relay edge containing a `PackageSearch` and its cursor."""
type PackageSearchEdge {
  """The item at the end of the edge"""
  node: PackageVersion

  """A cursor for use in pagination"""
  cursor: String!
}

type DeployAppConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `DeployApp` and its cursor."""
type DeployAppEdge {
  """The item at the end of the edge"""
  node: DeployApp

  """A cursor for use in pagination"""
  cursor: String!
}

enum DeployAppsSortBy {
  NEWEST
  OLDEST
  MOST_ACTIVE
}

type NamespaceCollaboratorConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `NamespaceCollaborator` and its cursor."""
type NamespaceCollaboratorEdge {
  """The item at the end of the edge"""
  node: NamespaceCollaborator

  """A cursor for use in pagination"""
  cursor: String!
}

type PackageTransferRequestConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `PackageTransferRequest` and its cursor."""
type PackageTransferRequestEdge {
  """The item at the end of the edge"""
  node: PackageTransferRequest

  """A cursor for use in pagination"""
  cursor: String!
}

type DNSDomainConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `DNSDomain` and its cursor."""
type DNSDomainEdge {
  """The item at the end of the edge"""
  node: DNSDomain

  """A cursor for use in pagination"""
  cursor: String!
}

type DNSDomain implements Node {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  name: String!

  """This zone will be accessible at /dns/{slug}/."""
  slug: String!
  zoneFile: String!

  """The ID of the object"""
  id: ID!
  records: [DNSRecord]
  owner: Owner!
}

union DNSRecord = ARecord | AAAARecord | CNAMERecord | TXTRecord | MXRecord | NSRecord | CAARecord | DNAMERecord | PTRRecord | SOARecord | SRVRecord | SSHFPRecord

type ARecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  address: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

interface DNSRecordInterface {
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
}

type AAAARecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  address: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type CNAMERecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime

  """This domain name will alias to this canonical name."""
  cName: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type TXTRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  data: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type MXRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  preference: Int!
  exchange: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type NSRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  nsdname: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type CAARecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  flags: Int!
  tag: DnsmanagerCertificationAuthorityAuthorizationRecordTagChoices!
  value: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

enum DnsmanagerCertificationAuthorityAuthorizationRecordTagChoices {
  """issue"""
  ISSUE

  """issue wildcard"""
  ISSUEWILD

  """Incident object description exchange format"""
  IODEF
}

type DNAMERecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime

  """
  This domain name will alias to the entire subtree of that delegation domain.
  """
  dName: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type PTRRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  ptrdname: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type SOARecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime

  """Primary master name server for this zone."""
  mname: String!

  """Email address of the administrator responsible for this zone."""
  rname: String!

  """
  A slave name server will initiate a zone transfer if this serial is incremented.
  """
  serial: BigInt!

  """
  Number of seconds after which secondary name servers should query the master to detect zone changes.
  """
  refresh: BigInt!

  """
  Number of seconds after which secondary name servers should retry to request the serial number from the master if the master does not respond.
  """
  retry: BigInt!

  """
  Number of seconds after which secondary name servers should stop answering request for this zone if the master does not respond.
  """
  expire: BigInt!

  """Time to live for purposes of negative caching."""
  minimum: BigInt!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type SRVRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime

  """The symbolic name of the desired service."""
  service: String!

  """
  The transport protocol of the desired service, usually either TCP or UDP.
  """
  protocol: String!

  """The priority of the target host, lower value means more preferred."""
  priority: Int!

  """
  A relative weight for records with the same priority, higher value means higher chance of getting picked.
  """
  weight: Int!
  port: Int!

  """
  The canonical hostname of the machine providing the service, ending in a dot.
  """
  target: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

type SSHFPRecord implements Node & DNSRecordInterface {
  createdAt: DateTime!
  updatedAt: DateTime!
  deletedAt: DateTime
  algorithm: DnsmanagerSshFingerprintRecordAlgorithmChoices!
  type: DnsmanagerSshFingerprintRecordTypeChoices!
  fingerprint: String!

  """The ID of the object"""
  id: ID!
  name: String!
  ttl: Int!
  dnsClass: String
  text: String!
  domain: DNSDomain!
}

enum DnsmanagerSshFingerprintRecordAlgorithmChoices {
  """RSA"""
  A_1

  """DSA"""
  A_2

  """ECDSA"""
  A_3

  """Ed25519"""
  A_4
}

enum DnsmanagerSshFingerprintRecordTypeChoices {
  """SHA-1"""
  A_1

  """SHA-256"""
  A_2
}

type APITokenConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [APITokenEdge]!
}

"""A Relay edge containing a `APIToken` and its cursor."""
type APITokenEdge {
  """The item at the end of the edge"""
  node: APIToken

  """A cursor for use in pagination"""
  cursor: String!
}

type APIToken implements Node {
  user: User!
  identifier: String
  createdAt: DateTime!
  revokedAt: DateTime
  lastUsedAt: DateTime
  nonceSet(offset: Int, before: String, after: String, first: Int, last: Int): NonceConnection!

  """The ID of the object"""
  id: ID!
}

type NonceConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `Nonce` and its cursor."""
type NonceEdge {
  """The item at the end of the edge"""
  node: Nonce

  """A cursor for use in pagination"""
  cursor: String!
}

type Nonce implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
  callbackUrl: String!
  createdAt: DateTime!
  isValidated: Boolean!
  secret: String!
  token: String!
  expired: Boolean!
  authUrl: String!
}

type UserNotificationConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [UserNotificationEdge]!
  hasPendingNotifications: Boolean!
  pendingNotificationsCount: Int!
}

"""A Relay edge containing a `UserNotification` and its cursor."""
type UserNotificationEdge {
  """The item at the end of the edge"""
  node: UserNotification

  """A cursor for use in pagination"""
  cursor: String!
}

type UserNotification implements Node {
  """The ID of the object"""
  id: ID!
  icon: String
  body: EventBody!
  seenState: UserNotificationSeenState!
  kind: UserNotificationKind
  createdAt: DateTime!
}

enum UserNotificationSeenState {
  UNSEEN
  SEEN
  SEEN_AND_READ
}

union UserNotificationKind = UserNotificationKindPublishedPackageVersion | UserNotificationKindIncomingPackageTransfer | UserNotificationKindIncomingPackageInvite | UserNotificationKindIncomingNamespaceInvite | UserNotificationKindValidateEmail

type UserNotificationKindPublishedPackageVersion {
  packageVersion: PackageVersion!
}

type UserNotificationKindIncomingNamespaceInvite {
  namespaceInvite: NamespaceCollaboratorInvite!
}

type UserNotificationKindValidateEmail {
  user: User!
}

"""

    Enum of ways a user can login. One user can have many login methods
    associated with their account.
    
"""
enum LoginMethod {
  GOOGLE
  GITHUB
  PASSWORD
}

type SocialAuth implements Node {
  """The ID of the object"""
  id: ID!
  user: User!
  provider: String!
  uid: String!
  extraData: JSONString!
  created: DateTime!
  modified: DateTime!
  username: String!
}

type GithubRepository {
  url: String!
  name: String!
  namespace: String!
}

type Signature {
  id: ID!
  publicKey: PublicKey!
  data: String!
  createdAt: DateTime!
}

type StripeCustomer {
  id: ID!
}

type Billing {
  stripeCustomer: StripeCustomer!
  payments: [PaymentIntent]!
  paymentMethods: [PaymentMethod]!
}

type PaymentIntent implements Node {
  """The datetime this object was created in stripe."""
  created: DateTime

  """Three-letter ISO currency code"""
  currency: String!

  """
  Status of this PaymentIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, requires_capture, canceled, or succeeded. You can read more about PaymentIntent statuses here.
  """
  status: DjstripePaymentIntentStatusChoices!

  """The ID of the object"""
  id: ID!
  amount: String!
}

enum DjstripePaymentIntentStatusChoices {
  """
  Cancellation invalidates the intent for future confirmation and cannot be undone.
  """
  CANCELED

  """Required actions have been handled."""
  PROCESSING

  """Payment Method require additional action, such as 3D secure."""
  REQUIRES_ACTION

  """Capture the funds on the cards which have been put on holds."""
  REQUIRES_CAPTURE

  """Intent is ready to be confirmed."""
  REQUIRES_CONFIRMATION

  """Intent created and requires a Payment Method to be attached."""
  REQUIRES_PAYMENT_METHOD

  """The funds are in your account."""
  SUCCEEDED
}

union PaymentMethod = CardPaymentMethod

type CardPaymentMethod implements Node {
  """The ID of the object"""
  id: ID!
  brand: CardBrand!
  country: String!
  expMonth: Int!
  expYear: Int!
  funding: CardFunding!
  last4: String!
  isDefault: Boolean!
}

"""
Card brand.

Can be amex, diners, discover, jcb, mastercard, unionpay, visa, or unknown.
"""
enum CardBrand {
  AMEX
  DINERS
  DISCOVER
  JCB
  MASTERCARD
  UNIONPAY
  VISA
  UNKNOWN
}

"""
Card funding type.

Can be credit, debit, prepaid, or unknown.
"""
enum CardFunding {
  CREDIT
  DEBIT
  PREPAID
  UNKNOWN
}

type Payment {
  id: ID
  amount: String
  paidOn: DateTime
}

"""Log entry for deploy app."""
type Log {
  """Timestamp in nanoseconds"""
  timestamp: Float!

  """ISO 8601 string in UTC"""
  datetime: DateTime!

  """Log message"""
  message: String!

  """Log stream"""
  stream: LogStream

  """ID of instance from which the log was generated"""
  instanceId: String!
}

"""This is for backwards compatibility with the old PackageInstance type."""
interface PackageInstance {
  piritaManifest: JSONString
  piritaOffsets: JSONString
  piritaVolumes: JSONString
  isArchived: Boolean!
  clientName: String
  publishedBy: User!
  createdAt: DateTime!
  updatedAt: DateTime!
  package: Package!
  webc: WebcImage
  webcV3: WebcImage
  tag: String!
}

type UserNotificationKindIncomingPackageTransfer {
  packageTransferRequest: PackageTransferRequest!
}

type UserNotificationKindIncomingPackageInvite {
  packageInvite: PackageCollaboratorInvite!
}

input DeploymentV1 {
  name: String!
  workload: WorkloadV1!
}

input WorkloadV1 {
  capability: CapabilityMapV1
  name: String = null
  runner: WorkloadRunnerV1!
}

input AppV1Spec {
  aliases: [String] = []
  workload: WorkloadV2!
}

input WorkloadV2 {
  source: String!
}

input CapabilityCpuV1 {
  maximumThreads: Int
  maximumUsage: Int
}

input FileSystemPermissionsV1 {
  delete: Boolean
  read: Boolean
  write: Boolean
}

input FileSystemVolumeMountV1 {
  path: String!
  permissions: [FileSystemPermissionsV1]
}

input FileSystemVolumeSourceLocalV1 {
  maximumSize: String!
}

input FileSystemVolumeSourceV1 {
  local: FileSystemVolumeSourceLocalV1!
}

input FileSystemVolumeConfigV1 {
  mounts: [FileSystemVolumeMountV1]!
  name: String!
  source: FileSystemVolumeSourceV1!
}

input CapabilityFileSystemV1 {
  volumes: [FileSystemVolumeConfigV1]!
}

input CapabilityPersistentMemoryV1 {
  volumes: [String]
}

input CapabilityMemorySwapV1 {
  maximumSize: String
  memoryId: String
}

input CapabilityNetworkV1 {
  egress: NetworkEgressV1
}

input NetworkEgressV1 {
  enabled: Boolean
}

input CapabilityNetworkDnsV1 {
  enabled: Boolean
  servers: [String]
  allowedHosts: NetworkDnsAllowedHostsV1
}

input NetworkDnsAllowedHostsV1 {
  allowAllHosts: Boolean
  hosts: [String]
  regexPatterns: [String]
  wildcardPatterns: [String]
}

input CapabilityNetworkGatewayV1 {
  domains: [String]
  enforceHttps: Boolean
}

input CapabilityMapV1 {
  memorySwap: CapabilityCpuV1
}

input WebcSourceV1 {
  name: String!
  namespace: String!
  repository: String! = "https://registry.wasmer.wtf"
  tag: String
  authToken: String
}

input WorkloadRunnerV1 {
  webProxy: RunnerWebProxyV1
  wcgi: RunnerWCGIV1
}

"""Run a webassembly file."""
input RunnerWCGIV1 {
  source: WorkloadRunnerWasmSourceV1!
  dialect: String
}

input RunnerWebProxyV1 {
  source: WorkloadRunnerWasmSourceV1!
}

input WorkloadRunnerWasmSourceV1 {
  webc: WebcSourceV1!
}

type Query {
  latestTOS: TermsOfService!
  getAppRegions(offset: Int, before: String, after: String, first: Int, last: Int): AppRegionConnection!
  getDeployAppVersion(name: String!, owner: String, version: String): DeployAppVersion
  getAllDomains(namespace: String, offset: Int, before: String, after: String, first: Int, last: Int): DNSDomainConnection!
  getAllDNSRecords(sortBy: DNSRecordsSortBy, updatedAfter: DateTime, before: String, after: String, first: Int, last: Int): DNSRecordConnection!
  getDomain(name: String!): DNSDomain
  getDeployApp(
    name: String!

    """Owner of the app. Defaults to logged in user."""
    owner: String
  ): DeployApp
  getAppByGlobalAlias(alias: String!): DeployApp
  getDeployApps(sortBy: DeployAppsSortBy, updatedAfter: DateTime, offset: Int, before: String, after: String, first: Int, last: Int): DeployAppConnection!
  getAppVersions(sortBy: DeployAppVersionsSortBy, updatedAfter: DateTime, offset: Int, before: String, after: String, first: Int, last: Int): DeployAppVersionConnection!
  getTemplateFrameworks(offset: Int, before: String, after: String, first: Int, last: Int): TemplateFrameworkConnection
  getTemplateLanguages(offset: Int, before: String, after: String, first: Int, last: Int): TemplateLanguageConnection
  getAppTemplates(categorySlug: String, frameworkSlug: String, languageSlug: String, sortBy: AppTemplatesSortBy, offset: Int, before: String, after: String, first: Int, last: Int): AppTemplateConnection
  getAppSecrets(appId: ID!, names: [String], offset: Int, before: String, after: String, first: Int, last: Int): SecretConnection
  getAppSecret(appId: ID!, secretName: String!): Secret
  getAppSecretLog(appId: ID!, offset: Int, before: String, after: String, first: Int, last: Int): SecretLogConnection
  getSecretValue(id: ID!): String
  getAppTemplate(slug: String!): AppTemplate
  getAppTemplateCategories(offset: Int, before: String, after: String, first: Int, last: Int): AppTemplateCategoryConnection
  getBuildKinds(offset: Int, before: String, after: String, first: Int, last: Int): BuildKindConnection!

  """Specify if the database name is valid or not."""
  canDeployDbWithName(
    """Name of the database"""
    name: String!
  ): Boolean!
  viewer: User
  getUser(username: String!): User
  getPasswordResetToken(token: String!): GetPasswordResetToken
  getAuthNonce(name: String!): Nonce

  """Can the logged in user create app templates?"""
  canDeployAppToGithub: Boolean!

  """Check if a repo exists in the logged in user's github account."""
  checkRepoExists(
    """The namespace of the repo to check."""
    namespace: String!

    """The name of the repo to check."""
    name: String!
  ): Boolean!

  """Generate a unique repo name in the logged in user's github account."""
  newRepoName(
    """The github namespace of the repo to create the repo in."""
    namespace: String!

    """The template to use."""
    templateSlug: String!
  ): String!
  packages(offset: Int, before: String, after: String, first: Int, last: Int): PackageConnection
  recentPackageVersions(curated: Boolean, offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
  allPackageVersions(sortBy: PackageVersionSortBy, createdAfter: DateTime, updatedAfter: DateTime, offset: Int, before: String, after: String, first: Int, last: Int): PackageVersionConnection!
  allPackageReleases(sortBy: PackageVersionSortBy, createdAfter: DateTime, updatedAfter: DateTime, offset: Int, before: String, after: String, first: Int, last: Int): PackageWebcConnection!
  getWebcImage(hash: String!): WebcImage
  getNamespace(name: String!): Namespace
  getPackage(name: String!): Package
  getPackages(names: [String!]!): [Package]!
  getPackageVersion(name: String!, version: String = "latest"): PackageVersion
  getPackageVersions(names: [String!]!): [PackageVersion]
  getPackageVersionByHash(name: String!, hash: String!): PackageVersion
  getInterface(name: String!): Interface
  getInterfaces(names: [String!]!): [Interface]!
  getInterfaceVersion(name: String!, version: String = "latest"): InterfaceVersion
  getContract(name: String!): Interface @deprecated(reason: "Please use getInterface instead")
  getContracts(names: [String!]!): [Interface]! @deprecated(reason: "Please use getInterfaces instead")
  getContractVersion(name: String!, version: String): InterfaceVersion @deprecated(reason: "Please use getInterfaceVersion instead")
  getCommand(name: String!): Command
  getCommands(names: [String!]!): [Command]
  getCollections(before: String, after: String, first: Int, last: Int): CollectionConnection
  getSignedUrlForPackageUpload(name: String, version: String = "latest", filename: String, expiresAfterSeconds: Int = 60): SignedUrl
  getPackageHash(name: String, hash: String!): PackageWebc
  getPackageRelease(hash: String): PackageWebc
  getPackageInstanceByVersionOrHash(name: String!, version: String, hash: String): PackageInstance
  categories(offset: Int, before: String, after: String, first: Int, last: Int): CategoryConnection!
  viewerCan(action: OwnerAction!, ownerName: String!): Boolean!
  blogposts(tags: [String!], before: String, after: String, first: Int, last: Int): BlogPostConnection!
  getBlogpost(slug: String, featured: Boolean): BlogPost
  allBlogpostTags(offset: Int, before: String, after: String, first: Int, last: Int): BlogPostTagConnection
  search(query: String!, packages: PackagesFilter, namespaces: NamespacesFilter, users: UsersFilter, apps: AppFilter, blogposts: BlogPostsFilter, appTemplates: AppTemplateFilter, before: String, after: String, first: Int, last: Int): SearchConnection!
  searchAutocomplete(kind: [SearchKind!], query: String!, before: String, after: String, first: Int, last: Int): SearchConnection!
  getGlobalObject(slug: String!): GlobalObject
  node(
    """The ID of the object"""
    id: ID!
  ): Node
  nodes(ids: [ID!]!): [Node]
  info: RegistryInfo
}

type TermsOfService implements Node {
  """The ID of the object"""
  id: ID!
  content: String!
  createdAt: DateTime!
  viewerHasAccepted: Boolean!
}

type AppRegionConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `AppRegion` and its cursor."""
type AppRegionEdge {
  """The item at the end of the edge"""
  node: AppRegion

  """A cursor for use in pagination"""
  cursor: String!
}

type AppRegion implements Node {
  name: String!
  country: String!
  city: String!

  """The ID of the object"""
  id: ID!
}

type DNSRecordConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `DNSRecord` and its cursor."""
type DNSRecordEdge {
  """The item at the end of the edge"""
  node: DNSRecord

  """A cursor for use in pagination"""
  cursor: String!
}

enum DNSRecordsSortBy {
  NEWEST
  OLDEST
}

type TemplateFrameworkConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `TemplateFramework` and its cursor."""
type TemplateFrameworkEdge {
  """The item at the end of the edge"""
  node: TemplateFramework

  """A cursor for use in pagination"""
  cursor: String!
}

type TemplateLanguageConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `TemplateLanguage` and its cursor."""
type TemplateLanguageEdge {
  """The item at the end of the edge"""
  node: TemplateLanguage

  """A cursor for use in pagination"""
  cursor: String!
}

enum AppTemplatesSortBy {
  NEWEST
  OLDEST
  POPULAR
}

type SecretLogConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `SecretLog` and its cursor."""
type SecretLogEdge {
  """The item at the end of the edge"""
  node: SecretLog

  """A cursor for use in pagination"""
  cursor: String!
}

type SecretLog implements Node {
  createdAt: DateTime!
  action: DeploySecretLogActionChoices!

  """The ID of the object"""
  id: ID!
  secretName: String!
}

enum DeploySecretLogActionChoices {
  """Access"""
  ACCESS

  """Modification"""
  MODIFICATION

  """Create"""
  CREATE

  """DELETE"""
  DELETE
}

type AppTemplateCategoryConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `AppTemplateCategory` and its cursor."""
type AppTemplateCategoryEdge {
  """The item at the end of the edge"""
  node: AppTemplateCategory

  """A cursor for use in pagination"""
  cursor: String!
}

type BuildKindConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `BuildKind` and its cursor."""
type BuildKindEdge {
  """The item at the end of the edge"""
  node: BuildKind

  """A cursor for use in pagination"""
  cursor: String!
}

type BuildKind implements Node {
  name: String!
  setupDb: Boolean!
  buildCmd: String!
  installCmd: String!

  """The ID of the object"""
  id: ID!
}

type GetPasswordResetToken {
  valid: Boolean!
  user: User
}

enum PackageVersionSortBy {
  NEWEST
  OLDEST
}

type CollectionConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [CollectionEdge]!
}

"""A Relay edge containing a `Collection` and its cursor."""
type CollectionEdge {
  """The item at the end of the edge"""
  node: Collection

  """A cursor for use in pagination"""
  cursor: String!
}

type SignedUrl {
  url: String!
}

type BlogPostConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [BlogPostEdge]!
}

"""A Relay edge containing a `BlogPost` and its cursor."""
type BlogPostEdge {
  """The item at the end of the edge"""
  node: BlogPost

  """A cursor for use in pagination"""
  cursor: String!
}

type BlogPost implements Node {
  """The ID of the object"""
  id: ID!
  live: Boolean!

  """The page title as you'd like it to be seen by the public"""
  title: String!

  """
  The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/
  """
  slug: String!
  owner: User
  body: String!
  publishDate: DateTime
  theme: BlogBlogPostThemeChoices!
  url: String!
  coverImageUrl: String
  opengraphImageUrl: String
  tagline: String!
  relatedArticles: [BlogPost!]
  updatedAt: DateTime!
  tags: [BlogPostTag!]
  editUrl: String
}

enum BlogBlogPostThemeChoices {
  """Green"""
  GREEN

  """Purple"""
  PURPLE

  """Orange"""
  ORANGE

  """Blue"""
  BLUE
}

type BlogPostTag implements Node {
  """The ID of the object"""
  id: ID!
  name: String!
  slug: String!
}

type BlogPostTagConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

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

  """Total number of items in the connection."""
  totalCount: Int
}

"""A Relay edge containing a `BlogPostTag` and its cursor."""
type BlogPostTagEdge {
  """The item at the end of the edge"""
  node: BlogPostTag

  """A cursor for use in pagination"""
  cursor: String!
}

type SearchConnection {
  """Pagination data for this connection."""
  pageInfo: PageInfo!

  """Contains the nodes in this connection."""
  edges: [SearchEdge]!
  totalCount: Int
}

"""A Relay edge containing a `Search` and its cursor."""
type SearchEdge {
  """The item at the end of the edge"""
  node: SearchResult

  """A cursor for use in pagination"""
  cursor: String!
}

union SearchResult = PackageVersion | User | Namespace | DeployApp | BlogPost | AppTemplate

input PackagesFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Filter packages by being curated."""
  curated: Boolean

  """Filter packages by publish date."""
  publishDate: SearchPublishDate

  """Filter packages by having bindings."""
  hasBindings: Boolean = false

  """Filter packages by being standalone."""
  isStandalone: Boolean = false

  """Filter packages by having commands."""
  hasCommands: Boolean = false

  """Filter packages by interface."""
  withInterfaces: [String]

  """Filter packages by deployable status."""
  deployable: Boolean

  """Filter packages by license."""
  license: String

  """Filter packages created after this date."""
  createdAfter: DateTime

  """Filter packages created before this date."""
  createdBefore: DateTime

  """Filter packages with version published after this date."""
  lastPublishedAfter: DateTime

  """Filter packages with version published before this date."""
  lastPublishedBefore: DateTime

  """Filter packages by size."""
  size: CountFilter

  """Filter packages by download count."""
  downloads: CountFilter

  """Filter packages by like count."""
  likes: CountFilter

  """Filter packages by owner."""
  owner: String

  """Filter packages by published by."""
  publishedBy: String

  """Order packages by field."""
  orderBy: PackageOrderBy = PUBLISHED_DATE
}

enum SearchOrderSort {
  ASC
  DESC
}

enum SearchPublishDate {
  LAST_DAY
  LAST_WEEK
  LAST_MONTH
  LAST_YEAR
}

input CountFilter {
  count: Int = 0
  comparison: CountComparison = GREATER_THAN_OR_EQUAL
}

enum CountComparison {
  EQUAL
  GREATER_THAN
  LESS_THAN
  GREATER_THAN_OR_EQUAL
  LESS_THAN_OR_EQUAL
}

enum PackageOrderBy {
  ALPHABETICALLY
  SIZE
  TOTAL_DOWNLOADS
  PUBLISHED_DATE
  CREATED_DATE
  TOTAL_LIKES
}

input NamespacesFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Filter namespaces by package count."""
  packageCount: CountFilter

  """Filter namespaces created after this date."""
  createdAfter: DateTime

  """Filter namespaces created before this date."""
  createdBefore: DateTime

  """Filter namespaces by user count."""
  userCount: CountFilter

  """Filter namespaces by collaborator."""
  collaborator: String

  """Order namespaces by field."""
  orderBy: NamespaceOrderBy = CREATED_DATE
}

enum NamespaceOrderBy {
  PACKAGE_COUNT
  COLLABORATOR_COUNT
  APP_COUNT
  CREATED_DATE
}

input UsersFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Filter users by package count."""
  packageCount: CountFilter

  """Filter users by namespace count."""
  namespaceCount: CountFilter

  """Filter users joined after this date."""
  joinedAfter: DateTime

  """Filter users joined before this date."""
  joinedBefore: DateTime

  """Order users by field."""
  orderBy: UserOrderBy = CREATED_DATE
}

enum UserOrderBy {
  PACKAGE_COUNT
  APP_COUNT
  CREATED_DATE
}

input AppFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Filter apps by deployed by."""
  deployedBy: String

  """Filter apps last deployed after this date."""
  lastDeployedAfter: DateTime

  """Filter apps last deployed before this date."""
  lastDeployedBefore: DateTime

  """Filter apps by owner."""
  owner: String

  """Order apps by field."""
  orderBy: AppOrderBy = CREATED_DATE

  """Filter apps by client name."""
  clientName: String
}

enum AppOrderBy {
  PUBLISHED_DATE
  CREATED_DATE
}

input BlogPostsFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Filter blog posts by tag."""
  tags: [String]
}

input AppTemplateFilter {
  count: Int = 1000
  sortBy: SearchOrderSort = ASC

  """Order app templates by field."""
  orderBy: AppTemplateOrderBy = CREATED_DATE

  """Filter by app template framework"""
  framework: String

  """Filter by app template language"""
  language: String

  """Filter by one or more of the use-cases for the app template"""
  useCases: [String]
}

enum AppTemplateOrderBy {
  CREATED_DATE
}

enum SearchKind {
  PACKAGE
  NAMESPACE
  USER
}

union GlobalObject = User | Namespace

type RegistryInfo {
  """Base URL for this registry"""
  baseUrl: String!

  """Base URL for the default frontend"""
  defaultFrontend: String!

  """URL to the graphql endpoint"""
  graphqlUrl: String!

  """URL for app domains"""
  appDomain: String!

  """URL to the graphql endpoint"""
  createBlogpostUrl: String

  """Public metadata about packages"""
  packages: PackageInfo!

  """Public metadata about the graphql schema"""
  schema: SchemaInfo!
}

type PackageInfo {
  """Number of package versions published this month"""
  versionsPublishedThisMonth: Int!

  """Number of new packages published this month"""
  newPackagesThisMonth: Int!

  """Number of package downloads this month"""
  packageDownloadsThisMonth: Int!
}

type SchemaInfo {
  """Download link for graphql schema"""
  downloadUrl: String!

  """SHA256 hash of the schema data"""
  SHA256Hash: String!

  """Timestamp when the schema was last updated"""
  lastUpdated: DateTime!
}

type Mutation {
  """Viewer accepts the latest ToS."""
  acceptTOS(input: AcceptTOSInput!): AcceptTOSPayload
  publishDeployApp(input: PublishDeployAppInput!): PublishDeployAppPayload
  deleteApp(input: DeleteAppInput!): DeleteAppPayload

  """Add current user to the waitlist."""
  joinWaitlist(input: JoinWaitlistInput!): JoinWaitlistPayload

  """Add stripe payment to the user"""
  addPayment(input: AddPaymentInput!): AddPaymentPayload

  """
  Mutation to change the active version of a DeployApp to another DeployAppVersion.
  """
  markAppVersionAsActive(input: MarkAppVersionAsActiveInput!): MarkAppVersionAsActivePayload

  """Set a payment method as default for the user."""
  makePaymentDefault(input: SetDefaultPaymentMethodInput!): SetDefaultPaymentMethodPayload

  """
  Try to detach a payment method from customer.
  Fails if trying to detach a default method,
  or if it's the only payment method.
  """
  detachPaymentMethod(input: DetachPaymentMethodInput!): DetachPaymentMethodPayload
  generateDeployConfigToken(input: GenerateDeployConfigTokenInput!): GenerateDeployConfigTokenPayload
  renameApp(input: RenameAppInput!): RenameAppPayload
  renameAppAlias(input: RenameAppAliasInput!): RenameAppAliasPayload

  """Purges all cache for this app version"""
  purgeCacheForAppVersion(input: PurgeCacheForAppVersionInput!): PurgeCacheForAppVersionPayload
  requestAppTransfer(input: RequestAppTransferInput!): RequestAppTransferPayload
  acceptAppTransferRequest(input: AcceptAppTransferRequestInput!): AcceptAppTransferRequestPayload
  removeAppTransferRequest(input: RemoveAppTransferRequestInput!): RemoveAppTransferRequestPayload
  createRepoForAppTemplate(input: CreateRepoForAppTemplateInput!): CreateRepoForAppTemplatePayload
  registerDomain(input: RegisterDomainInput!): RegisterDomainPayload
  upsertDNSRecord(input: UpsertDNSRecordInput!): UpsertDNSRecordPayload
  deleteDNSRecord(input: DeleteDNSRecordInput!): DeleteDNSRecordPayload
  upsertDomainFromZoneFile(input: UpsertDomainFromZoneFileInput!): UpsertDomainFromZoneFilePayload
  deleteDomain(input: DeleteDomainInput!): DeleteDomainPayload

  """Create or update an app secret on an app with given ID"""
  upsertAppSecret(input: UpsertAppSecretInput!): UpsertAppSecretPayload

  """Create or update app secrets on an app with given ID"""
  upsertAppSecrets(input: UpsertAppSecretsInput!): UpsertAppSecretsPayload

  """Delete secret with given ID"""
  deleteAppSecret(input: DeleteAppSecretInput!): DeleteAppSecretPayload

  """Redeploy the active version of an app."""
  redeployActiveVersion(input: RedeployActiveVersionInput!): RedeployActiveVersionPayload

  """Toggle HTTP redirect for the active version of app"""
  toggleForceHttps(input: ToggleForceHTTPSInput!): ToggleForceHTTPSPayload

  """Redeploy the active version of an app."""
  rotateS3SecretsForApp(input: RotateS3SecretsForAppInput!): RotateS3SecretsForAppPayload

  """Delete a database for an app."""
  rotateCredentialsForAppDb(input: RotateCredentialsForAppDBInput!): RotateCredentialsForAppDBPayload

  """Create a new database for an app."""
  createAppDb(input: CreateAppDBInput!): CreateAppDBPayload

  """Delete a database for an app."""
  deleteAppDb(input: DeleteAppDBInput!): DeleteAppDBPayload

  """Get the autobuild config for a given repo"""
  autobuildConfigForRepo(input: AutobuildConfigForRepoInput!): AutobuildConfigForRepoPayload

  """Add a new github app installation"""
  installGithubApp(input: InstallGithubAppInput!): InstallGithubAppPayload

  """Detach autobuild from app."""
  detachAppFromAutobuild(input: DetachAppFromAutobuildInput!): DetachAppFromAutobuildPayload

  """Update autobuild config for an app."""
  updateAutobuildConfigForApp(input: UpdateAutobuildConfigForAppInput!): UpdateAutobuildConfigForAppPayload
  tokenAuth(input: ObtainJSONWebTokenInput!): ObtainJSONWebTokenPayload
  generateDeployToken(input: GenerateDeployTokenInput!): GenerateDeployTokenPayload
  verifyAccessToken(token: String): Verify
  refreshAccessToken(refreshToken: String): Refresh
  revokeAccessToken(refreshToken: String): Revoke
  registerUser(input: RegisterUserInput!): RegisterUserPayload
  socialAuth(input: SocialAuthJWTInput!): SocialAuthJWTPayload
  validateUserEmail(input: ValidateUserEmailInput!): ValidateUserEmailPayload
  requestPasswordReset(input: RequestPasswordResetInput!): RequestPasswordResetPayload
  requestValidationEmail(input: RequestValidationEmailInput!): RequestValidationEmailPayload
  changeUserPassword(input: ChangeUserPasswordInput!): ChangeUserPasswordPayload
  changeUserUsername(input: ChangeUserUsernameInput!): ChangeUserUsernamePayload
  changeUserEmail(input: ChangeUserEmailInput!): ChangeUserEmailPayload
  updateUserInfo(input: UpdateUserInfoInput!): UpdateUserInfoPayload
  validateUserPassword(input: ValidateUserPasswordInput!): ValidateUserPasswordPayload
  generateApiToken(input: GenerateAPITokenInput!): GenerateAPITokenPayload

  """Request To revoke an API token; these start with 'wap_'."""
  revokeApiToken(input: RevokeAPITokenInput!): RevokeAPITokenPayload
  checkUserExists(input: CheckUserExistsInput!): CheckUserExistsPayload
  readNotification(input: ReadNotificationInput!): ReadNotificationPayload
  seePendingNotifications(input: SeePendingNotificationsInput!): SeePendingNotificationsPayload
  newNonce(input: NewNonceInput!): NewNoncePayload
  validateNonce(input: ValidateNonceInput!): ValidateNoncePayload
  invalidateNonce(input: InvalidateNonceInput!): InvalidateNoncePayload
  mfa2totpGetToken(input: MFATOTPGetTokenInput!): MFATOTPTokenType
  mfa2totpVerify(input: MFATOTPVerifyInput!): MFATOTPVerifyPayload
  mfa2totpAuth(input: MFATOTPAuthInput!): MFAAuthResponse
  mfa2RecoveryGetToken(input: MFAGenerateRecoveryTokenInput!): MFARecoveryCodes
  mfa2RecoveryAuth(input: MFARecoveryAuthInput!): MFAAuthResponse
  mfa2EmailAuth(input: MFAEmailAuthInput!): MFAAuthResponse
  mfa2EmailGetToken(input: MFAGenerateEmailOTPInput!): MFAEmailGenerationResponse
  publishPublicKey(input: PublishPublicKeyInput!): PublishPublicKeyPayload
  publishPackage(input: PublishPackageInput!): PublishPackagePayload
  pushPackageRelease(input: PushPackageReleaseInput!): PushPackageReleasePayload
  tagPackageRelease(input: TagPackageReleaseInput!): TagPackageReleasePayload
  updatePackage(input: UpdatePackageInput!): UpdatePackagePayload
  likePackage(input: LikePackageInput!): LikePackagePayload
  unlikePackage(input: UnlikePackageInput!): UnlikePackagePayload
  watchPackage(input: WatchPackageInput!): WatchPackagePayload
  unwatchPackage(input: UnwatchPackageInput!): UnwatchPackagePayload
  archivePackage(input: ArchivePackageInput!): ArchivePackagePayload
  renamePackage(input: RenamePackageInput!): RenamePackagePayload
  changePackageVersionArchivedStatus(input: ChangePackageVersionArchivedStatusInput!): ChangePackageVersionArchivedStatusPayload
  createNamespace(input: CreateNamespaceInput!): CreateNamespacePayload
  updateNamespace(input: UpdateNamespaceInput!): UpdateNamespacePayload
  deleteNamespace(input: DeleteNamespaceInput!): DeleteNamespacePayload
  inviteNamespaceCollaborator(input: InviteNamespaceCollaboratorInput!): InviteNamespaceCollaboratorPayload
  acceptNamespaceCollaboratorInvite(input: AcceptNamespaceCollaboratorInviteInput!): AcceptNamespaceCollaboratorInvitePayload
  removeNamespaceCollaboratorInvite(input: RemoveNamespaceCollaboratorInviteInput!): RemoveNamespaceCollaboratorInvitePayload
  removeNamespaceCollaborator(input: RemoveNamespaceCollaboratorInput!): RemoveNamespaceCollaboratorPayload
  updateNamespaceCollaboratorRole(input: UpdateNamespaceCollaboratorRoleInput!): UpdateNamespaceCollaboratorRolePayload
  updateNamespaceCollaboratorInviteRole(input: UpdateNamespaceCollaboratorInviteRoleInput!): UpdateNamespaceCollaboratorInviteRolePayload
  invitePackageCollaborator(input: InvitePackageCollaboratorInput!): InvitePackageCollaboratorPayload
  acceptPackageCollaboratorInvite(input: AcceptPackageCollaboratorInviteInput!): AcceptPackageCollaboratorInvitePayload
  removePackageCollaboratorInvite(input: RemovePackageCollaboratorInviteInput!): RemovePackageCollaboratorInvitePayload
  updatePackageCollaboratorRole(input: UpdatePackageCollaboratorRoleInput!): UpdatePackageCollaboratorRolePayload
  updatePackageCollaboratorInviteRole(input: UpdatePackageCollaboratorInviteRoleInput!): UpdatePackageCollaboratorInviteRolePayload
  removePackageCollaborator(input: RemovePackageCollaboratorInput!): RemovePackageCollaboratorPayload
  requestPackageTransfer(input: RequestPackageTransferInput!): RequestPackageTransferPayload
  acceptPackageTransferRequest(input: AcceptPackageTransferRequestInput!): AcceptPackageTransferRequestPayload
  removePackageTransferRequest(input: RemovePackageTransferRequestInput!): RemovePackageTransferRequestPayload
  generateBindingsForAllPackages(input: GenerateBindingsForAllPackagesInput!): GenerateBindingsForAllPackagesPayload
  makePackagePublic(input: MakePackagePublicInput!): MakePackagePublicPayload
  generateUploadUrl(input: GenerateUploadUrlInput!): GenerateUploadUrlPayload
}

"""Viewer accepts the latest ToS."""
type AcceptTOSPayload {
  TOS: TermsOfService!
  clientMutationId: String
}

input AcceptTOSInput {
  clientMutationId: String
}

type PublishDeployAppPayload {
  deployAppVersion: DeployAppVersion!
  clientMutationId: String
}

input PublishDeployAppInput {
  """The configuration of the app."""
  config: Configuration!

  """The name of the app."""
  name: ID

  """The owner of the app."""
  owner: ID

  """The description of the app."""
  description: String

  """If true, the new version will be set as the default version."""
  makeDefault: Boolean = true

  """
  If true, Publishing will fail if the source package does not have a valid webc.
  """
  strict: Boolean = false
  clientMutationId: String
}

input Configuration {
  deployment: AppConfigV1
  yamlConfig: String
}

input AppConfigV1 {
  kind: String = "wasmer.io/App.v0"
  appId: ID
  name: String!
  description: String
  package: String!
}

type DeleteAppPayload {
  success: Boolean!
  clientMutationId: String
}

input DeleteAppInput {
  """App ID to delete."""
  id: ID!
  clientMutationId: String
}

"""Add current user to the waitlist."""
type JoinWaitlistPayload {
  waitlistMember: WaitlistMember!
  clientMutationId: String
}

input JoinWaitlistInput {
  name: String!
  clientMutationId: String
}

"""Add stripe payment to the user"""
type AddPaymentPayload {
  customerSecret: String!
  clientMutationId: String
}

input AddPaymentInput {
  clientMutationId: String
}

"""
Mutation to change the active version of a DeployApp to another DeployAppVersion.
"""
type MarkAppVersionAsActivePayload {
  app: DeployApp!
  clientMutationId: String
}

input MarkAppVersionAsActiveInput {
  """The ID of the DeployAppVersion to set as the new active version."""
  appVersion: ID!
  clientMutationId: String
}

"""Set a payment method as default for the user."""
type SetDefaultPaymentMethodPayload {
  success: Boolean!
  billing: Billing!
  clientMutationId: String
}

input SetDefaultPaymentMethodInput {
  paymentMethod: ID!
  clientMutationId: String
}

"""
Try to detach a payment method from customer.
Fails if trying to detach a default method,
or if it's the only payment method.
"""
type DetachPaymentMethodPayload {
  success: Boolean!
  billing: Billing!
  clientMutationId: String
}

input DetachPaymentMethodInput {
  paymentMethod: ID!
  clientMutationId: String
}

type GenerateDeployConfigTokenPayload {
  token: String!
  config: String!
  clientMutationId: String
}

input GenerateDeployConfigTokenInput {
  config: String!
  clientMutationId: String
}

type RenameAppPayload {
  success: Boolean!
  app: DeployApp!
  clientMutationId: String
}

input RenameAppInput {
  """App ID to delete."""
  id: ID!

  """New name for the app."""
  name: String!
  clientMutationId: String
}

type RenameAppAliasPayload {
  success: Boolean!
  alias: AppAlias!
  clientMutationId: String
}

input RenameAppAliasInput {
  """App alias ID to delete."""
  id: ID!

  """New name for the alias."""
  name: String!
  clientMutationId: String
}

"""Purges all cache for this app version"""
type PurgeCacheForAppVersionPayload {
  appVersion: DeployAppVersion!
  success: Boolean!
  clientMutationId: String
}

input PurgeCacheForAppVersionInput {
  """ID of the app version to purge cache for."""
  id: ID!
  clientMutationId: String
}

type RequestAppTransferPayload {
  appTransferRequest: AppTransferRequest
  wasInstantlyTransferred: Boolean!
  clientMutationId: String
}

type AppTransferRequest implements Node {
  """The ID of the object"""
  id: ID!
  requestedBy: User!
  previousOwnerObjectId: Int!
  newOwnerObjectId: Int!
  app: DeployApp!
  approvedBy: User
  declinedBy: User
  createdAt: DateTime!
  expiresAt: DateTime!
  closedAt: DateTime
  previousOwner: Owner!
  newOwner: Owner!
}

input RequestAppTransferInput {
  appId: ID!
  newOwnerId: ID!
  clientMutationId: String
}

type AcceptAppTransferRequestPayload {
  app: DeployApp!
  appTransferRequest: AppTransferRequest!
  clientMutationId: String
}

input AcceptAppTransferRequestInput {
  appTransferRequestId: ID!
  clientMutationId: String
}

type RemoveAppTransferRequestPayload {
  app: DeployApp!
  clientMutationId: String
}

input RemoveAppTransferRequestInput {
  appTransferRequestId: ID!
  clientMutationId: String
}

type CreateRepoForAppTemplatePayload {
  success: Boolean!
  repoId: ID!
  clientMutationId: String
}

input CreateRepoForAppTemplateInput {
  templateId: ID!
  name: String!
  namespace: String!
  private: Boolean = false
  domains: [String] = null
  clientMutationId: String
}

type RegisterDomainPayload {
  success: Boolean!
  domain: DNSDomain
  clientMutationId: String
}

input RegisterDomainInput {
  name: String!
  namespace: String
  importRecords: Boolean = true
  clientMutationId: String
}

type UpsertDNSRecordPayload {
  success: Boolean!
  record: DNSRecord!
  clientMutationId: String
}

input UpsertDNSRecordInput {
  kind: RecordKind!
  domainId: String!
  name: String!
  value: String!
  ttl: Int
  recordId: String
  mx: DNSMXExtraInput
  clientMutationId: String
}

enum RecordKind {
  A
  AAAA
  CNAME
  MX
  NS
  TXT
  DNAME
  PTR
  SOA
  SRV
  CAA
  SSHFP
}

input DNSMXExtraInput {
  preference: Int!
}

type DeleteDNSRecordPayload {
  success: Boolean!
  clientMutationId: String
}

input DeleteDNSRecordInput {
  recordId: ID!
  clientMutationId: String
}

type UpsertDomainFromZoneFilePayload {
  success: Boolean!
  domain: DNSDomain!
  clientMutationId: String
}

input UpsertDomainFromZoneFileInput {
  zoneFile: String!
  deleteMissingRecords: Boolean
  clientMutationId: String
}

type DeleteDomainPayload {
  success: Boolean!
  clientMutationId: String
}

input DeleteDomainInput {
  domainId: ID!
  clientMutationId: String
}

"""Create or update an app secret on an app with given ID"""
type UpsertAppSecretPayload {
  secret: Secret!
  success: Boolean!
  clientMutationId: String
}

input UpsertAppSecretInput {
  """ID of the app onto which to add secrets."""
  appId: ID!

  """Name of the secret."""
  name: String!

  """Value of the secret."""
  value: String!
  clientMutationId: String
}

"""Create or update app secrets on an app with given ID"""
type UpsertAppSecretsPayload {
  success: Boolean!
  secrets: [Secret]!
  clientMutationId: String
}

input UpsertAppSecretsInput {
  """ID of the app onto which to add secrets."""
  appId: ID!
  secrets: [SecretInput]
  clientMutationId: String
}

input SecretInput {
  """Name of the secret."""
  name: String!

  """Value of the secret."""
  value: String!
}

"""Delete secret with given ID"""
type DeleteAppSecretPayload {
  success: Boolean!

  """ID of the deleted secret."""
  id: ID!
  clientMutationId: String
}

input DeleteAppSecretInput {
  """ID of the secret to delete."""
  id: ID!
  clientMutationId: String
}

"""Redeploy the active version of an app."""
type RedeployActiveVersionPayload {
  app: DeployApp!
  clientMutationId: String
}

input RedeployActiveVersionInput {
  """ID of the app to redeploy."""
  id: ID!
  clientMutationId: String
}

"""Toggle HTTP redirect for the active version of app"""
type ToggleForceHTTPSPayload {
  app: DeployApp!
  clientMutationId: String
}

input ToggleForceHTTPSInput {
  """App ID"""
  id: ID!
  clientMutationId: String
}

"""Redeploy the active version of an app."""
type RotateS3SecretsForAppPayload {
  app: DeployApp!
  clientMutationId: String
}

input RotateS3SecretsForAppInput {
  """ID of the app."""
  id: ID!
  clientMutationId: String
}

"""Delete a database for an app."""
type RotateCredentialsForAppDBPayload {
  database: AppDatabase!
  password: String!
  clientMutationId: String
}

input RotateCredentialsForAppDBInput {
  """App Database ID"""
  id: ID!
  clientMutationId: String
}

"""Create a new database for an app."""
type CreateAppDBPayload {
  database: AppDatabase!
  password: String!
  clientMutationId: String
}

input CreateAppDBInput {
  """App ID"""
  id: ID!

  """Database name"""
  name: String!
  clientMutationId: String
}

"""Delete a database for an app."""
type DeleteAppDBPayload {
  success: Boolean!
  clientMutationId: String
}

input DeleteAppDBInput {
  """App Database ID"""
  id: ID!
  clientMutationId: String
}

"""Get the autobuild config for a given repo"""
type AutobuildConfigForRepoPayload {
  """The build configuration"""
  buildConfig: BuildConfig

  """List of apps deployed with this repo."""
  deployedApps: [DeployApp]
  clientMutationId: String
}

"""The Build Configuration for a given repo"""
type BuildConfig {
  buildCmd: String!
  installCmd: String!
  setupDb: Boolean!
  presetName: String!
  appName: String!
}

input AutobuildConfigForRepoInput {
  """The repo URL"""
  repoUrl: String!
  clientMutationId: String
}

"""Add a new github app installation"""
type InstallGithubAppPayload {
  success: Boolean!
  user: User!
  clientMutationId: String
}

input InstallGithubAppInput {
  """Github app Installation ID"""
  installationId: ID!
  clientMutationId: String
}

"""Detach autobuild from app."""
type DetachAppFromAutobuildPayload {
  app: DeployApp!
  clientMutationId: String
}

input DetachAppFromAutobuildInput {
  """The ID of the App"""
  appId: ID!
  clientMutationId: String
}

"""Update autobuild config for an app."""
type UpdateAutobuildConfigForAppPayload {
  app: DeployApp!
  clientMutationId: String
}

input UpdateAutobuildConfigForAppInput {
  """The ID of the App"""
  appId: ID!

  """Build command for the app"""
  buildCmd: String

  """Install command for the app"""
  installCmd: String
  clientMutationId: String
}

type ObtainJSONWebTokenPayload {
  payload: GenericScalar!
  refreshExpiresIn: Int!
  username: CaseInsensitiveString!
  clientMutationId: String
  token: String!
  refreshToken: String!
}

"""
The `GenericScalar` scalar type represents a generic
GraphQL scalar value that could be:
String, Boolean, Int, Float, List or Object.
"""
scalar GenericScalar

"""
The `CaseInsensitiveString` scalar type represents textual data, represented as UTF-8
character sequences. The String type is most often used by GraphQL to
represent free-form human-readable text.
"""
scalar CaseInsensitiveString

input ObtainJSONWebTokenInput {
  clientMutationId: String
  username: String!
  password: String!
}

type GenerateDeployTokenPayload {
  token: String!
  deployConfigVersion: DeployAppVersion!
  clientMutationId: String
}

input GenerateDeployTokenInput {
  deployConfigVersionId: String!
  clientMutationId: String
}

type Verify {
  payload: GenericScalar!
}

type Refresh {
  payload: GenericScalar!
  refreshExpiresIn: Int!
  token: String!
  refreshToken: String!
}

type Revoke {
  revoked: Int!
}

type RegisterUserPayload {
  token: String
  clientMutationId: String
}

input RegisterUserInput {
  fullName: String!
  email: String!
  username: CaseInsensitiveString!
  password: String!
  acceptedTos: Boolean
  intent: String
  clientMutationId: String
}

type SocialAuthJWTPayload {
  social: SocialAuth
  token: String
  clientMutationId: String
}

input SocialAuthJWTInput {
  provider: String!
  accessToken: String!
  register: Boolean = false
  registerIntent: String
  clientMutationId: String
}

type ValidateUserEmailPayload {
  user: User
  clientMutationId: String
}

input ValidateUserEmailInput {
  """The user id"""
  userId: ID
  challenge: String!
  clientMutationId: String
}

type RequestPasswordResetPayload {
  email: String!
  errors: [ErrorType]
  clientMutationId: String
}

type ErrorType {
  field: String!
  messages: [String!]!
}

input RequestPasswordResetInput {
  email: String!
  clientMutationId: String
}

type RequestValidationEmailPayload {
  user: User
  success: Boolean!
  clientMutationId: String
}

input RequestValidationEmailInput {
  """The user id"""
  userId: ID
  clientMutationId: String
}

type ChangeUserPasswordPayload {
  token: String
  clientMutationId: String
}

input ChangeUserPasswordInput {
  """
  The token associated to change the password. If not existing it will use the request user by default
  """
  token: String
  oldPassword: String
  password: String!
  clientMutationId: String
}

type ChangeUserUsernamePayload {
  user: User
  token: String
  clientMutationId: String
}

input ChangeUserUsernameInput {
  """The new user username"""
  username: CaseInsensitiveString!
  clientMutationId: String
}

type ChangeUserEmailPayload {
  user: User!
  clientMutationId: String
}

input ChangeUserEmailInput {
  newEmail: String!
  clientMutationId: String
}

type UpdateUserInfoPayload {
  user: User
  clientMutationId: String
}

input UpdateUserInfoInput {
  """The user id"""
  userId: ID

  """The user full name"""
  fullName: String

  """The user bio"""
  bio: String

  """The user avatar"""
  avatar: String

  """
  The user Twitter (it can be the url, or the handle with or without the @)
  """
  twitter: String

  """
  The user Github (it can be the url, or the handle with or without the @)
  """
  github: String

  """The user website (it must be a valid url)"""
  websiteUrl: String

  """The user location"""
  location: String
  clientMutationId: String
}

type ValidateUserPasswordPayload {
  success: Boolean
  clientMutationId: String
}

input ValidateUserPasswordInput {
  password: String!
  clientMutationId: String
}

type GenerateAPITokenPayload {
  token: APIToken
  tokenRaw: String
  user: User
  clientMutationId: String
}

input GenerateAPITokenInput {
  identifier: String
  clientMutationId: String
}

"""Request To revoke an API token; these start with 'wap_'."""
type RevokeAPITokenPayload {
  token: APIToken
  success: Boolean
  clientMutationId: String
}

input RevokeAPITokenInput {
  """The API token ID"""
  tokenId: String

  """The raw API token"""
  token: String
  clientMutationId: String
}

type CheckUserExistsPayload {
  exists: Boolean!

  """The user is only returned if the user input was the username"""
  user: User
  clientMutationId: String
}

input CheckUserExistsInput {
  """The user"""
  user: String!
  clientMutationId: String
}

type ReadNotificationPayload {
  notification: UserNotification
  clientMutationId: String
}

input ReadNotificationInput {
  notificationId: ID!
  clientMutationId: String
}

type SeePendingNotificationsPayload {
  success: Boolean
  clientMutationId: String
}

input SeePendingNotificationsInput {
  clientMutationId: String
}

type NewNoncePayload {
  nonce: Nonce!
  clientMutationId: String
}

input NewNonceInput {
  name: String!
  callbackUrl: String!
  clientMutationId: String
}

type ValidateNoncePayload {
  nonce: Nonce!
  clientMutationId: String
}

input ValidateNonceInput {
  id: ID!
  secret: String!
  clientMutationId: String
}

type InvalidateNoncePayload {
  nonce: Nonce!
  clientMutationId: String
}

input InvalidateNonceInput {
  id: ID!
  secret: String!
  clientMutationId: String
}

type MFATOTPTokenType {
  qr: String
  secretKey: String
}

input MFATOTPGetTokenInput {
  clientMutationId: String
}

type MFATOTPVerifyPayload {
  status: MFATOTPVerifyStatus
  clientMutationId: String
}

enum MFATOTPVerifyStatus {
  SUCCESS
  RECOVERY
}

input MFATOTPVerifyInput {
  answer: String!
  secretKey: String!
  clientMutationId: String
}

"""Response object for MFAAuth mutation."""
type MFAAuthResponse {
  success: Boolean!
  token: String
  refreshToken: String
  username: String
  refreshTokenExpiresIn: Int
}

input MFATOTPAuthInput {
  username: String!
  otp: String!
  clientMutationId: String
}

type MFARecoveryCodes {
  codes: [String]!
}

input MFAGenerateRecoveryTokenInput {
  clientMutationId: String
}

input MFARecoveryAuthInput {
  username: String!
  otp: String!
  clientMutationId: String
}

input MFAEmailAuthInput {
  username: String!
  otp: String!
  clientMutationId: String
}

type MFAEmailGenerationResponse {
  success: Boolean!
}

input MFAGenerateEmailOTPInput {
  clientMutationId: String
}

type PublishPublicKeyPayload {
  success: Boolean!
  publicKey: PublicKey!
  clientMutationId: String
}

input PublishPublicKeyInput {
  keyId: String!
  key: String!
  verifyingSignatureId: String
  clientMutationId: String
}

type PublishPackagePayload {
  success: Boolean!
  packageVersion: PackageVersion
  packageWebc: PackageWebc
  clientMutationId: String
}

input PublishPackageInput {
  manifest: String!
  name: String
  namespace: String
  version: String
  description: String
  license: String
  licenseFile: String
  readme: String
  repository: String
  homepage: String
  file: String
  signedUrl: String
  signature: InputSignature

  """The package icon"""
  icon: String

  """Whether the package is private"""
  private: Boolean = false

  """The upload format of the package"""
  uploadFormat: UploadFormat = targz

  """Whether to wait for webc generation to finish"""
  wait: Boolean = false
  clientMutationId: String
}

input InputSignature {
  publicKeyKeyId: String!
  data: String!
}

enum UploadFormat {
  targz
  webcv2
  webcv3
}

type PushPackageReleasePayload {
  success: Boolean!
  packageWebc: PackageWebc
  clientMutationId: String
}

input PushPackageReleaseInput {
  namespace: String!
  signedUrl: String!
  name: String

  """Whether the package is private"""
  private: Boolean = false
  clientMutationId: String
}

type TagPackageReleasePayload {
  success: Boolean!
  packageVersion: PackageVersion
  clientMutationId: String
}

input TagPackageReleaseInput {
  packageReleaseId: ID!
  version: String!
  name: String
  manifest: String
  namespace: String
  description: String
  license: String
  licenseFile: String
  readme: String
  repository: String
  homepage: String
  signature: InputSignature

  """The package icon"""
  icon: String
  private: Boolean = false
  clientMutationId: String
}

type UpdatePackagePayload {
  package: Package!
  clientMutationId: String
}

input UpdatePackageInput {
  packageId: ID!

  """The package icon"""
  icon: String
  clientMutationId: String
}

type LikePackagePayload {
  package: Package!
  clientMutationId: String
}

input LikePackageInput {
  packageId: ID!
  clientMutationId: String
}

type UnlikePackagePayload {
  package: Package!
  clientMutationId: String
}

input UnlikePackageInput {
  packageId: ID!
  clientMutationId: String
}

type WatchPackagePayload {
  package: Package!
  clientMutationId: String
}

input WatchPackageInput {
  packageId: ID!
  clientMutationId: String
}

type UnwatchPackagePayload {
  package: Package!
  clientMutationId: String
}

input UnwatchPackageInput {
  packageId: ID!
  clientMutationId: String
}

type ArchivePackagePayload {
  package: Package!
  clientMutationId: String
}

input ArchivePackageInput {
  packageId: ID!
  clientMutationId: String
}

type RenamePackagePayload {
  package: Package!
  clientMutationId: String
}

input RenamePackageInput {
  packageId: ID!
  newName: String!
  clientMutationId: String
}

type ChangePackageVersionArchivedStatusPayload {
  packageVersion: PackageVersion!
  clientMutationId: String
}

input ChangePackageVersionArchivedStatusInput {
  packageVersionId: ID!
  isArchived: Boolean
  clientMutationId: String
}

type CreateNamespacePayload {
  namespace: Namespace!
  user: User!
  clientMutationId: String
}

input CreateNamespaceInput {
  name: String!

  """The namespace display name"""
  displayName: String

  """The namespace description"""
  description: String

  """The namespace avatar"""
  avatar: String
  clientMutationId: String
}

type UpdateNamespacePayload {
  namespace: Namespace!
  clientMutationId: String
}

input UpdateNamespaceInput {
  namespaceId: ID!

  """The namespace slug name"""
  name: String

  """The namespace display name"""
  displayName: String

  """The namespace description"""
  description: String

  """The namespace avatar"""
  avatar: String

  """
  The user Twitter (it can be the url, or the handle with or without the @)
  """
  twitter: String

  """
  The user Github (it can be the url, or the handle with or without the @)
  """
  github: String

  """The user website (it must be a valid url)"""
  websiteUrl: String
  clientMutationId: String
}

type DeleteNamespacePayload {
  success: Boolean!
  clientMutationId: String
}

input DeleteNamespaceInput {
  namespaceId: ID!
  clientMutationId: String
}

type InviteNamespaceCollaboratorPayload {
  invite: NamespaceCollaboratorInvite!
  namespace: Namespace!
  clientMutationId: String
}

input InviteNamespaceCollaboratorInput {
  namespaceId: ID!
  role: GrapheneRole!
  username: String
  email: String
  clientMutationId: String
}

type AcceptNamespaceCollaboratorInvitePayload {
  namespaceCollaboratorInvite: NamespaceCollaboratorInvite!
  clientMutationId: String
}

input AcceptNamespaceCollaboratorInviteInput {
  inviteId: ID!
  clientMutationId: String
}

type RemoveNamespaceCollaboratorInvitePayload {
  namespace: Namespace!
  clientMutationId: String
}

input RemoveNamespaceCollaboratorInviteInput {
  inviteId: ID!
  clientMutationId: String
}

type RemoveNamespaceCollaboratorPayload {
  namespace: Namespace!
  clientMutationId: String
}

input RemoveNamespaceCollaboratorInput {
  namespaceCollaboratorId: ID!
  clientMutationId: String
}

type UpdateNamespaceCollaboratorRolePayload {
  collaborator: NamespaceCollaborator!
  clientMutationId: String
}

input UpdateNamespaceCollaboratorRoleInput {
  namespaceCollaboratorId: ID!
  role: GrapheneRole!
  clientMutationId: String
}

type UpdateNamespaceCollaboratorInviteRolePayload {
  collaboratorInvite: NamespaceCollaboratorInvite!
  clientMutationId: String
}

input UpdateNamespaceCollaboratorInviteRoleInput {
  namespaceCollaboratorInviteId: ID!
  role: GrapheneRole!
  clientMutationId: String
}

type InvitePackageCollaboratorPayload {
  invite: PackageCollaboratorInvite!
  package: Package!
  clientMutationId: String
}

input InvitePackageCollaboratorInput {
  packageName: String!
  role: GrapheneRole!
  username: String
  email: String
  clientMutationId: String
}

type AcceptPackageCollaboratorInvitePayload {
  packageCollaboratorInvite: PackageCollaboratorInvite!
  clientMutationId: String
}

input AcceptPackageCollaboratorInviteInput {
  inviteId: ID!
  clientMutationId: String
}

type RemovePackageCollaboratorInvitePayload {
  package: Package!
  clientMutationId: String
}

input RemovePackageCollaboratorInviteInput {
  inviteId: ID!
  clientMutationId: String
}

type UpdatePackageCollaboratorRolePayload {
  collaborator: PackageCollaborator!
  clientMutationId: String
}

input UpdatePackageCollaboratorRoleInput {
  packageCollaboratorId: ID!
  role: GrapheneRole!
  clientMutationId: String
}

type UpdatePackageCollaboratorInviteRolePayload {
  collaboratorInvite: PackageCollaboratorInvite!
  clientMutationId: String
}

input UpdatePackageCollaboratorInviteRoleInput {
  packageCollaboratorInviteId: ID!
  role: GrapheneRole!
  clientMutationId: String
}

type RemovePackageCollaboratorPayload {
  package: Package!
  clientMutationId: String
}

input RemovePackageCollaboratorInput {
  packageCollaboratorId: ID!
  clientMutationId: String
}

type RequestPackageTransferPayload {
  package: Package!
  wasInstantlyTransferred: Boolean!
  packageTransferRequest: PackageTransferRequest
  clientMutationId: String
}

input RequestPackageTransferInput {
  packageId: ID!
  newOwnerId: ID!
  clientMutationId: String
}

type AcceptPackageTransferRequestPayload {
  package: Package!
  packageTransferRequest: PackageTransferRequest!
  clientMutationId: String
}

input AcceptPackageTransferRequestInput {
  packageTransferRequestId: ID!
  clientMutationId: String
}

type RemovePackageTransferRequestPayload {
  package: Package!
  clientMutationId: String
}

input RemovePackageTransferRequestInput {
  packageTransferRequestId: ID!
  clientMutationId: String
}

type GenerateBindingsForAllPackagesPayload {
  message: String!
  clientMutationId: String
}

input GenerateBindingsForAllPackagesInput {
  bindingsGeneratorId: ID
  bindingsGeneratorCommand: String
  clientMutationId: String
}

type MakePackagePublicPayload {
  package: Package!
  clientMutationId: String
}

input MakePackagePublicInput {
  """The ID of the package to make public"""
  id: ID!
  clientMutationId: String
}

type GenerateUploadUrlPayload {
  signedUrl: SignedUrl!
  clientMutationId: String
}

input GenerateUploadUrlInput {
  name: String
  version: String = "latest"
  filename: String
  expiresAfterSeconds: Int = 60
  clientMutationId: String
}

type Subscription {
  streamLogs(
    appVersionId: ID!

    """
    Get logs starting from this timestamp. Takes ISO timestamp in UTC timezone.
    """
    startingFromISO: DateTime

    """
    Fetch logs until this timestamp. Takes ISO timestamp in UTC timezone. If specified, the subscription will at this time.
    """
    untilISO: DateTime

    """Filter logs by stream"""
    streams: [LogStream]

    """Filter logs by instance ids"""
    instanceIds: [String]

    """Filter logs by request ID"""
    requestId: String

    """Search logs for this term"""
    searchTerm: String
  ): Log!
  waitOnRepoCreation(repoId: ID!): Boolean!
  appIsPublishedFromRepo(repoId: ID!): DeployAppVersion!
  publishAppFromRepoAutobuild(repoUrl: String!, appName: String!, owner: String, buildCmd: String, installCmd: String, databaseName: String, secrets: [SecretInput]): AutobuildLog
  fetchBuildLogs(buildId: String!): String
  packageVersionCreated(publishedBy: ID, ownerId: ID): PackageVersion!

  """Subscribe to package version ready"""
  packageVersionReady(packageVersionId: ID!): PackageVersionReadyResponse!
  userNotificationCreated(userId: ID!): UserNotificationCreated!
}

"""Log entry for Deploying app from github repo"""
type AutobuildLog {
  """Kind of log message."""
  kind: AutoBuildDeployAppLogKind!

  """Log message"""
  message: String
  appVersion: DeployAppVersion

  """The database password, if DB was setup."""
  dbPassword: String
}

enum AutoBuildDeployAppLogKind {
  LOG
  COMPLETE
}

type PackageVersionReadyResponse {
  state: PackageVersionState!
  packageVersion: PackageVersion!
  success: Boolean!
}

enum PackageVersionState {
  WEBC_GENERATED
  BINDINGS_GENERATED
  NATIVE_EXES_GENERATED
}

type UserNotificationCreated {
  notification: UserNotification
  notificationDeletedId: ID
}
