Full Code of comigor/artemis for AI

beta 93a726510197 cached
154 files
809.4 KB
194.9k tokens
383 symbols
1 requests
Download .txt
Showing preview only (861K chars total). Download the full file or copy to clipboard to get everything.
Repository: comigor/artemis
Branch: beta
Commit: 93a726510197
Files: 154
Total size: 809.4 KB

Directory structure:
gitextract_38k7t15o/

├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── library-scripts/
│       ├── README.md
│       └── common-debian.sh
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug-report.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── pull_request.yaml
│       └── push.yaml
├── .gitignore
├── CHANGELOG.md
├── FUNDING.yml
├── LICENSE
├── README.md
├── analysis_options.yaml
├── build.yaml
├── example/
│   ├── .gitignore
│   ├── README.md
│   ├── github/
│   │   ├── .gitignore
│   │   ├── build.yaml
│   │   ├── lib/
│   │   │   ├── graphql/
│   │   │   │   ├── search_repositories.dart
│   │   │   │   ├── search_repositories.graphql
│   │   │   │   ├── search_repositories.graphql.dart
│   │   │   │   └── search_repositories.graphql.g.dart
│   │   │   └── main.dart
│   │   └── pubspec.yaml
│   ├── graphbrainz/
│   │   ├── build.yaml
│   │   ├── lib/
│   │   │   ├── coercers.dart
│   │   │   ├── graphbrainz.schema.graphql
│   │   │   ├── main.dart
│   │   │   └── queries/
│   │   │       ├── ed_sheeran.query.dart
│   │   │       ├── ed_sheeran.query.graphql
│   │   │       ├── ed_sheeran.query.graphql.dart
│   │   │       └── ed_sheeran.query.graphql.g.dart
│   │   └── pubspec.yaml
│   ├── hasura/
│   │   ├── build.yaml
│   │   ├── graphql/
│   │   │   └── messages_with_users.graphql
│   │   ├── hasura.sql
│   │   ├── lib/
│   │   │   ├── graphql/
│   │   │   │   ├── messages_with_users.graphql.dart
│   │   │   │   └── messages_with_users.graphql.g.dart
│   │   │   └── main.dart
│   │   ├── pubspec.yaml
│   │   └── schema.graphql
│   └── pokemon/
│       ├── build.yaml
│       ├── graphql/
│       │   ├── big_query.query.graphql
│       │   ├── fragment_query.query.graphql
│       │   ├── fragments_glob.fragment.graphql
│       │   ├── fragments_glob.query.graphql
│       │   └── simple_query.query.graphql
│       ├── lib/
│       │   ├── graphql/
│       │   │   ├── big_query.dart
│       │   │   ├── big_query.graphql.dart
│       │   │   ├── big_query.graphql.g.dart
│       │   │   ├── fragment_query.dart
│       │   │   ├── fragment_query.graphql.dart
│       │   │   ├── fragment_query.graphql.g.dart
│       │   │   ├── fragments_glob.dart
│       │   │   ├── fragments_glob.graphql.dart
│       │   │   ├── fragments_glob.graphql.g.dart
│       │   │   ├── simple_query.dart
│       │   │   ├── simple_query.graphql.dart
│       │   │   └── simple_query.graphql.g.dart
│       │   └── main.dart
│       ├── pokemon.schema.graphql
│       └── pubspec.yaml
├── lib/
│   ├── artemis.dart
│   ├── builder.dart
│   ├── client.dart
│   ├── generator/
│   │   ├── data/
│   │   │   ├── class_definition.dart
│   │   │   ├── class_property.dart
│   │   │   ├── data.dart
│   │   │   ├── definition.dart
│   │   │   ├── enum_definition.dart
│   │   │   ├── enum_value_definition.dart
│   │   │   ├── fragment_class_definition.dart
│   │   │   ├── library_definition.dart
│   │   │   ├── nullable.dart
│   │   │   ├── query_definition.dart
│   │   │   └── query_input.dart
│   │   ├── data_printer.dart
│   │   ├── ephemeral_data.dart
│   │   ├── errors.dart
│   │   ├── graphql_helpers.dart
│   │   ├── helpers.dart
│   │   └── print_helpers.dart
│   ├── generator.dart
│   ├── schema/
│   │   ├── graphql_query.dart
│   │   ├── graphql_response.dart
│   │   ├── options.dart
│   │   └── options.g2.dart
│   ├── transformer/
│   │   └── add_typename_transformer.dart
│   └── visitor/
│       ├── canonical_visitor.dart
│       ├── generator_visitor.dart
│       ├── object_type_definition_visitor.dart
│       ├── operation_type_definition_visitor.dart
│       ├── schema_definition_visitor.dart
│       └── type_definition_node_visitor.dart
├── pubspec.yaml
├── test/
│   ├── generator/
│   │   ├── helpers_test.dart
│   │   └── print_helpers_test.dart
│   ├── helpers.dart
│   └── query_generator/
│       ├── aliases/
│       │   ├── alias_on_leaves_test.dart
│       │   └── alias_on_object_test.dart
│       ├── append_type_name_test.dart
│       ├── ast_schema/
│       │   ├── field_not_found_mutation_test.dart
│       │   ├── input_types_test.dart
│       │   ├── missing_schema_test.dart
│       │   └── multiple_schema_mappint_test.dart
│       ├── deprecated/
│       │   ├── deprecated_enum_value_test.dart
│       │   ├── deprecated_field_test.dart
│       │   ├── deprecated_input_object_field_test.dart
│       │   └── deprecated_interface_field_test.dart
│       ├── enums/
│       │   ├── enum_duplication_test.dart
│       │   ├── enum_list_test.dart
│       │   ├── filter_enum_test.dart
│       │   ├── input_enum_list_test.dart
│       │   ├── input_enum_test.dart
│       │   ├── kw_prefix_test.dart
│       │   └── query_enum_test.dart
│       ├── errors/
│       │   ├── fragment_not_found_test.dart
│       │   ├── generation_errors_test.dart
│       │   └── root_type_not_found_test.dart
│       ├── forwarder_test.dart
│       ├── fragments/
│       │   ├── fragment_duplication_test.dart
│       │   ├── fragment_glob_schema_level_test.dart
│       │   ├── fragment_glob_test.dart
│       │   ├── fragment_multiple_queries_test.dart
│       │   ├── fragment_on_fragments_test.dart
│       │   ├── fragments_multiple_test.dart
│       │   ├── fragments_test.dart
│       │   └── multiple_references_on_simple_naming_test.dart
│       ├── interfaces/
│       │   ├── interface_fragment_glob_test.dart
│       │   ├── interface_possible_types_test.dart
│       │   └── interface_test.dart
│       ├── multiple_operations_per_file_test.dart
│       ├── multiple_queries_test.dart
│       ├── mutations_and_inputs/
│       │   ├── complex_input_objects_test.dart
│       │   ├── custom_scalars_on_input_objects_test.dart
│       │   ├── filter_input_objects_test.dart
│       │   ├── input_duplication_test.dart
│       │   ├── mutations_test.dart
│       │   ├── non_nullable_list_inputs_test.dart
│       │   └── recursive_input_test.dart
│       ├── naming/
│       │   ├── casing_conversion_test.dart
│       │   ├── common.dart
│       │   ├── pathed_with_fields_test.dart
│       │   └── simple_naming_test.dart
│       ├── nnbd_test.dart
│       ├── query_generator_test.dart
│       ├── scalars/
│       │   ├── custom_scalars_test.dart
│       │   ├── scalars_test.dart
│       │   └── unused_custom_scalars_test.dart
│       ├── subscription_test.dart
│       └── union/
│           ├── union_types_test.dart
│           └── union_with_nested_types_test.dart
└── tool/
    └── fetch_schema.dart

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/Dockerfile
================================================
# Update VARIANT in devcontainer.json to pick a Dart version
ARG VARIANT=2
FROM google/dart:${VARIANT}

# [Option] Install zsh
ARG INSTALL_ZSH="true"
# [Option] Upgrade OS packages to their latest versions
ARG UPGRADE_PACKAGES="false"

# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
COPY library-scripts/*.sh /tmp/library-scripts/
RUN apt-get update \
    && /bin/bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
    && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts

# Add bin location to path
ENV PUB_CACHE="/usr/local/share/pub-cache"
ENV PATH="${PATH}:${PUB_CACHE}/bin"
RUN mkdir -p ${PUB_CACHE} \
    && chown ${USERNAME}:root ${PUB_CACHE} \
    && echo "if [ \"\$(stat -c '%U' ${PUB_CACHE})\" != \"${USERNAME}\" ]; then sudo chown -R ${USER_UID}:root ${PUB_CACHE}; fi" \
    | tee -a /root/.bashrc /root/.zshrc /home/${USERNAME}/.bashrc >> /home/${USERNAME}/.zshrc

# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
#     && apt-get -y install --no-install-recommends <your-package-list-here>

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
	"name": "Dart",
	"build": {
		"dockerfile": "Dockerfile",
		// Update VARIANT to pick a Dart version
		"args": {
			"VARIANT": "2",
		},
	},
	// Set *default* container specific settings.json values on container create.
	"settings": {
		"editor.formatOnSave": true,
		"terminal.integrated.shell.linux": "/usr/bin/zsh",
		"editor.fontLigatures": true,
		"workbench.colorTheme": "Default Dark+",
		"editor.fontFamily": "'Jetbrains Mono', Menlo, Monaco, 'Courier New', monospace",
	},
	// Add the IDs of extensions you want installed when the container is created.
	"extensions": [
		"dart-code.dart-code",
		"dart-code.flutter",
		"redhat.vscode-yaml",
		"luanpotter.dart-import",
		"jeroen-meijer.pubspec-assist",
		"kumar-harsh.graphql-for-vscode",
	],
	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],
	// Use 'postCreateCommand' to run commands after the container is created.
	// "postCreateCommand": "uname -a",
	// Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
	// "remoteUser": "vscode"
}

================================================
FILE: .devcontainer/library-scripts/README.md
================================================
# Warning: Folder contents may be replaced

The contents of this folder will be automatically replaced with a file of the same name in the [vscode-dev-containers](https://github.com/microsoft/vscode-dev-containers) repository's [script-library folder](https://github.com/microsoft/vscode-dev-containers/tree/master/script-library) whenever the repository is packaged.

To retain your edits, move the file to a different location. You may also delete the files if they are not needed.

================================================
FILE: .devcontainer/library-scripts/common-debian.sh
================================================
#!/usr/bin/env bash
#-------------------------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
#-------------------------------------------------------------------------------------------------------------
#
# Docs: https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/docs/common.md
#
# Syntax: ./common-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] [install Oh My *! flag]

INSTALL_ZSH=${1:-"true"}
USERNAME=${2:-"automatic"}
USER_UID=${3:-"automatic"}
USER_GID=${4:-"automatic"}
UPGRADE_PACKAGES=${5:-"true"}
INSTALL_OH_MYS=${6:-"true"}

set -e

if [ "$(id -u)" -ne 0 ]; then
    echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
    exit 1
fi

# If in automatic mode, determine if a user already exists, if not use vscode
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
    USERNAME=""
    POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)")
    for CURRENT_USER in ${POSSIBLE_USERS[@]}; do
        if id -u ${CURRENT_USER} > /dev/null 2>&1; then
            USERNAME=${CURRENT_USER}
            break
        fi
    done
    if [ "${USERNAME}" = "" ]; then
        USERNAME=vscode
    fi
elif [ "${USERNAME}" = "none" ]; then
    USERNAME=root
    USER_UID=0
    USER_GID=0
fi

# Load markers to see which steps have already run
MARKER_FILE="/usr/local/etc/vscode-dev-containers/common"
if [ -f "${MARKER_FILE}" ]; then
    echo "Marker file found:"
    cat "${MARKER_FILE}"
    source "${MARKER_FILE}"
fi

# Ensure apt is in non-interactive to avoid prompts
export DEBIAN_FRONTEND=noninteractive

# Function to call apt-get if needed
apt-get-update-if-needed()
{
    if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then
        echo "Running apt-get update..."
        apt-get update
    else
        echo "Skipping apt-get update."
    fi
}

# Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies
if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then
    apt-get-update-if-needed

    PACKAGE_LIST="apt-utils \
        git \
        openssh-client \
        gnupg2 \
        iproute2 \
        procps \
        lsof \
        htop \
        net-tools \
        psmisc \
        curl \
        wget \
        rsync \
        ca-certificates \
        unzip \
        zip \
        nano \
        vim-tiny \
        less \
        jq \
        lsb-release \
        apt-transport-https \
        dialog \
        libc6 \
        libgcc1 \
        libgssapi-krb5-2 \
        libicu[0-9][0-9] \
        liblttng-ust0 \
        libstdc++6 \
        zlib1g \
        locales \
        sudo \
        ncdu \
        man-db"

    # Install libssl1.1 if available
    if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then
        PACKAGE_LIST="${PACKAGE_LIST}       libssl1.1"
    fi
    
    # Install appropriate version of libssl1.0.x if available
    LIBSSL=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '')
    if [ "$(echo "$LIBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then
        if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then
            # Debian 9
            PACKAGE_LIST="${PACKAGE_LIST}       libssl1.0.2"
        elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then
            # Ubuntu 18.04, 16.04, earlier
            PACKAGE_LIST="${PACKAGE_LIST}       libssl1.0.0"
        fi
    fi

    echo "Packages to verify are installed: ${PACKAGE_LIST}"
    apt-get -y install --no-install-recommends ${PACKAGE_LIST} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 )
        
    PACKAGES_ALREADY_INSTALLED="true"
fi

# Get to latest versions of all packages
if [ "${UPGRADE_PACKAGES}" = "true" ]; then
    apt-get-update-if-needed
    apt-get -y upgrade --no-install-recommends
    apt-get autoremove -y
fi

# Ensure at least the en_US.UTF-8 UTF-8 locale is available.
# Common need for both applications and things like the agnoster ZSH theme.
if [ "${LOCALE_ALREADY_SET}" != "true" ] && ! grep -o -E '^\s*en_US.UTF-8\s+UTF-8' /etc/locale.gen > /dev/null; then
    echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen 
    locale-gen
    LOCALE_ALREADY_SET="true"
fi

# Create or update a non-root user to match UID/GID.
if id -u ${USERNAME} > /dev/null 2>&1; then
    # User exists, update if needed
    if [ "${USER_GID}" != "automatic" ] && [ "$USER_GID" != "$(id -G $USERNAME)" ]; then 
        groupmod --gid $USER_GID $USERNAME 
        usermod --gid $USER_GID $USERNAME
    fi
    if [ "${USER_UID}" != "automatic" ] && [ "$USER_UID" != "$(id -u $USERNAME)" ]; then 
        usermod --uid $USER_UID $USERNAME
    fi
else
    # Create user
    if [ "${USER_GID}" = "automatic" ]; then
        groupadd $USERNAME
    else
        groupadd --gid $USER_GID $USERNAME
    fi
    if [ "${USER_UID}" = "automatic" ]; then 
        useradd -s /bin/bash --gid $USERNAME -m $USERNAME
    else
        useradd -s /bin/bash --uid $USER_UID --gid $USERNAME -m $USERNAME
    fi
fi

# Add add sudo support for non-root user
if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then
    echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME
    chmod 0440 /etc/sudoers.d/$USERNAME
    EXISTING_NON_ROOT_USER="${USERNAME}"
fi

# ** Shell customization section **
if [ "${USERNAME}" = "root" ]; then 
    USER_RC_PATH="/root"
else
    USER_RC_PATH="/home/${USERNAME}"
fi

# .bashrc/.zshrc snippet
RC_SNIPPET="$(cat << EOF
export USER=\$(whoami)

export PATH=\$PATH:\$HOME/.local/bin
EOF
)"

# code shim, it fallbacks to code-insiders if code is not available
cat << 'EOF' > /usr/local/bin/code
#!/bin/sh

get_in_path_except_current() {
  which -a "$1" | grep -v "$0" | head -1
}

code="$(get_in_path_except_current code)"

if [ -n "$code" ]; then
  exec "$code" "$@"
elif [ "$(command -v code-insiders)" ]; then
  exec code-insiders "$@"
else
  echo "code or code-insiders is not installed" >&2
  exit 127
fi
EOF
chmod +x /usr/local/bin/code

# Codespaces themes - partly inspired by https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/robbyrussell.zsh-theme
CODESPACES_BASH="$(cat \
<<EOF
#!/usr/bin/env bash
prompt() {
    if [ "\$?" != "0" ]; then
        local arrow_color=\${bold_red}
    else
        local arrow_color=\${reset_color}
    fi
    if [ ! -z "\${GITHUB_USER}" ]; then
        local USERNAME="@\${GITHUB_USER}"
    else
        local USERNAME="\\u"
    fi
    local cwd="\$(pwd | sed "s|^\${HOME}|~|")"
    PS1="\${green}\${USERNAME} \${arrow_color}➜\${reset_color} \${bold_blue}\${cwd}\${reset_color} \$(scm_prompt_info)\${white}$ \${reset_color}"
}
SCM_THEME_PROMPT_PREFIX="\${reset_color}\${cyan}(\${bold_red}"
SCM_THEME_PROMPT_SUFFIX="\${reset_color} "
SCM_THEME_PROMPT_DIRTY=" \${bold_yellow}✗\${reset_color}\${cyan})"
SCM_THEME_PROMPT_CLEAN="\${reset_color}\${cyan})"
SCM_GIT_SHOW_MINIMAL_INFO="true"
safe_append_prompt_command prompt
EOF
)"
CODESPACES_ZSH="$(cat \
<<EOF
prompt() {
    if [ ! -z "\${GITHUB_USER}" ]; then
        local USERNAME="@\${GITHUB_USER}"
    else
        local USERNAME="%n"
    fi
    PROMPT="%{\$fg[green]%}\${USERNAME} %(?:%{\$reset_color%}➜ :%{\$fg_bold[red]%}➜ )"
    PROMPT+='%{\$fg_bold[blue]%}%~%{\$reset_color%} \$(git_prompt_info)%{\$fg[white]%}$ %{\$reset_color%}'
}
ZSH_THEME_GIT_PROMPT_PREFIX="%{\$fg_bold[cyan]%}(%{\$fg_bold[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{\$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY=" %{\$fg_bold[yellow]%}✗%{\$fg_bold[cyan]%})"
ZSH_THEME_GIT_PROMPT_CLEAN="%{\$fg_bold[cyan]%})"
prompt
EOF
)"

# Adapted Oh My Zsh! install step to work with both "Oh Mys" rather than relying on an installer script
# See https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh for offical script.
install-oh-my()
{
    local OH_MY=$1
    local OH_MY_INSTALL_DIR="${USER_RC_PATH}/.oh-my-${OH_MY}"
    local TEMPLATE="${OH_MY_INSTALL_DIR}/templates/$2"
    local OH_MY_GIT_URL=$3
    local USER_RC_FILE="${USER_RC_PATH}/.${OH_MY}rc"

    if [ -d "${OH_MY_INSTALL_DIR}" ] || [ "${INSTALL_OH_MYS}" != "true" ]; then
        return 0
    fi

    umask g-w,o-w
    mkdir -p ${OH_MY_INSTALL_DIR}
    git clone --depth=1 \
        -c core.eol=lf \
        -c core.autocrlf=false \
        -c fsck.zeroPaddedFilemode=ignore \
        -c fetch.fsck.zeroPaddedFilemode=ignore \
        -c receive.fsck.zeroPaddedFilemode=ignore \
        ${OH_MY_GIT_URL} ${OH_MY_INSTALL_DIR} 2>&1
    echo -e "$(cat "${TEMPLATE}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${USER_RC_FILE}
    if [ "${OH_MY}" = "bash" ]; then
        sed -i -e 's/OSH_THEME=.*/OSH_THEME="codespaces"/g' ${USER_RC_FILE}
        mkdir -p ${OH_MY_INSTALL_DIR}/custom/themes/codespaces
        echo "${CODESPACES_BASH}" > ${OH_MY_INSTALL_DIR}/custom/themes/codespaces/codespaces.theme.sh
    else
        sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="codespaces"/g' ${USER_RC_FILE}
        mkdir -p ${OH_MY_INSTALL_DIR}/custom/themes
        echo "${CODESPACES_ZSH}" > ${OH_MY_INSTALL_DIR}/custom/themes/codespaces.zsh-theme
    fi
    # Shrink git while still enabling updates
    cd ${OH_MY_INSTALL_DIR} 
    git repack -a -d -f --depth=1 --window=1

    if [ "${USERNAME}" != "root" ]; then
        cp -rf ${USER_RC_FILE} ${OH_MY_INSTALL_DIR} /root
        chown -R ${USERNAME}:${USERNAME} ${USER_RC_PATH}
    fi
}

if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then
    echo "${RC_SNIPPET}" >> /etc/bash.bashrc
    RC_SNIPPET_ALREADY_ADDED="true"
fi
install-oh-my bash bashrc.osh-template https://github.com/ohmybash/oh-my-bash

# Optionally install and configure zsh and Oh My Zsh!
if [ "${INSTALL_ZSH}" = "true" ]; then
    if ! type zsh > /dev/null 2>&1; then
        apt-get-update-if-needed
        apt-get install -y zsh
    fi
    if [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then
        echo "${RC_SNIPPET}" >> /etc/zsh/zshrc
        ZSH_ALREADY_INSTALLED="true"
    fi
    install-oh-my zsh zshrc.zsh-template https://github.com/ohmyzsh/ohmyzsh
fi

# Write marker file
mkdir -p "$(dirname "${MARKER_FILE}")"
echo -e "\
    PACKAGES_ALREADY_INSTALLED=${PACKAGES_ALREADY_INSTALLED}\n\
    LOCALE_ALREADY_SET=${LOCALE_ALREADY_SET}\n\
    EXISTING_NON_ROOT_USER=${EXISTING_NON_ROOT_USER}\n\
    RC_SNIPPET_ALREADY_ADDED=${RC_SNIPPET_ALREADY_ADDED}\n\
    ZSH_ALREADY_INSTALLED=${ZSH_ALREADY_INSTALLED}" > "${MARKER_FILE}"

echo "Done!"


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

**Before reporting a bug, please test the beta branch!**

## Bug description
Please describe what happened wrong and the expected behaviour/output.

## Specs
Artemis version: [e.g. 6.0.3-beta.1]
<details>
<summary>build.yaml:</summary>
  
```yaml
# Please paste your `build.yaml` file
```
</details>
<details>
<summary>Artemis output:</summary>
  
```bash
# Please paste the output of
$ flutter pub run build_runner build --verbose
#or
$ pub run build_runner build --verbose
```
</details>
<details>
<summary>GraphQL schema:</summary>

```graphql
# If possible, please paste your GraphQL schema file,
# or a minimum reproducible schema of the bug.
```
</details>
<details>
<summary>GraphQL query:</summary>

```graphql
# If possible, please paste your GraphQL query file,
# or a minimum reproducible query of the bug.
```
</details>


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
**Make sure you're opening this pull request pointing to beta branch!**

## What does this PR do/solve?


================================================
FILE: .github/workflows/pull_request.yaml
================================================
on: pull_request

name: CI

jobs:
  check-version-and-changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: comigor/actions/check-version-and-changelog@master
        with:
          repo_token: ${{ github.token }}
          base_ref: ${{ github.base_ref }}
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Check formatting
        if: always() && steps.install.outcome == 'success'
        run: dart format --set-exit-if-changed .
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Test
        if: always() && steps.install.outcome == 'success'
        run: dart test
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Analyze
        if: always() && steps.install.outcome == 'success'
        run: dart analyze


================================================
FILE: .github/workflows/push.yaml
================================================
on:
  push:
    branches:
      - master
      - beta

name: CI

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Check formatting
        if: always() && steps.install.outcome == 'success'
        run: dart format --set-exit-if-changed .
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Test
        if: always() && steps.install.outcome == 'success'
        run: dart test
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Analyze
        if: always() && steps.install.outcome == 'success'
        run: dart analyze
  create-tag-and-release:
    needs:
      - lint
      - test
      - analyze
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/beta'
    steps:
      - uses: actions/checkout@master
      - id: check_version_and_changelog
        name: Check if version on pubspec.yaml was changed and if there's an entry for this new version on CHANGELOG
        uses: comigor/actions/check-version-and-changelog@master
        with:
          base_ref: "${{ github.ref }}"
      - name: Push tag
        uses: anothrNick/github-tag-action@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          CUSTOM_TAG: "v${{ steps.check_version_and_changelog.outputs.package_version }}"
      - name: Create release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: "v${{ steps.check_version_and_changelog.outputs.package_version }}"
          release_name: "Release v${{ steps.check_version_and_changelog.outputs.package_version }}"
  deploy:
    needs: create-tag-and-release
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/beta'
    steps:
      - uses: actions/checkout@master
      - uses: dart-lang/setup-dart@v1.3
        with:
          sdk: stable
      - id: install
        name: Install dependencies
        run: dart pub get
      - name: Publish to pub.dev
        run: |
          mkdir -p ~/.config/dart
          echo '${{ secrets.PUB_CREDENTIALS }}' > ~/.config/dart/pub-credentials.json
          dart pub publish --force


================================================
FILE: .gitignore
================================================

# Created by https://www.gitignore.io/api/dart,macos

### Dart ###
# See https://www.dartlang.org/guides/libraries/private-files

# Files and directories created by pub
.dart_tool/
.packages
.fvm
build/
# If you're building an application, you may want to check-in your pubspec.lock
/pubspec.lock

# Directory created by dartdoc
# If you don't generate documentation locally you can remove this line.
doc/api/

# Avoid committing generated Javascript files:
*.dart.js
*.info.json      # Produced by the --dump-info flag.
*.js             # When generated by dart2js. Don't specify *.js if your
                 # project includes source files written in JavaScript.
*.js_
*.js.deps
*.js.map

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk


# End of https://www.gitignore.io/api/dart,macos

.idea


================================================
FILE: CHANGELOG.md
================================================
# CHANGELOG

## 7.13.1

- Move `beta` version out of beta for pub.dev awareness

## 7.13.0-beta.3

- Add discontinuation notice

## 7.13.0-beta.2

- readme fix

## 7.13.0-beta.1

- package update

## 7.12.0-beta.1

- package update

## 7.11.0-beta.1

- actions/checkout@v3 update

## 7.11.0-beta

- package update

## 7.10.0-beta.4

- fix pipeline quoting issues

## 7.10.0-beta.3

- fix pipeline path, again

## 7.10.0-beta.2

- fix pipeline path

## 7.10.0-beta.1

- update workflows to use official community actions

## 7.10.0-beta

- package update

## 7.9.0-beta

- common fragments overlap fix

## 7.8.0-beta

- package update

## 7.7.0-beta

- package update

## 7.6.1-beta

- operation name constant

## 7.6.2-beta

- generate_queries flag to signify if query documents and operation names should be generated

## 7.6.1-beta

- operation name constant

## 7.6.0-beta

- package updates

## 7.5.0-beta

- there is no need to use `fragments_glob` any more just specify the glob which will include all your graphql docs

## 7.4.0-beta

- allow using file fragments and common fragments at the same time

## 7.3.3-beta

- fix https://github.com/comigor/artemis/issues/373

## 7.3.2-beta

- performance improvements-2

## 7.3.1-beta

- performance improvements

## 7.3.0-beta

- package update

## 7.2.6-beta

- Fix README

## 7.2.5-beta

- Format some files to improve `pana` score

## 7.2.4-beta

- package update

## 7.2.3-beta

- Update examples and make sure they all work

## 7.2.2-beta

- Add throwable errors for missing root object and used query fragments

## 7.2.1-beta

- Update package to use official Dart lint
  following [this guide](https://github.com/dart-lang/lints#migrating-from-packagepedantic)

## 7.2.0-beta.0

- package update

## 7.1.1-beta.1

- support of `fragments_glob` at schema level

## 7.1.0-beta.2

- fix for https://github.com/comigor/artemis/issues/341

## 7.1.0-beta.1

- duplicated $$typename fix

## 7.1.0-beta.0

**BREAKING CHANGE**

- changed the naming of scalar mappers

## 7.0.0-beta.17

- example indentaion fix

## 7.0.0-beta.16

- lazy canonical visitors

## 7.0.0-beta.15

- Update build_runner version in examples
- Update Pokemon API in pokemon example
- Update WebSocketLink in hasura example

## 7.0.0-beta.14

- Support gql context in client's execute and stream methods

## 7.0.0-beta.13

- fix for https://github.com/comigor/artemis/issues/177

## 7.0.0-beta.12

- package update

## 7.0.0-beta.11

- document generation fix for https://github.com/comigor/artemis/issues/307

## 7.0.0-beta.10

- union generation fix for https://github.com/comigor/artemis/issues/284

## 7.0.0-beta.9

- nullable scalar_mapping types

## 7.0.0-beta.8

- packages update

## 7.0.0-beta.7

- config file error handling

## 7.0.0-beta.6

- packages update

## 7.0.0-beta.5

- github example fix
- pokemon example fix
- hasura example fix
- graphbrainz example fix

## 7.0.0-beta.4

- packages update
- null-safe tests

## 7.0.0-beta.3

- document generated in separate variable for easier usage

## 7.0.0-beta.2

- package nnbd migraion

## 7.0.0-beta.1

**MAJOR BREAKING CHANGE**

- Code generated by Artemis is now nnbd-compliant

## 6.20.1-beta.2

- Add codespaces folder

## 6.20.1-beta.1

- Allow for auto generated response and inputs to extend JsonSerializable

## 6.19.3-beta.1

- bugfix of append typename - common fragments

## 6.19.2-beta.1

- bugfix of append typename

## 6.19.1-beta.1

- Append typename flag

## 6.18.2

- Merging beta into master

## 6.18.1-beta.1

- add unknownEnumValue on list enums https://github.com/comigor/artemis/issues/246

## 6.17.3

- Add test case, warning to README, fix CI pipeline

## 6.17.2

- Update dependencies versions

## 6.17.1-beta.1

- package updates and one test fix

## 6.16.1-beta.1

- simple naming schema fix https://github.com/comigor/artemis/issues/226

## 6.15.1-beta.1

- Override annotation fix

## 6.14.1-beta.1

- Package updates

## 6.13.1-beta.1

- input underscore bugfix https://github.com/comigor/artemis/issues/223

## 6.12.3-beta.2

- Subscription test added

## 6.12.3-beta.1

- Readme fix

## 6.12.2-beta.1

- Fixed `ignore_for_file` documentation.

## 6.12.1-beta.1

- Added `ignore_for_file` option to ignore linter rules on generated files.

## 6.11.1-beta.1

- improved canonical types handling

## 6.10.1-beta.1

- Package updates

## 6.9.2-beta.1

- Fixed `toJson() doesn't remove "kw$" prefix`

## 6.8.2-beta.1

- test fix

## 6.8.1-beta.1

- fix for multiple schema_mapping

## 6.7.2-beta.1

- analyzer and linter warnings fix

## 6.7.1-beta.1

- uppercase keyword fix

## 6.6.4-beta.1

- pubspec fix

## 6.6.3-beta.1

- test fix

## 6.6.2-beta.1

- nnbd preparation

## 6.6.1-beta.1

- allow multiple operations per file

## 6.5.2-beta.1

- performance improvements - scan schema for canonical types only once

## 6.5.1-beta.1

- enum name pascal casing.

## 6.5.0-beta.1

- Add deprecated annotations in fields.

## 6.4.4-beta.1

- Build type name recursively, considering casing changes.

## 6.4.3-beta.1

- Mass package update

## 6.3.3-beta.1

- Centralize naming transformations; make types PascalCase and fields camelCase.

## 6.3.2-beta.1

- Recursively consider input lists.

## 6.3.1-beta.1

- Do not throw on unused scalars.

## 6.3.0-beta.1

**MAJOR BREAKING CHANGE**

- all starting underscores are replaced with $
- `__typename` field replaced with `$$typename`
- enums are named according to Dart spec
- fields similar to Dart keywords are prefixed with `kw$`

## 6.2.1-beta.1

- Check for more error causes and throw, explaining the error.

## 6.2.0-beta.1

**MAJOR BREAKING CHANGE**

We've found a regression on `6.1.0-beta.1`, which sends Enums as camelCase to
the server, when they should be sent as SCREAMING_SNAKE_CASE.

- Reverts `6.1.0-beta.1`.

## 6.1.1-beta.2

- Improve actions and check pipeline output.

## 6.1.1-beta.1

- Short-circuit input object generation on recursive detection

## 6.1.0-beta.1

**MAJOR BREAKING CHANGE**

- Convert enum casing to camel case.

## 6.0.11-beta.1

- Convert `ClassProperty` annotation item to `List<String>`.

## 6.0.10-beta.1

- Duplication bug fix

## 6.0.9-beta.1

- Added the exception for the case when `fragment_glob` leads to query files fragments ignore.

## 6.0.8-beta.1

- Adapt Artemis to subscriptions and create an example

## 6.0.7-beta.1

- Fix for the interfaces which uses fragments from fragments_glob

## 6.0.6-beta.1

- Hide build logs under `--verbose` flag

## 6.0.5-beta.1

- Include coercers annotations on custom scalars on input objects.

## 6.0.4-beta.1

- Properly consider "sub-fragments" on class generation.

## 6.0.3-beta.1

- Fix generation of custom scalars and its functions.

## 6.0.2-beta.1

- Fix invalid reference to class on Query generations.

## 6.0.1-beta.1

- End forwarder file with a newline.

## 6.0.0-beta.1

**MAJOR BREAKING CHANGE**

- Generate canonical objects (enums and input objects) with their original
  names on GraphQL. Fragments are also generated with their own names (plus the `Mixin` prefix, for now).
- Make it possible to select a naming scheme to be used for generate the class
  names. `pathedWithTypes` is the default for retrocompatibility, where the names
  of previous types are used as prefix of the next class. This can generate
  duplication on certain schemas. With `pathedWithFields`, the names of previous
  fields are used as prefix of the next class and with `simple`, only the actual
  GraphQL class nameis considered. See discussion on [#90][pr-90] and [#96][pr-96]
  for more information.

## 5.1.0

- Add `.graphql.` to outputted files path, in a non-breaking change way: a
  "forwarder" file will be generated to make it retro-compatible when a
  configurated output doesn't end with `.graphql.dart`.

## 5.0.4

- Update CI to include beta branch.

## 5.0.3

- Update examples to match latest changes.

## 5.0.2

- Use default names for query/mutation root when SDL does not declare `schema`.

## 5.0.1

- Fix generation of recursive input objects introduced by 5.0.0.

## 5.0.0

**MAJOR BREAKING CHANGE**

In this version we moved from `json` to `graphql` (SDL) schema parsing.
This allowed us to get rid off ±1200 lines of code which makes the  
project support much easier. The test files with schema definitions
became more clear and human readable.

If you already have your schema in SDL format, just point to it in `build.yaml`.
If not, use this [snippet][introspection-to-sdl-snippet]
(from [this Apollo article][apollo-3-ways-schema]) or online helpers like
[this one][introspection-to-sdl-online] to convert from one to another.

## 4.0.2

- Only add unknownEnumValue on non-list enums
- Consider all classes to include reference to meta package

## 4.0.1

- Look at mutation root when generating a mutation

## 4.0.0

**MAJOR BREAKING CHANGE**

This version completely refactors how Artemis generate code (by finally
using the implementation of visitor pattern provided by `gql`). On top of that,
I've decided to do other major breaking changes to make code cleaner and more
maintainable. Listed:

- `add_query_prefix` doesn't exist anymore (it's now the default to generate
  classes with its "path" from the query), e.g., this query's `city` field will
  be typed as `CityName$QueryRoot$User$Address$City`:
  ```graphql
  query city_name {
    user {
      address {
        city {
          name
        }
      }
    }
  }
  ```
  This change was also done to tip users to NOT use those generated queries
  directly on their code, to avoid coupling them to your business logic.
- `custom_parser_import` was moved to inside a ScalarMap, and
  `use_custom_parser` was removed.
- `resolve_type_field` option was renamed to `type_name_field`, as `__typename`
  is the correct field name (by GraphQL spec).
- Classes generated for mutation will have a `Mutation` suffix, as queries
  already have `Query` suffix.
- Change pre-generation data classes constructors to named parameters, so if
  you're using `GraphQLQueryBuilder.onBuild`, it will break.

And also:

- Add more logs and errors while generating code, to help debugging.
- Add more/refactor tests.
- Add a GitHub example.

TODO:

- [ ] re-add more logs
- [ ] clean options (?)
- [ ] prefix every class with `$` (?)
- [ ] refactor class naming variables
- [ ] review readme and changelog

## 3.2.1

- Fix unknown enum: add prefix

## 3.2.0

- Make enums loose. When unknown values are provided into an enum, it will fall back to a custom `ARTEMIS_UNKNOWN` value
  avoiding breaking/crashing the client.

## 3.1.0

- Allow to dispose `ArtemisClient` underlining http client when possible

## 3.0.0

- BREAKING: Marks non nullable input field as `@required` [#68][pr-68]

## 2.2.2

- Make lists as input objects work again

## 2.2.1

- Display error on types not found on schema

## 2.2.0+1

- Add "Articles and videos" category on README

## 2.2.0

- Share fragments between queries and schemas (see `fragments_glob`) [#65][pr-65]

## 2.1.4

- Add missing prefix to generated enums

## 2.1.3

- Bump equatable/gql suite, refine GitHub actions

## 2.1.2

- Bump json_serializable/json_annotation

## 2.1.1

- Properly consider Union types on generation

## 2.1.0+1

- Fix GitHub actions deploy pipeline
- Make sure artemis depends on json_annotation

## 2.1.0

- Generate fragments as mixins

## 2.0.7+1

- README updates

## 2.0.7

- Add missing prefix to interfaces

## 2.0.6

- Perserve the query name casing

## 2.0.5

- Bump `gql` package

## 2.0.4

- Bump `gql` package

## 2.0.3

- Generate every field of input objects

## 2.0.2

- Support `__schema` key under the data field or on root of `schema.json`.

## 2.0.1

- Loosen up dependencies to make it work again with Flutter `beta` channel

## 2.0.0

- BREAKING: move `GraphQLError` to `package:gql`. If you don't use it, or just
  reference it indirectly, it will not be breaking, but a major will be bumped
  anyway, just for sure.
- Upgrade `package:gql` to version `0.7.4`
- Build GQL AST into generated Dart code instead of the raw string
- Use `Link` from `package:gql/link` as the execution interface of `ArtemisClient`
- Use `package:gql_dedupe_link` and `package:gql_http_link` as the default links

## 1.0.4

- Add a test to guarantee query inputs can be lists

## 1.0.3

- Disable implicit casts
- Avoid double-parsing the source string

## 1.0.2

- Differentiate lists from named types when looping through variables
- Consider nullable operation name when defining query name

## 1.0.1

- Upgrade `gql` to version `0.2.0` to get rid of direct dependency on `source_span`
  and for better parsing errors.
- Filter for `SchemaMap` with `output` when generating code

## 1.0.0

- Breaking: Add required `output` option to `SchemaMap`
- Make Artemis a `$lib$` synthetic generator
- Add `add_query_prefix` option to `SchemaMap`

## 0.7.0

- Make generated classes a mixin of `Equatable`, meaning they can be easily comparable with `==`

## 0.6.1

- Include pubspec.lock files of examples

## 0.6.0

- Replace `graphql_parser` with `gql` package

## 0.5.1

- Add most documentation
- Increase pana grade (health and maintenance)
- Fix some stuff related to importing http on client

## 0.5.0

- Start using `code_builder` to better generate Dart code

## 0.4.0

- Allow scalar mappings to include imports for types

## 0.3.2

- Decode HTTP response as UTF-8 on execute helper.

## 0.3.1

- Export common used files on default package route (`package:artemis/artemis.dart`)
- Use single schemaMap globbing stream to make sure only one schema will be found
- Add missing changelog
- Test new github actions

## 0.3.0 BREAKING

- Add new generators to GraphQLQuery and QueryArguments
- Fix toJson() on JsonSerializable classes (for nested entities)
- [BREAKING] Remove the `execute*` functions generations, to use instead the generic `ArtemisClient` class
  that should receive a GraphQLQuery generated subclass.

## 0.2.1

Set HTTP headers only when using default HTTP client.

## 0.2.0 BREAKING

Completely overhaul how this works.

Artemis won't generate a full schema typing anymore. Instead, it will use the schema to generate typings from a specific
query or mutation. It will also create helper functions to execute those queries. See [README][readme] for more info.

This is totally a breaking change but as this library is still on alpha, I should keep it under 1.0.

## 0.1.3

- Make objects that implement interfaces override resolveType

## 0.1.2

- Improve package score

## 0.1.1

- Enable tests on pipeline

## 0.1.0

- "Fix" json_serializable dependency
- Add tests
- Generate union types as inheritance
- Generate interface types as implementation
- Make generated code choose inheritance

## 0.0.1

- First release
- No tests
- No documentation
- Parse complex GraphQL schemas (incorrectly, now I know)
- Parse all GraphQL types types (union, interface, enum, input object, object, scalar, list, non null)
- Consider custom scalars
- Not even compile from scratch
- Lot of bugs

[readme]: ./README.md

[pr-65]: https://github.com/comigor/artemis/pull/65

[pr-68]: https://github.com/comigor/artemis/pull/68

[apollo-3-ways-schema]: https://blog.apollographql.com/three-ways-to-represent-your-graphql-schema-a41f4175100d#:~:text=Introspection%20query%20result%20to%20SDL

[introspection-to-sdl-snippet]: https://gist.github.com/stubailo/041999ba5b8b15cede60b93ff9a38f53

[introspection-to-sdl-online]: https://codesandbox.io/s/graphql-introspection-sdl-svlx2

[pr-90]: https://github.com/comigor/artemis/pull/90

[pr-96]: https://github.com/comigor/artemis/pull/96


================================================
FILE: FUNDING.yml
================================================
github: comigor
patreon: comigor
custom: ['https://www.blockchain.com/btc/payment_request?address=1M1NJGg4SE7eaGUPUxQmqT9U1NhNYzW22J', 'https://api.qrserver.com/v1/create-qr-code/?data=xrb%3Anano_1jbe6nohyhpswj8gea8d7bpdd1ixxcmf3haj7gcrwzfweiwrmwuh33gpu1q3']


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 Igor Borges

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<!-- @formatter:off -->

<p align="center">
  <img src="https://user-images.githubusercontent.com/735858/58768495-8ecbd600-8572-11e9-9321-4fa5ce4ea007.png" height="200">
  <h1><b>Artemis</b></h1>
</p>

<!-- **Build dart types from GraphQL schemas and queries** -->

## Notice

Artemis has been [discontinued](https://github.com/gql-dart/ferry/issues/541).

For alternatives, take a look at the [Ferry](https://pub.dev/packages/ferry) project, featuring code generation for data types, customizable network layer (using `gql_link`), cache, data store connections, refetching + pagination support and more.

Also check out [graphql](https://pub.dev/packages/graphql), with features closely matching the current Artemis state: fully-featured client (for Dart and Flutter) with persistence, type generation (with [graphql_codegen](https://pub.dev/packages/graphql_codegen)), cache, and more.

Users and community are also invited to join the [GraphQL Dart](https://discord.gg/Pu8AMajSd) Discord to discuss migration approaches and ask for support.

Thanks to all contributors and users that made this project possible.

<details>
  <summary>To check out the old README, click here.</summary>

<!-- Badges -->
[![View at pub.dev][pub-badge]][pub-link]
[![Test][actions-badge]][actions-link]
[![PRs Welcome][prs-badge]][prs-link]
[![Star on GitHub][github-star-badge]][github-star-link]
[![Fork on GitHub][github-forks-badge]][github-forks-link]
[![Discord][discord-badge]][discord-link]

[pub-badge]: https://img.shields.io/pub/v/artemis?style=for-the-badge
[pub-link]: https://pub.dev/packages/artemis

[actions-badge]: https://img.shields.io/github/workflow/status/comigor/artemis/test?style=for-the-badge
[actions-link]: https://github.com/comigor/artemis/actions

[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
[prs-link]: https://github.com/comigor/artemis/issues

[github-star-badge]: https://img.shields.io/github/stars/comigor/artemis.svg?style=for-the-badge&logo=github&logoColor=ffffff
[github-star-link]: https://github.com/comigor/artemis/stargazers

[github-forks-badge]: https://img.shields.io/github/forks/comigor/artemis.svg?style=for-the-badge&logo=github&logoColor=ffffff
[github-forks-link]: https://github.com/comigor/artemis/network/members

[discord-badge]: https://img.shields.io/discord/559455668810153989.svg?style=for-the-badge&logo=discord&logoColor=ffffff
[discord-link]: https://discord.gg/2Y4wdE4

Check the [**beta**](https://github.com/comigor/artemis/tree/beta) branch for the bleeding edge (and breaking) stuff.

Artemis is a code generator that looks for `schema.graphql` (GraphQL SDL - Schema Definition Language) and `*.graphql` files and builds `.graphql.dart` files typing that query, based on the schema. That's similar to what [Apollo](https://github.com/apollographql/apollo-client) does (Artemis is his sister anyway).

---

## **Installation**
Add the following to your `pubspec.yaml` file to be able to do code generation:
```yaml
dev_dependencies:
  artemis: '>=7.0.0 <8.0.0'
  build_runner: ^2.1.4
  json_serializable: ^6.0.1
```
The generated code uses the following packages in run-time:
```yaml
dependencies:
  artemis: '>=8.0.0 <8.0.0' # only if you're using ArtemisClient!
  json_annotation: ^4.3.0
  equatable: ^2.0.3
  gql: ^0.13.1-alpha
```

Then run:
```shell
dart pub get
```
or
```shell
flutter pub get
```

Now Artemis will generate the API files for you by running:
```shell
dart run build_runner build
```
or
```shell
flutter pub run build_runner build
```

## **Configuration**
Artemis offers some configuration options to generate code. All options should be included on `build.yaml` file on the root of the project:
```yaml
targets:
  $default:
    builders:
      artemis:
        options:
          # custom configuration options!
```

> ⚠️ Make sure your configuration file is called `build.yaml` (with `.yaml` extension, not `.yml`)!

| Option | Default value | Description |
| - | - | - |
| `generate_helpers` | `true` | If Artemis should generate query/mutation helper GraphQLQuery subclasses. |
| `scalar_mapping` | `[]` | Mapping of GraphQL and Dart types. See [Custom scalars](#custom-scalars). |
| `schema_mapping` | `[]` | Mapping of queries and which schemas they will use for code generation. See [Schema mapping](#schema-mapping). |
| `fragments_glob` | `null` | Import path to the file implementing fragments for all queries mapped in schema_mapping. If it's assigned, fragments defined in schema_mapping will be ignored. |
| `ignore_for_file` | `[]`  | The linter rules to ignore for artemis generated files. |
| `generate_queries` | `true` | If Artemis should generate query documents and operation names. If you are using Artemis with `graphql` library it is useful to have those queries and operation names generated but without Atremis specific classes to exclude Artemis from dependancies |

It's important to remember that, by default, [build](https://github.com/dart-lang/build) will follow [Dart's package layout conventions](https://dart.dev/tools/pub/package-layout), meaning that only some folders will be considered to parse the input files. So, if you want to reference files from a folder other than `lib/`, make sure you've included it on `sources`:
```yaml
targets:
  $default:
    sources:
      - lib/**
      - graphql/**
      - data/**
      - schema.graphql
```

### **Schema mapping**
By default, Artemis won't generate anything. That's because your queries/mutations should be linked to GraphQL schemas. To configure it, you need to point a `schema_mapping` to the path of those queries and schemas:

```yaml
targets:
  $default:
    builders:
      artemis:
        options:
          schema_mapping:
            - output: lib/graphql_api.graphql.dart
              schema: lib/my_graphql_schema.graphql
              queries_glob: lib/**.graphql
```

Each `SchemaMap` is configured this way:

| Option | Default value | Description |
| - | - | - |
| `output` | | Relative path to output the generated code. It should end with `.graphql.dart` or else the generator will need to generate one more file. |
| `schema` | | Relative path to the GraphQL schema. |
| `queries_glob` | | Glob that selects all query files to be used with this schema. |
| `naming_scheme` | `pathedWithTypes` | The naming scheme to be used on generated classes names. `pathedWithTypes` is the default for retrocompatibility, where the names of previous types are used as prefix of the next class. This can generate duplication on certain schemas. With `pathedWithFields`, the names of previous fields are used as prefix of the next class and with `simple`, only the actual GraphQL class nameis considered. |
| `type_name_field` | `__typename` | The name of the field used to differentiate interfaces and union types (commonly `__typename` or `__resolveType`). Note that `__typename` field are not added automatically to the query. If you want interface/union type resolution, you need to manually add it there or set `append_type_name` to `true`. |
| `append_type_name` | `false` | Appends `type_name_field` value to the query selections set. |
| `fragments_glob` | `null` | Import path to the file implementing fragments for all queries mapped in schema_mapping. |

See [examples](./example) for more information and configuration options.

### **Custom scalars**

If your schema uses custom scalars, they must be defined on `build.yaml`. If it needs a custom parser (to decode from/to json), the `custom_parser_import` path must be set and the file must implement both `fromGraphQL___ToDart___` and `fromDart___ToGraphQL___` constant functions.

`___ToDart___` and `___ToGraphQL___` should be named including nullability, here is an example:

* `file: Upload` => `fromGraphQLUploadNullableToDartMultipartFileNullable`
and `fromDartMultipartFileNullableToGraphQLUploadNullable`
* `file: Upload!` => `fromGraphQLUploadToDartMultipartFile` and `fromDartMultipartFileToGraphQLUpload`
* `file: [Upload]` => `fromGraphQLListNullableUploadNullableToDartListNullableMultipartFileNullable`
and `fromDartListNullableMultipartFileNullableToGraphQLListNullableUploadNullable`
* `file: [Upload]!` => `fromGraphQLListUploadNullableToDartListMultipartFileNullable`
and `fromDartListMultipartFileNullableToGraphQLListUploadNullable`
* `file: [Upload!]!` => `fromGraphQLListUploadToDartListMultipartFile` and `fromDartListMultipartFileToGraphQLListUpload`

```yaml
targets:
  $default:
    builders:
      artemis:
        options:
          scalar_mapping:
            - custom_parser_import: 'package:graphbrainz_example/coercers.dart'
              graphql_type: Date
              dart_type: DateTime
```

If your custom scalar needs to import Dart libraries, you can provide it in the config as well:

```yaml
targets:
  $default:
    builders:
      artemis:
        options:
          scalar_mapping:
            - custom_parser_import: 'package:graphbrainz_example/coercers.dart'
              graphql_type: BigDecimal
              dart_type:
                name: Decimal
                imports:
                  - 'package:decimal/decimal.dart'
```

Each `ScalarMap` is configured this way:

| Option | Default value | Description |
| - | - | - |
| `graphql_type` |  | The GraphQL custom scalar name on schema. |
| `dart_type` |  | The Dart type this custom scalar should be converted from/to. |
| `custom_parser_import` | `null` | Import path to the file implementing coercer functions for custom scalars. See [Custom scalars](#custom-scalars). |

See [examples](./example) for more information and configuration options.

## **Articles and videos**

1. [Ultimate toolchain to work with GraphQL in Flutter](https://medium.com/@v.ditsyak/ultimate-toolchain-to-work-with-graphql-in-flutter-13aef79c6484)
2. [Awesome GraphQL](https://github.com/chentsulin/awesome-graphql)

## **ArtemisClient**
If you have `generate_helpers`, Artemis will create a subclass of `GraphQLQuery` for you, this class can be used
in conjunction with `ArtemisClient`.

```dart
final client = ArtemisClient('/graphql');
final gitHubReposQuery = MyGitHubReposQuery();
final response = await client.execute(gitHubReposQuery);
```

`ArtemisClient` adds type-awareness around `Link` from [`package:gql/link`](https://pub.dev/packages/gql).
You can create `ArtemisClient` from any `Link` using `ArtemisClient.fromLink`.
 
Check the [examples](./example) to see how to use it in details.

</details>


================================================
FILE: analysis_options.yaml
================================================
# https://github.com/dart-lang/lints#migrating-from-packagepedantic
include: package:lints/recommended.yaml

analyzer:
  exclude:
    - example/**/*.dart
  language:
    strict-casts: true
linter:
  rules:
    overridden_fields: false


================================================
FILE: build.yaml
================================================
builders:
  artemis:
    import: 'package:artemis/builder.dart'
    builder_factories: ['graphQLQueryBuilder']
    build_extensions: {'$lib$': ['.graphql.dart']}
    auto_apply: dependents
    build_to: source
    applies_builders: ['json_serializable']
    runs_before: ['json_serializable']


================================================
FILE: example/.gitignore
================================================
/*
!/pokemon
!/graphbrainz
!/github
!/hasura

================================================
FILE: example/README.md
================================================
# **Examples**

This folder contains some examples on how to use artemis.

## [**pokemon**](./pokemon)

A simple example, showing [Pokémon GraphQL](https://graphql-pokemon.now.sh/) schema generation.

## [**graphqbrainz**](./graphbrainz)

A more complex example, for [graphbrainz](https://graphbrainz.herokuapp.com) (a MusicBrainz GraphQL server). Featuring union types, interfaces and custom scalars.

## [**github**](./github)

Even simpler example, for [GitHub GraphQL API](https://graphbrainz.herokuapp.com). I didn't commit the schema because it's too big (~3MB), so provide your own if you're running the example: https://github.com/octokit/graphql-schema

## [**hasura**](./hasura)

This example uses a simple [Hasura](https://hasura.io/) server (with tables schema defined [in this file](./hasura/hasura.sql)), as an example of how to use Artemis with subscriptions.


================================================
FILE: example/github/.gitignore
================================================
github.schema.json
github.schema.graphql

================================================
FILE: example/github/build.yaml
================================================
targets:
  $default:
    sources:
      - lib/**
      - github.schema.graphql
    builders:
      artemis:
        options:
          scalar_mapping:
            - graphql_type: GitObjectID
              dart_type: String
            - graphql_type: URI
              dart_type: String
            - graphql_type: GitRefname
              dart_type: String
            - graphql_type: DateTime
              dart_type: DateTime
          schema_mapping:
            - schema: github.schema.graphql
              queries_glob: lib/graphql/search_repositories.graphql
              output: lib/graphql/search_repositories.dart


================================================
FILE: example/github/lib/graphql/search_repositories.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
export 'search_repositories.graphql.dart';


================================================
FILE: example/github/lib/graphql/search_repositories.graphql
================================================
query search_repositories($query: String!) {
  search(first: 10, type: REPOSITORY, query: $query) {
    nodes {
      __typename
      ... on Repository {
        name
      }
    }
  }
}


================================================
FILE: example/github/lib/graphql/search_repositories.graphql.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
// @dart = 2.12

import 'package:artemis/artemis.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:equatable/equatable.dart';
import 'package:gql/ast.dart';
part 'search_repositories.graphql.g.dart';

@JsonSerializable(explicitToJson: true)
class SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository
    extends SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
    with EquatableMixin {
  SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository();

  factory SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository.fromJson(
          Map<String, dynamic> json) =>
      _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryFromJson(
          json);

  late String name;

  @override
  List<Object?> get props => [name];
  @override
  Map<String, dynamic> toJson() =>
      _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryToJson(
          this);
}

@JsonSerializable(explicitToJson: true)
class SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
    extends JsonSerializable with EquatableMixin {
  SearchRepositories$Query$SearchResultItemConnection$SearchResultItem();

  factory SearchRepositories$Query$SearchResultItemConnection$SearchResultItem.fromJson(
      Map<String, dynamic> json) {
    switch (json['__typename'].toString()) {
      case r'Repository':
        return SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository
            .fromJson(json);
      default:
    }
    return _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemFromJson(
        json);
  }

  @JsonKey(name: '__typename')
  String? $$typename;

  @override
  List<Object?> get props => [$$typename];
  @override
  Map<String, dynamic> toJson() {
    switch ($$typename) {
      case r'Repository':
        return (this
                as SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository)
            .toJson();
      default:
    }
    return _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemToJson(
        this);
  }
}

@JsonSerializable(explicitToJson: true)
class SearchRepositories$Query$SearchResultItemConnection
    extends JsonSerializable with EquatableMixin {
  SearchRepositories$Query$SearchResultItemConnection();

  factory SearchRepositories$Query$SearchResultItemConnection.fromJson(
          Map<String, dynamic> json) =>
      _$SearchRepositories$Query$SearchResultItemConnectionFromJson(json);

  List<SearchRepositories$Query$SearchResultItemConnection$SearchResultItem?>?
      nodes;

  @override
  List<Object?> get props => [nodes];
  @override
  Map<String, dynamic> toJson() =>
      _$SearchRepositories$Query$SearchResultItemConnectionToJson(this);
}

@JsonSerializable(explicitToJson: true)
class SearchRepositories$Query extends JsonSerializable with EquatableMixin {
  SearchRepositories$Query();

  factory SearchRepositories$Query.fromJson(Map<String, dynamic> json) =>
      _$SearchRepositories$QueryFromJson(json);

  late SearchRepositories$Query$SearchResultItemConnection search;

  @override
  List<Object?> get props => [search];
  @override
  Map<String, dynamic> toJson() => _$SearchRepositories$QueryToJson(this);
}

@JsonSerializable(explicitToJson: true)
class SearchRepositoriesArguments extends JsonSerializable with EquatableMixin {
  SearchRepositoriesArguments({required this.query});

  @override
  factory SearchRepositoriesArguments.fromJson(Map<String, dynamic> json) =>
      _$SearchRepositoriesArgumentsFromJson(json);

  late String query;

  @override
  List<Object?> get props => [query];
  @override
  Map<String, dynamic> toJson() => _$SearchRepositoriesArgumentsToJson(this);
}

final SEARCH_REPOSITORIES_QUERY_DOCUMENT = DocumentNode(definitions: [
  OperationDefinitionNode(
      type: OperationType.query,
      name: NameNode(value: 'search_repositories'),
      variableDefinitions: [
        VariableDefinitionNode(
            variable: VariableNode(name: NameNode(value: 'query')),
            type:
                NamedTypeNode(name: NameNode(value: 'String'), isNonNull: true),
            defaultValue: DefaultValueNode(value: null),
            directives: [])
      ],
      directives: [],
      selectionSet: SelectionSetNode(selections: [
        FieldNode(
            name: NameNode(value: 'search'),
            alias: null,
            arguments: [
              ArgumentNode(
                  name: NameNode(value: 'first'),
                  value: IntValueNode(value: '10')),
              ArgumentNode(
                  name: NameNode(value: 'type'),
                  value: EnumValueNode(name: NameNode(value: 'REPOSITORY'))),
              ArgumentNode(
                  name: NameNode(value: 'query'),
                  value: VariableNode(name: NameNode(value: 'query')))
            ],
            directives: [],
            selectionSet: SelectionSetNode(selections: [
              FieldNode(
                  name: NameNode(value: 'nodes'),
                  alias: null,
                  arguments: [],
                  directives: [],
                  selectionSet: SelectionSetNode(selections: [
                    FieldNode(
                        name: NameNode(value: '__typename'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: null),
                    InlineFragmentNode(
                        typeCondition: TypeConditionNode(
                            on: NamedTypeNode(
                                name: NameNode(value: 'Repository'),
                                isNonNull: false)),
                        directives: [],
                        selectionSet: SelectionSetNode(selections: [
                          FieldNode(
                              name: NameNode(value: 'name'),
                              alias: null,
                              arguments: [],
                              directives: [],
                              selectionSet: null)
                        ]))
                  ]))
            ]))
      ]))
]);

class SearchRepositoriesQuery extends GraphQLQuery<SearchRepositories$Query,
    SearchRepositoriesArguments> {
  SearchRepositoriesQuery({required this.variables});

  @override
  final DocumentNode document = SEARCH_REPOSITORIES_QUERY_DOCUMENT;

  @override
  final String operationName = 'search_repositories';

  @override
  final SearchRepositoriesArguments variables;

  @override
  List<Object?> get props => [document, operationName, variables];
  @override
  SearchRepositories$Query parse(Map<String, dynamic> json) =>
      SearchRepositories$Query.fromJson(json);
}


================================================
FILE: example/github/lib/graphql/search_repositories.graphql.g.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
// @dart=2.12

part of 'search_repositories.graphql.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository
    _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryFromJson(
            Map<String, dynamic> json) =>
        SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository()
          ..$$typename = json['__typename'] as String?
          ..name = json['name'] as String;

Map<String, dynamic>
    _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryToJson(
            SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository
                instance) =>
        <String, dynamic>{
          '__typename': instance.$$typename,
          'name': instance.name,
        };

SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
    _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemFromJson(
            Map<String, dynamic> json) =>
        SearchRepositories$Query$SearchResultItemConnection$SearchResultItem()
          ..$$typename = json['__typename'] as String?;

Map<String, dynamic>
    _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemToJson(
            SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
                instance) =>
        <String, dynamic>{
          '__typename': instance.$$typename,
        };

SearchRepositories$Query$SearchResultItemConnection
    _$SearchRepositories$Query$SearchResultItemConnectionFromJson(
            Map<String, dynamic> json) =>
        SearchRepositories$Query$SearchResultItemConnection()
          ..nodes = (json['nodes'] as List<dynamic>?)
              ?.map((e) => e == null
                  ? null
                  : SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
                      .fromJson(e as Map<String, dynamic>))
              .toList();

Map<String, dynamic>
    _$SearchRepositories$Query$SearchResultItemConnectionToJson(
            SearchRepositories$Query$SearchResultItemConnection instance) =>
        <String, dynamic>{
          'nodes': instance.nodes?.map((e) => e?.toJson()).toList(),
        };

SearchRepositories$Query _$SearchRepositories$QueryFromJson(
        Map<String, dynamic> json) =>
    SearchRepositories$Query()
      ..search = SearchRepositories$Query$SearchResultItemConnection.fromJson(
          json['search'] as Map<String, dynamic>);

Map<String, dynamic> _$SearchRepositories$QueryToJson(
        SearchRepositories$Query instance) =>
    <String, dynamic>{
      'search': instance.search.toJson(),
    };

SearchRepositoriesArguments _$SearchRepositoriesArgumentsFromJson(
        Map<String, dynamic> json) =>
    SearchRepositoriesArguments(
      query: json['query'] as String,
    );

Map<String, dynamic> _$SearchRepositoriesArgumentsToJson(
        SearchRepositoriesArguments instance) =>
    <String, dynamic>{
      'query': instance.query,
    };


================================================
FILE: example/github/lib/main.dart
================================================
import 'dart:async';
import 'dart:io';

import 'package:artemis/artemis.dart';
import 'package:http/http.dart' as http;

import 'graphql/search_repositories.dart';

class AuthenticatedClient extends http.BaseClient {
  final http.Client _inner = http.Client();

  Future<http.StreamedResponse> send(http.BaseRequest request) {
    request.headers['Authorization'] =
        'Bearer ${Platform.environment['GITHUB_TOKEN']}';
    return _inner.send(request);
  }
}

Future<void> main() async {
  final client = ArtemisClient(
    'https://api.github.com/graphql',
    httpClient: AuthenticatedClient(),
  );

  final query = SearchRepositoriesQuery(
    variables: SearchRepositoriesArguments(query: 'flutter'),
  );

  final response = await client.execute(query);

  (response.data?.search.nodes ?? [])
      .whereType<
          SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository>()
      .map((r) => r.name)
      .forEach(print);
}


================================================
FILE: example/github/pubspec.yaml
================================================
name: github_example
version: 0.0.1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  http:

dev_dependencies:
  test:
  build_runner:
  json_serializable:
  lints: ^1.0.1
  artemis:
    path: ../../.


================================================
FILE: example/graphbrainz/build.yaml
================================================
targets:
  $default:
    sources:
      - lib/**
    builders:
      artemis:
        options:
          schema_mapping:
            - schema: lib/graphbrainz.schema.graphql
              queries_glob: lib/queries/ed_sheeran.query.graphql
              output: lib/queries/ed_sheeran.query.dart
          custom_parser_import: 'package:graphbrainz_example/coercers.dart'
          scalar_mapping:
            - graphql_type: Date
              dart_type: DateTime
              use_custom_parser: true
            - graphql_type: Time
              dart_type: DateTime
              use_custom_parser: true
            - graphql_type: DiscID
              dart_type: String
            - graphql_type: MBID
              dart_type: String
            - graphql_type: ASIN
              dart_type: String
            - graphql_type: IPI
              dart_type: String
            - graphql_type: ISNI
              dart_type: String
            - graphql_type: ISRC
              dart_type: String
            - graphql_type: URLString
              dart_type: String
            - graphql_type: Degrees
              dart_type: double
            - graphql_type: Locale
              dart_type: String


================================================
FILE: example/graphbrainz/lib/coercers.dart
================================================
import 'package:intl/intl.dart';

final dateFormatter = DateFormat('yyyy-MM-dd');
final timeFormatter = DateFormat('HH:mm:ss');

DateTime fromGraphQLDateToDartDateTime(String date) => DateTime.parse(date);
String fromDartDateTimeToGraphQLDate(DateTime date) =>
    dateFormatter.format(date);
DateTime fromGraphQLTimeToDartDateTime(String time) =>
    DateTime.parse('1970-01-01T${time}Z');
String fromDartDateTimeToGraphQLTime(DateTime date) =>
    timeFormatter.format(date);


================================================
FILE: example/graphbrainz/lib/graphbrainz.schema.graphql
================================================
"""
[Aliases](https://musicbrainz.org/doc/Aliases) are variant names
that are mostly used as search help: if a search matches an entity’s alias, the
entity will be given as a result – even if the actual name wouldn’t be.
"""
type Alias {
  """The aliased name of the entity."""
  name: String

  """
  The string to use for the purpose of ordering by name (for
  example, by moving articles like ‘the’ to the end or a person’s last name to
  the front).
  """
  sortName: String

  """
  The locale (language and/or country) in which the alias is
  used.
  """
  locale: Locale

  """
  Whether this is the main alias for the entity in the
  specified locale (this could mean the most recent or the most common).
  """
  primary: Boolean

  """
  The type or purpose of the alias – whether it is a variant,
  search hint, etc.
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID
}

"""
[Areas](https://musicbrainz.org/doc/Area) are geographic regions
or settlements (countries, cities, or the like).
"""
type Area implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """
  The string to use for the purpose of ordering by name (for
  example, by moving articles like ‘the’ to the end or a person’s last name to
  the front).
  """
  sortName: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  [ISO 3166 codes](https://en.wikipedia.org/wiki/ISO_3166) are
  the codes assigned by ISO to countries and subdivisions.
  """
  isoCodes(
    """
    Specify the particular ISO standard codes to retrieve.
    Available ISO standards are 3166-1, 3166-2, and 3166-3.
    """
    standard: String = "3166-1"
  ): [String]

  """
  The type of area (country, city, etc. – see the [possible
  values](https://musicbrainz.org/doc/Area)).
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """A list of artists linked to this entity."""
  artists(after: String, first: Int): ArtistConnection

  """A list of events linked to this entity."""
  events(after: String, first: Int): EventConnection

  """A list of labels linked to this entity."""
  labels(after: String, first: Int): LabelConnection

  """A list of places linked to this entity."""
  places(after: String, first: Int): PlaceConnection

  """A list of releases linked to this entity."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Chart data available for this area on [Last.fm](https://www.last.fm/), if
  the area represents a country with an [ISO 3166 code](https://en.wikipedia.org/wiki/ISO_3166).
  This field is provided by the Last.fm extension.
  """
  lastFM: LastFMCountry
}

"""A connection to a list of items."""
type AreaConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [AreaEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Area]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type AreaEdge {
  """The item at the end of the edge"""
  node: Area

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An [artist](https://musicbrainz.org/doc/Artist) is generally a
musician, group of musicians, or other music professional (like a producer or
engineer). Occasionally, it can also be a non-musical person (like a
photographer, an illustrator, or a poet whose writings are set to music), or
even a fictional character.
"""
type Artist implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """
  The string to use for the purpose of ordering by name (for
  example, by moving articles like ‘the’ to the end or a person’s last name to
  the front).
  """
  sortName: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  The country with which an artist is primarily identified. It
  is often, but not always, its birth/formation country.
  """
  country: String

  """
  The area with which an artist is primarily identified. It
  is often, but not always, its birth/formation country.
  """
  area: Area

  """
  The area in which an artist began their career (or where
  they were born, if the artist is a person).
  """
  beginArea: Area

  """
  The area in which an artist ended their career (or where
  they died, if the artist is a person).
  """
  endArea: Area

  """
  The begin and end dates of the entity’s existence. Its exact
  meaning depends on the type of entity.
  """
  lifeSpan: LifeSpan

  """
  Whether a person or character identifies as male, female, or
  neither. Groups do not have genders.
  """
  gender: String

  """
  The MBID associated with the value of the `gender`
  field.
  """
  genderID: MBID

  """Whether an artist is a person, a group, or something else."""
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """
  List of [Interested Parties Information](https://musicbrainz.org/doc/IPI)
  (IPI) codes for the artist.
  """
  ipis: [IPI]

  """
  List of [International Standard Name Identifier](https://musicbrainz.org/doc/ISNI)
  (ISNI) codes for the artist.
  """
  isnis: [ISNI]

  """A list of recordings linked to this entity."""
  recordings(after: String, first: Int): RecordingConnection

  """A list of releases linked to this entity."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """A list of release groups linked to this entity."""
  releaseGroups(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]
    after: String
    first: Int
  ): ReleaseGroupConnection

  """A list of works linked to this entity."""
  works(after: String, first: Int): WorkConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Images of the artist from [fanart.tv](https://fanart.tv/).
  This field is provided by the fanart.tv extension.
  """
  fanArt: FanArtArtist

  """
  Artist images found at MediaWiki URLs in the artist’s URL relationships.
  Defaults to URL relationships with the type “image”.
  This field is provided by the MediaWiki extension.
  """
  mediaWikiImages(
    """
    The type of URL relationship that will be selected to find images. See
    the possible [Artist-URL relationship types](https://musicbrainz.org/relationships/artist-url).
    """
    type: String = "image"
  ): [MediaWikiImage]!

  """
  Data about the artist from [TheAudioDB](http://www.theaudiodb.com/), a good
  source of biographical information and images.
  This field is provided by TheAudioDB extension.
  """
  theAudioDB: TheAudioDBArtist

  """Information about the artist on Discogs."""
  discogs: DiscogsArtist

  """
  Data about the artist from [Last.fm](https://www.last.fm/), a good source
  for measuring popularity via listener and play counts. This field is
  provided by the Last.fm extension.
  """
  lastFM: LastFMArtist

  """The artist’s entry on Spotify."""
  spotify: SpotifyArtist
}

"""A connection to a list of items."""
type ArtistConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [ArtistEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Artist]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""
[Artist credits](https://musicbrainz.org/doc/Artist_Credits)
indicate who is the main credited artist (or artists) for releases, release
groups, tracks, and recordings, and how they are credited. They consist of
artists, with (optionally) their names as credited in the specific release,
track, etc., and join phrases between them.
"""
type ArtistCredit {
  """
  The entity representing the artist referenced in the
  credits.
  """
  artist: Artist

  """
  The name of the artist as credited in the specific release,
  track, etc.
  """
  name: String

  """
  Join phrases might include words and/or punctuation to
  separate artist names as they appear on the release, track, etc.
  """
  joinPhrase: String
}

"""An edge in a connection."""
type ArtistEdge {
  """The item at the end of the edge"""
  node: Artist

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An [Amazon Standard Identification Number](https://musicbrainz.org/doc/ASIN)
(ASIN) is a 10-character alphanumeric unique identifier assigned by Amazon.com
and its partners for product identification within the Amazon organization.
"""
scalar ASIN

"""
A query for all MusicBrainz entities directly linked to another
entity.
"""
type BrowseQuery {
  """Browse area entities linked to the given arguments."""
  areas(
    """The MBID of a collection in which the entity is found."""
    collection: MBID
    after: String
    first: Int
  ): AreaConnection

  """Browse artist entities linked to the given arguments."""
  artists(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """The MBID of a recording to which the entity is linked."""
    recording: MBID

    """The MBID of a release to which the entity is linked."""
    release: MBID

    """The MBID of a release group to which the entity is linked."""
    releaseGroup: MBID

    """The MBID of a work to which the entity is linked."""
    work: MBID
    after: String
    first: Int
  ): ArtistConnection

  """Browse collection entities linked to the given arguments."""
  collections(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The username of the editor who created the collection."""
    editor: String

    """The MBID of an event to which the entity is linked."""
    event: MBID

    """The MBID of a label to which the entity is linked."""
    label: MBID

    """The MBID of a place to which the entity is linked."""
    place: MBID

    """The MBID of a recording to which the entity is linked."""
    recording: MBID

    """The MBID of a release to which the entity is linked."""
    release: MBID

    """The MBID of a release group to which the entity is linked."""
    releaseGroup: MBID

    """The MBID of a work to which the entity is linked."""
    work: MBID
    after: String
    first: Int
  ): CollectionConnection

  """Browse event entities linked to the given arguments."""
  events(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """The MBID of a place to which the entity is linked."""
    place: MBID
    after: String
    first: Int
  ): EventConnection

  """Browse label entities linked to the given arguments."""
  labels(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """The MBID of a release to which the entity is linked."""
    release: MBID
    after: String
    first: Int
  ): LabelConnection

  """Browse place entities linked to the given arguments."""
  places(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID
    after: String
    first: Int
  ): PlaceConnection

  """Browse recording entities linked to the given arguments."""
  recordings(
    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """
    The [International Standard Recording Code](https://musicbrainz.org/doc/ISRC)
    (ISRC) of the recording.
    """
    isrc: ISRC

    """The MBID of a release to which the entity is linked."""
    release: MBID
    after: String
    first: Int
  ): RecordingConnection

  """Browse release entities linked to the given arguments."""
  releases(
    """The MBID of an area to which the entity is linked."""
    area: MBID

    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """
    A [disc ID](https://musicbrainz.org/doc/Disc_ID)
    associated with the release.
    """
    discID: DiscID

    """The MBID of a label to which the entity is linked."""
    label: MBID

    """The MBID of a recording to which the entity is linked."""
    recording: MBID

    """The MBID of a release group to which the entity is linked."""
    releaseGroup: MBID

    """The MBID of a track that is included in the release."""
    track: MBID

    """
    The MBID of an artist that appears on a track in the
    release, but is not included in the credits for the release itself.
    """
    trackArtist: MBID

    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """Browse release group entities linked to the given arguments."""
  releaseGroups(
    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """The MBID of a release to which the entity is linked."""
    release: MBID

    """Filter by one or more release group types."""
    type: [ReleaseGroupType]
    after: String
    first: Int
  ): ReleaseGroupConnection

  """Browse work entities linked to the given arguments."""
  works(
    """The MBID of an artist to which the entity is linked."""
    artist: MBID

    """The MBID of a collection in which the entity is found."""
    collection: MBID

    """
    The [International Standard Musical Work Code](https://musicbrainz.org/doc/ISWC)
    (ISWC) of the work.
    """
    iswc: ISWC
    after: String
    first: Int
  ): WorkConnection
}

"""
[Collections](https://musicbrainz.org/doc/Collections) are
lists of entities that users can create.
"""
type Collection implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """The username of the editor who created the collection."""
  editor: String!

  """The type of entity listed in the collection."""
  entityType: String!

  """The type of collection."""
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """The list of areas found in this collection."""
  areas(after: String, first: Int): AreaConnection

  """The list of artists found in this collection."""
  artists(after: String, first: Int): ArtistConnection

  """The list of events found in this collection."""
  events(after: String, first: Int): EventConnection

  """The list of instruments found in this collection."""
  instruments(after: String, first: Int): InstrumentConnection

  """The list of labels found in this collection."""
  labels(after: String, first: Int): LabelConnection

  """The list of places found in this collection."""
  places(after: String, first: Int): PlaceConnection

  """The list of recordings found in this collection."""
  recordings(after: String, first: Int): RecordingConnection

  """The list of releases found in this collection."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """The list of release groups found in this collection."""
  releaseGroups(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]
    after: String
    first: Int
  ): ReleaseGroupConnection

  """The list of series found in this collection."""
  series(after: String, first: Int): SeriesConnection

  """The list of works found in this collection."""
  works(after: String, first: Int): WorkConnection
}

"""A connection to a list of items."""
type CollectionConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [CollectionEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Collection]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type CollectionEdge {
  """The item at the end of the edge"""
  node: Collection

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""Geographic coordinates described with latitude and longitude."""
type Coordinates {
  """The north–south position of a point on the Earth’s surface."""
  latitude: Degrees

  """The east–west position of a point on the Earth’s surface."""
  longitude: Degrees
}

"""
An individual piece of album artwork from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).
"""
type CoverArtArchiveImage {
  """The Internet Archive’s internal file ID for the image."""
  fileID: String!

  """The URL at which the image can be found."""
  image: URLString!

  """A set of thumbnails for the image."""
  thumbnails: CoverArtArchiveImageThumbnails!

  """Whether this image depicts the “main front” of the release."""
  front: Boolean!

  """Whether this image depicts the “main back” of the release."""
  back: Boolean!

  """
  A list of [image types](https://musicbrainz.org/doc/Cover_Art/Types)
  describing what part(s) of the release the image includes.
  """
  types: [String]!

  """The MusicBrainz edit ID."""
  edit: Int

  """Whether the image was approved by the MusicBrainz edit system."""
  approved: Boolean

  """A free-text comment left for the image."""
  comment: String
}

"""
The image sizes that may be requested at the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).
"""
enum CoverArtArchiveImageSize {
  """A maximum dimension of 250px."""
  SMALL

  """A maximum dimension of 500px."""
  LARGE

  """The image’s original dimensions, with no maximum."""
  FULL
}

"""
URLs for thumbnails of different sizes for a particular piece of cover art.
"""
type CoverArtArchiveImageThumbnails {
  """
  The URL of a small version of the cover art, where the maximum dimension is
  250px.
  """
  small: URLString

  """
  The URL of a large version of the cover art, where the maximum dimension is
  500px.
  """
  large: URLString
}

"""
An object containing a list of the cover art images for a release obtained
from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive),
as well as a summary of what artwork is available.
"""
type CoverArtArchiveRelease {
  """
  The URL of an image depicting the album cover or “main front” of the release,
  i.e. the front of the packaging of the audio recording (or in the case of a
  digital release, the image associated with it in a digital media store).
  
  In the MusicBrainz schema, this field is a Boolean value indicating the
  presence of a front image, whereas here the value is the URL for the image
  itself if one exists. You can check for null if you just want to determine
  the presence of an image.
  """
  front(
    """
    The size of the image to retrieve. By default, the returned image will
    have its full original dimensions, but certain thumbnail sizes may be
    retrieved as well.
    """
    size: CoverArtArchiveImageSize = FULL
  ): URLString

  """
  The URL of an image depicting the “main back” of the release, i.e. the back
  of the packaging of the audio recording.
  
  In the MusicBrainz schema, this field is a Boolean value indicating the
  presence of a back image, whereas here the value is the URL for the image
  itself. You can check for null if you just want to determine the presence of
  an image.
  """
  back(
    """
    The size of the image to retrieve. By default, the returned image will
    have its full original dimensions, but certain thumbnail sizes may be
    retrieved as well.
    """
    size: CoverArtArchiveImageSize = FULL
  ): URLString

  """
  A list of images depicting the different sides and surfaces of a release’s
  media and packaging.
  """
  images: [CoverArtArchiveImage]!

  """Whether there is artwork present for this release."""
  artwork: Boolean!

  """The number of artwork images present for this release."""
  count: Int!

  """The particular release shown in the returned cover art."""
  release: Release
}

"""Year, month (optional), and day (optional) in YYYY-MM-DD format."""
scalar Date

"""Decimal degrees, used for latitude and longitude."""
scalar Degrees

"""
Information about the physical CD and releases associated with a
particular [disc ID](https://musicbrainz.org/doc/Disc_ID).
"""
type Disc implements Node {
  """The ID of an object"""
  id: ID!

  """The [disc ID](https://musicbrainz.org/doc/Disc_ID) of this disc."""
  discID: DiscID!

  """The number of offsets (tracks) on the disc."""
  offsetCount: Int!

  """The sector offset of each track on the disc."""
  offsets: [Int]

  """The sector offset of the lead-out (the end of the disc)."""
  sectors: Int!

  """The list of releases linked to this disc ID."""
  releases(after: String, first: Int): ReleaseConnection
}

"""
[Disc ID](https://musicbrainz.org/doc/Disc_ID) is the code
number which MusicBrainz uses to link a physical CD to a [release](https://musicbrainz.org/doc/Release)
listing.

A release may have any number of disc IDs, and a disc ID may be linked to
multiple releases. This is because disc ID calculation involves a hash of the
frame offsets of the CD tracks.

Different pressing of a CD often have slightly different frame offsets, and
hence different disc IDs.

Conversely, two different CDs may happen to have exactly the same set of frame
offsets and hence the same disc ID.
"""
scalar DiscID

"""An artist on Discogs."""
type DiscogsArtist {
  """The ID of the artist on Discogs."""
  artistID: ID!

  """The name of the artist on Discogs."""
  name: String!

  """Commonly found variations of the artist’s name."""
  nameVariations: [String!]!

  """
  The artist’s real name, if the artist is a person who uses a stage name.
  """
  realName: String

  """
  A list of Discogs artists that represent the same artist under a different
  alias.
  """
  aliases: [DiscogsArtist!]!

  """The URL of the artist’s page on Discogs."""
  url: URLString!

  """Links to the artist’s official pages on different web properties."""
  urls: [URLString!]!

  """A biography or description of the artist."""
  profile: String

  """A list of images picturing the artist."""
  images: [DiscogsImage!]!

  """A list of members, if the artist is a group."""
  members: [DiscogsArtistMember!]!

  """
  A description of the quality and completeness of this artist’s data in the
  Discogs database.
  """
  dataQuality: String
}

"""A credited artist on a release, track, etc."""
type DiscogsArtistCredit {
  """The official or common name of the credited artist."""
  name: String

  """
  The artist name as credited on this particular work (the Artist Name
  Variation, or ANV, in Discogs terms).
  """
  nameVariation: String

  """
  Join phrases might include words and/or punctuation to separate artist
  names as they appear on the release, track, etc.
  """
  joinPhrase: String

  """A list of roles the artist had on the work in question."""
  roles: [String!]!

  """
  A list of tracks or track ranges (e.g. “A1 to A4”) on which the artist is
  credited.
  """
  tracks: [String!]!

  """The artist’s entry on Discogs."""
  artist: DiscogsArtist
}

"""A single artist who is a member of a group on Discogs."""
type DiscogsArtistMember {
  """Whether or not the member is still active in the group."""
  active: Boolean

  """The name of the member."""
  name: String!

  """The member’s artist information on Discogs."""
  artist: DiscogsArtist
}

"""Community statistics regarding an item on Discogs."""
type DiscogsCommunity {
  """The acceptance status."""
  status: String

  """Information about how Discogs users have rated the item."""
  rating: DiscogsRating

  """The number of Discogs users who have the item in their collection."""
  haveCount: Int

  """The number of Discogs users who want the item."""
  wantCount: Int

  """The Discogs users who have contributed to the item’s data."""
  contributors: [DiscogsUser!]!

  """The Discogs user who submitted the item."""
  submitter: DiscogsUser
}

"""A single image from Discogs."""
type DiscogsImage {
  """The URL of the image file."""
  url: URLString!

  """The image type, primary or secondary."""
  type: DiscogsImageType!

  """The image width in pixels."""
  width: Int!

  """The image height in pixels."""
  height: Int!

  """The URL for a 150x150 thumbnail of the image."""
  thumbnail: URLString
}

"""The type of image."""
enum DiscogsImageType {
  """The primary image representing the item."""
  PRIMARY

  """A secondary image representing the item."""
  SECONDARY
}

"""A label on Discogs."""
type DiscogsLabel {
  """The ID of the label on Discogs."""
  labelID: ID!

  """The name of the label."""
  name: String!

  """The URL of the label on Discogs."""
  url: URLString!

  """A description of the history of the label."""
  profile: String

  """Information on how to contact a representative of the label."""
  contactInfo: String

  """The parent label, if this label is a subsidiary."""
  parentLabel: DiscogsLabel

  """A list of labels that are subsidiaries of this label."""
  subLabels: [DiscogsLabel!]!

  """A list of images associated with the label."""
  images: [DiscogsImage!]!

  """
  A description of the quality and completeness of this label’s data in the
  Discogs database.
  """
  dataQuality: String
}

"""
Master releases group different versions of the same release (for example,
releases in different formats, issued in different countries, re-releases,
etc.). The equivalent of a MusicBrainz release group.
"""
type DiscogsMaster {
  """The ID of the master on Discogs."""
  masterID: ID!

  """The title of the master."""
  title: String!

  """The URL of the master on Discogs."""
  url: URLString!

  """The artists credited on the master."""
  artistCredits: [DiscogsArtistCredit!]!

  """The primary musical genres of the master (e.g. “Electronic”)."""
  genres: [String!]!

  """The primary musical styles of the master (e.g. “Techno”, “Minimal”)."""
  styles: [String!]!

  """The number of listings the master currently has on the marketplace."""
  forSaleCount: Int

  """The lowest price for the master currently found on the marketplace."""
  lowestPrice(
    """
    The three-letter currency code for which to retrieve the price. Discogs
    supports USD, GBP, EUR, CAD, AUD, JPY, CHF, MXN, BRL, NZD, SEK, and ZAR.
    #
    [NOT YET WORKING]
    """
    currency: String
  ): Float

  """The year the master was released (most likely its “main” release)."""
  year: Int

  """The main release from the master."""
  mainRelease: DiscogsRelease

  """Images of the master."""
  images: [DiscogsImage!]!

  """Music videos from the master."""
  videos: [DiscogsVideo!]!

  """
  A description of the quality and completeness of this master’s data in the
  Discogs database.
  """
  dataQuality: String
}

"""An aggregated rating on Discogs."""
type DiscogsRating {
  """The number of users who have contributed to the rating."""
  voteCount: Int!

  """The average rating as determined by users."""
  value: Float
}

"""A release on Discogs."""
type DiscogsRelease {
  """The ID of the release on Discogs."""
  releaseID: ID!

  """The title of the release."""
  title: String!

  """The URL of the release on Discogs."""
  url: URLString!

  """The artists credited on the release."""
  artistCredits: [DiscogsArtistCredit!]!

  """
  An additional list of artists who contributed to the release, but are not
  named in the release’s artists.
  """
  extraArtistCredits: [DiscogsArtistCredit!]!

  """The primary musical genres of the release (e.g. “Electronic”)."""
  genres: [String!]!

  """The primary musical styles of the release (e.g. “Techno”, “Minimal”)."""
  styles: [String!]!

  """The number of listings the release currently has on the marketplace."""
  forSaleCount: Int

  """The lowest price for the release currently found on the marketplace."""
  lowestPrice(
    """
    The three-letter currency code for which to retrieve the price. Discogs
    supports USD, GBP, EUR, CAD, AUD, JPY, CHF, MXN, BRL, NZD, SEK, and ZAR.
    #
    [NOT YET WORKING]
    """
    currency: String
  ): Float

  """The year the release was issued."""
  year: Int

  """Notes about the release."""
  notes: String

  """The country in which the release was issued."""
  country: String

  """The master release on Discogs."""
  master: DiscogsMaster

  """The primary thumbnail image for the release."""
  thumbnail: URLString

  """Images of the release."""
  images: [DiscogsImage!]!

  """Music videos from the release."""
  videos: [DiscogsVideo!]!

  """
  Information about the Discogs community’s contributions to the release’s
  data.
  """
  community: DiscogsCommunity

  """
  A description of the quality and completeness of this release’s data in
  the Discogs database.
  """
  dataQuality: String
}

"""A connection to a list of Discogs releases."""
type DiscogsReleaseConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [DiscogsReleaseEdge!]!

  """
  A list of nodes in the connection (without going through the `edges` field).
  """
  nodes: [DiscogsRelease!]!

  """
  A count of the total number of items in this connection, ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a Discogs release connection."""
type DiscogsReleaseEdge {
  """The release at the end of the edge."""
  node: DiscogsRelease!
}

"""A user on Discogs."""
type DiscogsUser {
  """The user’s username on Discogs."""
  username: String!
}

"""A single video linked from Discogs."""
type DiscogsVideo {
  """The URL of the video."""
  url: URLString!

  """The title of the video."""
  title: String

  """The video description."""
  description: String

  """The duration of the video in milliseconds."""
  duration: Duration

  """Whether the video is embeddable."""
  embed: Boolean
}

"""A length of time, in milliseconds."""
scalar Duration

"""An entity in the MusicBrainz schema."""
interface Entity {
  """The MBID of the entity."""
  mbid: MBID!
}

"""
An [event](https://musicbrainz.org/doc/Event) refers to an
organised event which people can attend, and is relevant to MusicBrainz.
Generally this means live performances, like concerts and festivals.
"""
type Event implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  The begin and end dates of the entity’s existence. Its exact
  meaning depends on the type of entity.
  """
  lifeSpan: LifeSpan

  """The start time of the event."""
  time: Time

  """Whether or not the event took place."""
  cancelled: Boolean

  """
  A list of songs performed, optionally including links to
  artists and works. See the [setlist documentation](https://musicbrainz.org/doc/Event/Setlist)
  for syntax and examples.
  """
  setlist: String

  """What kind of event the event is, e.g. concert, festival, etc."""
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection
}

"""A connection to a list of items."""
type EventConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [EventEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Event]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type EventEdge {
  """The item at the end of the edge"""
  node: Event

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An object containing lists of the different types of release group images from
[fanart.tv](https://fanart.tv/).
"""
type FanArtAlbum {
  """
  A list of 1000x1000 JPG images of the cover artwork of the release group.
  """
  albumCovers: [FanArtImage]

  """
  A list of 1000x1000 PNG images of the physical disc media for the release
  group, with transparent backgrounds.
  """
  discImages: [FanArtDiscImage]
}

"""
An object containing lists of the different types of artist images from
[fanart.tv](https://fanart.tv/).
"""
type FanArtArtist {
  """
  A list of 1920x1080 JPG images picturing the artist, suitable for use as
  backgrounds.
  """
  backgrounds: [FanArtImage]

  """
  A list of 1000x185 JPG images containing the artist and their logo or name.
  """
  banners: [FanArtImage]

  """
  A list of 400x155 PNG images containing the artist’s logo or name, with
  transparent backgrounds.
  """
  logos: [FanArtImage]

  """
  A list of 800x310 PNG images containing the artist’s logo or name, with
  transparent backgrounds.
  """
  logosHD: [FanArtImage]

  """
  A list of 1000x1000 JPG thumbnail images picturing the artist (usually
  containing every member of a band).
  """
  thumbnails: [FanArtImage]
}

"""A disc image from [fanart.tv](https://fanart.tv/)."""
type FanArtDiscImage {
  """The ID of the image on fanart.tv."""
  imageID: ID

  """The URL of the image."""
  url(
    """The size of the image to retrieve."""
    size: FanArtImageSize = FULL
  ): URLString

  """The number of likes the image has received by fanart.tv users."""
  likeCount: Int

  """The disc number."""
  discNumber: Int

  """The width and height of the (square) disc image."""
  size: Int
}

"""A single image from [fanart.tv](https://fanart.tv/)."""
type FanArtImage {
  """The ID of the image on fanart.tv."""
  imageID: ID

  """The URL of the image."""
  url(
    """The size of the image to retrieve."""
    size: FanArtImageSize = FULL
  ): URLString

  """The number of likes the image has received by fanart.tv users."""
  likeCount: Int
}

"""
The image sizes that may be requested at [fanart.tv](https://fanart.tv/).
"""
enum FanArtImageSize {
  """The image’s full original dimensions."""
  FULL

  """A maximum dimension of 200px."""
  PREVIEW
}

"""
An object containing lists of the different types of label images from
[fanart.tv](https://fanart.tv/).
"""
type FanArtLabel {
  """
  A list of 400x270 PNG images containing the label’s logo. There will
  usually be a black version, a color version, and a white version, all with
  transparent backgrounds.
  """
  logos: [FanArtLabelImage]
}

"""A music label image from [fanart.tv](https://fanart.tv/)."""
type FanArtLabelImage {
  """The ID of the image on fanart.tv."""
  imageID: ID

  """The URL of the image."""
  url(
    """The size of the image to retrieve."""
    size: FanArtImageSize = FULL
  ): URLString

  """The number of likes the image has received by fanart.tv users."""
  likeCount: Int

  """The type of color content in the image (usually “white” or “colour”)."""
  color: String
}

"""
[Instruments](https://musicbrainz.org/doc/Instrument) are
devices created or adapted to make musical sounds. Instruments are primarily
used in relationships between two other entities.
"""
type Instrument implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  A brief description of the main characteristics of the
  instrument.
  """
  description: String

  """
  The type categorises the instrument by the way the sound is
  created, similar to the [Hornbostel-Sachs](https://en.wikipedia.org/wiki/Hornbostel%E2%80%93Sachs)
  classification.
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Instrument images found at MediaWiki URLs in the instrument’s URL
  relationships. Defaults to URL relationships with the type “image”.
  This field is provided by the MediaWiki extension.
  """
  mediaWikiImages(
    """
    The type of URL relationship that will be selected to find images. See the
    possible [Instrument-URL relationship types](https://musicbrainz.org/relationships/instrument-url).
    """
    type: String = "image"
  ): [MediaWikiImage]!
}

"""A connection to a list of items."""
type InstrumentConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [InstrumentEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Instrument]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type InstrumentEdge {
  """The item at the end of the edge"""
  node: Instrument

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An [Interested Parties Information](https://musicbrainz.org/doc/IPI)
(IPI) code is an identifying number assigned by the CISAC database for musical
rights management.
"""
scalar IPI

"""
The [International Standard Name Identifier](https://musicbrainz.org/doc/ISNI)
(ISNI) is an ISO standard for uniquely identifying the public identities of
contributors to media content.
"""
scalar ISNI

"""
The [International Standard Recording Code](https://musicbrainz.org/doc/ISRC)
(ISRC) is an identification system for audio and music video recordings. It is
standarized by the [IFPI](http://www.ifpi.org/) in ISO 3901:2001 and used by
IFPI members to assign a unique identifier to every distinct sound recording
they release. An ISRC identifies a particular [sound recording](https://musicbrainz.org/doc/Recording),
not the song itself. Therefore, different recordings, edits, remixes and
remasters of the same song will each be assigned their own ISRC. However, note
that same recording should carry the same ISRC in all countries/territories.
Songs are identified by analogous [International Standard Musical Work Codes](https://musicbrainz.org/doc/ISWC)
(ISWCs).
"""
scalar ISRC

"""
The [International Standard Musical Work Code](https://musicbrainz.org/doc/ISWC)
(ISWC) is an ISO standard similar to ISBNs for identifying musical works /
compositions.
"""
scalar ISWC

"""
[Labels](https://musicbrainz.org/doc/Label) represent mostly
(but not only) imprints. To a lesser extent, a label entity may be created to
represent a record company.
"""
type Label implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """
  The string to use for the purpose of ordering by name (for
  example, by moving articles like ‘the’ to the end or a person’s last name to
  the front).
  """
  sortName: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """The country of origin for the label."""
  country: String

  """The area in which the label is based."""
  area: Area

  """
  The begin and end dates of the entity’s existence. Its exact
  meaning depends on the type of entity.
  """
  lifeSpan: LifeSpan

  """
  The [“LC” code](https://musicbrainz.org/doc/Label/Label_Code)
  of the label.
  """
  labelCode: Int

  """
  List of [Interested Parties Information](https://musicbrainz.org/doc/IPI)
  codes for the label.
  """
  ipis: [IPI]

  """
  A type describing the main activity of the label, e.g.
  imprint, production, distributor, rights society, etc.
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """A list of releases linked to this entity."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Images of the label from [fanart.tv](https://fanart.tv/).
  This field is provided by the fanart.tv extension.
  """
  fanArt: FanArtLabel

  """
  Label images found at MediaWiki URLs in the label’s URL relationships.
  Defaults to URL relationships with the type “logo”.
  This field is provided by the MediaWiki extension.
  """
  mediaWikiImages(
    """
    The type of URL relationship that will be selected to find images. See the
    possible [Label-URL relationship types](https://musicbrainz.org/relationships/label-url).
    """
    type: String = "logo"
  ): [MediaWikiImage]!

  """Information about the label on Discogs."""
  discogs: DiscogsLabel
}

"""A connection to a list of items."""
type LabelConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [LabelEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Label]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type LabelEdge {
  """The item at the end of the edge"""
  node: Label

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An album on [Last.fm](https://www.last.fm/) corresponding with a MusicBrainz
Release.
"""
type LastFMAlbum {
  """The MBID of the corresponding MusicBrainz release."""
  mbid: MBID

  """The title of the album according to [Last.fm](https://www.last.fm/)."""
  title: String

  """The URL for the album on [Last.fm](https://www.last.fm/)."""
  url: URLString!

  """An image of the cover artwork of the release."""
  image(
    """The size of the image to retrieve."""
    size: LastFMImageSize
  ): URLString

  """The number of listeners recorded for the album."""
  listenerCount: Float

  """The number of plays recorded for the album."""
  playCount: Float

  """
  Historical information written about the album, often available in several
  languages.
  """
  description(
    """
    The two-letter code for the language in which to retrieve the description.
    """
    lang: String
  ): LastFMWikiContent

  """
  The artist who released the album. This returns the Last.fm artist info,
  not the MusicBrainz artist.
  """
  artist: LastFMArtist

  """A list of tags applied to the artist by users, ordered by popularity."""
  topTags(
    """The maximum number of tags to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tags will be retrieved."""
    after: String
  ): LastFMTagConnection
}

"""A connection to a list of items."""
type LastFMAlbumConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [LastFMAlbumEdge]

  """
  A list of nodes in the connection (without going through the `edges` field).
  """
  nodes: [LastFMAlbum]

  """
  A count of the total number of items in this connection, ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type LastFMAlbumEdge {
  """The item at the end of the edge."""
  node: LastFMAlbum

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

"""An artist on [Last.fm](https://www.last.fm/)."""
type LastFMArtist {
  """The MBID of the corresponding MusicBrainz artist."""
  mbid: MBID

  """The name of the artist according to [Last.fm](https://www.last.fm/)."""
  name: String

  """The URL for the artist on [Last.fm](https://www.last.fm/)."""
  url: URLString!

  """An image of the artist."""
  image(
    """The size of the image to retrieve."""
    size: LastFMImageSize
  ): URLString

  """The number of listeners recorded for the artist."""
  listenerCount: Float

  """The number of plays recorded for the artist."""
  playCount: Float

  """A list of similar artists."""
  similarArtists(
    """The maximum number of artists to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more artists will be retrieved."""
    after: String
  ): LastFMArtistConnection

  """A list of the artist’s most popular albums."""
  topAlbums(
    """The maximum number of albums to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more albums will be retrieved."""
    after: String
  ): LastFMAlbumConnection

  """A list of tags applied to the artist by users, ordered by popularity."""
  topTags(
    """The maximum number of tags to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tags will be retrieved."""
    after: String
  ): LastFMTagConnection

  """A list of the artist’s most popular tracks."""
  topTracks(
    """The maximum number of tracks to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tracks will be retrieved."""
    after: String
  ): LastFMTrackConnection

  """A biography of the artist, often available in several languages."""
  biography(
    """
    The two-letter code for the language in which to retrieve the biography.
    """
    lang: String
  ): LastFMWikiContent
}

"""A connection to a list of items."""
type LastFMArtistConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [LastFMArtistEdge]

  """
  A list of nodes in the connection (without going through the `edges` field).
  """
  nodes: [LastFMArtist]

  """
  A count of the total number of items in this connection, ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type LastFMArtistEdge {
  """The item at the end of the edge."""
  node: LastFMArtist

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

  """
  The artist similarity score (0–1) as determined by [Last.fm](https://www.last.fm/),
  if this connection is with another artist.
  """
  matchScore: Float
}

"""A query for chart data on [Last.fm](https://www.last.fm/)."""
type LastFMChartQuery {
  """
  The most popular artists, ordered by popularity. If a country code is
  given, retrieve the most popular artists in that country.
  """
  topArtists(
    """
    A two-letter [ISO 3166 country code](https://en.wikipedia.org/wiki/ISO_3166).
    """
    country: String

    """The maximum number of artists to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more artists will be retrieved."""
    after: String
  ): LastFMArtistConnection

  """The most popular tags, ordered by popularity."""
  topTags(
    """The maximum number of tags to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tags will be retrieved."""
    after: String
  ): LastFMTagConnection

  """
  The most popular tracks, ordered by popularity. If a country code is
  given, retrieve the most popular tracks in that country.
  """
  topTracks(
    """
    A two-letter [ISO 3166 country code](https://en.wikipedia.org/wiki/ISO_3166).
    """
    country: String

    """The maximum number of tracks to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tracks will be retrieved."""
    after: String
  ): LastFMTrackConnection
}

"""
A country with chart data available on [Last.fm](https://www.last.fm/).
"""
type LastFMCountry {
  """The top artists in this country, ordered by popularity."""
  topArtists(
    """The maximum number of artists to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more artists will be retrieved."""
    after: String
  ): LastFMArtistConnection

  """The top tracks in this country, ordered by popularity."""
  topTracks(
    """The maximum number of tracks to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tracks will be retrieved."""
    after: String
  ): LastFMTrackConnection
}

"""
The image sizes that may be requested at [Last.fm](https://www.last.fm/).
"""
enum LastFMImageSize {
  """A maximum dimension of 34px."""
  SMALL

  """A maximum dimension of 64px."""
  MEDIUM

  """A maximum dimension of 174px."""
  LARGE

  """A maximum dimension of 300px."""
  EXTRALARGE

  """A maximum dimension of 300px."""
  MEGA
}

"""
The different types of [Last.fm](https://www.last.fm/) queries that can be
made that are not connected to any particular MusicBrainz entity.
"""
type LastFMQuery {
  """A query for chart data."""
  chart: LastFMChartQuery!
}

"""A tag added by users to an entity on [Last.fm](https://www.last.fm/)."""
type LastFMTag {
  """The tag name."""
  name: String!

  """The URL for the tag on [Last.fm](https://www.last.fm/)."""
  url: URLString!
}

"""A connection to a list of items."""
type LastFMTagConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [LastFMTagEdge]

  """
  A list of nodes in the connection (without going through the `edges` field).
  """
  nodes: [LastFMTag]

  """
  A count of the total number of items in this connection, ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type LastFMTagEdge {
  """The item at the end of the edge."""
  node: LastFMTag

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

  """The number of times the tag has been applied to the item in question."""
  tagCount: Int
}

"""
A track on [Last.fm](https://www.last.fm/) corresponding with a MusicBrainz
Recording.
"""
type LastFMTrack {
  """The MBID of the corresponding MusicBrainz recording."""
  mbid: MBID

  """The title of the track according to [Last.fm](https://www.last.fm/)."""
  title: String

  """The URL for the track on [Last.fm](https://www.last.fm/)."""
  url: URLString!

  """The length of the track."""
  duration: Duration

  """The number of listeners recorded for the track."""
  listenerCount: Float

  """The number of plays recorded for the track."""
  playCount: Float

  """
  Historical information written about the track, often available in several
  languages.
  """
  description(
    """
    The two-letter code for the language in which to retrieve the description.
    """
    lang: String
  ): LastFMWikiContent

  """
  The artist who released the track. This returns the Last.fm artist info,
  not the MusicBrainz artist.
  """
  artist: LastFMArtist

  """
  The album on which the track appears. This returns the Last.fm album info,
  not the MusicBrainz release.
  """
  album: LastFMAlbum

  """A list of similar tracks."""
  similarTracks(
    """The maximum number of tracks to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tracks will be retrieved."""
    after: String
  ): LastFMTrackConnection

  """A list of tags applied to the track by users, ordered by popularity."""
  topTags(
    """The maximum number of tags to retrieve."""
    first: Int = 25

    """The cursor of the edge after which more tags will be retrieved."""
    after: String
  ): LastFMTagConnection
}

"""A connection to a list of items."""
type LastFMTrackConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [LastFMTrackEdge]

  """
  A list of nodes in the connection (without going through the `edges` field).
  """
  nodes: [LastFMTrack]

  """
  A count of the total number of items in this connection, ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type LastFMTrackEdge {
  """The item at the end of the edge."""
  node: LastFMTrack

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

  """
  The track similarity score (0–1) as determined by [Last.fm](https://www.last.fm/),
  if this connection is with another track.
  """
  matchScore: Float
}

"""
Biographical or background information written about an entity on
[Last.fm](https://www.last.fm/).
"""
type LastFMWikiContent {
  """A summary of the wiki content, which may contain HTML."""
  summaryHTML: String

  """The full wiki content, which may contain HTML."""
  contentHTML: String

  """
  The date the content was published. The data is reformatted from the
  Last.fm API’s original format into the Date scalar format.
  """
  publishDate: Date

  """
  The time the content was published. The data is reformatted from the
  Last.fm API’s original format into the Time scalar format. The API offers
  no indication as to which time zone the time is in.
  """
  publishTime: Time

  """The URL at which the content was published."""
  url: URLString
}

"""
Fields indicating the begin and end date of an entity’s
lifetime, including whether it has ended (even if the date is unknown).
"""
type LifeSpan {
  """The start date of the entity’s life span."""
  begin: Date

  """The end date of the entity’s life span."""
  end: Date

  """Whether or not the entity’s life span has ended."""
  ended: Boolean
}

"""Language code, optionally with country and encoding."""
scalar Locale

"""A lookup of an individual MusicBrainz entity by its MBID."""
type LookupQuery {
  """Look up a specific area by its MBID."""
  area(
    """The MBID of the entity."""
    mbid: MBID!
  ): Area

  """Look up a specific artist by its MBID."""
  artist(
    """The MBID of the entity."""
    mbid: MBID!
  ): Artist

  """Look up a specific collection by its MBID."""
  collection(
    """The MBID of the entity."""
    mbid: MBID!
  ): Collection

  """Look up a specific physical disc by its disc ID."""
  disc(
    """
    The [disc ID](https://musicbrainz.org/doc/Disc_ID)
    of the disc.
    """
    discID: DiscID!
  ): Disc

  """Look up a specific event by its MBID."""
  event(
    """The MBID of the entity."""
    mbid: MBID!
  ): Event

  """Look up a specific instrument by its MBID."""
  instrument(
    """The MBID of the entity."""
    mbid: MBID!
  ): Instrument

  """Look up a specific label by its MBID."""
  label(
    """The MBID of the entity."""
    mbid: MBID!
  ): Label

  """Look up a specific place by its MBID."""
  place(
    """The MBID of the entity."""
    mbid: MBID!
  ): Place

  """Look up a specific recording by its MBID."""
  recording(
    """The MBID of the entity."""
    mbid: MBID!
  ): Recording

  """Look up a specific release by its MBID."""
  release(
    """The MBID of the entity."""
    mbid: MBID!
  ): Release

  """Look up a specific release group by its MBID."""
  releaseGroup(
    """The MBID of the entity."""
    mbid: MBID!
  ): ReleaseGroup

  """Look up a specific series by its MBID."""
  series(
    """The MBID of the entity."""
    mbid: MBID!
  ): Series

  """Look up a specific URL by its MBID."""
  url(
    """The MBID of the entity."""
    mbid: MBID

    """The web address of the URL entity to look up."""
    resource: URLString
  ): URL

  """Look up a specific work by its MBID."""
  work(
    """The MBID of the entity."""
    mbid: MBID!
  ): Work
}

"""
The MBID scalar represents MusicBrainz identifiers, which are
36-character UUIDs.
"""
scalar MBID

"""
An object describing various properties of an image stored on a MediaWiki
server. The information comes the [MediaWiki imageinfo API](https://www.mediawiki.org/wiki/API:Imageinfo).
"""
type MediaWikiImage {
  """The URL of the actual image file."""
  url: URLString!

  """The URL of the wiki page describing the image."""
  descriptionURL: URLString

  """The user who uploaded the file."""
  user: String

  """The size of the file in bytes."""
  size: Int

  """The pixel width of the image."""
  width: Int

  """The pixel height of the image."""
  height: Int

  """The canonical title of the file."""
  canonicalTitle: String

  """The image title, brief description, or file name."""
  objectName: String

  """A description of the image, potentially containing HTML."""
  descriptionHTML: String

  """
  The original date of creation of the image. May be a description rather than
  a parseable timestamp, and may contain HTML.
  """
  originalDateTimeHTML: String

  """A list of the categories of the image."""
  categories: [String]!

  """The name of the image author, potentially containing HTML."""
  artistHTML: String

  """The source of the image, potentially containing HTML."""
  creditHTML: String

  """A short human-readable license name."""
  licenseShortName: String

  """A web address where the license is described."""
  licenseURL: URLString

  """The full list of values in the `extmetadata` field."""
  metadata: [MediaWikiImageMetadata]!
}

"""An entry in the `extmetadata` field of a MediaWiki image file."""
type MediaWikiImageMetadata {
  """The name of the metadata field."""
  name: String!

  """
  The value of the metadata field. All values will be converted to strings.
  """
  value: String

  """The source of the value."""
  source: String
}

"""
A medium is the actual physical medium the audio content is
stored upon. This means that each CD in a multi-disc release will be entered as
separate mediums within the release, and that both sides of a vinyl record or
cassette will exist on one medium. Mediums have a format (e.g. CD, DVD, vinyl,
cassette) and can optionally also have a title.
"""
type Medium {
  """The title of this particular medium."""
  title: String

  """
  The [format](https://musicbrainz.org/doc/Release/Format) of
  the medium (e.g. CD, DVD, vinyl, cassette).
  """
  format: String

  """
  The MBID associated with the value of the `format`
  field.
  """
  formatID: MBID

  """
  The order of this medium in the release (for example, in a
  multi-disc release).
  """
  position: Int

  """The number of audio tracks on this medium."""
  trackCount: Int

  """A list of physical discs and their disc IDs for this medium."""
  discs: [Disc]

  """The list of tracks on the given media."""
  tracks: [Track]
}

"""An object with an ID"""
interface Node {
  """The id of the object."""
  id: ID!
}

"""Information about pagination in a 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 [place](https://musicbrainz.org/doc/Place) is a venue, studio,
or other place where music is performed, recorded, engineered, etc.
"""
type Place implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  The address describes the location of the place using the
  standard addressing format for the country it is located in.
  """
  address: String

  """
  The area entity representing the area, such as the city, in
  which the place is located.
  """
  area: Area

  """The geographic coordinates of the place."""
  coordinates: Coordinates

  """
  The begin and end dates of the entity’s existence. Its exact
  meaning depends on the type of entity.
  """
  lifeSpan: LifeSpan

  """
  The type categorises the place based on its primary
  function.
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """A list of events linked to this entity."""
  events(after: String, first: Int): EventConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Place images found at MediaWiki URLs in the place’s URL relationships.
  Defaults to URL relationships with the type “image”.
  This field is provided by the MediaWiki extension.
  """
  mediaWikiImages(
    """
    The type of URL relationship that will be selected to find images. See the
    possible [Place-URL relationship types](https://musicbrainz.org/relationships/place-url).
    """
    type: String = "image"
  ): [MediaWikiImage]!
}

"""A connection to a list of items."""
type PlaceConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [PlaceEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Place]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type PlaceEdge {
  """The item at the end of the edge"""
  node: Place

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
The query root, from which multiple types of MusicBrainz
requests can be made.
"""
type Query {
  """Perform a lookup of a MusicBrainz entity by its MBID."""
  lookup: LookupQuery

  """Browse all MusicBrainz entities directly linked to another entity."""
  browse: BrowseQuery

  """Search for MusicBrainz entities using Lucene query syntax."""
  search: SearchQuery

  """Fetches an object given its ID"""
  node(
    """The ID of an object"""
    id: ID!
  ): Node

  """
  A query for data on [Last.fm](https://www.last.fm/) that is not connected
  to any particular MusicBrainz entity. This field is provided by the
  Last.fm extension.
  """
  lastFM: LastFMQuery
  spotify: SpotifyQuery!
}

"""
[Ratings](https://musicbrainz.org/doc/Rating_System) allow users
to rate MusicBrainz entities. User may assign a value between 1 and 5; these
values are then aggregated by the server to compute an average community rating
for the entity.
"""
type Rating {
  """The number of votes that have contributed to the rating."""
  voteCount: Int!

  """The average rating value based on the aggregated votes."""
  value: Float
}

"""
A [recording](https://musicbrainz.org/doc/Recording) is an
entity in MusicBrainz which can be linked to tracks on releases. Each track must
always be associated with a single recording, but a recording can be linked to
any number of tracks.

A recording represents distinct audio that has been used to produce at least one
released track through copying or mastering. A recording itself is never
produced solely through copying or mastering.

Generally, the audio represented by a recording corresponds to the audio at a
stage in the production process before any final mastering but after any editing
or mixing.
"""
type Recording implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official title of the entity."""
  title: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """The main credited artist(s)."""
  artistCredit: [ArtistCredit] @deprecated(reason: "The `artistCredit` field has been renamed to\n`artistCredits`, since it is a list of credits and is referred to in the\nplural form throughout the MusicBrainz documentation. This field is deprecated\nand will be removed in a major release in the future. Use the equivalent\n`artistCredits` field.")

  """The main credited artist(s)."""
  artistCredits: [ArtistCredit]

  """
  A list of [International Standard Recording Codes](https://musicbrainz.org/doc/ISRC)
  (ISRCs) for this recording.
  """
  isrcs: [ISRC]

  """
  An approximation to the length of the recording, calculated
  from the lengths of the tracks using it.
  """
  length: Duration

  """Whether this is a video recording."""
  video: Boolean

  """A list of artists linked to this entity."""
  artists(after: String, first: Int): ArtistConnection

  """A list of releases linked to this entity."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  Data about the recording from [TheAudioDB](http://www.theaudiodb.com/).
  This field is provided by TheAudioDB extension.
  """
  theAudioDB: TheAudioDBTrack

  """
  Data about the recording from [Last.fm](https://www.last.fm/), a good
  source for measuring popularity via listener and play counts. This field
  is provided by the Last.fm extension.
  """
  lastFM: LastFMTrack

  """The recording’s entry on Spotify."""
  spotify(
    """
    The strategies to use to match the recording with a Spotify track, in
    preferential order.
    """
    strategy: [SpotifyMatchStrategy!] = [URL, EXTERNALID]
  ): SpotifyTrack
}

"""A connection to a list of items."""
type RecordingConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [RecordingEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Recording]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type RecordingEdge {
  """The item at the end of the edge"""
  node: Recording

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
[Relationships](https://musicbrainz.org/doc/Relationships) are a
way to represent all the different ways in which entities are connected to each
other and to URLs outside MusicBrainz.
"""
type Relationship {
  """The target entity."""
  target: Entity!

  """The direction of the relationship."""
  direction: String!

  """The type of entity on the receiving end of the relationship."""
  targetType: String!

  """
  How the source entity was actually credited, if different
  from its main (performance) name.
  """
  sourceCredit: String

  """
  How the target entity was actually credited, if different
  from its main (performance) name.
  """
  targetCredit: String

  """The date on which the relationship became applicable."""
  begin: Date

  """The date on which the relationship became no longer applicable."""
  end: Date

  """Whether the relationship still applies."""
  ended: Boolean

  """
  Attributes which modify the relationship. There is a [list
  of all attributes](https://musicbrainz.org/relationship-attributes), but the
  attributes which are available, and how they should be used, depends on the
  relationship type.
  """
  attributes: [String]

  """The type of relationship."""
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID
}

"""A connection to a list of items."""
type RelationshipConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [RelationshipEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Relationship]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type RelationshipEdge {
  """The item at the end of the edge"""
  node: Relationship

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""Lists of entity relationships for each entity type."""
type Relationships {
  """A list of relationships between these two entity types."""
  areas(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  artists(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  events(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  instruments(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  labels(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  places(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  recordings(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  releases(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  releaseGroups(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  series(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  urls(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection

  """A list of relationships between these two entity types."""
  works(
    """Filter by the relationship direction."""
    direction: String

    """Filter by the relationship type."""
    type: String

    """
    The MBID associated with the value of the `type`
    field.
    """
    typeID: MBID
    after: String
    first: Int
    before: String
    last: Int
  ): RelationshipConnection
}

"""
A [release](https://musicbrainz.org/doc/Release) represents the
unique release (i.e. issuing) of a product on a specific date with specific
release information such as the country, label, barcode, packaging, etc. If you
walk into a store and purchase an album or single, they’re each represented in
MusicBrainz as one release.
"""
type Release implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official title of the entity."""
  title: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """The main credited artist(s)."""
  artistCredit: [ArtistCredit] @deprecated(reason: "The `artistCredit` field has been renamed to\n`artistCredits`, since it is a list of credits and is referred to in the\nplural form throughout the MusicBrainz documentation. This field is deprecated\nand will be removed in a major release in the future. Use the equivalent\n`artistCredits` field.")

  """The main credited artist(s)."""
  artistCredits: [ArtistCredit]

  """The release events for this release."""
  releaseEvents: [ReleaseEvent]

  """
  The [release date](https://musicbrainz.org/doc/Release/Date)
  is the date in which a release was made available through some sort of
  distribution mechanism.
  """
  date: Date

  """The country in which the release was issued."""
  country: String

  """
  The [Amazon Standard Identification Number](https://musicbrainz.org/doc/ASIN)
  of the release.
  """
  asin: ASIN

  """
  The [barcode](https://en.wikipedia.org/wiki/Barcode), if the
  release has one. The most common types found on releases are 12-digit
  [UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit
  [EANs](https://en.wikipedia.org/wiki/International_Article_Number).
  """
  barcode: String

  """The status describes how “official” a release is."""
  status: ReleaseStatus

  """
  The MBID associated with the value of the `status`
  field.
  """
  statusID: MBID

  """
  The physical packaging that accompanies the release. See
  the [list of packaging](https://musicbrainz.org/doc/Release/Packaging) for more
  information.
  """
  packaging: String

  """
  The MBID associated with the value of the `packaging`
  field.
  """
  packagingID: MBID

  """
  Data quality indicates how good the data for a release is.
  It is not a mark of how good or bad the music itself is – for that, use
  [ratings](https://musicbrainz.org/doc/Rating_System).
  """
  quality: String

  """The media on which the release was distributed."""
  media: [Medium]

  """A list of artists linked to this entity."""
  artists(after: String, first: Int): ArtistConnection

  """A list of labels linked to this entity."""
  labels(after: String, first: Int): LabelConnection

  """A list of recordings linked to this entity."""
  recordings(after: String, first: Int): RecordingConnection

  """A list of release groups linked to this entity."""
  releaseGroups(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]
    after: String
    first: Int
  ): ReleaseGroupConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  An object containing a list and summary of the cover art images that are
  present for this release from the [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive).
  This field is provided by the Cover Art Archive extension.
  """
  coverArtArchive: CoverArtArchiveRelease

  """Information about the release on Discogs."""
  discogs: DiscogsRelease

  """
  Data about the release from [Last.fm](https://www.last.fm/), a good source
  for measuring popularity via listener and play counts. This field is
  provided by the Last.fm extension.
  """
  lastFM: LastFMAlbum

  """The release’s entry on Spotify."""
  spotify(
    """
    The strategies to use to match the release with a Spotify album, in
    preferential order.
    """
    strategy: [SpotifyMatchStrategy!] = [URL, EXTERNALID]
  ): SpotifyAlbum
}

"""A connection to a list of items."""
type ReleaseConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [ReleaseEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Release]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type ReleaseEdge {
  """The item at the end of the edge"""
  node: Release

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
The date on which a release was issued in a country/region with
a particular label, catalog number, barcode, and format.
"""
type ReleaseEvent {
  area: Area
  date: Date
}

"""
A [release group](https://musicbrainz.org/doc/Release_Group) is
used to group several different releases into a single logical entity. Every
release belongs to one, and only one release group.

Both release groups and releases are “albums” in a general sense, but with an
important difference: a release is something you can buy as media such as a CD
or a vinyl record, while a release group embraces the overall concept of an
album – it doesn’t matter how many CDs or editions/versions it had.
"""
type ReleaseGroup implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official title of the entity."""
  title: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """The main credited artist(s)."""
  artistCredit: [ArtistCredit] @deprecated(reason: "The `artistCredit` field has been renamed to\n`artistCredits`, since it is a list of credits and is referred to in the\nplural form throughout the MusicBrainz documentation. This field is deprecated\nand will be removed in a major release in the future. Use the equivalent\n`artistCredits` field.")

  """The main credited artist(s)."""
  artistCredits: [ArtistCredit]

  """The date of the earliest release in the group."""
  firstReleaseDate: Date

  """
  The [type](https://musicbrainz.org/doc/Release_Group/Type)
  of a release group describes what kind of releases the release group represents,
  e.g. album, single, soundtrack, compilation, etc. A release group can have a
  “main” type and an unspecified number of additional types.
  """
  primaryType: ReleaseGroupType

  """
  The MBID associated with the value of the `primaryType`
  field.
  """
  primaryTypeID: MBID

  """
  Additional [types](https://musicbrainz.org/doc/Release_Group/Type)
  that apply to this release group.
  """
  secondaryTypes: [ReleaseGroupType]

  """
  The MBIDs associated with the values of the `secondaryTypes`
  field.
  """
  secondaryTypeIDs: [MBID]

  """A list of artists linked to this entity."""
  artists(after: String, first: Int): ArtistConnection

  """A list of releases linked to this entity."""
  releases(
    """Filter by one or more release group types."""
    type: [ReleaseGroupType]

    """Filter by one or more release statuses."""
    status: [ReleaseStatus]
    after: String
    first: Int
  ): ReleaseConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection

  """
  The cover art for a release in the release group, obtained from the
  [Cover Art Archive](https://musicbrainz.org/doc/Cover_Art_Archive). A
  release in the release group will be chosen as representative of the release
  group.
  This field is provided by the Cover Art Archive extension.
  """
  coverArtArchive: CoverArtArchiveRelease

  """
  Images of the release group from [fanart.tv](https://fanart.tv/).
  This field is provided by the fanart.tv extension.
  """
  fanArt: FanArtAlbum

  """
  Data about the release group from [TheAudioDB](http://www.theaudiodb.com/),
  a good source of descriptive information, reviews, and images.
  This field is provided by TheAudioDB extension.
  """
  theAudioDB: TheAudioDBAlbum

  """Information about the release group on Discogs."""
  discogs: DiscogsMaster
}

"""A connection to a list of items."""
type ReleaseGroupConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [ReleaseGroupEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [ReleaseGroup]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type ReleaseGroupEdge {
  """The item at the end of the edge"""
  node: ReleaseGroup

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
A type used to describe release groups, e.g. album, single, EP,
etc.
"""
enum ReleaseGroupType {
  """
  An album, perhaps better defined as a “Long Play” (LP)
  release, generally consists of previously unreleased material (unless this type
  is combined with secondary types which change that, such as “Compilation”). This
  includes album re-issues, with or without bonus tracks.
  """
  ALBUM

  """
  A single typically has one main song and possibly a handful
  of additional tracks or remixes of the main track. A single is usually named
  after its main song.
  """
  SINGLE

  """
  An EP is a so-called “Extended Play” release and often
  contains the letters EP in the title. Generally an EP will be shorter than a
  full length release (an LP or “Long Play”) and the tracks are usually exclusive
  to the EP, in other words the tracks don’t come from a previously issued
  release. EP is fairly difficult to define; usually it should only be assumed
  that a release is an EP if the artist defines it as such.
  """
  EP

  """Any release that does not fit any of the other categories."""
  OTHER

  """
  An episodic release that was originally broadcast via radio,
  television, or the Internet, including podcasts.
  """
  BROADCAST

  """
  A compilation is a collection of previously released tracks
  by one or more artists.
  """
  COMPILATION

  """
  A soundtrack is the musical score to a movie, TV series,
  stage show, computer game, etc.
  """
  SOUNDTRACK

  """A non-music spoken word release."""
  SPOKENWORD

  """
  An interview release contains an interview, generally with
  an artist.
  """
  INTERVIEW

  """An audiobook is a book read by a narrator without music."""
  AUDIOBOOK

  """A release that was recorded live."""
  LIVE

  """
  A release that was (re)mixed from previously released
  material.
  """
  REMIX

  """
  A DJ-mix is a sequence of several recordings played one
  after the other, each one modified so that they blend together into a continuous
  flow of music. A DJ mix release requires that the recordings be modified in some
  manner, and the DJ who does this modification is usually (although not always)
  credited in a fairly prominent way.
  """
  DJMIX

  """
  Promotional in nature (but not necessarily free), mixtapes
  and street albums are often released by artists to promote new artists, or
  upcoming studio albums by prominent artists. They are also sometimes used to
  keep fans’ attention between studio releases and are most common in rap & hip
  hop genres. They are often not sanctioned by the artist’s label, may lack proper
  sample or song clearances and vary widely in production and recording quality.
  While mixtapes are generally DJ-mixed, they are distinct from commercial DJ
  mixes (which are usually deemed compilations) and are defined by having a
  significant proportion of new material, including original production or
  original vocals over top of other artists’ instrumentals. They are distinct from
  demos in that they are designed for release directly to the public and fans, not
  to labels.
  """
  MIXTAPE

  """
  A release that was recorded for limited circulation or
  reference use rather than for general public release.
  """
  DEMO

  """A non-album track (special case)."""
  NAT
}

"""
A type used to describe the status of releases, e.g. official,
bootleg, etc.
"""
enum ReleaseStatus {
  """
  Any release officially sanctioned by the artist and/or their
  record company. (Most releases will fit into this category.)
  """
  OFFICIAL

  """
  A giveaway release or a release intended to promote an
  upcoming official release, e.g. prerelease albums or releases included with a
  magazine.
  """
  PROMOTION

  """
  An unofficial/underground release that was not sanctioned by
  the artist and/or the record company.
  """
  BOOTLEG

  """
  A pseudo-release is a duplicate release for
  translation/transliteration purposes.
  """
  PSEUDORELEASE
}

"""A search for MusicBrainz entities using Lucene query syntax."""
type SearchQuery {
  """Search for area entities matching the given query."""
  areas(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): AreaConnection

  """Search for artist entities matching the given query."""
  artists(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): ArtistConnection

  """Search for event entities matching the given query."""
  events(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): EventConnection

  """Search for instrument entities matching the given query."""
  instruments(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): InstrumentConnection

  """Search for label entities matching the given query."""
  labels(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): LabelConnection

  """Search for place entities matching the given query."""
  places(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): PlaceConnection

  """Search for recording entities matching the given query."""
  recordings(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): RecordingConnection

  """Search for release entities matching the given query."""
  releases(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): ReleaseConnection

  """Search for release group entities matching the given query."""
  releaseGroups(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): ReleaseGroupConnection

  """Search for series entities matching the given query."""
  series(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): SeriesConnection

  """Search for work entities matching the given query."""
  works(
    """
    The query terms, in Lucene search syntax. See [examples
    and search fields](https://musicbrainz.org/doc/Development/XML_Web_Service/Version_2/Search).
    """
    query: String!
    after: String
    first: Int
  ): WorkConnection
}

"""
A [series](https://musicbrainz.org/doc/Series) is a sequence of
separate release groups, releases, recordings, works or events with a common
theme.
"""
type Series implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official name of the entity."""
  name: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  The type primarily describes what type of entity the series
  contains.
  """
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection
}

"""A connection to a list of items."""
type SeriesConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [SeriesEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Series]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type SeriesEdge {
  """The item at the end of the edge"""
  node: Series

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""An album from Spotify."""
type SpotifyAlbum {
  """
  The [Spotify ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the album.
  """
  albumID: ID!

  """
  The [Spotify URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the album.
  """
  uri: String!

  """A link to the Web API endpoint providing full details of the album."""
  href: URLString!

  """
  The name of the album. In case of an album takedown, the value may be empty.
  """
  title: String

  """The type of the album, e.g. “Album”, “Single”, “Compilation”."""
  albumType: ReleaseGroupType!

  """The artists of the album."""
  artists: [SpotifyArtist!]!

  """
  The markets in which the album is available: [ISO 3166-1 alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
  country codes.
  
  Note that an album is considered available in a market when at least 1 of its tracks is available in that market.
  """
  availableMarkets: [String!]!

  """The copyright statements of the album."""
  copyrights: [SpotifyCopyright!]!

  """Known external IDs for the album."""
  externalIDs: [SpotifyExternalID!]!

  """Known external URLs for this album."""
  externalURLs: [SpotifyExternalURL!]!

  """
  A list of the genres used to classify the album. For example: “Prog Rock”,
  “Post-Grunge”. (If not yet classified, the array is empty.)
  """
  genres: [String!]!

  """The cover art for the album in various sizes, widest first."""
  images: [SpotifyImage!]!

  """The label for the album."""
  label: String

  """
  The popularity of the album. The value will be between 0 and 100, with 100
  being the most popular. The popularity is calculated from the popularity of
  the album’s individual tracks.
  """
  popularity: Int!

  """
  The date the album was first released, for example “1981-12-15”. Depending
  on the precision, the month or day might be missing.
  """
  releaseDate: Date
}

"""An artist from Spotify."""
type SpotifyArtist {
  """
  The [Spotify ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the artist.
  """
  artistID: ID!

  """
  The [Spotify URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the artist.
  """
  uri: String!

  """A link to the Web API endpoint providing full details of the artist."""
  href: URLString!

  """The name of the artist."""
  name: String!

  """Known external URLs for this artist."""
  externalURLs: [SpotifyExternalURL!]!

  """
  A list of the genres the artist is associated with. For example:
  “Prog Rock”, “Post-Grunge”. (If not yet classified, the array is empty.)
  """
  genres: [String!]!

  """
  The popularity of the artist. The value will be between 0 and 100, with 100
  being the most popular. The artist’s popularity is calculated from the
  popularity of all the artist’s tracks.
  """
  popularity: Int!

  """Images of the artist in various sizes, widest first."""
  images: [SpotifyImage!]!

  """Spotify catalog information about an artist’s top tracks by country."""
  topTracks(
    """
    An [ISO 3166-1 alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
    country code.
    """
    market: String!
  ): [SpotifyTrack!]!

  """
  Spotify catalog information about artists similar to a given artist.
  Similarity is based on analysis of the Spotify community’s listening
  history.
  """
  relatedArtists: [SpotifyArtist!]!
}

"""The audio features of a track from Spotify."""
type SpotifyAudioFeatures {
  """
  A confidence measure from 0.0 to 1.0 of whether the track is acoustic. 1.0
  represents high confidence the track is acoustic.
  """
  acousticness: Float!

  """
  Danceability describes how suitable a track is for dancing based on a
  combination of musical elements including tempo, rhythm stability, beat
  strength, and overall regularity. A value of 0.0 is least danceable and 1.0
  is most danceable.
  """
  danceability: Float!

  """The duration of the track in milliseconds."""
  duration: Duration!

  """
  Energy is a measure from 0.0 to 1.0 and represents a perceptual measure of
  intensity and activity. Typically, energetic tracks feel fast, loud, and
  noisy. For example, death metal has high energy, while a Bach prelude scores
  low on the scale. Perceptual features contributing to this attribute include
  dynamic range, perceived loudness, timbre, onset rate, and general entropy.
  """
  energy: Float!

  """
  Predicts whether a track contains no vocals. “Ooh” and “aah” sounds are
  treated as instrumental in this context. Rap or spoken word tracks are
  clearly “vocal”. The closer the instrumentalness value is to 1.0, the
  greater likelihood the track contains no vocal content. Values above 0.5 are
  intended to represent instrumental tracks, but confidence is higher as the
  value approaches 1.0.
  """
  instrumentalness: Float!

  """
  The key the track is in. Integers map to pitches using standard [Pitch Class
  notation](https://en.wikipedia.org/wiki/Pitch_class), e.g. 0 = C, 1 = C♯/D♭,
  2 = D, and so on. See the `keyName` field if you’d prefer the note as a
  string.
  """
  key: Int!

  """
  The `key` translated from an integer to a name like “C”. (Only one name
  will be returned, so enharmonic notes like like C♯/D♭ will just return
  “C♯”.)
  """
  keyName: String!

  """
  Detects the presence of an audience in the recording. Higher liveness values
  represent an increased probability that the track was performed live. A
  value above 0.8 provides strong likelihood that the track is live.
  """
  liveness: Float!

  """
  The overall loudness of a track in decibels (dB). Loudness values are
  averaged across the entire track and are useful for comparing relative
  loudness of tracks. Loudness is the quality of a sound that is the primary
  psychological correlate of physical strength (amplitude). Values typical
  range between -60 and 0 db.
  """
  loudness: Float!

  """
  Mode indicates the modality (major or minor) of a track, the type of scale
  from which its melodic content is derived. Major is represented by 1 and
  minor is 0.
  """
  mode: SpotifyTrackMode!

  """
  Speechiness detects the presence of spoken words in a track. The more
  exclusively speech-like the recording (e.g. talk show, audio book, poetry),
  the closer to 1.0 the attribute value. Values above 0.66 describe tracks
  that are probably made entirely of spoken words. Values between 0.33 and
  0.66 describe tracks that may contain both music and speech, either in
  sections or layered, including such cases as rap music. Values below 0.33
  most likely represent music and other non-speech-like tracks.
  """
  speechiness: Float!

  """
  The overall estimated tempo of a track in beats per minute (BPM). In musical
  terminology, tempo is the speed or pace of a given piece and derives
  directly from the average beat duration.
  """
  tempo: Float!

  """
  An estimated overall time signature of a track. The time signature (meter)
  is a notational convention to specify how many beats are in each bar (or
  measure).
  """
  timeSignature: Float!

  """
  A measure from 0.0 to 1.0 describing the musical positiveness conveyed by a
  track. Tracks with high valence sound more positive (e.g. happy, cheerful,
  euphoric), while tracks with low valence sound more negative (e.g. sad,
  depressed, angry).
  """
  valence: Float!
}

"""A copyright statement for an album from Spotify."""
type SpotifyCopyright {
  """The copyright text."""
  text: String!

  """
  Whether the copyright is for the work itself or the sound recording
  (performance).
  """
  type: SpotifyCopyrightType!
}

"""The type of copyright."""
enum SpotifyCopyrightType {
  """The copyright."""
  COPYRIGHT

  """The sound recording (performance) copyright."""
  PERFORMANCE
}

"""A value for identifying an entity with some third party."""
type SpotifyExternalID {
  """The identifier type, for example “isrc”, “ean”, “upc”."""
  type: String!

  """The identifier value."""
  id: String!
}

"""A URL for linking to an entity with some third party."""
type SpotifyExternalURL {
  """The type of the URL, for example “spotify”."""
  type: String!

  """An external, public URL to the object."""
  url: URLString!
}

"""A single image from Spotify."""
type SpotifyImage {
  """The source URL of the image."""
  url: URLString!

  """The image width in pixels, if known."""
  width: Int

  """The image height in pixels, if known."""
  height: Int
}

"""Strategies for matching MusicBrainz entities to Spotify entities."""
enum SpotifyMatchStrategy {
  """
  The entity will be matched by finding an explicit URL relationship that
  links to Spotify.
  """
  URL

  """
  The entity will be matched by searching for Spotify entities by some
  external ID that is known to both MusicBrainz and Spotify, like an ISRC
  or UPC barcode. Since this can result in multiple Spotify matches, the most
  popular will be preferred (if possible), or the first.
  """
  EXTERNALID
}

type SpotifyQuery {
  """Track recommendations based on seed entities and various parameters."""
  recommendations(
    """
    A list of [Spotify IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
    for seed artists. Up to 5 seed values may be provided in any combination
    of `seedArtists`, `seedTracks`, and `seedGenres`.
    """
    seedArtists: [ID!] = []

    """
    A comma separated list of any genres in the set of [available genre seeds](https://developer.spotify.com/documentation/web-api/reference/browse/get-recommendations/#available-genre-seeds).
    Up to 5 seed values may be provided in any combination of `seedArtists`,
    `seedTracks`, and `seedGenres`.
    """
    seedGenres: [ID!] = []

    """
    A list of [Spotify IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
    for seed tracks. Up to 5 seed values may be provided in any combination
    of `seedArtists`, `seedTracks`, and `seedGenres`.
    """
    seedTracks: [ID!] = []

    """
    The target size of the list of recommended tracks. For seeds with
    unusually small pools or when highly restrictive filtering is applied, it
    may be impossible to generate the requested number of recommended tracks.
    Debugging information for such cases is available in the response.
    
    Default: 20. Minimum: 1. Maximum: 100.
    """
    limit: Int
  ): SpotifyRecommendations!
}

type SpotifyRecommendations {
  tracks: [SpotifyTrack!]!
}

"""A track from Spotify."""
type SpotifyTrack {
  """
  The [Spotify ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the track.
  """
  trackID: ID!

  """
  The [Spotify URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)
  for the track.
  """
  uri: String!

  """A link to the Web API endpoint providing full details of the track."""
  href: URLString!

  """The name of the track."""
  title: String!

  """The audio features of the track."""
  audioFeatures: SpotifyAudioFeatures

  """The album on which the track appears."""
  album: SpotifyAlbum

  """The artists who performed the track."""
  artists: [SpotifyArtist!]!

  """
  A list of the countries in which the track can be played, identified by
  their [ISO 3166-1 alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
  code.
  """
  availableMarkets: [String!]!

  """
  The disc number (usually `1` unless the album consists of more than one
  disc).
  """
  discNumber: Int!

  """The track length in milliseconds."""
  duration: Duration!

  """Whether or not the track has explicit lyrics, if known."""
  explicit: Boolean

  """Known external IDs for the track."""
  externalIDs: [SpotifyExternalID!]!

  """Known external URLs for the track."""
  externalURLs: [SpotifyExternalURL!]!

  """
  The popularity of the track. The value will be between 0 and 100, with 100
  being the most popular.
  
  The popularity is calculated by algorithm and is based, in the most part, on
  the total number of plays the track has had and how recent those plays are.
  Generally speaking, songs that are being played a lot now will have a higher
  popularity than songs that were played a lot in the past.
  
  Duplicate tracks (e.g. the same track from a single and an album) are rated
  independently.
  
  Artist and album popularity is derived mathematically from track popularity.
  
  Note that the popularity value may lag actual popularity by a few days: the
  value is not updated in real time.
  """
  popularity: Int!

  """A link to a 30 second preview (MP3 format) of the track, if available."""
  previewURL: URLString

  """
  The number of the track. If an album has several discs, the track number is
  the number on the specified disc.
  """
  trackNumber: Int!

  """A MusicBrainz recording that corresponds to the track."""
  musicBrainz(
    """
    The strategies to use to match the track with a MusicBrainz recording, in
    preferential order.
    """
    strategy: [SpotifyMatchStrategy!] = [URL, EXTERNALID]
  ): Recording
}

"""The potential values for modality (major or minor) of a track."""
enum SpotifyTrackMode {
  """The major scale."""
  MAJOR

  """The minor scale."""
  MINOR
}

"""
[Tags](https://musicbrainz.org/tags) are a way to mark entities
with extra information – for example, the genres that apply to an artist,
release, or recording.
"""
type Tag {
  """The tag label."""
  name: String!

  """How many times this tag has been applied to the entity."""
  count: Int
}

"""A connection to a list of items."""
type TagConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [TagEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Tag]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type TagEdge {
  """The item at the end of the edge"""
  node: Tag

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}

"""
An album on [TheAudioDB](http://www.theaudiodb.com/) corresponding with a
MusicBrainz Release Group.
"""
type TheAudioDBAlbum {
  """TheAudioDB ID of the album."""
  albumID: ID

  """TheAudioDB ID of the artist who released the album."""
  artistID: ID

  """A description of the album, often available in several languages."""
  description(
    """
    The two-letter code for the language in which to retrieve the biography.
    """
    lang: String = "en"
  ): String

  """A review of the album."""
  review: String

  """The worldwide sales figure."""
  salesCount: Float

  """The album’s rating as determined by user votes, out of 10."""
  score: Float

  """The number of users who voted to determine the album’s score."""
  scoreVotes: Float

  """An image of the physical disc media for the album."""
  discImage(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """An image of the spine of the album packaging."""
  spineImage(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """An image of the front of the album packaging."""
  frontImage(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """An image of the back of the album packaging."""
  backImage(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """The primary musical genre of the album (e.g. “Alternative Rock”)."""
  genre: String

  """The primary musical mood of the album (e.g. “Sad”)."""
  mood: String

  """The primary musical style of the album (e.g. “Rock/Pop”)."""
  style: String

  """
  A rough description of the primary musical speed of the album (e.g. “Medium”).
  """
  speed: String

  """The primary musical theme of the album (e.g. “In Love”)."""
  theme: String
}

"""An artist on [TheAudioDB](http://www.theaudiodb.com/)."""
type TheAudioDBArtist {
  """TheAudioDB ID of the artist."""
  artistID: ID

  """A biography of the artist, often available in several languages."""
  biography(
    """
    The two-letter code for the language in which to retrieve the biography.
    """
    lang: String = "en"
  ): String

  """The number of members in the musical group, if applicable."""
  memberCount: Int

  """
  A 1000x185 JPG banner image containing the artist and their logo or name.
  """
  banner(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """A list of 1280x720 or 1920x1080 JPG images depicting the artist."""
  fanArt(
    """The size of the images to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): [URLString]!

  """
  A 400x155 PNG image containing the artist’s logo or name, with a transparent
  background.
  """
  logo(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """
  A 1000x1000 JPG thumbnail image picturing the artist (usually containing
  every member of a band).
  """
  thumbnail(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """The primary musical genre of the artist (e.g. “Alternative Rock”)."""
  genre: String

  """The primary musical mood of the artist (e.g. “Sad”)."""
  mood: String

  """The primary musical style of the artist (e.g. “Rock/Pop”)."""
  style: String
}

"""
The image sizes that may be requested at [TheAudioDB](http://www.theaudiodb.com/).
"""
enum TheAudioDBImageSize {
  """The image’s full original dimensions."""
  FULL

  """A maximum dimension of 200px."""
  PREVIEW
}

"""
Details of a music video associated with a track on [TheAudioDB](http://www.theaudiodb.com/).
"""
type TheAudioDBMusicVideo {
  """The URL where the music video can be found."""
  url: URLString

  """The video production company of the music video."""
  companyName: String

  """The director of the music video."""
  directorName: String

  """A list of still images from the music video."""
  screenshots(
    """The size of the images to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): [URLString]!

  """
  The number of views the video has received at the given URL. This will rarely
  be up to date, so use cautiously.
  """
  viewCount: Float

  """
  The number of likes the video has received at the given URL. This will rarely
  be up to date, so use cautiously.
  """
  likeCount: Float

  """
  The number of dislikes the video has received at the given URL. This will
  rarely be up to date, so use cautiously.
  """
  dislikeCount: Float

  """
  The number of comments the video has received at the given URL. This will
  rarely be up to date, so use cautiously.
  """
  commentCount: Float
}

"""
A track on [TheAudioDB](http://www.theaudiodb.com/) corresponding with a
MusicBrainz Recording.
"""
type TheAudioDBTrack {
  """TheAudioDB ID of the track."""
  trackID: ID

  """TheAudioDB ID of the album on which the track appears."""
  albumID: ID

  """TheAudioDB ID of the artist who released the track."""
  artistID: ID

  """A description of the track."""
  description(
    """
    The two-letter code for the language in which to retrieve the description.
    """
    lang: String = "en"
  ): String

  """A thumbnail image for the track."""
  thumbnail(
    """The size of the image to retrieve."""
    size: TheAudioDBImageSize = FULL
  ): URLString

  """The track’s rating as determined by user votes, out of 10."""
  score: Float

  """The number of users who voted to determine the album’s score."""
  scoreVotes: Float

  """The track number of the song on the album."""
  trackNumber: Int

  """The official music video for the track."""
  musicVideo: TheAudioDBMusicVideo

  """The primary musical genre of the track (e.g. “Alternative Rock”)."""
  genre: String

  """The primary musical mood of the track (e.g. “Sad”)."""
  mood: String

  """The primary musical style of the track (e.g. “Rock/Pop”)."""
  style: String

  """The primary musical theme of the track (e.g. “In Love”)."""
  theme: String
}

"""A time of day, in 24-hour hh:mm notation."""
scalar Time

"""
A track is the way a recording is represented on a particular
  release (or, more exactly, on a particular medium). Every track has a title
  (see the guidelines for titles) and is credited to one or more artists.
"""
type Track implements Entity {
  """The MBID of the entity."""
  mbid: MBID!

  """The official title of the entity."""
  title: String

  """
  The track’s position on the overall release (including all
  tracks from all discs).
  """
  position: Int

  """
  The track number, which may include information about the
  disc or side it appears on, e.g. “A1” or “B3”.
  """
  number: String

  """The length of the track."""
  length: Duration

  """The recording that appears on the track."""
  recording: Recording
}

"""
A [URL](https://musicbrainz.org/doc/URL) pointing to a resource
external to MusicBrainz, i.e. an official homepage, a site where music can be
acquired, an entry in another database, etc.
"""
type URL implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The actual URL string."""
  resource: URLString!

  """Relationships between this entity and other entitites."""
  relationships: Relationships
}

"""A web address."""
scalar URLString

"""
A [work](https://musicbrainz.org/doc/Work) is a distinct
intellectual or artistic creation, which can be expressed in the form of one or
more audio recordings.
"""
type Work implements Node & Entity {
  """The ID of an object"""
  id: ID!

  """The MBID of the entity."""
  mbid: MBID!

  """The official title of the entity."""
  title: String

  """A comment used to help distinguish identically named entitites."""
  disambiguation: String

  """
  [Aliases](https://musicbrainz.org/doc/Aliases) are used to store
  alternate names or misspellings.
  """
  aliases: [Alias]

  """
  A list of [ISWCs](https://musicbrainz.org/doc/ISWC) assigned
  to the work by copyright collecting agencies.
  """
  iswcs: [String]

  """The language in which the work was originally written."""
  language: String

  """The type of work."""
  type: String

  """
  The MBID associated with the value of the `type`
  field.
  """
  typeID: MBID

  """A list of artists linked to this entity."""
  artists(after: String, first: Int): ArtistConnection

  """Relationships between this entity and other entitites."""
  relationships: Relationships

  """A list of collections containing this entity."""
  collections(after: String, first: Int): CollectionConnection

  """The rating users have given to this entity."""
  rating: Rating

  """A list of tags linked to this entity."""
  tags(after: String, first: Int): TagConnection
}

"""A connection to a list of items."""
type WorkConnection {
  """Information to aid in pagination."""
  pageInfo: PageInfo!

  """A list of edges."""
  edges: [WorkEdge]

  """
  A list of nodes in the connection (without going through the
  `edges` field).
  """
  nodes: [Work]

  """
  A count of the total number of items in this connection,
  ignoring pagination.
  """
  totalCount: Int
}

"""An edge in a connection."""
type WorkEdge {
  """The item at the end of the edge"""
  node: Work

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

  """
  The relevancy score (0–100) assigned by the search engine, if
  these results were found through a search.
  """
  score: Int
}


================================================
FILE: example/graphbrainz/lib/main.dart
================================================
import 'package:artemis/artemis.dart';

import 'queries/ed_sheeran.query.dart';

void main() async {
  final client = ArtemisClient(
    'https://graphbrainz.herokuapp.com/',
  );

  final query = EdSheeranQuery();
  final query2 = EdSheeranQuery();
  final response = await client.execute(query);
  client.dispose();

  print('Equality works: ${query == query2}');

  if (response.hasErrors) {
    return print('Error: ${response.errors!.map((e) => e.message).toList()}');
  }

  print(response.data?.node?.$$typename);
  final edSheeran = response.data?.node as EdSheeran$Query$Node$Artist;
  print(edSheeran.name);
  print(edSheeran.lifeSpan?.begin);
}


================================================
FILE: example/graphbrainz/lib/queries/ed_sheeran.query.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
export 'ed_sheeran.query.graphql.dart';


================================================
FILE: example/graphbrainz/lib/queries/ed_sheeran.query.graphql
================================================
query ed_sheeran {
  node(id: "QXJ0aXN0OmI4YTdjNTFmLTM2MmMtNGRjYi1hMjU5LWJjNmUwMDk1ZjBhNg==") {
    __typename
    id
    ... on Artist {
      mbid
      name
      releases {
        nodes {
          id
          status
        }
      }
      lifeSpan {
        begin
      }
      spotify {
        href
      }
    }
  }
}


================================================
FILE: example/graphbrainz/lib/queries/ed_sheeran.query.graphql.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
// @dart = 2.12

import 'package:artemis/artemis.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:equatable/equatable.dart';
import 'package:gql/ast.dart';
part 'ed_sheeran.query.graphql.g.dart';

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node$Artist$ReleaseConnection$Release
    extends JsonSerializable with EquatableMixin {
  EdSheeran$Query$Node$Artist$ReleaseConnection$Release();

  factory EdSheeran$Query$Node$Artist$ReleaseConnection$Release.fromJson(
          Map<String, dynamic> json) =>
      _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseFromJson(json);

  late String id;

  @JsonKey(unknownEnumValue: ReleaseStatus.artemisUnknown)
  ReleaseStatus? status;

  @override
  List<Object?> get props => [id, status];
  @override
  Map<String, dynamic> toJson() =>
      _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseToJson(this);
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node$Artist$ReleaseConnection extends JsonSerializable
    with EquatableMixin {
  EdSheeran$Query$Node$Artist$ReleaseConnection();

  factory EdSheeran$Query$Node$Artist$ReleaseConnection.fromJson(
          Map<String, dynamic> json) =>
      _$EdSheeran$Query$Node$Artist$ReleaseConnectionFromJson(json);

  List<EdSheeran$Query$Node$Artist$ReleaseConnection$Release?>? nodes;

  @override
  List<Object?> get props => [nodes];
  @override
  Map<String, dynamic> toJson() =>
      _$EdSheeran$Query$Node$Artist$ReleaseConnectionToJson(this);
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node$Artist$LifeSpan extends JsonSerializable
    with EquatableMixin {
  EdSheeran$Query$Node$Artist$LifeSpan();

  factory EdSheeran$Query$Node$Artist$LifeSpan.fromJson(
          Map<String, dynamic> json) =>
      _$EdSheeran$Query$Node$Artist$LifeSpanFromJson(json);

  DateTime? begin;

  @override
  List<Object?> get props => [begin];
  @override
  Map<String, dynamic> toJson() =>
      _$EdSheeran$Query$Node$Artist$LifeSpanToJson(this);
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node$Artist$SpotifyArtist extends JsonSerializable
    with EquatableMixin {
  EdSheeran$Query$Node$Artist$SpotifyArtist();

  factory EdSheeran$Query$Node$Artist$SpotifyArtist.fromJson(
          Map<String, dynamic> json) =>
      _$EdSheeran$Query$Node$Artist$SpotifyArtistFromJson(json);

  late String href;

  @override
  List<Object?> get props => [href];
  @override
  Map<String, dynamic> toJson() =>
      _$EdSheeran$Query$Node$Artist$SpotifyArtistToJson(this);
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node$Artist extends EdSheeran$Query$Node
    with EquatableMixin {
  EdSheeran$Query$Node$Artist();

  factory EdSheeran$Query$Node$Artist.fromJson(Map<String, dynamic> json) =>
      _$EdSheeran$Query$Node$ArtistFromJson(json);

  late String mbid;

  String? name;

  EdSheeran$Query$Node$Artist$ReleaseConnection? releases;

  EdSheeran$Query$Node$Artist$LifeSpan? lifeSpan;

  EdSheeran$Query$Node$Artist$SpotifyArtist? spotify;

  @override
  List<Object?> get props => [mbid, name, releases, lifeSpan, spotify];
  @override
  Map<String, dynamic> toJson() => _$EdSheeran$Query$Node$ArtistToJson(this);
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query$Node extends JsonSerializable with EquatableMixin {
  EdSheeran$Query$Node();

  factory EdSheeran$Query$Node.fromJson(Map<String, dynamic> json) {
    switch (json['__typename'].toString()) {
      case r'Artist':
        return EdSheeran$Query$Node$Artist.fromJson(json);
      default:
    }
    return _$EdSheeran$Query$NodeFromJson(json);
  }

  @JsonKey(name: '__typename')
  String? $$typename;

  late String id;

  @override
  List<Object?> get props => [$$typename, id];
  @override
  Map<String, dynamic> toJson() {
    switch ($$typename) {
      case r'Artist':
        return (this as EdSheeran$Query$Node$Artist).toJson();
      default:
    }
    return _$EdSheeran$Query$NodeToJson(this);
  }
}

@JsonSerializable(explicitToJson: true)
class EdSheeran$Query extends JsonSerializable with EquatableMixin {
  EdSheeran$Query();

  factory EdSheeran$Query.fromJson(Map<String, dynamic> json) =>
      _$EdSheeran$QueryFromJson(json);

  EdSheeran$Query$Node? node;

  @override
  List<Object?> get props => [node];
  @override
  Map<String, dynamic> toJson() => _$EdSheeran$QueryToJson(this);
}

enum ReleaseStatus {
  @JsonValue('OFFICIAL')
  official,
  @JsonValue('PROMOTION')
  promotion,
  @JsonValue('BOOTLEG')
  bootleg,
  @JsonValue('PSEUDORELEASE')
  pseudorelease,
  @JsonValue('ARTEMIS_UNKNOWN')
  artemisUnknown,
}

final ED_SHEERAN_QUERY_DOCUMENT = DocumentNode(definitions: [
  OperationDefinitionNode(
      type: OperationType.query,
      name: NameNode(value: 'ed_sheeran'),
      variableDefinitions: [],
      directives: [],
      selectionSet: SelectionSetNode(selections: [
        FieldNode(
            name: NameNode(value: 'node'),
            alias: null,
            arguments: [
              ArgumentNode(
                  name: NameNode(value: 'id'),
                  value: StringValueNode(
                      value:
                          'QXJ0aXN0OmI4YTdjNTFmLTM2MmMtNGRjYi1hMjU5LWJjNmUwMDk1ZjBhNg==',
                      isBlock: false))
            ],
            directives: [],
            selectionSet: SelectionSetNode(selections: [
              FieldNode(
                  name: NameNode(value: '__typename'),
                  alias: null,
                  arguments: [],
                  directives: [],
                  selectionSet: null),
              FieldNode(
                  name: NameNode(value: 'id'),
                  alias: null,
                  arguments: [],
                  directives: [],
                  selectionSet: null),
              InlineFragmentNode(
                  typeCondition: TypeConditionNode(
                      on: NamedTypeNode(
                          name: NameNode(value: 'Artist'), isNonNull: false)),
                  directives: [],
                  selectionSet: SelectionSetNode(selections: [
                    FieldNode(
                        name: NameNode(value: 'mbid'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: null),
                    FieldNode(
                        name: NameNode(value: 'name'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: null),
                    FieldNode(
                        name: NameNode(value: 'releases'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: SelectionSetNode(selections: [
                          FieldNode(
                              name: NameNode(value: 'nodes'),
                              alias: null,
                              arguments: [],
                              directives: [],
                              selectionSet: SelectionSetNode(selections: [
                                FieldNode(
                                    name: NameNode(value: 'id'),
                                    alias: null,
                                    arguments: [],
                                    directives: [],
                                    selectionSet: null),
                                FieldNode(
                                    name: NameNode(value: 'status'),
                                    alias: null,
                                    arguments: [],
                                    directives: [],
                                    selectionSet: null)
                              ]))
                        ])),
                    FieldNode(
                        name: NameNode(value: 'lifeSpan'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: SelectionSetNode(selections: [
                          FieldNode(
                              name: NameNode(value: 'begin'),
                              alias: null,
                              arguments: [],
                              directives: [],
                              selectionSet: null)
                        ])),
                    FieldNode(
                        name: NameNode(value: 'spotify'),
                        alias: null,
                        arguments: [],
                        directives: [],
                        selectionSet: SelectionSetNode(selections: [
                          FieldNode(
                              name: NameNode(value: 'href'),
                              alias: null,
                              arguments: [],
                              directives: [],
                              selectionSet: null)
                        ]))
                  ]))
            ]))
      ]))
]);

class EdSheeranQuery extends GraphQLQuery<EdSheeran$Query, JsonSerializable> {
  EdSheeranQuery();

  @override
  final DocumentNode document = ED_SHEERAN_QUERY_DOCUMENT;

  @override
  final String operationName = 'ed_sheeran';

  @override
  List<Object?> get props => [document, operationName];
  @override
  EdSheeran$Query parse(Map<String, dynamic> json) =>
      EdSheeran$Query.fromJson(json);
}


================================================
FILE: example/graphbrainz/lib/queries/ed_sheeran.query.graphql.g.dart
================================================
// GENERATED CODE - DO NOT MODIFY BY HAND
// @dart=2.12

part of 'ed_sheeran.query.graphql.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

EdSheeran$Query$Node$Artist$ReleaseConnection$Release
    _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseFromJson(
            Map<String, dynamic> json) =>
        EdSheeran$Query$Node$Artist$ReleaseConnection$Release()
          ..id = json['id'] as String
          ..status = _$enumDecodeNullable(
              _$ReleaseStatusEnumMap, json['status'],
              unknownValue: ReleaseStatus.artemisUnknown);

Map<String, dynamic>
    _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseToJson(
            EdSheeran$Query$Node$Artist$ReleaseConnection$Release instance) =>
        <String, dynamic>{
          'id': instance.id,
          'status': _$ReleaseStatusEnumMap[instance.status],
        };

K _$enumDecode<K, V>(
  Map<K, V> enumValues,
  Object? source, {
  K? unknownValue,
}) {
  if (source == null) {
    throw ArgumentError(
      'A value must be provided. Supported values: '
      '${enumValues.values.join(', ')}',
    );
  }

  return enumValues.entries.singleWhere(
    (e) => e.value == source,
    orElse: () {
      if (unknownValue == null) {
        throw ArgumentError(
          '`$source` is not one of the supported values: '
          '${enumValues.values.join(', ')}',
        );
      }
      return MapEntry(unknownValue, enumValues.values.first);
    },
  ).key;
}

K? _$enumDecodeNullable<K, V>(
  Map<K, V> enumValues,
  dynamic source, {
  K? unknownValue,
}) {
  if (source == null) {
    return null;
  }
  return _$enumDecode<K, V>(enumValues, source, unknownV
Download .txt
gitextract_38k7t15o/

├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── library-scripts/
│       ├── README.md
│       └── common-debian.sh
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug-report.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── pull_request.yaml
│       └── push.yaml
├── .gitignore
├── CHANGELOG.md
├── FUNDING.yml
├── LICENSE
├── README.md
├── analysis_options.yaml
├── build.yaml
├── example/
│   ├── .gitignore
│   ├── README.md
│   ├── github/
│   │   ├── .gitignore
│   │   ├── build.yaml
│   │   ├── lib/
│   │   │   ├── graphql/
│   │   │   │   ├── search_repositories.dart
│   │   │   │   ├── search_repositories.graphql
│   │   │   │   ├── search_repositories.graphql.dart
│   │   │   │   └── search_repositories.graphql.g.dart
│   │   │   └── main.dart
│   │   └── pubspec.yaml
│   ├── graphbrainz/
│   │   ├── build.yaml
│   │   ├── lib/
│   │   │   ├── coercers.dart
│   │   │   ├── graphbrainz.schema.graphql
│   │   │   ├── main.dart
│   │   │   └── queries/
│   │   │       ├── ed_sheeran.query.dart
│   │   │       ├── ed_sheeran.query.graphql
│   │   │       ├── ed_sheeran.query.graphql.dart
│   │   │       └── ed_sheeran.query.graphql.g.dart
│   │   └── pubspec.yaml
│   ├── hasura/
│   │   ├── build.yaml
│   │   ├── graphql/
│   │   │   └── messages_with_users.graphql
│   │   ├── hasura.sql
│   │   ├── lib/
│   │   │   ├── graphql/
│   │   │   │   ├── messages_with_users.graphql.dart
│   │   │   │   └── messages_with_users.graphql.g.dart
│   │   │   └── main.dart
│   │   ├── pubspec.yaml
│   │   └── schema.graphql
│   └── pokemon/
│       ├── build.yaml
│       ├── graphql/
│       │   ├── big_query.query.graphql
│       │   ├── fragment_query.query.graphql
│       │   ├── fragments_glob.fragment.graphql
│       │   ├── fragments_glob.query.graphql
│       │   └── simple_query.query.graphql
│       ├── lib/
│       │   ├── graphql/
│       │   │   ├── big_query.dart
│       │   │   ├── big_query.graphql.dart
│       │   │   ├── big_query.graphql.g.dart
│       │   │   ├── fragment_query.dart
│       │   │   ├── fragment_query.graphql.dart
│       │   │   ├── fragment_query.graphql.g.dart
│       │   │   ├── fragments_glob.dart
│       │   │   ├── fragments_glob.graphql.dart
│       │   │   ├── fragments_glob.graphql.g.dart
│       │   │   ├── simple_query.dart
│       │   │   ├── simple_query.graphql.dart
│       │   │   └── simple_query.graphql.g.dart
│       │   └── main.dart
│       ├── pokemon.schema.graphql
│       └── pubspec.yaml
├── lib/
│   ├── artemis.dart
│   ├── builder.dart
│   ├── client.dart
│   ├── generator/
│   │   ├── data/
│   │   │   ├── class_definition.dart
│   │   │   ├── class_property.dart
│   │   │   ├── data.dart
│   │   │   ├── definition.dart
│   │   │   ├── enum_definition.dart
│   │   │   ├── enum_value_definition.dart
│   │   │   ├── fragment_class_definition.dart
│   │   │   ├── library_definition.dart
│   │   │   ├── nullable.dart
│   │   │   ├── query_definition.dart
│   │   │   └── query_input.dart
│   │   ├── data_printer.dart
│   │   ├── ephemeral_data.dart
│   │   ├── errors.dart
│   │   ├── graphql_helpers.dart
│   │   ├── helpers.dart
│   │   └── print_helpers.dart
│   ├── generator.dart
│   ├── schema/
│   │   ├── graphql_query.dart
│   │   ├── graphql_response.dart
│   │   ├── options.dart
│   │   └── options.g2.dart
│   ├── transformer/
│   │   └── add_typename_transformer.dart
│   └── visitor/
│       ├── canonical_visitor.dart
│       ├── generator_visitor.dart
│       ├── object_type_definition_visitor.dart
│       ├── operation_type_definition_visitor.dart
│       ├── schema_definition_visitor.dart
│       └── type_definition_node_visitor.dart
├── pubspec.yaml
├── test/
│   ├── generator/
│   │   ├── helpers_test.dart
│   │   └── print_helpers_test.dart
│   ├── helpers.dart
│   └── query_generator/
│       ├── aliases/
│       │   ├── alias_on_leaves_test.dart
│       │   └── alias_on_object_test.dart
│       ├── append_type_name_test.dart
│       ├── ast_schema/
│       │   ├── field_not_found_mutation_test.dart
│       │   ├── input_types_test.dart
│       │   ├── missing_schema_test.dart
│       │   └── multiple_schema_mappint_test.dart
│       ├── deprecated/
│       │   ├── deprecated_enum_value_test.dart
│       │   ├── deprecated_field_test.dart
│       │   ├── deprecated_input_object_field_test.dart
│       │   └── deprecated_interface_field_test.dart
│       ├── enums/
│       │   ├── enum_duplication_test.dart
│       │   ├── enum_list_test.dart
│       │   ├── filter_enum_test.dart
│       │   ├── input_enum_list_test.dart
│       │   ├── input_enum_test.dart
│       │   ├── kw_prefix_test.dart
│       │   └── query_enum_test.dart
│       ├── errors/
│       │   ├── fragment_not_found_test.dart
│       │   ├── generation_errors_test.dart
│       │   └── root_type_not_found_test.dart
│       ├── forwarder_test.dart
│       ├── fragments/
│       │   ├── fragment_duplication_test.dart
│       │   ├── fragment_glob_schema_level_test.dart
│       │   ├── fragment_glob_test.dart
│       │   ├── fragment_multiple_queries_test.dart
│       │   ├── fragment_on_fragments_test.dart
│       │   ├── fragments_multiple_test.dart
│       │   ├── fragments_test.dart
│       │   └── multiple_references_on_simple_naming_test.dart
│       ├── interfaces/
│       │   ├── interface_fragment_glob_test.dart
│       │   ├── interface_possible_types_test.dart
│       │   └── interface_test.dart
│       ├── multiple_operations_per_file_test.dart
│       ├── multiple_queries_test.dart
│       ├── mutations_and_inputs/
│       │   ├── complex_input_objects_test.dart
│       │   ├── custom_scalars_on_input_objects_test.dart
│       │   ├── filter_input_objects_test.dart
│       │   ├── input_duplication_test.dart
│       │   ├── mutations_test.dart
│       │   ├── non_nullable_list_inputs_test.dart
│       │   └── recursive_input_test.dart
│       ├── naming/
│       │   ├── casing_conversion_test.dart
│       │   ├── common.dart
│       │   ├── pathed_with_fields_test.dart
│       │   └── simple_naming_test.dart
│       ├── nnbd_test.dart
│       ├── query_generator_test.dart
│       ├── scalars/
│       │   ├── custom_scalars_test.dart
│       │   ├── scalars_test.dart
│       │   └── unused_custom_scalars_test.dart
│       ├── subscription_test.dart
│       └── union/
│           ├── union_types_test.dart
│           └── union_with_nested_types_test.dart
└── tool/
    └── fetch_schema.dart
Download .txt
SYMBOL INDEX (383 symbols across 107 files)

FILE: example/github/lib/graphql/search_repositories.graphql.dart
  class SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Repository (line 10) | @JsonSerializable(explicitToJson: true)
    method toJson (line 26) | Map<String, dynamic> toJson()
  class SearchRepositories$Query$SearchResultItemConnection$SearchResultItem (line 31) | @JsonSerializable(explicitToJson: true)
    method toJson (line 54) | Map<String, dynamic> toJson()
  class SearchRepositories$Query$SearchResultItemConnection (line 67) | @JsonSerializable(explicitToJson: true)
    method toJson (line 82) | Map<String, dynamic> toJson()
  class SearchRepositories$Query (line 86) | @JsonSerializable(explicitToJson: true)
    method toJson (line 98) | Map<String, dynamic> toJson()
  class SearchRepositoriesArguments (line 101) | @JsonSerializable(explicitToJson: true)
    method toJson (line 114) | Map<String, dynamic> toJson()
  class SearchRepositoriesQuery (line 178) | class SearchRepositoriesQuery extends GraphQLQuery<SearchRepositories$Qu...
    method parse (line 194) | SearchRepositories$Query parse(Map<String, dynamic> json)

FILE: example/github/lib/graphql/search_repositories.graphql.g.dart
  function _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryFromJson (line 10) | SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$Rep...
  function _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItem$RepositoryToJson (line 17) | Map<String, dynamic>
  function _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemFromJson (line 26) | SearchRepositories$Query$SearchResultItemConnection$SearchResultItem
  function _$SearchRepositories$Query$SearchResultItemConnection$SearchResultItemToJson (line 32) | Map<String, dynamic>
  function _$SearchRepositories$Query$SearchResultItemConnectionFromJson (line 40) | SearchRepositories$Query$SearchResultItemConnection
  function _$SearchRepositories$Query$SearchResultItemConnectionToJson (line 51) | Map<String, dynamic>
  function _$SearchRepositories$QueryFromJson (line 58) | SearchRepositories$Query _$SearchRepositories$QueryFromJson(
  function _$SearchRepositories$QueryToJson (line 64) | Map<String, dynamic> _$SearchRepositories$QueryToJson(
  function _$SearchRepositoriesArgumentsFromJson (line 70) | SearchRepositoriesArguments _$SearchRepositoriesArgumentsFromJson(
  function _$SearchRepositoriesArgumentsToJson (line 76) | Map<String, dynamic> _$SearchRepositoriesArgumentsToJson(

FILE: example/github/lib/main.dart
  class AuthenticatedClient (line 9) | class AuthenticatedClient extends http.BaseClient {
    method send (line 12) | Future<http.StreamedResponse> send(http.BaseRequest request)
  function main (line 19) | Future<void> main()

FILE: example/graphbrainz/lib/coercers.dart
  function fromGraphQLDateToDartDateTime (line 6) | DateTime fromGraphQLDateToDartDateTime(String date)
  function fromDartDateTimeToGraphQLDate (line 7) | String fromDartDateTimeToGraphQLDate(DateTime date)
  function fromGraphQLTimeToDartDateTime (line 9) | DateTime fromGraphQLTimeToDartDateTime(String time)
  function fromDartDateTimeToGraphQLTime (line 11) | String fromDartDateTimeToGraphQLTime(DateTime date)

FILE: example/graphbrainz/lib/main.dart
  function main (line 5) | void main()

FILE: example/graphbrainz/lib/queries/ed_sheeran.query.graphql.dart
  class EdSheeran$Query$Node$Artist$ReleaseConnection$Release (line 10) | @JsonSerializable(explicitToJson: true)
    method toJson (line 27) | Map<String, dynamic> toJson()
  class EdSheeran$Query$Node$Artist$ReleaseConnection (line 31) | @JsonSerializable(explicitToJson: true)
    method toJson (line 45) | Map<String, dynamic> toJson()
  class EdSheeran$Query$Node$Artist$LifeSpan (line 49) | @JsonSerializable(explicitToJson: true)
    method toJson (line 63) | Map<String, dynamic> toJson()
  class EdSheeran$Query$Node$Artist$SpotifyArtist (line 67) | @JsonSerializable(explicitToJson: true)
    method toJson (line 81) | Map<String, dynamic> toJson()
  class EdSheeran$Query$Node$Artist (line 85) | @JsonSerializable(explicitToJson: true)
    method toJson (line 106) | Map<String, dynamic> toJson()
  class EdSheeran$Query$Node (line 109) | @JsonSerializable(explicitToJson: true)
    method toJson (line 130) | Map<String, dynamic> toJson()
  class EdSheeran$Query (line 140) | @JsonSerializable(explicitToJson: true)
    method toJson (line 152) | Map<String, dynamic> toJson()
  type ReleaseStatus (line 155) | enum ReleaseStatus {
  class EdSheeranQuery (line 275) | class EdSheeranQuery extends GraphQLQuery<EdSheeran$Query, JsonSerializa...
    method parse (line 287) | EdSheeran$Query parse(Map<String, dynamic> json)

FILE: example/graphbrainz/lib/queries/ed_sheeran.query.graphql.g.dart
  function _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseFromJson (line 10) | EdSheeran$Query$Node$Artist$ReleaseConnection$Release
  function _$EdSheeran$Query$Node$Artist$ReleaseConnection$ReleaseToJson (line 19) | Map<String, dynamic>
  function _$enumDecode (line 27) | K _$enumDecode<K, V>(
  function _$enumDecodeNullable (line 53) | K? _$enumDecodeNullable<K, V>(
  function _$EdSheeran$Query$Node$Artist$ReleaseConnectionFromJson (line 72) | EdSheeran$Query$Node$Artist$ReleaseConnection
  function _$EdSheeran$Query$Node$Artist$ReleaseConnectionToJson (line 83) | Map<String, dynamic> _$EdSheeran$Query$Node$Artist$ReleaseConnectionToJson(
  function _$EdSheeran$Query$Node$Artist$LifeSpanFromJson (line 89) | EdSheeran$Query$Node$Artist$LifeSpan
  function _$EdSheeran$Query$Node$Artist$LifeSpanToJson (line 96) | Map<String, dynamic> _$EdSheeran$Query$Node$Artist$LifeSpanToJson(
  function _$EdSheeran$Query$Node$Artist$SpotifyArtistFromJson (line 102) | EdSheeran$Query$Node$Artist$SpotifyArtist
  function _$EdSheeran$Query$Node$Artist$SpotifyArtistToJson (line 108) | Map<String, dynamic> _$EdSheeran$Query$Node$Artist$SpotifyArtistToJson(
  function _$EdSheeran$Query$Node$ArtistFromJson (line 114) | EdSheeran$Query$Node$Artist _$EdSheeran$Query$Node$ArtistFromJson(
  function _$EdSheeran$Query$Node$ArtistToJson (line 134) | Map<String, dynamic> _$EdSheeran$Query$Node$ArtistToJson(
  function _$EdSheeran$Query$NodeFromJson (line 146) | EdSheeran$Query$Node _$EdSheeran$Query$NodeFromJson(
  function _$EdSheeran$Query$NodeToJson (line 152) | Map<String, dynamic> _$EdSheeran$Query$NodeToJson(
  function _$EdSheeran$QueryFromJson (line 159) | EdSheeran$Query _$EdSheeran$QueryFromJson(Map<String, dynamic> json)
  function _$EdSheeran$QueryToJson (line 165) | Map<String, dynamic> _$EdSheeran$QueryToJson(EdSheeran$Query instance)

FILE: example/hasura/hasura.sql
  type profile (line 1) | CREATE TABLE profile (
  type messages (line 6) | CREATE TABLE messages (

FILE: example/hasura/lib/graphql/messages_with_users.graphql.dart
  class MessagesWithUsers$SubscriptionRoot$Messages$Profile (line 10) | @JsonSerializable(explicitToJson: true)
    method toJson (line 26) | Map<String, dynamic> toJson()
  class MessagesWithUsers$SubscriptionRoot$Messages (line 30) | @JsonSerializable(explicitToJson: true)
    method toJson (line 48) | Map<String, dynamic> toJson()
  class MessagesWithUsers$SubscriptionRoot (line 52) | @JsonSerializable(explicitToJson: true)
    method toJson (line 66) | Map<String, dynamic> toJson()
  class MessagesWithUsersSubscription (line 118) | class MessagesWithUsersSubscription
    method parse (line 131) | MessagesWithUsers$SubscriptionRoot parse(Map<String, dynamic> json)

FILE: example/hasura/lib/graphql/messages_with_users.graphql.g.dart
  function _$MessagesWithUsers$SubscriptionRoot$Messages$ProfileFromJson (line 10) | MessagesWithUsers$SubscriptionRoot$Messages$Profile
  function _$MessagesWithUsers$SubscriptionRoot$Messages$ProfileToJson (line 17) | Map<String, dynamic>
  function _$MessagesWithUsers$SubscriptionRoot$MessagesFromJson (line 25) | MessagesWithUsers$SubscriptionRoot$Messages
  function _$MessagesWithUsers$SubscriptionRoot$MessagesToJson (line 35) | Map<String, dynamic> _$MessagesWithUsers$SubscriptionRoot$MessagesToJson(
  function _$MessagesWithUsers$SubscriptionRootFromJson (line 43) | MessagesWithUsers$SubscriptionRoot _$MessagesWithUsers$SubscriptionRootF...
  function _$MessagesWithUsers$SubscriptionRootToJson (line 51) | Map<String, dynamic> _$MessagesWithUsers$SubscriptionRootToJson(

FILE: example/hasura/lib/main.dart
  function main (line 9) | Future<void> main()

FILE: example/pokemon/lib/graphql/big_query.graphql.dart
  class BigQuery$Query$Charmander (line 10) | @JsonSerializable(explicitToJson: true)
    method toJson (line 24) | Map<String, dynamic> toJson()
  class BigQuery$Query$Pokemon$Evolutions (line 27) | @JsonSerializable(explicitToJson: true)
    method toJson (line 43) | Map<String, dynamic> toJson()
  class BigQuery$Query$Pokemon (line 47) | @JsonSerializable(explicitToJson: true)
    method toJson (line 65) | Map<String, dynamic> toJson()
  class BigQuery$Query (line 68) | @JsonSerializable(explicitToJson: true)
    method toJson (line 82) | Map<String, dynamic> toJson()
  class BigQueryArguments (line 85) | @JsonSerializable(explicitToJson: true)
    method toJson (line 98) | Map<String, dynamic> toJson()
  class BigQueryQuery (line 188) | class BigQueryQuery extends GraphQLQuery<BigQuery$Query, BigQueryArgumen...
    method parse (line 203) | BigQuery$Query parse(Map<String, dynamic> json)

FILE: example/pokemon/lib/graphql/big_query.graphql.g.dart
  function _$BigQuery$Query$CharmanderFromJson (line 10) | BigQuery$Query$Charmander _$BigQuery$Query$CharmanderFromJson(
  function _$BigQuery$Query$CharmanderToJson (line 17) | Map<String, dynamic> _$BigQuery$Query$CharmanderToJson(
  function _$BigQuery$Query$Pokemon$EvolutionsFromJson (line 24) | BigQuery$Query$Pokemon$Evolutions _$BigQuery$Query$Pokemon$EvolutionsFro...
  function _$BigQuery$Query$Pokemon$EvolutionsToJson (line 30) | Map<String, dynamic> _$BigQuery$Query$Pokemon$EvolutionsToJson(
  function _$BigQuery$Query$PokemonFromJson (line 37) | BigQuery$Query$Pokemon _$BigQuery$Query$PokemonFromJson(
  function _$BigQuery$Query$PokemonToJson (line 51) | Map<String, dynamic> _$BigQuery$Query$PokemonToJson(
  function _$BigQuery$QueryFromJson (line 60) | BigQuery$Query _$BigQuery$QueryFromJson(Map<String, dynamic> json)
  function _$BigQuery$QueryToJson (line 72) | Map<String, dynamic> _$BigQuery$QueryToJson(BigQuery$Query instance)
  function _$BigQueryArgumentsFromJson (line 78) | BigQueryArguments _$BigQueryArgumentsFromJson(Map<String, dynamic> json)
  function _$BigQueryArgumentsToJson (line 83) | Map<String, dynamic> _$BigQueryArgumentsToJson(BigQueryArguments instance)

FILE: example/pokemon/lib/graphql/fragment_query.graphql.dart
  class FragmentQuery$Query$Charmander (line 16) | @JsonSerializable(explicitToJson: true)
    method toJson (line 27) | Map<String, dynamic> toJson()
  class FragmentQuery$Query$Pokemon$Evolutions (line 30) | @JsonSerializable(explicitToJson: true)
    method toJson (line 42) | Map<String, dynamic> toJson()
  class FragmentQuery$Query$Pokemon (line 46) | @JsonSerializable(explicitToJson: true)
    method toJson (line 59) | Map<String, dynamic> toJson()
  class FragmentQuery$Query (line 62) | @JsonSerializable(explicitToJson: true)
    method toJson (line 76) | Map<String, dynamic> toJson()
  class FragmentQueryArguments (line 79) | @JsonSerializable(explicitToJson: true)
    method toJson (line 92) | Map<String, dynamic> toJson()
  class FragmentQueryQuery (line 172) | class FragmentQueryQuery
    method parse (line 188) | FragmentQuery$Query parse(Map<String, dynamic> json)

FILE: example/pokemon/lib/graphql/fragment_query.graphql.g.dart
  function _$FragmentQuery$Query$CharmanderFromJson (line 10) | FragmentQuery$Query$Charmander _$FragmentQuery$Query$CharmanderFromJson(
  function _$FragmentQuery$Query$CharmanderToJson (line 18) | Map<String, dynamic> _$FragmentQuery$Query$CharmanderToJson(
  function _$FragmentQuery$Query$Pokemon$EvolutionsFromJson (line 26) | FragmentQuery$Query$Pokemon$Evolutions
  function _$FragmentQuery$Query$Pokemon$EvolutionsToJson (line 36) | Map<String, dynamic> _$FragmentQuery$Query$Pokemon$EvolutionsToJson(
  function _$FragmentQuery$Query$PokemonFromJson (line 44) | FragmentQuery$Query$Pokemon _$FragmentQuery$Query$PokemonFromJson(
  function _$FragmentQuery$Query$PokemonToJson (line 58) | Map<String, dynamic> _$FragmentQuery$Query$PokemonToJson(
  function _$FragmentQuery$QueryFromJson (line 67) | FragmentQuery$Query _$FragmentQuery$QueryFromJson(Map<String, dynamic> j...
  function _$FragmentQuery$QueryToJson (line 79) | Map<String, dynamic> _$FragmentQuery$QueryToJson(
  function _$FragmentQueryArgumentsFromJson (line 86) | FragmentQueryArguments _$FragmentQueryArgumentsFromJson(
  function _$FragmentQueryArgumentsToJson (line 92) | Map<String, dynamic> _$FragmentQueryArgumentsToJson(

FILE: example/pokemon/lib/graphql/fragments_glob.graphql.dart
  class FragmentsGlob$Query$Pokemon$Pokemon (line 25) | @JsonSerializable(explicitToJson: true)
    method toJson (line 37) | Map<String, dynamic> toJson()
  class FragmentsGlob$Query$Pokemon (line 41) | @JsonSerializable(explicitToJson: true)
    method toJson (line 54) | Map<String, dynamic> toJson()
  class FragmentsGlob$Query (line 57) | @JsonSerializable(explicitToJson: true)
    method toJson (line 69) | Map<String, dynamic> toJson()
  class PokemonMixin$PokemonDimension (line 72) | @JsonSerializable(explicitToJson: true)
    method toJson (line 83) | Map<String, dynamic> toJson()
  class PokemonMixin$PokemonAttack (line 86) | @JsonSerializable(explicitToJson: true)
    method toJson (line 97) | Map<String, dynamic> toJson()
  class PokemonAttackMixin$Attack (line 100) | @JsonSerializable(explicitToJson: true)
    method toJson (line 111) | Map<String, dynamic> toJson()
  class FragmentsGlobQuery (line 222) | class FragmentsGlobQuery
    method parse (line 235) | FragmentsGlob$Query parse(Map<String, dynamic> json)

FILE: example/pokemon/lib/graphql/fragments_glob.graphql.g.dart
  function _$FragmentsGlob$Query$Pokemon$PokemonFromJson (line 10) | FragmentsGlob$Query$Pokemon$Pokemon
  function _$FragmentsGlob$Query$Pokemon$PokemonToJson (line 23) | Map<String, dynamic> _$FragmentsGlob$Query$Pokemon$PokemonToJson(
  function _$FragmentsGlob$Query$PokemonFromJson (line 31) | FragmentsGlob$Query$Pokemon _$FragmentsGlob$Query$PokemonFromJson(
  function _$FragmentsGlob$Query$PokemonToJson (line 50) | Map<String, dynamic> _$FragmentsGlob$Query$PokemonToJson(
  function _$FragmentsGlob$QueryFromJson (line 59) | FragmentsGlob$Query _$FragmentsGlob$QueryFromJson(Map<String, dynamic> j...
  function _$FragmentsGlob$QueryToJson (line 66) | Map<String, dynamic> _$FragmentsGlob$QueryToJson(
  function _$PokemonMixin$PokemonDimensionFromJson (line 72) | PokemonMixin$PokemonDimension _$PokemonMixin$PokemonDimensionFromJson(
  function _$PokemonMixin$PokemonDimensionToJson (line 76) | Map<String, dynamic> _$PokemonMixin$PokemonDimensionToJson(
  function _$PokemonMixin$PokemonAttackFromJson (line 82) | PokemonMixin$PokemonAttack _$PokemonMixin$PokemonAttackFromJson(
  function _$PokemonMixin$PokemonAttackToJson (line 91) | Map<String, dynamic> _$PokemonMixin$PokemonAttackToJson(
  function _$PokemonAttackMixin$AttackFromJson (line 97) | PokemonAttackMixin$Attack _$PokemonAttackMixin$AttackFromJson(
  function _$PokemonAttackMixin$AttackToJson (line 101) | Map<String, dynamic> _$PokemonAttackMixin$AttackToJson(

FILE: example/pokemon/lib/graphql/simple_query.graphql.dart
  class SimpleQuery$Query$Pokemon (line 10) | @JsonSerializable(explicitToJson: true)
    method toJson (line 24) | Map<String, dynamic> toJson()
  class SimpleQuery$Query (line 27) | @JsonSerializable(explicitToJson: true)
    method toJson (line 39) | Map<String, dynamic> toJson()
  class SimpleQueryQuery (line 75) | class SimpleQueryQuery
    method parse (line 88) | SimpleQuery$Query parse(Map<String, dynamic> json)

FILE: example/pokemon/lib/graphql/simple_query.graphql.g.dart
  function _$SimpleQuery$Query$PokemonFromJson (line 10) | SimpleQuery$Query$Pokemon _$SimpleQuery$Query$PokemonFromJson(
  function _$SimpleQuery$Query$PokemonToJson (line 17) | Map<String, dynamic> _$SimpleQuery$Query$PokemonToJson(
  function _$SimpleQuery$QueryFromJson (line 24) | SimpleQuery$Query _$SimpleQuery$QueryFromJson(Map<String, dynamic> json)
  function _$SimpleQuery$QueryToJson (line 31) | Map<String, dynamic> _$SimpleQuery$QueryToJson(SimpleQuery$Query instance)

FILE: example/pokemon/lib/main.dart
  function main (line 8) | Future<void> main()

FILE: lib/builder.dart
  function graphQLQueryBuilder (line 16) | GraphQLQueryBuilder graphQLQueryBuilder(BuilderOptions options)
  function _addGraphQLExtensionToPathIfNeeded (line 19) | String _addGraphQLExtensionToPathIfNeeded(String path)
  function _builderOptionsToExpectedOutputs (line 26) | List<String> _builderOptionsToExpectedOutputs(BuilderOptions builderOpti...
  class GraphQLQueryBuilder (line 52) | class GraphQLQueryBuilder implements Builder {
    method readGraphQlFiles (line 76) | Future<List<DocumentNode>> readGraphQlFiles(
    method build (line 93) | Future<void> build(BuildStep buildStep)

FILE: lib/client.dart
  class ArtemisClient (line 16) | class ArtemisClient {
    method execute (line 44) | Future<GraphQLResponse<T>> execute<T, U extends JsonSerializable>(
    method stream (line 67) | Stream<GraphQLResponse<T>> stream<T, U extends JsonSerializable>(
    method dispose (line 92) | void dispose()

FILE: lib/generator.dart
  type OnNewClassFoundCallback (line 19) | typedef OnNewClassFoundCallback = void Function(Context context);
  function generateLibrary (line 28) | LibraryDefinition generateLibrary(
  function _extractFragments (line 112) | Set<FragmentDefinitionNode> _extractFragments(SelectionSetNode? selectio...
  function generateDefinitions (line 143) | Iterable<QueryDefinition> generateDefinitions({
  function _extractCustomImports (line 268) | List<String> _extractCustomImports(
  function createClassProperty (line 285) | ClassProperty createClassProperty({

FILE: lib/generator/data/class_definition.dart
  class ClassDefinition (line 9) | class ClassDefinition extends Definition with DataPrinter {
  class ClassName (line 59) | class ClassName extends Name with DataPrinter {
    method normalize (line 76) | String normalize(String name)

FILE: lib/generator/data/class_property.dart
  class ClassProperty (line 7) | class ClassProperty extends Definition with DataPrinter {
    method copyWith (line 33) | ClassProperty copyWith({
  class ClassPropertyName (line 56) | class ClassPropertyName extends Name with DataPrinter {
    method normalize (line 61) | String normalize(String name)
  class TypeName (line 76) | class TypeName extends Name with DataPrinter {
    method normalize (line 96) | String normalize(String name)
  class DartTypeName (line 107) | class DartTypeName extends TypeName with DataPrinter {
    method normalize (line 115) | String normalize(String name)
  class ListOfTypeName (line 119) | class ListOfTypeName extends TypeName with DataPrinter {
    method normalize (line 140) | String normalize(String? name)

FILE: lib/generator/data/definition.dart
  class Definition (line 6) | abstract class Definition extends Equatable with DataPrinter {
  class Name (line 15) | abstract class Name extends Equatable with DataPrinter {
    method normalize (line 44) | String normalize(String name)

FILE: lib/generator/data/enum_definition.dart
  class EnumDefinition (line 8) | class EnumDefinition extends Definition with DataPrinter {
  class EnumName (line 30) | class EnumName extends Name with DataPrinter {
    method normalize (line 35) | String normalize(String name)

FILE: lib/generator/data/enum_value_definition.dart
  class EnumValueDefinition (line 6) | class EnumValueDefinition extends Definition with DataPrinter {
  class EnumValueName (line 27) | class EnumValueName extends Name with DataPrinter {
    method normalize (line 37) | String normalize(String name)

FILE: lib/generator/data/fragment_class_definition.dart
  class FragmentClassDefinition (line 8) | class FragmentClassDefinition extends Definition with DataPrinter {
  class FragmentName (line 30) | class FragmentName extends Name with DataPrinter {
    method normalize (line 45) | String normalize(String name)

FILE: lib/generator/data/library_definition.dart
  type OnBuildQuery (line 7) | typedef OnBuildQuery = void Function(LibraryDefinition definition);
  class LibraryDefinition (line 11) | class LibraryDefinition extends Equatable with DataPrinter {

FILE: lib/generator/data/nullable.dart
  class Nullable (line 2) | class Nullable<T> {

FILE: lib/generator/data/query_definition.dart
  class QueryDefinition (line 10) | class QueryDefinition extends Definition with DataPrinter {
  class QueryName (line 67) | class QueryName extends Name with DataPrinter {
    method normalize (line 84) | String normalize(String name)

FILE: lib/generator/data/query_input.dart
  class QueryInput (line 7) | class QueryInput extends Definition with DataPrinter {
  class QueryInputName (line 34) | class QueryInputName extends Name {

FILE: lib/generator/data_printer.dart
  function _formatPrint (line 5) | String? _formatPrint(Object? obj)
  function toString (line 30) | String toString()

FILE: lib/generator/ephemeral_data.dart
  function createPathName (line 9) | List<Name> createPathName(List<Name> path, NamingScheme? namingScheme,
  class Context (line 36) | class Context {
    method _stringForNaming (line 109) | Name? _stringForNaming(Name? withFieldNames, Name? withClassNames)
    method fullPathName (line 115) | List<Name> fullPathName()
    method nextTypeWithSamePath (line 119) | Context nextTypeWithSamePath({
    method next (line 148) | Context next({
    method withAlias (line 186) | Context withAlias({
    method sameTypeWithNextPath (line 211) | Context sameTypeWithNextPath({
    method rollbackPath (line 251) | Context rollbackPath()
    method sameTypeWithNoPath (line 273) | Context sameTypeWithNoPath({
    method nextTypeWithNoPath (line 300) | Context nextTypeWithNoPath({

FILE: lib/generator/errors.dart
  class DuplicatedClassesException (line 4) | class DuplicatedClassesException implements Exception {
    method toString (line 15) | String toString()
  class QueryGlobsSchemaException (line 29) | class QueryGlobsSchemaException implements Exception {
    method toString (line 35) | String toString()
  class QueryGlobsOutputException (line 42) | class QueryGlobsOutputException implements Exception {
    method toString (line 47) | String toString()
  class MissingFilesException (line 54) | class MissingFilesException implements Exception {
    method toString (line 62) | String toString()
  class MissingBuildConfigurationException (line 68) | class MissingBuildConfigurationException implements Exception {
    method toString (line 76) | String toString()
  class MissingScalarConfigurationException (line 82) | class MissingScalarConfigurationException implements Exception {
    method toString (line 91) | String toString()
  class MissingRootTypeException (line 100) | class MissingRootTypeException implements Exception {
    method toString (line 109) | String toString()
  class MissingFragmentException (line 115) | class MissingFragmentException implements Exception {
    method toString (line 126) | String toString()

FILE: lib/generator/graphql_helpers.dart
  function getTypeByName (line 9) | TypeDefinitionNode getTypeByName(
  function buildTypeName (line 34) | TypeName buildTypeName(
  function getSingleScalarMap (line 107) | ScalarMap? getSingleScalarMap(GeneratorOptions options, String type,
  function importsOfScalar (line 123) | Iterable<String> importsOfScalar(GeneratorOptions options, String type)

FILE: lib/generator/helpers.dart
  type IterableFunction (line 6) | typedef IterableFunction<T, U> = U Function(T i);
  type MergeableFunction (line 7) | typedef MergeableFunction<T> = T Function(T oldT, T newT);
  function _removeDuplicatedBy (line 74) | Iterable<T> _removeDuplicatedBy<T, U>(
  function normalizeName (line 87) | String normalizeName(String name)
  function _mergeDuplicatesBy (line 105) | Iterable<T> _mergeDuplicatesBy<T, U>(
  function mergeDuplicatesBy (line 123) | Iterable<T> mergeDuplicatesBy(
  function removeDuplicatedBy (line 129) | Iterable<T> removeDuplicatedBy(IterableFunction<T, U> fn)
  function hasValue (line 134) | bool hasValue(Object? obj)
  function proceedDeprecated (line 142) | List<String> proceedDeprecated(
  function logFn (line 167) | void logFn(Context context, int align, Object logObject)

FILE: lib/generator/print_helpers.dart
  function enumDefinitionToSpec (line 14) | Spec enumDefinitionToSpec(EnumDefinition definition)
  function _enumValueToSpec (line 19) | String _enumValueToSpec(EnumValueDefinition value)
  function _fromJsonBody (line 27) | String _fromJsonBody(ClassDefinition definition)
  function _toJsonBody (line 43) | String _toJsonBody(ClassDefinition definition)
  function _propsMethod (line 59) | Method _propsMethod(Iterable<String> body)
  function classDefinitionToSpec (line 71) | Spec classDefinitionToSpec(
  function fragmentClassDefinitionToSpec (line 197) | Spec fragmentClassDefinitionToSpec(FragmentClassDefinition definition)
  function generateArgumentClassSpec (line 212) | Spec generateArgumentClassSpec(QueryDefinition definition)
  function generateQuerySpec (line 278) | Spec generateQuerySpec(QueryDefinition definition)
  function generateQueryClassSpec (line 290) | Spec generateQueryClassSpec(QueryDefinition definition)
  function generateLibrarySpec (line 365) | Spec generateLibrarySpec(LibraryDefinition definition)
  function specToString (line 429) | String specToString(Spec spec)
  function writeLibraryDefinitionToBuffer (line 436) | void writeLibraryDefinitionToBuffer(
  function writeLibraryForwarder (line 453) | String writeLibraryForwarder(LibraryDefinition definition)

FILE: lib/schema/graphql_query.dart
  class GraphQLQuery (line 7) | abstract class GraphQLQuery<T, U extends JsonSerializable> extends Equat...
    method parse (line 21) | T parse(Map<String, dynamic> json)
    method getVariablesMap (line 24) | Map<String, dynamic> getVariablesMap()

FILE: lib/schema/graphql_response.dart
  class GraphQLResponse (line 5) | class GraphQLResponse<T> {

FILE: lib/schema/options.dart
  class GeneratorOptions (line 9) | @JsonSerializable(fieldRename: FieldRename.snake, anyMap: true)
    method toJson (line 50) | Map<String, dynamic> toJson()
  class DartType (line 54) | @JsonSerializable()
    method toJson (line 86) | Map<String, dynamic> toJson()
  class ScalarMap (line 90) | @JsonSerializable(fieldRename: FieldRename.snake)
    method toJson (line 114) | Map<String, dynamic> toJson()
  type NamingScheme (line 118) | enum NamingScheme {
  class SchemaMap (line 132) | @JsonSerializable(fieldRename: FieldRename.snake)
    method toJson (line 182) | Map<String, dynamic> toJson()

FILE: lib/schema/options.g2.dart
  function _$GeneratorOptionsFromJson (line 9) | GeneratorOptions _$GeneratorOptionsFromJson(Map json)
  function _$GeneratorOptionsToJson (line 32) | Map<String, dynamic> _$GeneratorOptionsToJson(GeneratorOptions instance)
  function _$DartTypeFromJson (line 42) | DartType _$DartTypeFromJson(Map<String, dynamic> json)
  function _$DartTypeToJson (line 51) | Map<String, dynamic> _$DartTypeToJson(DartType instance)
  function _$ScalarMapFromJson (line 56) | ScalarMap _$ScalarMapFromJson(Map<String, dynamic> json)
  function _$ScalarMapToJson (line 65) | Map<String, dynamic> _$ScalarMapToJson(ScalarMap instance)
  function _$SchemaMapFromJson (line 71) | SchemaMap _$SchemaMapFromJson(Map<String, dynamic> json)
  function _$SchemaMapToJson (line 85) | Map<String, dynamic> _$SchemaMapToJson(SchemaMap instance)
  function _$enumDecode (line 95) | K _$enumDecode<K, V>(
  function _$enumDecodeNullable (line 121) | K? _$enumDecodeNullable<K, V>(

FILE: lib/transformer/add_typename_transformer.dart
  class AppendTypename (line 4) | class AppendTypename extends TransformingVisitor {
    method visitOperationDefinitionNode (line 15) | OperationDefinitionNode visitOperationDefinitionNode(
    method visitFragmentDefinitionNode (line 39) | FragmentDefinitionNode visitFragmentDefinitionNode(
    method visitInlineFragmentNode (line 62) | InlineFragmentNode visitInlineFragmentNode(InlineFragmentNode node)
    method visitFieldNode (line 83) | FieldNode visitFieldNode(FieldNode node)

FILE: lib/visitor/canonical_visitor.dart
  type ClassDefinitionGenerator (line 11) | typedef ClassDefinitionGenerator = ClassDefinition Function();
  type EnumDefinitionGenerator (line 14) | typedef EnumDefinitionGenerator = EnumDefinition Function();
  class CanonicalVisitor (line 17) | class CanonicalVisitor extends RecursiveVisitor {
    method visitEnumTypeDefinitionNode (line 33) | void visitEnumTypeDefinitionNode(EnumTypeDefinitionNode node)
    method visitInputObjectTypeDefinitionNode (line 60) | void visitInputObjectTypeDefinitionNode(InputObjectTypeDefinitionNode ...

FILE: lib/visitor/generator_visitor.dart
  class GeneratorVisitor (line 11) | class GeneratorVisitor extends RecursiveVisitor {
    method visitSelectionSetNode (line 30) | void visitSelectionSetNode(SelectionSetNode node)
    method visitFieldNode (line 76) | void visitFieldNode(FieldNode node)
    method visitInlineFragmentNode (line 94) | void visitInlineFragmentNode(InlineFragmentNode node)
    method addUsedInputObjectsAndEnums (line 128) | void addUsedInputObjectsAndEnums(InputObjectTypeDefinitionNode node)
    method visitVariableDefinitionNode (line 147) | void visitVariableDefinitionNode(VariableDefinitionNode node)
    method visitFragmentSpreadNode (line 232) | void visitFragmentSpreadNode(FragmentSpreadNode node)
    method visitFragmentDefinitionNode (line 261) | void visitFragmentDefinitionNode(FragmentDefinitionNode node)

FILE: lib/visitor/object_type_definition_visitor.dart
  class ObjectTypeDefinitionVisitor (line 4) | class ObjectTypeDefinitionVisitor extends RecursiveVisitor {
    method visitObjectTypeDefinitionNode (line 9) | void visitObjectTypeDefinitionNode(
    method getByName (line 17) | ObjectTypeDefinitionNode? getByName(String name)

FILE: lib/visitor/operation_type_definition_visitor.dart
  class OperationTypeDefinitionNodeVisitor (line 4) | class OperationTypeDefinitionNodeVisitor extends RecursiveVisitor {
    method visitOperationTypeDefinitionNode (line 9) | void visitOperationTypeDefinitionNode(
    method getByType (line 17) | OperationTypeDefinitionNode? getByType(OperationType operationType)

FILE: lib/visitor/schema_definition_visitor.dart
  class SchemaDefinitionVisitor (line 4) | class SchemaDefinitionVisitor extends RecursiveVisitor {
    method visitSchemaDefinitionNode (line 9) | void visitSchemaDefinitionNode(

FILE: lib/visitor/type_definition_node_visitor.dart
  class TypeDefinitionNodeVisitor (line 13) | class TypeDefinitionNodeVisitor extends RecursiveVisitor {
    method visitObjectTypeDefinitionNode (line 18) | void visitObjectTypeDefinitionNode(
    method visitScalarTypeDefinitionNode (line 26) | void visitScalarTypeDefinitionNode(
    method visitInterfaceTypeDefinitionNode (line 34) | void visitInterfaceTypeDefinitionNode(
    method visitUnionTypeDefinitionNode (line 42) | void visitUnionTypeDefinitionNode(
    method visitInputObjectTypeDefinitionNode (line 50) | void visitInputObjectTypeDefinitionNode(
    method visitEnumTypeDefinitionNode (line 58) | void visitEnumTypeDefinitionNode(
    method getByName (line 66) | TypeDefinitionNode? getByName(String name)

FILE: test/generator/helpers_test.dart
  function main (line 4) | void main()

FILE: test/generator/print_helpers_test.dart
  function main (line 7) | void main()

FILE: test/helpers.dart
  function testGenerator (line 12) | Future testGenerator({
  function testNaming (line 62) | Future testNaming({

FILE: test/query_generator/aliases/alias_on_leaves_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/aliases/alias_on_object_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/append_type_name_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/ast_schema/field_not_found_mutation_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/ast_schema/input_types_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/ast_schema/missing_schema_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/ast_schema/multiple_schema_mappint_test.dart
  function main (line 8) | void main()

FILE: test/query_generator/deprecated/deprecated_enum_value_test.dart
  function main (line 8) | void main()

FILE: test/query_generator/deprecated/deprecated_field_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/deprecated/deprecated_input_object_field_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/deprecated/deprecated_interface_field_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/enums/enum_duplication_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/enum_list_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/filter_enum_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/input_enum_list_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/input_enum_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/kw_prefix_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/enums/query_enum_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/errors/fragment_not_found_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/errors/generation_errors_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/errors/root_type_not_found_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/forwarder_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragment_duplication_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragment_glob_schema_level_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragment_glob_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragment_multiple_queries_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragment_on_fragments_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragments_multiple_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/fragments_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/fragments/multiple_references_on_simple_naming_test.dart
  function main (line 13) | void main()

FILE: test/query_generator/interfaces/interface_fragment_glob_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/interfaces/interface_possible_types_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/interfaces/interface_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/multiple_operations_per_file_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/multiple_queries_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/complex_input_objects_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/mutations_and_inputs/custom_scalars_on_input_objects_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/filter_input_objects_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/input_duplication_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/mutations_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/non_nullable_list_inputs_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/mutations_and_inputs/recursive_input_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/naming/casing_conversion_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/naming/pathed_with_fields_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/naming/simple_naming_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/nnbd_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/query_generator_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/scalars/custom_scalars_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/scalars/scalars_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/scalars/unused_custom_scalars_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/subscription_test.dart
  function main (line 7) | void main()

FILE: test/query_generator/union/union_types_test.dart
  function main (line 6) | void main()

FILE: test/query_generator/union/union_with_nested_types_test.dart
  function main (line 6) | void main()

FILE: tool/fetch_schema.dart
  function fetchGraphQLSchemaStringFromURL (line 101) | Future<String> fetchGraphQLSchemaStringFromURL(String graphqlEndpoint,
  function main (line 113) | void main(List<String> args)
Condensed preview — 154 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (878K chars).
[
  {
    "path": ".devcontainer/Dockerfile",
    "chars": 1331,
    "preview": "# Update VARIANT in devcontainer.json to pick a Dart version\nARG VARIANT=2\nFROM google/dart:${VARIANT}\n\n# [Option] Insta"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 1107,
    "preview": "{\n\t\"name\": \"Dart\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\",\n\t\t// Update VARIANT to pick a Dart version\n\t\t\"args\": {\n\t\t\t\""
  },
  {
    "path": ".devcontainer/library-scripts/README.md",
    "chars": 483,
    "preview": "# Warning: Folder contents may be replaced\n\nThe contents of this folder will be automatically replaced with a file of th"
  },
  {
    "path": ".devcontainer/library-scripts/common-debian.sh",
    "chars": 10808,
    "preview": "#!/usr/bin/env bash\n#---------------------------------------------------------------------------------------------------"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "chars": 938,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Before report"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 104,
    "preview": "**Make sure you're opening this pull request pointing to beta branch!**\n\n## What does this PR do/solve?\n"
  },
  {
    "path": ".github/workflows/pull_request.yaml",
    "chars": 1362,
    "preview": "on: pull_request\n\nname: CI\n\njobs:\n  check-version-and-changelog:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: act"
  },
  {
    "path": ".github/workflows/push.yaml",
    "chars": 2761,
    "preview": "on:\n  push:\n    branches:\n      - master\n      - beta\n\nname: CI\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n   "
  },
  {
    "path": ".gitignore",
    "chars": 1165,
    "preview": "\n# Created by https://www.gitignore.io/api/dart,macos\n\n### Dart ###\n# See https://www.dartlang.org/guides/libraries/priv"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 15588,
    "preview": "# CHANGELOG\n\n## 7.13.1\n\n- Move `beta` version out of beta for pub.dev awareness\n\n## 7.13.0-beta.3\n\n- Add discontinuation"
  },
  {
    "path": "FUNDING.yml",
    "chars": 259,
    "preview": "github: comigor\npatreon: comigor\ncustom: ['https://www.blockchain.com/btc/payment_request?address=1M1NJGg4SE7eaGUPUxQmqT"
  },
  {
    "path": "LICENSE",
    "chars": 1068,
    "preview": "MIT License\n\nCopyright (c) 2018 Igor Borges\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 10482,
    "preview": "<!-- @formatter:off -->\n\n<p align=\"center\">\n  <img src=\"https://user-images.githubusercontent.com/735858/58768495-8ecbd6"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 235,
    "preview": "# https://github.com/dart-lang/lints#migrating-from-packagepedantic\ninclude: package:lints/recommended.yaml\n\nanalyzer:\n "
  },
  {
    "path": "build.yaml",
    "chars": 293,
    "preview": "builders:\n  artemis:\n    import: 'package:artemis/builder.dart'\n    builder_factories: ['graphQLQueryBuilder']\n    build"
  },
  {
    "path": "example/.gitignore",
    "chars": 44,
    "preview": "/*\n!/pokemon\n!/graphbrainz\n!/github\n!/hasura"
  },
  {
    "path": "example/README.md",
    "chars": 875,
    "preview": "# **Examples**\n\nThis folder contains some examples on how to use artemis.\n\n## [**pokemon**](./pokemon)\n\nA simple example"
  },
  {
    "path": "example/github/.gitignore",
    "chars": 40,
    "preview": "github.schema.json\ngithub.schema.graphql"
  },
  {
    "path": "example/github/build.yaml",
    "chars": 626,
    "preview": "targets:\n  $default:\n    sources:\n      - lib/**\n      - github.schema.graphql\n    builders:\n      artemis:\n        opti"
  },
  {
    "path": "example/github/lib/graphql/search_repositories.dart",
    "chars": 85,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'search_repositories.graphql.dart';\n"
  },
  {
    "path": "example/github/lib/graphql/search_repositories.graphql",
    "chars": 188,
    "preview": "query search_repositories($query: String!) {\n  search(first: 10, type: REPOSITORY, query: $query) {\n    nodes {\n      __"
  },
  {
    "path": "example/github/lib/graphql/search_repositories.graphql.dart",
    "chars": 6908,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/github/lib/graphql/search_repositories.graphql.g.dart",
    "chars": 3246,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'search_repositories.graphql.dart';\n\n// ***************"
  },
  {
    "path": "example/github/lib/main.dart",
    "chars": 965,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:artemis/artemis.dart';\nimport 'package:http/http.dart' as http;\n"
  },
  {
    "path": "example/github/pubspec.yaml",
    "chars": 207,
    "preview": "name: github_example\nversion: 0.0.1\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  http:\n\ndev_dependencies:\n  t"
  },
  {
    "path": "example/graphbrainz/build.yaml",
    "chars": 1203,
    "preview": "targets:\n  $default:\n    sources:\n      - lib/**\n    builders:\n      artemis:\n        options:\n          schema_mapping:"
  },
  {
    "path": "example/graphbrainz/lib/coercers.dart",
    "chars": 478,
    "preview": "import 'package:intl/intl.dart';\n\nfinal dateFormatter = DateFormat('yyyy-MM-dd');\nfinal timeFormatter = DateFormat('HH:m"
  },
  {
    "path": "example/graphbrainz/lib/graphbrainz.schema.graphql",
    "chars": 120069,
    "preview": "\"\"\"\n[Aliases](https://musicbrainz.org/doc/Aliases) are variant names\nthat are mostly used as search help: if a search ma"
  },
  {
    "path": "example/graphbrainz/lib/main.dart",
    "chars": 656,
    "preview": "import 'package:artemis/artemis.dart';\n\nimport 'queries/ed_sheeran.query.dart';\n\nvoid main() async {\n  final client = Ar"
  },
  {
    "path": "example/graphbrainz/lib/queries/ed_sheeran.query.dart",
    "chars": 82,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'ed_sheeran.query.graphql.dart';\n"
  },
  {
    "path": "example/graphbrainz/lib/queries/ed_sheeran.query.graphql",
    "chars": 329,
    "preview": "query ed_sheeran {\n  node(id: \"QXJ0aXN0OmI4YTdjNTFmLTM2MmMtNGRjYi1hMjU5LWJjNmUwMDk1ZjBhNg==\") {\n    __typename\n    id\n  "
  },
  {
    "path": "example/graphbrainz/lib/queries/ed_sheeran.query.graphql.dart",
    "chars": 9583,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/graphbrainz/lib/queries/ed_sheeran.query.graphql.g.dart",
    "chars": 5733,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'ed_sheeran.query.graphql.dart';\n\n// ******************"
  },
  {
    "path": "example/graphbrainz/pubspec.yaml",
    "chars": 220,
    "preview": "name: graphbrainz_example\nversion: 0.0.1\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  http:\n  intl:\n\ndev_depe"
  },
  {
    "path": "example/hasura/build.yaml",
    "chars": 387,
    "preview": "targets:\n  $default:\n    sources:\n      - lib/**\n      - graphql/**\n      - schema.graphql\n    builders:\n      artemis:\n"
  },
  {
    "path": "example/hasura/graphql/messages_with_users.graphql",
    "chars": 113,
    "preview": "subscription messages_with_users {\n  messages {\n    id\n    message\n    profile {\n      id\n      name\n    }\n  }\n}\n"
  },
  {
    "path": "example/hasura/hasura.sql",
    "chars": 172,
    "preview": "CREATE TABLE profile (\n  id INTEGER PRIMARY KEY,\n  name TEXT\n)\n\nCREATE TABLE messages (\n  id INT PRIMARY KEY,\n  message "
  },
  {
    "path": "example/hasura/lib/graphql/messages_with_users.graphql.dart",
    "chars": 4314,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/hasura/lib/graphql/messages_with_users.graphql.g.dart",
    "chars": 2144,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'messages_with_users.graphql.dart';\n\n// ***************"
  },
  {
    "path": "example/hasura/lib/main.dart",
    "chars": 565,
    "preview": "import 'dart:async';\n\nimport 'package:artemis/artemis.dart';\nimport 'package:gql_link/gql_link.dart';\nimport 'package:gq"
  },
  {
    "path": "example/hasura/pubspec.yaml",
    "chars": 229,
    "preview": "name: hasura_example\nversion: 0.0.1\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  http:\n  gql_websocket_link:\n"
  },
  {
    "path": "example/hasura/schema.graphql",
    "chars": 20368,
    "preview": "schema {\n  query: query_root\n  mutation: mutation_root\n  subscription: subscription_root\n}\n\n\"\"\"\nexpression to compare co"
  },
  {
    "path": "example/pokemon/build.yaml",
    "chars": 867,
    "preview": "targets:\n  $default:\n    sources:\n      - lib/**\n      - graphql/**\n      - pokemon.schema.graphql\n    builders:\n      a"
  },
  {
    "path": "example/pokemon/graphql/big_query.query.graphql",
    "chars": 229,
    "preview": "query big_query($quantity: Int!) {\n  charmander: pokemon(name: \"Charmander\") {\n    number\n    types\n  }\n  pokemons(first"
  },
  {
    "path": "example/pokemon/graphql/fragment_query.query.graphql",
    "chars": 220,
    "preview": "query fragmentQuery($quantity: Int!) {\n  charmander: pokemon(name: \"Charmander\") {\n    ...PokemonParts\n  }\n  pokemons(fi"
  },
  {
    "path": "example/pokemon/graphql/fragments_glob.fragment.graphql",
    "chars": 360,
    "preview": "fragment Pokemon on Pokemon {\n  \t\tid\n      weight {\n        ...weight\n      }\n      attacks {\n        ...pokemonAttack\n "
  },
  {
    "path": "example/pokemon/graphql/fragments_glob.query.graphql",
    "chars": 91,
    "preview": "{\n  pokemon(name: \"Pikachu\") {\n    ...Pokemon\n    evolutions {\n      ...Pokemon\n    }\n  }\n}"
  },
  {
    "path": "example/pokemon/graphql/simple_query.query.graphql",
    "chars": 79,
    "preview": "query simple_query {\n  pokemon(name: \"Charmander\") {\n    number\n    types\n  }\n}"
  },
  {
    "path": "example/pokemon/lib/graphql/big_query.dart",
    "chars": 75,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'big_query.graphql.dart';\n"
  },
  {
    "path": "example/pokemon/lib/graphql/big_query.graphql.dart",
    "chars": 6379,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/pokemon/lib/graphql/big_query.graphql.g.dart",
    "chars": 3029,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'big_query.graphql.dart';\n\n// *************************"
  },
  {
    "path": "example/pokemon/lib/graphql/fragment_query.dart",
    "chars": 80,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'fragment_query.graphql.dart';\n"
  },
  {
    "path": "example/pokemon/lib/graphql/fragment_query.graphql.dart",
    "chars": 6203,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/pokemon/lib/graphql/fragment_query.graphql.g.dart",
    "chars": 3439,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'fragment_query.graphql.dart';\n\n// ********************"
  },
  {
    "path": "example/pokemon/lib/graphql/fragments_glob.dart",
    "chars": 80,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'fragments_glob.graphql.dart';\n"
  },
  {
    "path": "example/pokemon/lib/graphql/fragments_glob.graphql.dart",
    "chars": 7556,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/pokemon/lib/graphql/fragments_glob.graphql.g.dart",
    "chars": 3859,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'fragments_glob.graphql.dart';\n\n// ********************"
  },
  {
    "path": "example/pokemon/lib/graphql/simple_query.dart",
    "chars": 78,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nexport 'simple_query.graphql.dart';\n"
  },
  {
    "path": "example/pokemon/lib/graphql/simple_query.graphql.dart",
    "chars": 2672,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart = 2.12\n\nimport 'package:artemis/artemis.dart';\nimport 'package:json_a"
  },
  {
    "path": "example/pokemon/lib/graphql/simple_query.graphql.g.dart",
    "chars": 1169,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n// @dart=2.12\n\npart of 'simple_query.graphql.dart';\n\n// **********************"
  },
  {
    "path": "example/pokemon/lib/main.dart",
    "chars": 841,
    "preview": "import 'dart:async';\n\nimport 'package:artemis/artemis.dart';\n\nimport 'graphql/big_query.dart';\nimport 'graphql/simple_qu"
  },
  {
    "path": "example/pokemon/pokemon.schema.graphql",
    "chars": 1978,
    "preview": "\"\"\"Represents a Pokémon's attack types\"\"\"\ntype Attack {\n  \"\"\"The name of this Pokémon attack\"\"\"\n  name: String\n\n  \"\"\"The"
  },
  {
    "path": "example/pokemon/pubspec.yaml",
    "chars": 208,
    "preview": "name: pokemon_example\nversion: 0.0.1\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  http:\n\ndev_dependencies:\n  "
  },
  {
    "path": "lib/artemis.dart",
    "chars": 97,
    "preview": "export 'client.dart';\nexport 'schema/graphql_query.dart';\nexport 'schema/graphql_response.dart';\n"
  },
  {
    "path": "lib/builder.dart",
    "chars": 6613,
    "preview": "import 'dart:async';\n\nimport 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/transformer/add_typenam"
  },
  {
    "path": "lib/client.dart",
    "chars": 2803,
    "preview": "import 'dart:async';\n\nimport 'package:gql_dedupe_link/gql_dedupe_link.dart';\nimport 'package:gql_exec/gql_exec.dart';\nim"
  },
  {
    "path": "lib/generator/data/class_definition.dart",
    "chars": 2450,
    "preview": "import 'package:artemis/generator/data/class_property.dart';\nimport 'package:artemis/generator/data/definition.dart';\nim"
  },
  {
    "path": "lib/generator/data/class_property.dart",
    "chars": 3766,
    "preview": "import 'package:artemis/generator/data/definition.dart';\nimport 'package:artemis/generator/data_printer.dart';\nimport 'p"
  },
  {
    "path": "lib/generator/data/data.dart",
    "chars": 253,
    "preview": "export 'class_definition.dart';\nexport 'class_property.dart';\nexport 'enum_definition.dart';\nexport 'fragment_class_defi"
  },
  {
    "path": "lib/generator/data/definition.dart",
    "chars": 1259,
    "preview": "import 'package:artemis/generator/data_printer.dart';\nimport 'package:artemis/generator/helpers.dart';\nimport 'package:e"
  },
  {
    "path": "lib/generator/data/enum_definition.dart",
    "chars": 1153,
    "preview": "import 'package:artemis/generator/data/definition.dart';\nimport 'package:artemis/generator/data/enum_value_definition.da"
  },
  {
    "path": "lib/generator/data/enum_value_definition.dart",
    "chars": 977,
    "preview": "import 'package:artemis/generator/data/definition.dart';\nimport 'package:artemis/generator/data_printer.dart';\nimport 'p"
  },
  {
    "path": "lib/generator/data/fragment_class_definition.dart",
    "chars": 1529,
    "preview": "import 'package:artemis/generator/data/class_property.dart';\nimport 'package:artemis/generator/data/definition.dart';\nim"
  },
  {
    "path": "lib/generator/data/library_definition.dart",
    "chars": 1086,
    "preview": "import 'package:artemis/generator/data/query_definition.dart';\nimport 'package:artemis/generator/data_printer.dart';\nimp"
  },
  {
    "path": "lib/generator/data/nullable.dart",
    "chars": 219,
    "preview": "/// Allows to reset values back to null in `copyWith` pattern\nclass Nullable<T> {\n  final T _value;\n\n  /// Sets desired "
  },
  {
    "path": "lib/generator/data/query_definition.dart",
    "chars": 2607,
    "preview": "import 'package:artemis/generator/data/class_definition.dart';\nimport 'package:artemis/generator/data/definition.dart';\n"
  },
  {
    "path": "lib/generator/data/query_input.dart",
    "chars": 1037,
    "preview": "import 'package:artemis/generator/data/class_property.dart';\nimport 'package:artemis/generator/data/definition.dart';\nim"
  },
  {
    "path": "lib/generator/data_printer.dart",
    "chars": 978,
    "preview": "import 'package:equatable/equatable.dart';\n\nimport 'helpers.dart';\n\nString? _formatPrint(Object? obj) {\n  if (obj is Map"
  },
  {
    "path": "lib/generator/ephemeral_data.dart",
    "chars": 10741,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/nullable.dart';\nimport 'packag"
  },
  {
    "path": "lib/generator/errors.dart",
    "chars": 4174,
    "preview": "import 'package:artemis/generator/data/data.dart';\n\n/// Define an exception thrown when duplicated classes names were ge"
  },
  {
    "path": "lib/generator/graphql_helpers.dart",
    "chars": 4122,
    "preview": "import 'package:artemis/generator/errors.dart';\nimport 'package:artemis/visitor/type_definition_node_visitor.dart';\nimpo"
  },
  {
    "path": "lib/generator/helpers.dart",
    "chars": 3807,
    "preview": "import 'package:artemis/generator/ephemeral_data.dart';\nimport 'package:build/build.dart';\nimport 'package:collection/co"
  },
  {
    "path": "lib/generator/print_helpers.dart",
    "chars": 15358,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "lib/generator.dart",
    "chars": 13967,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "lib/schema/graphql_query.dart",
    "chars": 847,
    "preview": "import 'package:equatable/equatable.dart';\nimport 'package:gql/ast.dart';\nimport 'package:json_annotation/json_annotatio"
  },
  {
    "path": "lib/schema/graphql_response.dart",
    "chars": 607,
    "preview": "import 'package:gql_exec/gql_exec.dart';\n\n/// Encapsulates a GraphQL query/mutation response from server, with typed\n///"
  },
  {
    "path": "lib/schema/options.dart",
    "chars": 5415,
    "preview": "import 'package:json_annotation/json_annotation.dart';\nimport 'package:yaml/yaml.dart';\n\n// I can't use the default json"
  },
  {
    "path": "lib/schema/options.g2.dart",
    "chars": 4369,
    "preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'options.dart';\n\n// *************************************************"
  },
  {
    "path": "lib/transformer/add_typename_transformer.dart",
    "chars": 2991,
    "preview": "import 'package:gql/ast.dart';\n\n/// adds type name resolving to all schema types\nclass AppendTypename extends Transformi"
  },
  {
    "path": "lib/visitor/canonical_visitor.dart",
    "chars": 3255,
    "preview": "import 'package:artemis/generator.dart';\nimport 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/gene"
  },
  {
    "path": "lib/visitor/generator_visitor.dart",
    "chars": 10834,
    "preview": "import 'package:artemis/generator.dart';\nimport 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/gene"
  },
  {
    "path": "lib/visitor/object_type_definition_visitor.dart",
    "chars": 674,
    "preview": "import 'package:gql/ast.dart';\n\n/// Visits all object definition nodes recursively\nclass ObjectTypeDefinitionVisitor ext"
  },
  {
    "path": "lib/visitor/operation_type_definition_visitor.dart",
    "chars": 729,
    "preview": "import 'package:gql/ast.dart';\n\n/// Visits all operation definition nodes recursively\nclass OperationTypeDefinitionNodeV"
  },
  {
    "path": "lib/visitor/schema_definition_visitor.dart",
    "chars": 332,
    "preview": "import 'package:gql/ast.dart';\n\n/// Visits the schema definition node.\nclass SchemaDefinitionVisitor extends RecursiveVi"
  },
  {
    "path": "lib/visitor/type_definition_node_visitor.dart",
    "chars": 1803,
    "preview": "import 'package:gql/ast.dart';\n\nList<MapEntry<String, TypeDefinitionNode>> _defaultScalars =\n    ['Boolean', 'Float', 'I"
  },
  {
    "path": "pubspec.yaml",
    "chars": 786,
    "preview": "name: artemis\nversion: 7.13.1\n\ndescription: Build dart types from GraphQL schemas and queries (using Introspection Query"
  },
  {
    "path": "test/generator/helpers_test.dart",
    "chars": 2609,
    "preview": "import 'package:test/test.dart';\nimport 'package:artemis/generator/helpers.dart';\n\nvoid main() {\n  group('On removeDupli"
  },
  {
    "path": "test/generator/print_helpers_test.dart",
    "chars": 23989,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/helpers.dart",
    "chars": 2741,
    "preview": "import 'package:artemis/builder.dart';\nimport 'package:artemis/generator/data/data.dart';\nimport 'package:build/build.da"
  },
  {
    "path": "test/query_generator/aliases/alias_on_leaves_test.dart",
    "chars": 4067,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/aliases/alias_on_object_test.dart",
    "chars": 4772,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/append_type_name_test.dart",
    "chars": 27181,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/ast_schema/field_not_found_mutation_test.dart",
    "chars": 6313,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/ast_schema/input_types_test.dart",
    "chars": 7661,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/ast_schema/missing_schema_test.dart",
    "chars": 1812,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/ast_schema/multiple_schema_mappint_test.dart",
    "chars": 18257,
    "preview": "import 'package:artemis/builder.dart';\nimport 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/genera"
  },
  {
    "path": "test/query_generator/deprecated/deprecated_enum_value_test.dart",
    "chars": 3357,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/deprecated/deprecated_field_test.dart",
    "chars": 5622,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/deprecated/deprecated_input_object_field_test.dart",
    "chars": 6767,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/deprecated/deprecated_interface_field_test.dart",
    "chars": 8146,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/enums/enum_duplication_test.dart",
    "chars": 6257,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/enum_list_test.dart",
    "chars": 3766,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/filter_enum_test.dart",
    "chars": 6591,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/input_enum_list_test.dart",
    "chars": 7970,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/input_enum_test.dart",
    "chars": 10142,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/kw_prefix_test.dart",
    "chars": 5805,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/enums/query_enum_test.dart",
    "chars": 3808,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/errors/fragment_not_found_test.dart",
    "chars": 1227,
    "preview": "import 'package:artemis/builder.dart';\nimport 'package:artemis/generator/errors.dart';\nimport 'package:build/build.dart'"
  },
  {
    "path": "test/query_generator/errors/generation_errors_test.dart",
    "chars": 12803,
    "preview": "import 'package:artemis/builder.dart';\nimport 'package:artemis/generator/errors.dart';\nimport 'package:build/build.dart'"
  },
  {
    "path": "test/query_generator/errors/root_type_not_found_test.dart",
    "chars": 1012,
    "preview": "import 'package:artemis/builder.dart';\nimport 'package:artemis/generator/errors.dart';\nimport 'package:build/build.dart'"
  },
  {
    "path": "test/query_generator/forwarder_test.dart",
    "chars": 2388,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/fragments/fragment_duplication_test.dart",
    "chars": 9780,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragment_glob_schema_level_test.dart",
    "chars": 13741,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragment_glob_test.dart",
    "chars": 13310,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragment_multiple_queries_test.dart",
    "chars": 13206,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragment_on_fragments_test.dart",
    "chars": 5578,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragments_multiple_test.dart",
    "chars": 18404,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/fragments_test.dart",
    "chars": 2487,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/fragments/multiple_references_on_simple_naming_test.dart",
    "chars": 5205,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\n// Wh"
  },
  {
    "path": "test/query_generator/interfaces/interface_fragment_glob_test.dart",
    "chars": 8449,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/interfaces/interface_possible_types_test.dart",
    "chars": 6420,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/interfaces/interface_test.dart",
    "chars": 7949,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/multiple_operations_per_file_test.dart",
    "chars": 12795,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/multiple_queries_test.dart",
    "chars": 3350,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/mutations_and_inputs/complex_input_objects_test.dart",
    "chars": 8105,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/mutations_and_inputs/custom_scalars_on_input_objects_test.dart",
    "chars": 10059,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/mutations_and_inputs/filter_input_objects_test.dart",
    "chars": 7250,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/mutations_and_inputs/input_duplication_test.dart",
    "chars": 11306,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/mutations_and_inputs/mutations_test.dart",
    "chars": 12158,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/mutations_and_inputs/non_nullable_list_inputs_test.dart",
    "chars": 12027,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/mutations_and_inputs/recursive_input_test.dart",
    "chars": 3156,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/naming/casing_conversion_test.dart",
    "chars": 12423,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/naming/common.dart",
    "chars": 809,
    "preview": "const schema = r'''\nenum SomeEnum {\n  e1\n  e2\n}\n\ninput Input {\n  i: String\n  e: SomeEnum\n  s: SubInput\n}\n\ninput SubInput"
  },
  {
    "path": "test/query_generator/naming/pathed_with_fields_test.dart",
    "chars": 823,
    "preview": "import 'package:test/test.dart';\n\nimport '../../helpers.dart';\nimport 'common.dart';\n\nvoid main() {\n  group('On naming',"
  },
  {
    "path": "test/query_generator/naming/simple_naming_test.dart",
    "chars": 5985,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/nnbd_test.dart",
    "chars": 6282,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/query_generator_test.dart",
    "chars": 7666,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../helpers.dart';\n\nvoid mai"
  },
  {
    "path": "test/query_generator/scalars/custom_scalars_test.dart",
    "chars": 11188,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/scalars/scalars_test.dart",
    "chars": 3685,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/scalars/unused_custom_scalars_test.dart",
    "chars": 2228,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/subscription_test.dart",
    "chars": 5432,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:artemis/generator/data/enum_value_definition.dart';\ni"
  },
  {
    "path": "test/query_generator/union/union_types_test.dart",
    "chars": 10185,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "test/query_generator/union/union_with_nested_types_test.dart",
    "chars": 10845,
    "preview": "import 'package:artemis/generator/data/data.dart';\nimport 'package:test/test.dart';\n\nimport '../../helpers.dart';\n\nvoid "
  },
  {
    "path": "tool/fetch_schema.dart",
    "chars": 2551,
    "preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:args/args.dart';\nimport 'package:http/http.dart' as http;\n\nconst"
  }
]

About this extraction

This page contains the full source code of the comigor/artemis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 154 files (809.4 KB), approximately 194.9k tokens, and a symbol index with 383 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!